Changelog CannaCal

0.34.3 — Performance: Kalender-Monatsansicht, Dashboard-Grid, Seiten-Erkennung

Aus dem Performance-Review vom 13.08.2026:

  • Kalender-Heatmap ([canna_daily_calendar]): lud bisher pro Monatswechsel die komplette Tagebuch-Historie aller Grows und filterte den angezeigten Monat erst in PHP heraus. Je länger ein Nutzer sein Tagebuch führt, desto teurer wurde jeder Kalenderaufruf. Neue Methode Diary::getEntriesInMonth() grenzt die Query direkt per meta_query auf den angezeigten Monat ein.
  • Tagebuch-Dashboard: zählte die Einträge jeder Grow-Karte einzeln (countEntries() pro Karte → eine Query pro Tagebuch, N+1 bei N Tagebüchern). Neue Methode Diary::countEntriesBulk() holt alle Zählungen in einer gruppierten Query.
  • Seiten-Erkennung (cannacal_calendar_page_url(), cannadaily_page_url_by_shortcode()): scannte bei kaltem Options-Cache potenziell alle veröffentlichten Seiten der Website. Jetzt auf 500 Seiten begrenzt statt unbegrenzt.

0.34.2 — Fix: Toter Klick auf „Heute" im Grow-Kalender

Live gemeldet: Tippen auf den heutigen Tag im Monats-Heatmap-Kalender

([canna_daily_calendar]) tat nichts, wenn heute noch kein Eintrag geloggt

war. Root Cause: cannadaily_render_calendar_shortcode() rendert Tageszellen

nur dann als <button> mit Popover, wenn $level > 0 (also Log-Aktivität an

dem Tag existiert) — bei 0 Einträgen (der Normalfall für „heute", solange man

noch nichts eingetragen hat) blieb die Zelle eine reine, nicht interaktive

<span>. Fix: die is-today-Zelle ist jetzt immer ein Button; bei 0 Einträgen

öffnet sie ein Popover mit „Heute noch keine Einträge." + einem

„Eintrag hinzufügen →"-Link zum passenden Tagebuch (direkt zum einzigen Grow,

falls nur einer existiert, sonst zur Grow-Übersicht) — die Formular-Seite

befüllt das Datumsfeld dort ohnehin bereits automatisch mit heute.

0.34.1 — Polish-Pass: Tagebuch/Grow-Kalender

Gegen das neu erstellte DESIGN.md geprüft (Projekt-Root, gemeinsames System mit

NavWeed). Kein Feature-/Funktionsumfang geändert.

  • Aktions-Tags am Eintrag repariert: wurden mit der falschen CSS-Klasse (.we-tag/.we-tag-row, nie definiert) gerendert statt der bereits vorhandenen, vollständig gestylten .we-chip/.we-chip-row-Pillen — zeigten bislang unformatierten Rohtext statt Chips.
  • Schwebende Overlays vereinheitlicht: Kalender-Popover, Foto-Lightbox-Popover, Teilen-Popover, Speichern-Toast und Kamera-Dialog hatten fünf verschiedene Ad-hoc-Schattenwerte (eine davon: gar keinen) — jetzt durchgängig 0 20px 60px rgba(0,0,0,.3), wie im übrigen System für Modals/Popovers.
  • Danger-Rot vereinheitlicht + Dark-Mode ergänzt: Foto-Warnung und „Tagebuch löschen"-Link nutzten ein anderes Rot als der Rest des Systems und hatten keine Dark-Mode-Variante.
  • Fokus-Ringe ergänzt für Icon-Buttons (.we-act), Buttons, Sub-Tabs und Chips — bislang nur auf Texteingaben vorhanden.
  • Desktop-Breakpoint auf 782px vereinheitlicht (vorher 900px, s. 0.34.0): deckt sich jetzt mit --we-bp-lg, dem kanonischen Desktop-Breakpoint des restlichen App-Shells (Bottom-Nav→Rail wechselt ebenfalls bei 782px) — vorher blieb das Tagebuch zwischen 782–900px einspaltig, obwohl die Nav schon auf Desktop-Layout umgeschaltet hatte. Sidebar-Spalte dafür von 360px auf 320px verschmälert.
  • Stage-Bar barrierefrei: aktives Segment trägt jetzt aria-current="step", die Gruppe einen Tag/Phase-tragenden aria-label statt nur des benachbarten Texts.

0.34.0 — Grow-Tagebuch: 2-Spalten-Desktop-Layout, Katalog-Foto-Opt-in

  • Desktop-Layout: Ab 900px Breite steht das "Neuer Eintrag"-Formular jetzt sticky neben dem Grow-Log statt darüber/darunter — kein Hin-und-Herscrollen mehr beim Nacheintragen mehrerer Tage. Mobile (<900px) bleibt unverändert einspaltig. Siehe .we-diary-layout in assets/css/diary.css.
  • Katalog-Foto-Opt-in: neue Checkbox im Eintragsformular — Grower können ihr Titelbild für den NavWeed-Sorten-Katalog freigeben (cc_catalog_optin Meta, Diary::catalogOptIn()/setCatalogOptIn()). Getrennt vom bestehenden Share-Token-Mechanismus, da öffentlicher Katalog ein anderer Sichtbarkeits-Kontext ist als ein privater Share-Link.

0.33.1 — Tagebuch-Formular: kein Pflicht-Scroll mehr, Hinweistext, Sorten-Link

  • "Neuer Eintrag"-Formular (Foto-first Capture) erscheint jetzt direkt nach Titel/Tab-Umschalter statt erst nach dem Fortschrittsbalken — auf Mobile war bislang ein Scroll nötig, bevor Kamera/ Notizfeld sichtbar wurden. Fortschrittsbalken rückt dafür hinter das Formular.
  • Neuer Hinweistext im Formular: "Foto oder Notiz reicht — beides ist nicht Pflicht." (macht die bereits bestehende Server-Validierung sichtbar, Diary::addEntry() unverändert).
  • Sortenname im Tagebuch (Übersichtskarten + Grow-Detailseite) ist jetzt anklickbar und führt zur NavWeed-Sortenseite (Specs + dortiger HOS-Shop-Link).

0.33.0 — Dashboard-Redesign: Stat-Karten unter der Kalender-Heatmap (MacroFactor-Pattern)

Der Grow-Kalender ([canna_daily_calendar]) endete bisher direkt nach der Heatmap-Legende.

Ergänzt um eine Stat-Karten-Reihe (.we-result-info mit drei .we-info-cards: Log-Einträge,

Aktive Tage, Fotos — alle aus den ohnehin berechneten $activity-Daten des angezeigten

Monats, keine zusätzliche Query) nach dem Vorbild von MacroFactors Dashboard (Referenz-Recherche

via Mobbin, siehe Projekt-Memory). Dieselben Klassen kommen jetzt auch im NavWeed-Monats-Digest

zum Einsatz — geteiltes Stat-Karten-Pattern über beide Plugins hinweg.

0.32.2 — Fix: Kalender-Kacheln zu groß, Spalten nicht mehr unter Wochentagen

Live entdeckt: Grid-Items haben implizit min-width: auto (= Content-Mindestgröße), das

zwang die 1fr-Spalten in .we-heat-grid in Kombination mit aspect-ratio: 1 auf

.we-heat-cell über ihren fairen Anteil hinaus (65.5px statt 54px pro Spalte) — die

Kalender-Kacheln liefen aus dem Container und die Tages-Spalten passten nicht mehr zur

Wochentags-Kopfzeile (Mo/Di/Mi/…) darüber. Fix: min-width: 0; min-height: 0; auf

.we-heat-cell.

0.32.1 — Fix: ungewollte Abstände unter Untertiteln/Legende/Stage-Label

Live auf weederkennen.de entdeckt (Live-Inspektion via Browser-DevTools): dieselbe

