{
  "i18n": true,
  "type": "panel",
  "items": {
    "_urlHeader": {
      "type": "header",
      "text": "Custom URL (optional)",
      "size": 2,
      "xs": 12,
      "sm": 12,
      "md": 12,
      "lg": 12,
      "xl": 12
    },
    "customUrl": {
      "type": "text",
      "label": "Base URL",
      "placeholder": "https://your-domain.com",
      "help": "Override the links shown in ioBroker overview and instances. Leave empty to use the default (http://<ip>:<port>).",
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "_serverHeader": {
      "type": "header",
      "text": {
        "en": "Frontend configuration",
        "de": "Frontend-Konfiguration"
      },
      "size": 2,
      "xs": 12,
      "sm": 12,
      "md": 12,
      "lg": 12,
      "xl": 12
    },
    "port": {
      "type": "number",
      "label": {
        "en": "Port",
        "de": "Port"
      },
      "help": {
        "en": "Port for the aura HTTP server (frontend + iframe proxy). Must be free and reachable in your network. Default: 8095.",
        "de": "Port für den aura HTTP-Server (Frontend + iFrame-Proxy). Muss frei und im Netzwerk erreichbar sein. Standard: 8095."
      },
      "min": 1024,
      "max": 65535,
      "default": 8095,
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "socketUrl": {
      "type": "text",
      "label": {
        "en": "ioBroker socket URL (override)",
        "de": "ioBroker Socket-URL (Override)"
      },
      "help": {
        "en": "Override the socket URL injected into the frontend. Leave empty for auto-detection (http(s)://<host>:<socketPort>). Set this when using a reverse proxy — e.g. 'https://your-domain.com' if nginx proxies /socket.io/ and /echarts/ to the web adapter port.",
        "de": "Überschreibt die in das Frontend injizierte Socket-URL. Leer lassen für automatische Erkennung (http(s)://<Host>:<socketPort>). Setzen bei Reverse-Proxy — z.B. 'https://deine-domain.de' wenn nginx /socket.io/ und /echarts/ zum Web-Adapter-Port weiterleitet."
      },
      "placeholder": "https://your-domain.com",
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "socketPort": {
      "type": "number",
      "label": {
        "en": "ioBroker socket port",
        "de": "ioBroker Socket-Port"
      },
      "help": {
        "en": "Port of the iobroker.web instance that provides the socket.io connection (default: 8082).",
        "de": "Port der iobroker.web-Instanz, die die socket.io-Verbindung bereitstellt (Standard: 8082)."
      },
      "min": 1024,
      "max": 65535,
      "default": 8082,
      "xs": 12,
      "sm": 12,
      "md": 4,
      "lg": 4,
      "xl": 4
    },
    "socketSecure": {
      "type": "checkbox",
      "label": {
        "en": "Web adapter uses HTTPS",
        "de": "Web-Adapter nutzt HTTPS"
      },
      "help": {
        "en": "Enable if the iobroker.web instance at the socket port has HTTPS activated. Aura will then connect internally via wss/https (self-signed certificates are accepted).",
        "de": "Aktivieren wenn die iobroker.web-Instanz am Socket-Port HTTPS aktiviert hat. Aura verbindet dann intern über wss/https (selbstsignierte Zertifikate werden akzeptiert)."
      },
      "xs": 12,
      "sm": 12,
      "md": 4,
      "lg": 4,
      "xl": 4
    },
    "_tlsHeader": {
      "type": "header",
      "text": {
        "en": "HTTPS / TLS",
        "de": "HTTPS / TLS"
      },
      "size": 2,
      "xs": 12,
      "sm": 12,
      "md": 12,
      "lg": 12,
      "xl": 12
    },
    "secure": {
      "type": "checkbox",
      "label": {
        "en": "Use HTTPS",
        "de": "HTTPS verwenden"
      },
      "help": {
        "en": "Enable TLS for the built-in HTTP server. Certificates are loaded from ioBroker system.certificates. Note: self-signed default certificates will cause a browser warning.",
        "de": "TLS für den eingebauten HTTP-Server aktivieren. Zertifikate werden aus ioBroker system.certificates geladen. Hinweis: Standard-selbstsignierte Zertifikate erzeugen eine Browser-Warnung."
      },
      "default": false,
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "certPublic": {
      "type": "certificate",
      "certType": "public",
      "label": {
        "en": "Public certificate",
        "de": "Öffentliches Zertifikat"
      },
      "hidden": "!data.secure",
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "certPrivate": {
      "type": "certificate",
      "certType": "private",
      "label": {
        "en": "Private key",
        "de": "Privater Schlüssel"
      },
      "hidden": "!data.secure",
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "certChained": {
      "type": "certificate",
      "certType": "chained",
      "label": {
        "en": "Chained certificate",
        "de": "Kettenzertifikat"
      },
      "hidden": "!data.secure",
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "_fsHeader": {
      "type": "header",
      "text": {
        "en": "Image / file paths",
        "de": "Bild- / Dateipfade"
      },
      "size": 2,
      "xs": 12,
      "sm": 12,
      "md": 12,
      "lg": 12,
      "xl": 12
    },
    "fsRoots": {
      "type": "table",
      "label": {
        "en": "Allowed root folders",
        "de": "Erlaubte Wurzelverzeichnisse"
      },
      "help": {
        "en": "Folders the file picker (e.g. image widget) may browse. Add absolute paths for your operating system — Linux: /opt/iobroker/iobroker-data/files · macOS: /Users/you/Pictures · Windows: C:\\Users\\you\\Pictures. Subfolders are included automatically.",
        "de": "Verzeichnisse, die der Datei-Picker (z. B. Bild-Widget) durchsuchen darf. Absolute Pfade für dein Betriebssystem eintragen — Linux: /opt/iobroker/iobroker-data/files · macOS: /Users/du/Bilder · Windows: C:\\Users\\du\\Bilder. Unterordner werden automatisch einbezogen."
      },
      "items": [
        {
          "type": "text",
          "attr": "label",
          "width": "35%",
          "title": {
            "en": "Label",
            "de": "Bezeichnung"
          }
        },
        {
          "type": "text",
          "attr": "path",
          "width": "65%",
          "title": {
            "en": "Absolute path",
            "de": "Absoluter Pfad"
          }
        }
      ],
      "xs": 12,
      "sm": 12,
      "md": 12,
      "lg": 12,
      "xl": 12
    },
    "_timerHeader": {
      "type": "header",
      "text": {
        "en": "Timer widget scheduler",
        "de": "Zeitschaltuhr-Scheduler"
      },
      "size": 2,
      "xs": 12,
      "sm": 12,
      "md": 12,
      "lg": 12,
      "xl": 12
    },
    "timerTickSeconds": {
      "type": "number",
      "label": {
        "en": "Tick interval (s)",
        "de": "Prüfintervall (s)"
      },
      "help": {
        "en": "How often the backend scheduler checks for due timer events. Lower = more precise but more CPU. Range: 5–600. Default: 30.",
        "de": "Wie oft der Backend-Scheduler nach fälligen Zeitschaltuhr-Ereignissen prüft. Kleiner = präziser, aber mehr CPU. Bereich: 5–600. Standard: 30."
      },
      "min": 5,
      "max": 600,
      "default": 30,
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "_perfHeader": {
      "type": "header",
      "text": {
        "en": "Performance diagnostics",
        "de": "Performance-Diagnose"
      },
      "size": 2,
      "xs": 12,
      "sm": 12,
      "md": 12,
      "lg": 12,
      "xl": 12
    },
    "perfTracking": {
      "type": "checkbox",
      "label": {
        "en": "Record load-time metrics",
        "de": "Ladezeiten-Metriken aufzeichnen"
      },
      "help": {
        "en": "Collect page-level load metrics (initial load, first paint, socket warm-up, tab switch, long tasks) and backend command round-trip times. Overhead is negligible. Feeds the Ladezeiten widget.",
        "de": "Erfasst seitenweite Ladezeiten (Initial-Load, First Paint, Socket-Warmup, Tab-Wechsel, Long-Tasks) und Backend-Antwortzeiten. Vernachlässigbarer Overhead. Speist das Ladezeiten-Widget."
      },
      "default": true,
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    },
    "perfWidgetTracking": {
      "type": "checkbox",
      "label": {
        "en": "Record per-widget timing (higher overhead)",
        "de": "Timing pro Widget aufzeichnen (höherer Overhead)"
      },
      "help": {
        "en": "Additionally measure render and ready time for every widget so the Ladezeiten widget can show which widget is slow. This instruments every widget on every render — enable only to diagnose a problem, then turn it off.",
        "de": "Misst zusätzlich Render- und Bereit-Zeit für jedes Widget, damit das Ladezeiten-Widget anzeigt, welches Widget langsam ist. Instrumentiert jedes Widget bei jedem Render — nur zur Fehlersuche aktivieren, danach wieder ausschalten."
      },
      "default": false,
      "disabled": "!data.perfTracking",
      "xs": 12,
      "sm": 12,
      "md": 6,
      "lg": 4,
      "xl": 4
    }
  }
}
