{ config, ... }: { config.types.event = event@{ lib, ... }: let inherit (lib) mkOption types; in { imports = [ config.types.document ]; options = { title = mkOption { description = '' Übeschrift für den Termin ''; type = types.singleLineStr; }; summary = mkOption { description = '' Kurzbeschreibung des Termins ''; type = with types; nullOr singleLineStr; default = null; }; aside = mkOption { description = '' Anmerkung zur Beschreibung ''; type = with types; nullOr singleLineStr; default = null; }; description = mkOption { description = '' Beschreibung des Termins als Freitext ''; type = with types; nullOr str; default = null; }; data = mkOption { description = '' Semistrukturierte Daten über den Termin ''; type = with types; listOf (submodule { options = { name = mkOption { type = singleLineStr; }; value = mkOption { type = singleLineStr; }; }; }); example = [ { name = "Eintritt"; value = "frei – um Spenden wird gebeten"; } ]; default = [ ]; }; links = mkOption { description = '' Links zu weiteren Informationen ''; type = with types; listOf (submodule { options = { text = mkOption { type = singleLineStr; }; url = mkOption { type = strMatching "^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\\?([^#]*))?(#(.*))?"; }; external = mkOption { type = bool; default = true; }; }; }); default = [ ]; example = { text = "Details beim Veranstalter"; url = "https://examle.org/event/123"; }; }; hosts = mkOption { description = '' Veranstalter ''; type = with types; listOf (submodule { options = { name = mkOption { type = singleLineStr; }; url = mkOption { type = strMatching "^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\\?([^#]*))?(#(.*))?"; }; }; }); default = [ ]; example = { name = "Stadtteilbeirat Heimfeld"; url = "https://heimfeld.harburg"; }; }; date.start = mkOption { description = '' Datum des Termins ''; type = types.strMatching "[0-9]{4}-[0-9]{2}-[0-9]{2}"; example = "2025-12-20"; }; date.end = mkOption { description = '' Enddatum des Termins ''; type = with types; nullOr (strMatching "[0-9]{4}-[0-9]{2}-[0-9]{2}"); example = "2025-12-21"; default = null; }; time.start = mkOption { description = '' Startzeit des Termins ''; type = types.strMatching "[0-9]{2}:[0-9]{2}"; example = "17:00"; }; time.end = mkOption { description = '' Endzeit des Termins ''; type = with types; nullOr (strMatching "[0-9]{2}:[0-9]{2}"); example = "19:00"; default = null; }; datetime-range-text = mkOption { description = '' Zeitraum des Termins in Textform ''; type = types.str; example = "Samstag, 20.12.2025 von 15:00 bis 17:00 Uhr"; }; address.name = mkOption { description = '' Eigenname des Veranstaltungsorts ''; type = with types; nullOr str; example = "Treffpunkthaus"; default = null; }; address.text = mkOption { description = '' Ort in Textform ''; type = types.lines; }; address.openstreetmap = mkOption { description = '' Ort auf OpenStreetMap ''; type = with types; attrTag { way = mkOption { type = ints.positive; }; node = mkOption { type = ints.positive; }; }; example = { node = 6549438363; }; }; }; }; }