Ursache wie im NavWeed-Fix 0.53.1 — Astras .entry-content p { margin-bottom: 1.6em }

gewann gegen .we-subtitle, .we-subtitle--detail, .we-stage-label und

.we-heat-legend/.we-cal-daypop-date (einzelne Klasse schlägt gegen

Klasse+Element-Selektor). Fix: jeweils Ancestor-Klasse (.we-widget, .we-stage,

.we-cal-daypop) vorangestellt, kein !important nötig.

0.32.0 — UI-Redesign: echter Grow-Kalender statt Konsum-Tagebuch-Optik

Erste Umsetzungsrunde des App-Redesigns (Referenz: Planta/GrowBuddy-Muster). CannaCal

bekommt sein eigenes, domänengerechtes Framing statt generischer Journal-App-Optik.

  • Stage-Fortschritt: neue cannadaily_get_current_stage()-Hilfsfunktion leitet aus cc_start + dem bestehenden GrowSchedule-Zeitplan die aktuelle Phase (Keimling/Veg/Blüte/Curing) ab; als 4-Segment-Fortschrittsbalken + "Tag N"-Anzeige oben im Tagebuch sichtbar. Bekannte Grenze: GrowSchedule bildet weiterhin nur eine feste Autoflower-Zeitlinie ab, keine Photoperiod-Sorten.
  • Aktions-Tags pro Eintrag: neues cc_actions-Meta-Feld (Gegossen/Gedüngt/ Getrimmt/Umgetopft) als Chip-Auswahl im Eintragsformular, sichtbar als Mini-Tags in der Liste.
  • Foto-first Erfassung + Wochen-Timeline: die Foto-/Kamera-Aufnahme (Funktion war bereits vorhanden) steht jetzt als erstes, großes Element im Formular statt als Neben-Icon. Neue cannadaily_gallery_html_grouped() gruppiert die Grow-Fotos nach ISO-Woche (neueste zuerst) als eigene "Fotos"-Ansicht neben den Einträgen.
  • Kalender als Monats-Heatmap: [canna_daily_calendar] zeigt jetzt ein 7-Spalten-Raster mit Einfärbung nach Log-Aktivität des Tages (0/1/2+ Einträge, Foto vorhanden) statt der vorherigen Agenda-/FullCalendar-Ansicht; aktive Tage öffnen ein natives Popover mit den Einträgen des Tages.

0.31.0 — Security- & Performance-Audit: Sharepic-Härtung, Feed-Caching, Conditional Assets

Ergebnis eines vollständigen Audits (Security + Performance) beider Plugins.

Security

  • Sharepics gehärtet: Dateinamen enthalten jetzt ein nicht erratbares, vom Share-Token abgeleitetes Segment (share-{typ}-{id}-{hash}.png) — vorher waren die PNGs (Foto + Notiz-Auszug) allein über die enumerierbare Post-ID abrufbar. Beim **Zurückziehen des Teilens, Bearbeiten/Löschen von Einträgen, Cover-Wechsel und Grow-Löschung** werden die Dateien jetzt gelöscht (Share::deleteSharepics(), inkl. Alt-Dateien ohne Hash).
  • Rate-Limiting auf den öffentlichen Token-Routen (/grow-kalender/…, /geteilt/…): max. 20 ungültige Tokens pro IP in 10 min, danach 429.
  • Foto-Upload: Datei-Inhalt wird per wp_getimagesize als echtes Bild verifiziert (vorher nur Endungs-Check via wp_check_filetype).
  • Mastodon-Token verschlüsselt in User-Meta (AES-256-GCM, Schlüssel aus wp_salt); Legacy-Klartext wird beim nächsten Speichern migriert.
  • SSRF-Härtung Mastodon: Instanz-Angabe muss ein plain Hostname sein und darf nicht auf private/link-local IPs auflösen.
  • Privacy-Hinweis präzisiert: Tagebuch-Formular verspricht nicht mehr absolute Privatheit (Fotos sind als Uploads über ihren direkten Datei-Link erreichbar).

Performance

  • Assets nur noch auf Plugin-Seiten (Shortcodes/Blöcke/Share-Seiten) statt global auf jeder Seite; CSS/JS minifiziert (*.min.*, ~71 KB → ~48 KB). Gast-Nonces entfernt (Full-Page-Caching möglich); CannaDaily-REST-Nonce nur noch für eingeloggte Nutzer.
  • Sharepics werden nicht mehr bei jedem Seitenaufruf neu gerendert (file_exists-Guard; vorher 2 GD-Renderings pro View inkl. OG-Crawler).
  • Grow-Feed: Token→ID- und ICS-Ergebnis-Caching (Transients, Invalidierung bei Eintrags-Änderungen), ETag/304 + Cache-Control: private statt no-store.
  • Öffentlicher Kalender (/kalender/…): ICS-Transient + `Cache-Control: public, max-age=3600 + ETag`/304 (Inhalt ist generisch, voll cachebar).
  • Mastodon-Post entkoppelt (Single-Event via WP-Cron) — blockierte vorher das Eintrag-Speichern mit bis zu 40 s externen Requests; Wetter-Timeout 8 s → 4 s.
  • DB: Diary::getEntries() mit Per-Request-Memoization; coverPhotoId() lädt nur noch den neuesten Eintrag mit Foto statt aller Einträge; GrowSchedule::getEvents() (30-KB-Literal) einmal pro Request; cannacal_user_strain_photo() memoized; neuer Helper cannadaily_next_planned_event() für das NavWeed-Dashboard (kein Einträge-Volllast).
  • Autoload-Flags korrigiert (einmalige Migration beim Update): kleine Per-Request- Optionen (Seiten-IDs, Rewrite-Marker) → autoload, große Admin-Inhalte (Infotainment/Werbepartner-JSON) → kein autoload.

0.30.0 — Foto-Galerie: Wischen in der Lightbox (Mobil)

Die Vollbild-Lightbox der Grow-Foto-Galerie (Detail- und geteilte Seite) reagiert jetzt auf

Touch-Wischgesten: horizontal wischen blättert zum vorigen/nächsten Foto. Schwelle 40px,

horizontale Bewegung muss die vertikale übersteigen — so bleibt vertikales Scrollen/Schließen

unberührt. Rein additiv zu den bestehenden ‹ ›-Buttons, Pfeiltasten und dem Zähler; kein CSS,

kein neues Markup.

0.29.0 — Foto-Upload: Live-Kamera im Eintragsformular (In-Page-Sucher)

Instagram-artiger Aufnahme-Flow, im Rahmen dessen, was das Web hergibt: das Mediathek-Grid

liefert der native Foto-Picker (Galerie-Button, unverändert), neu ist der Live-Sucher in der Seite.

  • Live-Kamera als natives <dialog> (#cd-camera): getUserMedia-Viewfinder mit großem Auslöser (Kamera-App-Optik, dunkles Umfeld), Kamera-Wechsel vorn/hinten (Frontkamera in der Vorschau gespiegelt, Aufnahme ungespiegelt), Schließen/Esc stoppt den Stream sauber (Track-Cleanup).
  • Aufnahme → bestehende Pipeline: der Auslöser zeichnet den Video-Frame auf ein Canvas (JPEG 0.92 — toBlob-WebP kann Safari nicht überall), legt die Datei per DataTransfer ins bestehende cd_photo-Input und feuert change — **Optimierung (1600px/WebP/EXIF-Strip) und Sofort-Vorschau laufen unverändert mit** (ein Codepfad für Kamera + Galerie).
  • Robuster Fallback: ohne getUserMedia/<dialog>/Secure Context oder bei verweigerter Berechtigung öffnet der Kamera-Button wie bisher die native Kamera-App (capture-Attribut, wird nach Gebrauch entfernt, damit der Galerie-Button sauber bleibt).
  • Edit-Modus: „Foto entfernen" ist jetzt ein ✕ direkt auf dem Bestandsfoto (Tap togglet, ↩ macht rückgängig; Foto wird ausgegraut). Die Checkbox bleibt als Formularfeld erhalten (visuell versteckt) — kein Server-Change.
  • A11y: Vorschau-Box mit aria-live="polite" („Bild wird optimiert …"/„✅ bereit"), Hinweiszeile im Dialog als role="status", Auslöser-Animation respektiert prefers-reduced-motion, Safe-Area-Padding unter den Controls.

0.28.0 — Eigene Tagebuch-Ansicht bekommt die Foto-Galerie

  • Die eigene Tagebuch-Seite zeigt jetzt dieselbe Foto-Galerie (Grid + JS-Lightbox, alt → jung) wie die geteilte Seite — als gemeinsamer Baustein cannadaily_gallery_html() (ein Codepfad, Share-Seite + Eigen-Ansicht).
  • Formular „Neuer Eintrag" bleibt oben; die per-Eintrag-Aktionen (Bearbeiten/Teilen/Löschen, Titelbild setzen) bleiben in der Liste darunter erhalten.

0.27.0 — Auto-Post neuer Einträge auf Mastodon (Opt-in pro Grow)

  • Mastodon-Auto-Post: Ist bei einem Grow „automatisch posten" aktiv, löst jeder neue Eintrag einen öffentlichen Mastodon-Post aus (Grow-Name/Run + Notiz + Link zum geteilten Eintrag + Foto als Medium).
  • Konto pro User: Instanz + Zugangstoken werden als User-Meta gespeichert (einmal im Grow-Setup gesetzt, gilt für alle eigenen Tagebücher). Token maskiert; leer lassen behält den bestehenden.
  • Direkt aus WordPress (includes/Mastodon.php): Medien-Upload (v2) + Status (v1), fire-and-forget, kurzer Timeout, Doppelpost-Marker (cc_mastodon_posted). Fehler blockieren das Speichern nicht.
  • Beim Posten wird der Eintrag automatisch geteilt, damit der Link öffentlich funktioniert.

0.26.5 — Lightbox nutzt Design-System-Buttons + Hero volle Breite

  • Lightbox-Buttons verwenden jetzt die vorhandene Icon-Button-Komponente .we-act (statt eigener Styles) — behebt die ovalen Buttons (Astras globale button-Regeln blähten die feste Größe auf) und ist konsistent zum Styleguide.
  • .we-share-hero ohne max-width — das Sharepic oben nutzt die volle Breite.

0.26.4 — Sharepic-Feinschliff + Lightbox-Look + WP-Standard-Bilder

  • Sharepic: Kicker „WEEDERKENNEN" (statt CANNADAILY); Titel überlappt den Kicker nicht mehr (mehr Abstand, Foto etwas kleiner); Sorte inkl. Breeder (nw_breeder); Anzahl Einträge entfernt; **Run # steht jetzt in derselben Zeile wie die Domain** (Footer).
  • Galerie/Lightbox nutzt WordPress-Standardbilder: Thumbnails über wp_get_attachment_image (responsive srcset + lazy), Lightbox lädt die Größe large statt des Originals → deutlich schneller.
  • Lightbox-Look überarbeitet: runde Buttons, Pfeile seitlich, Schließen oben rechts, Bildunterschrift als Pille unten.

0.26.3 — Sharepic wie navweed + JS-Lightbox

  • Sharepic: nutzt jetzt navweeds gebündelte Font + Schriftgrößen (behebt das Mojibake, das vom System-Font-Fallback kam — rohes UTF-8 wie navweed statt Entity-Trick). Einzelbild (neuestes Foto) statt 2×2-Collage. Auf der Seite ganz oben als Hero.
  • Galerie-Reihenfolge alt → jung, damit das Durchblättern den Verlauf zeigt.
  • Lightbox neu (JS): sauberes Overlay mit Vor/Zurück, Pfeiltasten (←/→), Esc/Backdrop zum Schließen, Positionsanzeige. Behebt den Bug, dass „✕" vorwärts blätterte (native Popover-Navigation ersetzt).

0.26.2 — Geteilte Grow-Seite: Feinschliff

  • Sharepic wieder sichtbar auf der Seite (eigener Abschnitt „Sharepic" unter der Galerie), zusätzlich zu og:image + Download.
  • Lightbox zum Durchklicken: Vor/Zurück/Schließen direkt in der Foto-Lightbox (natives Popover mit Umlauf, kein JS), inkl. Positionsanzeige (z. B. „3/10").
  • Mehr Abstand über der Headline (Kopfbereich war zu knapp).
  • Strain verlinkt: Der Sortenname in der Meta-Zeile führt jetzt zur Sorten-Seite.

0.26.0 — Geteilte Grow-Seite: Galerie + Sharepic-Fix, Tagebuch-Löschen als Button

  • Öffentliche Grow-Seite (/geteilt/grow/…) neu: zeigt jetzt eine Galerie aller Grow-Fotos (Grid + native Popover-Lightbox) statt nur eines Bildes + leerer Datumszeilen. „Verlauf" listet nur Einträge mit Notiz. Layout über das we--Design-System statt Inline-CSS.
  • Sharepic (GD-Grafik) aufgehübscht: Mojibake behoben (·/Eintrâ → korrekte Umlaute/Trennzeichen via mb_encode_numericentity vor imagettftext); größeres Foto-Band; für Grows 2×2-Collage der neuesten Fotos statt einzelnem Cover; kompaktes Info-Band ohne die frühere Riesenlücke. Bleibt als og:image + Download.
  • Tagebuch löschen ist jetzt ein sichtbarer Secondary-Button (statt blassem Textlink); Bestätigungsdialog bleibt.

0.25.0 — Tagebuch: Speicher-Feedback + letztes Foto als Titel

  • Speicher-Loader: Beim Absenden eines Eintrags erscheint ein Overlay („Wird gespeichert …"), das bis zum Neuladen sichtbar bleibt — zeigt klar, wann Upload/Speichern abgeschlossen ist. Während der clientseitigen Bildoptimierung ist der Speichern-Button gesperrt (kein Original-Upload).
  • Letztes Bild = Titelbild: addEntry setzt cc_cover jetzt aktiv auf das neu hochgeladene Foto (vorher nur Anzeige-Fallback). Das neueste Foto wird automatisch zum Titelbild des Grows.
  • Nach dem Speichern zu den Einträgen: Redirect springt per Anker #cd-entries direkt zur Einträge-Liste. Darüber eine Zeile: links „← Alle Tagebücher", rechts die Bestätigung „✅ Eintrag gespeichert". Die Eintrags-Meldung wandert von oben in diese Zeile.

0.24.1 — Fix: Fatal bei doppeltem Plugin-Verzeichnis

  • Doppel-Last-Schutz in cannacal.php: Lädt WordPress versehentlich zwei Kopien des Plugins (z. B. cannacal und cannacal-1, wie es beim Hochladen eines Zips ohne umschließenden Ordner entstehen kann), bricht der zweite Ladevorgang jetzt sauber ab (if (defined('CANNACAL_VERSION')) return;). Vorher: „Constant already defined"-Warnungen + Fatal, weil CANNACAL_DIR der einen Kopie auf die andere zeigte.
  • Zip-Struktur korrigiert: Das Release-Zip enthält die Dateien jetzt im umschließenden Ordner cannacal/, damit WordPress beim Installieren/Aktualisieren kein zweites Verzeichnis cannacal-1 anlegt.

0.24.0 — DSGVO: Tagebücher beim Konto-Löschen entfernen

  • Löschfunktion (includes/Privacy.php): cannadaily_delete_user_data() löscht alle Tagebücher + Einträge + zugehörige Foto-Dateien eines Nutzers (unwiderruflich). Strains bleiben unberührt.
  • Registriert einen WP-Privacy-Eraser (Admin: Tools → Daten löschen). Die Self-Service-Konto-Löschung (navweed) ruft dieselbe Funktion auf.

0.23.0 — DSGVO: Datenexport (Tagebücher + Fotos)

  • Datensammlung für den Export (includes/Privacy.php): cannadaily_export_user_data() liefert alle Tagebücher des Nutzers mit Einträgen (Datum/Notiz/Wetter) + die zugehörigen Foto-Dateien.
  • Registriert einen WP-Privacy-Exporter (Admin: Tools → Daten exportieren). Der eigentliche Self-Service-Download (ZIP mit Fotos) liegt im navweed-Plugin (Konto-Seite) und holt sich diese Daten per function_exists() — lose gekoppelt.

0.22.0 — Farbe pro Tagebuch (Kalenderansicht)

  • Jedes Tagebuch hat jetzt eine wählbare Farbe (Farbfeld im Tagebuch-Formular, neu + bearbeiten). Sie markiert die Termine/Einträge dieses Tagebuchs im Grow-Kalender — praktisch bei mehreren Tagebüchern.
  • Auflösung über Helper cannadaily_grow_color(): gewählte cc_color (Hex) oder sonst eine stabile Palette-Farbe pro Grow. Speicherung sicher per sanitize_hex_color().

0.21.5 — Titelbild standardmäßig das letzte Foto

  • Tagebuch-Titelbild ist jetzt standardmäßig das neueste Eintrags-Foto — kein manuelles Setzen mehr nötig. Auflösung beim Anzeigen: manuell gewähltes cc_cover (falls die Datei noch existiert) hat Vorrang, sonst automatisch das letzte Foto (Helper Diary::coverPhotoId()). Greift auch für bestehende Tagebücher und fängt gelöschte Titelbilder ab. Die Lightbox-Auswahl „★ Als Titelbild verwenden" bleibt als Override.

0.21.4 — Fix: Grow-Seite (Slug grow-beta) wird erkannt

  • Mobile-Menü „Übersicht"/„Dashboard" zeigte nicht auf die Grow-Seite: cannadaily_grow_page_url() suchte nur Slug grow/Titel Grow — die Seite heißt aber grow-beta („Grow (beta)"). Die Auflösung scheiterte → Fallback aufs Bewertungs-Dashboard. Jetzt werden Slugs grow/grow-beta/grow-bereich und Titel Grow/Grow (beta)/Grow-Bereich geprüft (per Filter weiterhin überschreibbar).

0.21.3 — Changelog neueste-zuerst

  • CHANGELOG.md strikt absteigend sortiert (neueste Version oben) und das array_reverse in der Changelog-Ausgabe entfernt — die On-Site-Anzeige zeigt jetzt korrekt die aktuellste Version zuerst.

0.21.2 — Fix: diary.css wurde nicht geladen (Handle-Kollision)

  • Regression aus dem we--Rename behoben: frontend.css/frontend.js und diary.css/diary.js hatten nach der Umbenennung dasselbe Enqueue-Handle (we-frontend) — WordPress verwarf das zweite, also diary.css/diary.js. Folge: auf den Grow-Seiten fehlten die Diary-Styles (doppelte „Tagebuch"-Überschrift, Karten gestapelt statt im Raster). Jetzt eindeutige Handles: we-cal (Generator) und we-diary (Tagebuch).
  • Damit greifen wieder Astra-Titel-Unterdrückung, Karten-Raster, Eintrags-Styles, Foto-Lightbox + JS-Resize.

0.21.1 — Foto-Upload optimiert + Titelbild per Lightbox

  • Clientseitige Bild-Optimierung vor dem Upload: Fotos werden im Browser auf max. 1600 px verkleinert und als WebP (Q 0.82) exportiert, bevor sie hochgeladen werden. Spart auf dem Handy massiv Zeit (Voll-Auflösung 5–12 MB → ~200–400 KB); EXIF/GPS fällt beim Reencode automatisch weg. Server akzeptiert WebP bereits. Fallback: bei fehlender WebP-Unterstützung das Original.
  • Titelbild jetzt über eine Foto-Lightbox: Tippen aufs Eintragsfoto öffnet ein Popover mit großem Bild und großem Button „★ Als Titelbild verwenden" (statt des winzigen ☆ auf dem Thumbnail). Das aktuelle Titelbild wird mit einem ★-Badge markiert.

0.21.0 — Design-System Stufe C–E: ein Namensraum we- + Dark-Mode CSS-only

  • Alle Klassen auf .we-* (vorher cannadaily-/cannacal-): einheitlicher Namensraum über beide Plugins, Markup + CSS + JS im Gleichschritt, inkl. Element-IDs (Kalender) + Handles. Look unverändert (per-Page-Isolation).
  • Dark-Mode CSS-only: keine JS-Theme-Umschaltung mehr. Dark greift über html:has(#we-theme-dark:checked); ein verstecktes Checkbox (Footer, von Weederkennen) + <label>-Toggle schalten um. 2 Modi (Hell/Dunkel), ohne Persistenz (Reset je Seitenwechsel) — bewusst so gewählt.
  • Token-Quelle bleibt --we-* (we-core). Hinweis: das alte data-nw-theme-Attribut entfällt; einige Kontrast-Regeln bleiben inert (Kontrast-Modus entfällt im CSS-only-Schalter).

0.20.3 — Design-System Stufe B: Buttons auf .we-btn

  • Alle Button-Klassen (cannadaily-btn*, cannacal-btn*) in Markup und CSS auf .we-btn/.we-btn--* (BEM) vereinheitlicht. Look unverändert (Regeln im Gleichschritt umbenannt). we-core stylt Buttons vorerst nicht (kein Lade-Order-Konflikt); die Zusammenführung auf eine Definition folgt.

0.20.2 — Design-System Stufe A: Token-Vokabular vereinheitlicht

  • CSS-Tokens --nw-*--we-* (Weederkennen). Reine Umbenennung über alle CSS-Dateien, identische Werte + Fallbacks → kein optischer Bruch. Eine Quelle der Wahrheit (Child-Theme we-core.css/tokens.css).
  • Vorbereitung für die folgende Klassen-Vereinheitlichung auf den we--Präfix (eigene Stufen, mit Vorschau).
  • Hinweis: das Dark-Mode-Attribut data-nw-theme bleibt vorerst; es wird mit den Klassen umbenannt.

0.20.1 — Kalender mobil als Liste + schmaleres Datums-Feld

  • Mein Grow-Kalender startet auf Mobil (≤ 640 px) direkt in der Listen-Ansicht (listMonth) statt im Monats-Grid, das auf kleinen Screens kaum lesbar ist. Umschalter Liste/Monat bleibt.
  • „Dein persönlicher Grow-Kalender": das Datums-Feld zieht sich auf Mobil **nicht mehr über die volle Breite** (linksbündig, inhaltsbreit) — der „Kalender erstellen"-Button bleibt voll.

0.20.0 — Kopfzeilen aufgeräumt (eigener Seitentitel, Icons statt Emojis)

  • Eigene Seiten-Kopfzeile statt Astra-H1. Auf den CannaDaily-Seiten wird der Astra-Seitentitel per CSS unterdrückt (Body-Class cannadaily-page); der Shortcode rendert die Überschrift selbst.
  • Grow-Liste: „📓 Meine Grow-Tagebücher / CannaDaily · privat" entfällt; Titel „Tagebuch" links, „Neues Tagebuch" als Icon-Button oben rechts.
  • Tagebuch-Detail: Grow-Titel als Überschrift, rechts daneben **Bearbeiten/Kalender/Teilen nur als Icons** (.cannadaily-act, mit Tooltip/aria-label), Meta („Run #… · …") darunter. Eintragsformular steht als erstes im Kasten.
  • Emojis → SVG-Icons überall im Tagebuch-Kopf, im „Neuer Eintrag"-Titel, in den Popover-Titeln und bei den Foto-Buttons (Kamera/Galerie), die jetzt linksbündig sind. Neue Icons: camera, image, plus.
  • Mobile: Eintrags-Thumbnails ~1/3 kleiner (92→61 px).
  • „Übersicht"/„Alle Tagebücher" zeigen jetzt auf die „Grow"-Seite (Helper cannadaily_grow_page_url(), Auflösung Slug grow → Titel „Grow" → Fallback Dashboard).
  • Auch die Neu-/Bearbeiten-Formulare (Grow + Eintrag) nutzen die neue, emojifreie Kopfzeile.

0.19.4 — Eintragszeile kompakter (Datum + Wetter neben das Bild)

  • Die separate Kopfzeile (Datum links / Icons rechts) entfällt. Die Eintragszeile ist jetzt Thumbnail | Body | Icons: im Body stehen Datum und Wetter nebeneinander (.cannadaily-entry-meta), darunter die Notiz. Das leere Mittelfeld verschwindet, auch bei Einträgen ohne Foto.
  • Icons (Bearbeiten/Teilen/Löschen) bleiben oben rechts, oben ausgerichtet.
  • Aufräumen: tote .cannadaily-entry-head-CSS-Regeln entfernt.

0.19.3 — Aktionsleiste als Button-Reihe + SVG-Icons

  • Bearbeiten / Kalender abonnieren / Tagebuch teilen sitzen jetzt nebeneinander in einer Button-Reihe (.cannadaily-toolbar, flex + wrap) statt untereinander.
  • Emojis → SVG-Icons: die drei Buttons nutzen das vorhandene Icon-Set (cannadaily_share_svg); neues calendar-Icon ergänzt. Konsistent mit den Eintrags-Aktionen (Bearbeiten/Teilen/Löschen).
  • Die zwei aufklappbaren Boxen (Abonnieren, Teilen) sind jetzt Popovers (Wiederverwendung von .cannadaily-share-pop wie beim Eintrag-Teilen) — kein Inline-Aufklappen mehr, das die Reihe sprengt.
  • Fix: SVG in Buttons mit flex: 0 0 auto, damit Astra das Icon nicht auf Breite 0 schrumpft.

0.19.2 — Klapp-Header als Buttons

  • „Tagebuch bearbeiten", „Kalender abonnieren", „Ganzes Tagebuch teilen" nutzen jetzt die bestehende Button-Optik (.cannadaily-btn-secondary) statt Text-Link/Klappkasten — konsistent mit den übrigen Buttons. Die <details>-Boxen verlieren ihren Doppel-Rahmen; der Inhalt klappt unter dem Button auf.

0.19.1 — Eintrags-Icons + Versatz (im echten Browser verifiziert)

  • Leere Teilen-/Löschen-Icons behoben: Astra quetschte das SVG im <button> per Flexbox auf Breite 0 (Höhe blieb) — der Bearbeiten-Link (<a>) war nicht betroffen, daher nur er sichtbar. Fix: flex: 0 0 auto + erzwungene SVG-Breite und Button-Größe. (Live per DevTools bestätigt: Button-SVG 0px → 19px.)
  • Versatz behoben: Astra setzte 20px padding-left aufs ul.cannadaily-entries → mit padding: 0 !important überschrieben.

0.19.0 — Tagebuch bearbeiten

  • Bestehendes Tagebuch bearbeiten: neuer Link „✏️ Tagebuch bearbeiten" im Kopf der Detailseite öffnet das Setup-Formular vorbefüllt (Name, In-/Outdoor, Sorte, Standort, Run, Startdatum). Speichern über die neue Aktion update_grow (Diary::updateGrow, mit Eigentümer-Prüfung).
  • Alles editierbar inkl. Startdatum (verschiebt bewusst Plan/Kalender). Beim Wechsel **Outdoor → Indoor bleiben die Standortdaten erhalten** (nur die Wetter-Anzeige pausiert) — sie werden nur im Outdoor-Modus überschrieben.

0.18.2 — Tagebuch-Detail aufgeräumt

  • Datum/Icons fluchten jetzt: Der Eintrags-Kopf (Datum + Icons) sitzt über der Foto-Zeile und ist immer volle Breite — vorher rutschte er bei Einträgen mit Foto nach rechts (Versatz zu Einträgen ohne Foto).
  • Klarere Abgrenzung: Überschriften „✏️ Neuer Eintrag" und „Bisherige Einträge (N)" (mit Trennlinie) trennen Eingabe von der Liste.
  • Icons sichtbar (zweiter Anlauf): Icon-Farbe wird jetzt mit !important erzwungen — das Theme (Astra) überschrieb die Button-Textfarbe und machte die SVGs unsichtbar. Löschen rot, beides auch im Dark-Theme.

0.18.1 — Eintrags-Icons: Fixes

  • Leere Icons behoben: Die Aktions-<button> erbten die (weiße) Button-Textfarbe des Themes → Icons unsichtbar (nur der „Bearbeiten"-Link war grün). Icon-Farbe wird jetzt auf .cannadaily-act svg hart gesetzt; Löschen rot.
  • Aktionsreihe entzerrt: nur noch 3 Icons (Bearbeiten/Teilen/Löschen), kleiner (32px) und umbruchsicher → läuft auf dem Handy nicht mehr aus dem Eintrag.
  • Titelbild-Stern als Overlay direkt auf dem Foto (★ = aktuelles Titelbild, ☆ = als Titelbild setzen) statt als eigenes Icon in der Reihe.

0.18.0 — Kompakte Tagebuch-Einträge

  • Einträge als kompakte Liste statt hoher Karten: quadratisches Foto-Thumbnail links (object-fit: cover, 1:1 gecroppt; Tippen öffnet das Bild groß), rechts Datum/Notiz/Wetter.
  • Aktionen als Icons (wie im Bewertungs-Dashboard): ✎ Bearbeiten, ↗ Teilen, 🗑 Löschen und ★ Titelbild.
  • Teilen als Popover (native Popover-API) statt aufgeklappter Box — öffnet Link/X/Mastodon/Sharepics bzw. „Teilen aktivieren". Backend (Löschen, Teilen, Titelbild) unverändert; reiner Frontend-Umbau.

0.17.0 — Mobile Grow-Navigation + Foto-Auswahl

  • Helfer für die kontextabhängige Mobil-Navigation (von Weederkennen genutzt, lose gekoppelt): cannadaily_is_grow_page(), cannadaily_grow_entry_url() und cannadaily_nav_entry_data() (liefert je nach Anzahl Tagebücher den Modus neu/direkt/Auswahl + die Tagebuch-Liste). Das Eintragsformular hat jetzt einen Anker #cd-entry für den Direktsprung.
  • Foto-Upload „Instagram-like": statt des nackten Datei-Felds zwei Buttons 📷 Kamera und 🖼️ Galerie, die denselben (versteckten) cd_photo-Input auslösen — Kamera mit capture="environment", Galerie ohne. Sofort-Vorschau, Server-Validierung und EXIF-Strippung unverändert. Ein Foto pro Eintrag wie bisher.

0.16.1 — Kalender-Popover: Fixes

  • Pointer-Cursor auf Kalender-Events: FullCalendar setzt bei eventClick (statt url) keinen Hand-Cursor – jetzt per CSS ergänzt, damit Events sichtbar klickbar wirken.
  • Kodierung repariert: Tagebuch-Name/Titel zeigten texturierte Entities ( statt „–"), weil get_the_title() durch wptexturize läuft und die Werte per textContent ausgegeben werden. Jetzt serverseitig via html_entity_decode() zu echten UTF-8-Zeichen dekodiert (Name, Plan-Titel, Eintragszeile).

0.16.0 — Web-Kalender: Event-Popover

  • Klick auf einen Kalender-Eintrag öffnet ein Popover (FullCalendar-eventClick) mit Titel, Datum, Tagebuch-Badge und Typ (📋 Plan-Schritt / 📓 Tagebuch-Eintrag) sowie einem Button „Zum Tagebuch öffnen" (Detailseite des jeweiligen Grows via ?cd_grow=ID). Schließt bei Außenklick/ESC, bleibt im Viewport.
  • Dafür tragen die Kalender-Events jetzt growId + Detail-URL in extendedProps. Dynamische Texte werden per textContent gesetzt (kein innerHTML), da Titel aus Nutzer-Notizen stammen. Styling über --nw-*-Tokens inkl. Dark-Theme.

0.15.0 — Grow-Glossar

  • Neuer Shortcode [canna_glossar]: öffentliches Endnutzer-Fachlexikon für den Autoflower-Anbau (Pflanzentypen, Phasen, Licht/Klima, Training, Pflanzenteile, Substrat/Nährstoffe, Recht/KCanG) aus der mitgelieferten GLOSSAR.md. Alphabetisch sortiert, A–Z-Sprungnavigation, Live-Suchfilter und Anker je Begriff (Deep-Link, z. B. …/glossar/#term-autoflower).
  • Eigenständig, keine Kopplung an navweed (eigene Datei, eigener Inhalt). Styling über die --nw-*-Tokens inkl. Dark-Theme; standalone greifen die Fallback-Farben. Inhalt in GLOSSAR.md jederzeit erweiterbar.

0.14.6 — FullCalendar update-sicher laden

  • Der Web-Kalender ([canna_daily_calendar]) sucht die self-hosted FullCalendar-Datei jetzt zuerst im Plugin (assets/vendor/) und sonst in wp-content/uploads/cannacal/ — letzteres überlebt Plugin-Updates (im Plugin-Ordner würde die Datei bei jedem Update überschrieben). Gilt auch für die Locales-Datei.
  • Admin-Hinweis + READ_ME aktualisiert (empfohlener Ablageort = uploads/cannacal/).

0.14.5 — CannaDaily-Teilen mit Social-Icon-Reihe

  • In der Teilen-Box (Eintrag & Grow) jetzt die gleiche Icon-Reihe wie bei navweed: **Kopieren · X · Mastodon · Sharepic 1:1 · 4:5** (Icons 1.9rem, Buttons 44px). Kopieren/Mastodon via kleinem JS (diary.js).
  • Sharepics (1:1 + 4:5) werden beim Teilen erzeugt (Share::buildSharepics), damit die Download-Links sofort funktionieren; URL-Helper Share::sharepicUrl().

0.14.4 — Sharepic-Text repariert + Layout + Sorten-Vorbefüllung

  • Sharepic-Text gefixt: HTML-Entities (z. B. → „–") werden dekodiert, Emojis/Symbole entfernt (GD-Schrift hat dafür keine Glyphen → vorher Müllzeichen wie „đ"/„Ś"), sauberes Kürzen ohne kaputte Zeichen.
  • Layout/Schrift: Kicker „CANNADAILY" + großer Titel + Akzent-Subzeile (wie bei den Reviews), deutlich größere Schrift; Bug behoben (Sorte im Grow-Sharepic). Footer „weederkennen.de".
  • Setup-Vorbefüllung: kommt der Nutzer über „Jetzt growen" von einer Sorte (?cd_strain_pre=ID), ist die Sorte im Tagebuch-Setup bereits ausgewählt.

0.14.3 — Sharepic sichtbar machen

  • Auf der geteilten Seite (/geteilt/…) wird das Sharepic jetzt inline angezeigt (1:1 als Hero-Bild), nicht nur als Download. Die 4:5-Variante bleibt als Download.
  • In der Teilen-Box im Tagebuch gibt es einen klaren Link „👁️ Vorschau & Sharepic öffnen ↗" zum geteilten Link — so findet man das Bild sofort.

0.14.2 — Sharepic auch im Hochformat (4:5)

  • Zusätzlich zum quadratischen Sharepic (1:1) gibt es jetzt eine 4:5-Variante (1080×1350) je geteiltem Eintrag/Grow. Auf der geteilten Seite stehen beide als Download („Quadrat (1:1)" · „Hochformat (4:5)").
  • Share::sharepic($type, $post, $ratio) mit square|portrait; Foto-Band + Textbereich passen sich der Höhe an.

0.14.1 — Foto-Upload: Sofort-Vorschau

  • Beim Tagebuch-Eintrag zeigt das Foto-Feld jetzt direkt nach der Auswahl ein Thumbnail + Dateiname/Größe (assets/js/diary.js), mit „✕ Foto entfernen". Der Upload passiert weiterhin beim Speichern — aber der Nutzer sieht sofort, dass ein Bild gewählt ist.
  • Client-Warnung bei falschem Typ (nur JPG/PNG/WebP) oder > 5 MB, damit nicht still verworfen wird.

0.14.0 — Tagebuch teilen (Eintrag & Grow, mit Bild)

  • Öffentliches Teilen wie bei Reviews (includes/Share.php): pro Element ein geheimer Token + Opt-in (cc_shared), Route /geteilt/(eintrag|grow)/{token}/ mit öffentlicher Seite + OG-Tags + GD-Sharepic.
  • Einheit: beides — einzelner Eintrag (Datum, Notiz, Foto, Wetter; Foto-Option cc_share_photo) und ganzes Tagebuch/Grow (Titelbild, Sorte, Run, Stats, letzte Einträge).
  • Teilen-UI im Tagebuch: je Eintrag „🔗 Eintrag teilen" (mit „Foto mitteilen") und „🔗 Ganzes Tagebuch teilen"; jeweils Link anzeigen + „Nicht mehr teilen" (zieht den öffentlichen Zugriff zurück).
  • Sharepic: 1080², Foto als Cover-Band oben + Text (TTF mit System-Font-Fallback), Footer „weederkennen.de".
  • Hinweis: Geteilte Links sind über das Token öffentlich erreichbar (kein Login) — bewusst, wie bei den Reviews. Nach Update den Permalink-Cache ggf. einmal neu speichern (neue Route).

0.13.2 — Changelog-Anzeige: neueste Version oben

  • [cannacal_changelog] rendert die Versionen jetzt neueste zuerst (Sektionen werden im Renderer umgedreht; die Datei bleibt chronologisch, neue Einträge weiterhin unten anhängbar).

0.13.1 — Härtung: persönliche Seiten leiten auf Login

  • Gäste werden auf [canna_daily] / [canna_daily_dashboard] / [canna_daily_calendar]-Seiten jetzt **hart zur Login-Seite umgeleitet** (auth_redirect auf template_redirect), statt nur eine Hinweis-Zeile zu zeigen.
  • Kein bekanntes Datenleck vorher: anonyme Abrufe zeigten bereits nur den Login-Hinweis (Shortcodes prüfen Login), Seiten sind noindex,nofollow. Diese Änderung macht das Verhalten konsistent mit dem Weederkennen-Katalog und robuster gegenüber Caching.
  • Hinweis: Nach Deploy den Seiten-Cache leeren (PWA/Cache-Plugin), damit eine evtl. gecachte Hinweis-Seite durch den Redirect ersetzt wird.

0.13.0 — Changelog-Shortcode/Block

  • Neuer Shortcode [cannacal_changelog] + Block „CannaCal Changelog" (includes/Changelog.php): rendert diese CHANGELOG.md als HTML (Überschriften, Listen, fett, code). Vorher gab es das nur als Datei – der Shortcode wurde daher nicht interpretiert. Pendant zu Weederkennens [navweed_changelog].

0.12.0 — Feinschliff CannaDaily

  • Button-Schrift weiß: Anchor-Buttons (z. B. „Neues Tagebuch") erzwingen jetzt weiße Schrift auf Grün — die Theme-Linkfarbe (blau) wurde per Spezifität überschrieben.
  • Redirect nach Eintrag: zeigt zuverlässig zurück auf die Grow-Tagebuchseite (deterministisch über die Detailseiten-URL) statt über Referer/Home auf dem Weederkennen-Dashboard zu landen. Nach „Tagebuch löschen" → Übersichtsseite.
  • Grow-Run-Nummer: Setup-Feld „Dein Grow-Run (Nummer)" (Auto-Vorschlag = nächster Lauf, anpassbar), gespeichert als cc_run; Anzeige als „Run #N" auf Dashboard-Karte und Tagebuch-Kopf.
  • Plan-Abgleich: Unter der Eintrags-Eingabe erscheint der heutige Plan-Hinweis, wenn für den Grow-Tag eine Aufgabe ansteht (z. B. Düngen) — „📋 Heute im Plan (Tag X): …" (aus dem GrowSchedule).

0.11.0 — Web-Kalender (Gesamt-Kalender im Frontend, iCal optional)

  • Neuer Shortcode [canna_daily_calendar] + Block „CannaDaily Kalender": zeigt den Gesamt-Kalender des Nutzers direkt auf der Website — alle Tagebücher (Anbau-Plan ab jeweiligem Start + alle Einträge), farbig je Grow. Damit wird das iCal-Abo optional (bleibt aber bestehen).
  • Renderer: FullCalendar v6 (MIT), self-hosted unter assets/vendor/fullcalendar.min.js (assets/js/calendar.js, Monats-/Listen-Ansicht). Events werden serverseitig aggregiert und inline geliefert (kein externer Request, nur eigene Daten, login-gated).
  • Graceful Fallback: fehlt die FullCalendar-Datei, rendert PHP automatisch eine Agenda-Liste (kommende Termine) — nie leer. Admin-Hinweis + Anleitung unter assets/vendor/READ_ME_FULLCALENDAR.txt.
  • Die FullCalendar-Datei kann ich nicht mitliefern (MIT-Lizenz, aber aus der Build-Umgebung nicht beschaffbar); einmalig herunterladen + ablegen (Pfad/Anleitung beigelegt).

0.10.0 — Seiten-Split: Übersicht vs. Detailseite

  • Neuer Übersichts-Shortcode [canna_daily_dashboard] + Block „CannaDaily Übersicht": zeigt nur die Tagebuch-Karten. Damit kannst du eine Übersichtsseite bauen mit [autoflower_calendar] + [canna_daily_dashboard] (Kalender + alle Tagebücher nebeneinander).
  • Die Karten verlinken auf die Detailseite mit [canna_daily] (auto-erkannt über den Shortcode, Option-Cache). Das einzelne Tagebuch + Einträge + Bearbeiten leben dort.
  • Back-Links („← Alle Tagebücher") führen zur Übersichtsseite, sofern vorhanden.
  • [canna_daily] bleibt abwärtskompatibel: ohne Übersichtsseite zeigt es weiterhin selbst das Dashboard.

0.9.0 — Pro-Grow-Kalenderfeed (Einträge im Kalender)

  • Neuer privater, tokengeschützter ICS-Feed je Tagebuch: Route /grow-kalender/{token}/ (includes/GrowFeed.php). Enthält Anbau-Schema (ab dem Startdatum dieses Grows) + Tagebuch-Einträge als Termine + die wöchentliche Erinnerung.
  • ICalBuilder erweitert: setDiaryEntries() (Einträge als VEVENTs) und setUidSalt() — Letzteres gibt jedem Grow eindeutige Event-UIDs, damit zwei Grows mit gleichem Startdatum (z. B. dieselbe Sorte in- & outdoor) sich in Kalender-Apps nicht überlagern.
  • Abo-Link in der Tagebuchseite (aufklappbar). Token = Bearer-Geheimnis (Tagebuch ist privat → Link nicht öffentlich teilen). Rewrite-Regel wird nach dem Update einmalig automatisch geflusht.
  • Der bestehende anonyme Datums-Kalender (/kalender/{base64}/) bleibt unverändert.

0.8.0 — Mehrere Tagebücher, Dashboard, editierbare Einträge (Refactor)

  • Einträge sind jetzt ein eigener CPT cc_entry (post_parent = Tagebuch) statt JSON-Meta — Grundlage für Bearbeiten pro Eintrag und späteres Teilen (analog Reviews). Einmalige, idempotente Migration der alten JSON-Einträge (cc_entries) in cc_entry-Posts; Roh-JSON bleibt als Fallback erhalten.
  • Mehrere Tagebücher parallel je Nutzer (z. B. gleiche Sorte in- & outdoor).
  • [canna_daily] ist jetzt ein Router: ohne Auswahl → Dashboard (Karten je Tagebuch mit Cover, „Tag X" seit Keimstart und Eintrags-Anzahl, Button „Neues Tagebuch"); ?cd_grow=IDTagebuchseite (changelog-artige Eintragsliste); ?cd_grow=ID&cd_edit=ENTRYEintrag bearbeiten; sonst Setup.
  • Jeder Eintrag editierbar (Datum, Notiz, Foto ersetzen/entfernen) und einzeln löschbar; Titelbild weiterhin pro Tagebuch markierbar. Alle Aktionen führen die konkrete Grow-/Eintrags-ID mit (Eigentümer-geprüft).
  • Read-API cannacal_user_strain_photo() und DSGVO-Eraser auf cc_entry umgestellt; Foto-Upload/EXIF-Strip/ Wetter-Stempel unverändert, hängen jetzt am Eintrag.
  • Teilen pro Eintrag ist damit vorbereitet, aber noch nicht gebaut (Folge-Schritt).

0.7.0 — Gutenberg-Blöcke (neben den Shortcodes)

  • Zwei dynamische Blöcke als dünne Hülle um die bestehenden Shortcodes (kein Markup-Duplikat, kein Build-Step – reines wp.*-JS): includes/Blocks.php + assets/js/blocks.js.
  • „CannaCal Grow-Kalender" (cannacal/calendar, render = cannacal_render_shortcode), mit optionalem Überschrift-Attribut.
  • „CannaDaily Tagebuch" (cannacal/diary, render = cannadaily_render_shortcode).
  • Im Editor je ein Platzhalter (Live-Vorschau nicht sinnvoll: Kalender braucht JS, Tagebuch Login); das Frontend rendert das echte Widget. Shortcodes bleiben unverändert nutzbar.

0.6.0 — CannaDaily Phase 2a: Fotos + Sorten-Verknüpfung (Quelle)

  • Foto-Upload pro Eintrag (media_handle_upload, multipart): Typ (jpg/png/webp) + Größe (≤ 5 MB) serverseitig geprüft, Attachment am Grow. Abonnenten-Upload via temporär gewährtem upload_files.
  • EXIF/GPS-Strip beim Upload (GD-Neukodierung) — kein Grow-Standort in den Metadaten.
  • Grow ↔ Sorte: cc_strain_ref (nw_strain-ID), Sortenwahl im Setup per Weederkennen-REST-Autocomplete (/wp-json/navweed/v1/strains, diary.js). Nur wenn Weederkennen aktiv (sonst Feld ausgeblendet → standalone).
  • Titelbild: Nutzer markiert ein Eintrags-Foto (cc_cover, Aktion set_cover, Eigentümer-geprüft).
  • Read-API cannacal_user_strain_photo($userId, $strainId) (global, helpers.php): liefert Titelbild, sonst neuestes Foto — Grundlage für Phase 2b (Anzeige in Weederkennen-Review + Sharepic).
  • DSGVO: Grow-Attachments werden bei „Grow löschen" und im Personal-Data-Eraser mitgelöscht.
  • Noch offen (2b): Anzeige des Fotos in der Weederkennen-Review und auf dem Sharepic (Opt-in) — separater Schritt im navweed-Plugin.

0.5.0 — CannaDaily: Standort (Photon) + DWD-Wetter

  • Standort-Autocomplete im Setup (outdoor): custom Photon-Feld (OpenStreetMap, kein Key, kein Google), assets/js/diary.js. Auswahl speichert Ort-Label + lat/lng (+ PLZ) ins Meta — datensparsam, debounced (ab 3 Zeichen). Ausrichtung (Himmelsrichtung) bleibt separat. Bewusst kein ACF (komplett custom).
  • DWD-Wetter pro Eintrag: neuer WeatherProvider (includes/WeatherProvider.php) holt das Tageswetter via Bright Sky (DWD Open Data) für die Koordinaten des Grows und stempelt es an jeden neuen Outdoor-Eintrag (Emoji + Lage + Temperatur + Luftfeuchte). Transient-Cache (6 h) pro Ort/Tag, graceful: kein/kaputtes Ergebnis → Eintrag ohne Wetter.
  • Anzeige: Wetter-Chip je Eintrag; Pflicht-Attribution „DWD via Bright Sky · OpenStreetMap/Photon".
  • Hinweis: Photon/Bright Sky sind öffentliche Dritt-Instanzen (Rate-Limit, self-hostbar) — für DSGVO/Last ggf. später Self-Host. Foto-Upload weiterhin offen (Phase 2).

0.4.0 — CannaDaily: Grow-Tagebuch (MVP, ohne Wetter)

  • Neues, eigenständiges Tagebuch auf WP-Core (CPT cc_grow, post_author = Nutzer; Einträge als JSON-Meta cc_entries). Kein eigenes Login, keine Weederkennen-Kopplung. (includes/Diary.php)
  • Shortcode [canna_daily] (frontend/diary.php): nur eingeloggt; Setup (indoor/outdoor; bei outdoor PLZ + Ausrichtung; Startdatum rückdatierbar bis 30 Tage), datierte Text-Einträge, Eintragsliste (neueste zuerst), „Grow löschen". Formulare per Nonce + PRG-Redirect.
  • CSS assets/css/diary.css in den Weederkennen-Tokens (--nw-* mit Fallbacks) inkl. Dunkel-Mode.
  • Wöchentliche Tagebuch-Erinnerung im Kalender-Feed: wiederkehrendes Event (RRULE:FREQ=WEEKLY;COUNT=16) ab Tag 7 — zustandslos, in jedem generierten ICS (ICalBuilder).
  • DSGVO: in den WP-Personal-Data-Eraser eingehängt (löscht alle Grows eines Nutzers).
  • Bewusst noch NICHT enthalten: Wetter-Stempel (DWD). Grund: das im Konzept geplante Bündeln der PLZ→Koordinaten-CSV ist aus der Build-Umgebung nicht möglich → Geocoding-Quelle muss vor 0.5.0 entschieden werden (siehe CannaCal_Konzept_Tagebuch.md). Foto-Upload ebenfalls Phase 2.

0.3.1 — Startdatum: Rückdatieren möglich

  • Startdatum-Feld erlaubt jetzt Vergangenheitsdaten bis 30 Tage zurück („schon angesetzt"), statt nur ab heute (shortcode.php: min = heute−30). Label klarer: „Wann hast du die Samen angesetzt – oder wann planst du es?".
  • Bewusst keine separate Checkbox: das Datum kodiert geplant (Zukunft) vs. bereits gestartet (Vergangenheit) — keine redundante zweite Bedienlogik.
  • Hinweis: Rückdatieren verkürzt die verbleibende Link-Gültigkeit (145 Tage ab Startdatum).

0.3.0 — Nachernte: Fermentierung + Curing (+4 Wochen)

  • Schema um eine zweistufige Nachernte verlängert (Tag 85 → ~113):
  • Stufe 1 Fermentierung (Tag 85 Start, Tag 92 Woche 1, tägliches Burpen).
  • Stufe 2 Curing (Tag 99 Beginn, Tag 106 Woche 3, Tag 113 abgeschlossen).
  • Neue Phasen fermentation + curing (GrowSchedule::getPhases()), Emoji 🫙 in ICalBuilder.
  • Der „nächster Zyklus"-Hinweis + §34-Hinweis wandern ans neue Ende (Tag 113).
  • Gekoppelter Pflicht-Fix: Abo-Ablauf von 90 → 145 Tage angehoben (Server::EXPIRY_DAYS, genutzt in isExpired, PROPFIND-Fenster und Fehlertext) — sonst stürben die Curing-Events hinter der alten 90-Tage-Grenze. Frontend (frontend.js EXPIRY_DAYS, Shortcode-Anzeige „145 Tage", Termin-Zähler) synchron nachgezogen.

0.2.0 — Weederkennen-Integration (Phase 1a + 1b)

Design (1a)

  • assets/css/frontend.css komplett von der eigenen --cc-*-Glassmorphism-Optik auf die Weederkennen-Tokens (--nw-green, --nw-line, --nw-surface-soft, --nw-ink, --nw-star, --nw-radius*) umgestellt — flach, ohne Gradients/Glow/Float-Animation.
  • Tokens werden per var(--nw-*, fallback) referenziert: mit aktivem Weederkennen erbt das Widget dessen Marke; Dunkel-Mode via html[data-nw-theme="dark"]-Overrides; standalone greifen die Fallbacks.

Branding (1a)

  • iCal-Feed rebranded: PRODID, X-WR-CALNAME, UID-Domain (@weederkennen.de) und Footer (🌐 weederkennen.de) in ICalBuilder.php; PROPFIND-displayname/-Beschreibung + ICS-Dateiname in CalDAV/Server.php; Legal-Footer-Link im Shortcode (cannacal.ioweederkennen.de).
  • Naming „CannaCal" → „Weederkennen Grow" (im Feed/Abo sichtbar).

Kopplung (1b)

  • Neuer globaler Helper cannacal_calendar_page_url(int $strainId = 0) (frontend/helpers.php, bewusst global für function_exists()-Detection durch Weederkennen): findet die Seite mit dem [autoflower_calendar]-Shortcode (Option-Cache + Revalidierung), hängt optional ?nw_strain=ID an.
  • Shortcode nimmt den Sorten-Kontext (?nw_strain) auf und zeigt ihn als Chip „Für deine Sorte: …"; cached zugleich die eigene Seiten-ID für den Helper.
  • Gegenstück in Weederkennen (strain-view.php, ab navweed 0.35.7): CTA „🌱 Grow-Kalender starten" nur auf Autoflower-Sorten, function_exists()-gekapselt.

0.1.0 — Erststand (Bestandsaufnahme)

  • Autoflower-Grow-Kalender als CalDAV/ICS-Abo.
  • Rewrite-Route /kalender/{base64-datum}/; CalDAV-Server (GET/HEAD/OPTIONS/PROPFIND), Slug- Decode + checkdate-Validierung, 90-Tage-Ablauf (410).
  • RFC-5545-iCal: All-Day-VEVENTs, 24h-VALARM, Text-Escaping, 75-Oktett-Folding, Europe/Berlin.
  • Statisches Schema (GrowSchedule): ~25 Events, Phasen Vorbereitung→Ernte, Biobizz-Düngung, Ernte-Fenster Tag 70–85 (bewusst beibehalten).
  • Per-Tag-Content-Blöcke infotainment + werbepartner (JSON in wp_options); basis = Event- eigene Beschreibung (die separate basis-Option ist vestigial/ungenutzt).
  • Shortcode [autoflower_calendar] (Datum → URL, Kopieren, Plattform-Tabs); Admin mit 2 Tabs.
  • Moderne Code-Basis: Namespace CannaCal\, declare(strict_types=1), OOP/Singleton.
Nach oben scrollen