{"id":2356,"date":"2026-07-27T09:09:45","date_gmt":"2026-07-27T07:09:45","guid":{"rendered":"https:\/\/cad-kompass.de\/?page_id=2356"},"modified":"2026-07-28T11:02:15","modified_gmt":"2026-07-28T09:02:15","slug":"logbuch","status":"publish","type":"page","link":"https:\/\/cad-kompass.de\/?page_id=2356","title":{"rendered":"Logbuch"},"content":{"rendered":"\n<!--\nCAD-Kompass Logbuch \u2014 \u00dcbersichts-Seite\nWordPress-Embed-Snippet (Custom HTML Block f\u00fcr eigene WP-Seite)\n\nLiest denselben localStorage-Key cadk_logbook_v1 wie die Sidebar und zeigt\nALLE Eintr\u00e4ge \u00fcber alle Tutorial-\/Tool-Seiten hinweg an. Funktioniert weil\nlocalStorage per Origin scoped ist und diese Seite auf der gleichen Domain\nwie die Tutorials liegt.\n\nKeine Server-Komponente. Keine Cookies. Kein Tracking.\nTTDSG \u00a725 Abs. 2 Nr. 2 \u2014 nutzerinitiierte Funktion, kein Banner n\u00f6tig.\n\nKlassen-Prefix: lo-  (Logbuch-\u00dcbersicht)\nOptik: Header und Kompassrose 1:1 wie bei den Men\u00fc-Hub-\/Kapit\u00e4n-Seiten (cad-Prefix,\n       siehe 00-Website-Design\/Menue-Hauptseiten\/_VORLAGE-menue-hub.html und\n       10-Kapit\u00e4n\/html\/kapit\u00e4n.html). Das Funktions-UI darunter (Toolbar, Filter,\n       Eintragsliste, Aktionen) bleibt die eigenst\u00e4ndige Logbuch-Optik (lo-Prefix),\n       nur Farbwerte\/Radien sind auf die Hub-Palette abgestimmt.\n-->\n\n<style>\n.lo-page { max-width: 1240px; margin: 0 auto; padding: 8px 0 40px; font-family: inherit; color: #334155; line-height: 1.65; }\n.lo-page *, .lo-page *::before, .lo-page *::after { box-sizing: border-box; }\n.lo-page p { margin: 0 0 14px; }\n\n\/* ===== Hero + Kompass (identisch zu den Men\u00fc-Hub-\/Kapit\u00e4n-Seiten) ===== *\/\n.cad-hero {\n    --cad-grid-x: 0px;\n    --cad-grid-y: 0px;\n    position: relative;\n    background: #2f485b;\n    color: #fff;\n    border-radius: 2px;\n    padding: 17px 28px;\n    margin-bottom: 38px;\n    overflow: hidden;\n    display: flex;\n    align-items: center;\n    min-height: 96px;\n    border: 1px solid rgba(255,255,255,0.16);\n    box-shadow: inset 0 -1px 0 rgba(255,255,255,0.2);\n}\n.cad-hero::before {\n    content: \"\";\n    position: absolute; inset: -16px;\n    background-image:\n        linear-gradient(rgba(255,255,255,0.06) 1px, transparent 1px),\n        linear-gradient(90deg, rgba(255,255,255,0.06) 1px, transparent 1px);\n    background-size: 28px 28px;\n    opacity: 0.48;\n    pointer-events: none;\n    transform: translate3d(var(--cad-grid-x, 0px), var(--cad-grid-y, 0px), 0);\n    transition: transform 0.5s cubic-bezier(0.2, 0.8, 0.4, 1);\n}\n.cad-hero-text { position: relative; z-index: 2; max-width: 760px; }\n.cad-hero-eyebrow {\n    font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.18em;\n    font-weight: 600; color: rgba(255,255,255,0.72); margin-bottom: 8px;\n}\n.cad-hero-title {\n    font-size: 1.34rem; font-weight: 700; line-height: 1.25;\n    margin: 0; color: #fff; letter-spacing: -0.005em;\n}\n.cad-hero-meta {\n    margin-top: 8px;\n    font-family: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n    font-size: 0.73rem; color: rgba(255,255,255,0.7); letter-spacing: 0.04em;\n}\n.cad-compass {\n    position: absolute; z-index: 1; right: -76px; top: 50%;\n    width: 320px; height: 320px; transform: translateY(-50%);\n    display: flex; align-items: center; justify-content: center;\n    opacity: 0.44; pointer-events: none;\n}\n.cad-compass svg { width: 100%; height: 100%; display: block; }\n.cad-compass-rose, .cad-compass-secondary { transform-box: fill-box; transform-origin: center; }\n.cad-compass-rose { transition: transform 0.55s cubic-bezier(0.34, 1.2, 0.64, 1); }\n@media (prefers-reduced-motion: reduce) { .cad-compass-rose { transition: none; } }\n@media (prefers-reduced-motion: no-preference) {\n    .cad-compass-secondary { animation: cadLogCompassSpinReverse 140s linear infinite; }\n    @keyframes cadLogCompassSpinReverse { to { transform: rotate(-360deg); } }\n}\n\n.lo-root, .lo-root *, .lo-root *::before, .lo-root *::after { box-sizing: border-box; }\n\n.lo-root {\n    --lo-primary:       #3f5f75;\n    --lo-primary-dark:  #2c4a5e;\n    --lo-primary-light: #edf3f7;\n    --lo-primary-pale:  #f5f8fb;\n    --lo-accent:        #e8913a;\n    --lo-ink:           #1e293b;\n    --lo-text:          #334155;\n    --lo-muted:         #64748b;\n    --lo-faint:         #94a3b8;\n    --lo-bg:            #ffffff;\n    --lo-surface:       #f7f9fb;\n    --lo-border:        #c8d6e0;\n    --lo-border-light:  #eef2f6;\n    --lo-danger:        #c0392b;\n    --lo-mark-yellow:   #fff3a3;\n    --lo-mark-green:    #c8e6c9;\n    --lo-mark-orange:   #ffd6a8;\n    --lo-radius:        2px;\n    --lo-radius-md:     3px;\n    --lo-shadow:        0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.04);\n    --lo-shadow-md:     0 4px 8px rgba(0,0,0,0.08);\n    --lo-transition:    0.18s ease;\n\n    font-family: inherit;\n    color: var(--lo-text);\n    background: var(--lo-surface);\n    border: 2px solid var(--lo-primary);\n    border-radius: var(--lo-radius);\n    overflow: hidden;\n    box-shadow: var(--lo-shadow);\n    margin: 0 0 28px;\n    position: relative;\n    line-height: 1.6;\n}\n\n\/* Privacy-Banner \u2014 identisch zu bf-privacy *\/\n.lo-privacy {\n    background: #f0fdf4;\n    border-bottom: 1px solid #bbf7d0;\n    padding: 9px 14px;\n    font-size: 0.8rem;\n    color: #15803d;\n    line-height: 1.5;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n}\n.lo-privacy::before { content: '\\1F512'; flex-shrink: 0; font-size: 0.9rem; }\n.lo-privacy-text { flex: 1; }\n.lo-info-wrap { position: relative; display: inline-flex; }\n.lo-info-trigger {\n    width: 18px;\n    height: 18px;\n    border-radius: 50%;\n    border: 1.5px solid #15803d;\n    background: transparent;\n    color: #15803d;\n    font-family: Georgia, 'Times New Roman', serif;\n    font-style: italic;\n    font-weight: 700;\n    font-size: 11px;\n    line-height: 1;\n    padding: 0;\n    cursor: pointer;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    flex-shrink: 0;\n    transition: background var(--lo-transition), color var(--lo-transition);\n}\n.lo-info-trigger:hover { background: #15803d; color: #fff; }\n.lo-info-trigger:focus { outline: 2px solid #15803d; outline-offset: 1px; }\n.lo-info-pop {\n    position: fixed;\n    width: 340px;\n    max-width: calc(100vw - 32px);\n    background: var(--lo-bg);\n    color: var(--lo-text);\n    border: 1px solid var(--lo-border);\n    border-radius: var(--lo-radius-md);\n    box-shadow: 0 8px 22px rgba(0,0,0,0.14);\n    padding: 14px 16px;\n    font-size: 0.82rem;\n    line-height: 1.5;\n    z-index: 50;\n    display: none;\n}\n.lo-info-pop[data-open=\"1\"] { display: block; }\n.lo-info-pop h4 {\n    margin: 0 0 8px;\n    font-size: 0.85rem;\n    font-weight: 700;\n    color: var(--lo-ink);\n}\n.lo-info-pop ul {\n    margin: 0 0 8px;\n    padding: 0 0 0 18px;\n    list-style: disc;\n}\n.lo-info-pop li { margin: 0 0 4px; }\n.lo-info-pop p { margin: 0; font-size: 0.75rem; color: var(--lo-muted); }\n.lo-info-pop code {\n    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n    font-size: 0.75rem;\n    background: var(--lo-surface);\n    padding: 0 4px;\n    border-radius: 2px;\n}\n\n\/* Toolbar *\/\n.lo-toolbar {\n    background: var(--lo-bg);\n    padding: 16px 22px;\n    border-bottom: 1px solid var(--lo-border-light);\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n}\n.lo-toolbar-row {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 10px;\n    align-items: center;\n}\n.lo-search {\n    flex: 1 1 240px;\n    min-width: 0;\n    padding: 10px 12px;\n    font-size: 0.92rem;\n    border: 1px solid var(--lo-border);\n    border-radius: var(--lo-radius);\n    font-family: inherit;\n    color: var(--lo-ink);\n    background: var(--lo-bg);\n    transition: border-color var(--lo-transition), box-shadow var(--lo-transition);\n    -webkit-appearance: none;\n}\n.lo-search:focus {\n    outline: none;\n    border-color: var(--lo-primary);\n    box-shadow: 0 0 0 2px rgba(63,95,117,0.12);\n}\n.lo-search::placeholder { color: var(--lo-faint); }\n\n\/* View-Tabs \u2014 identisch zu massstabsrechner .ms-tabs *\/\n.lo-tabs {\n    display: inline-flex;\n    border: 1px solid var(--lo-border);\n    border-radius: var(--lo-radius);\n    overflow: hidden;\n    background: var(--lo-bg);\n}\n.lo-tab {\n    padding: 9px 16px;\n    background: var(--lo-bg);\n    border: none;\n    border-right: 1px solid var(--lo-border);\n    cursor: pointer;\n    font-family: inherit;\n    font-size: 0.85rem;\n    font-weight: 600;\n    color: var(--lo-muted);\n    transition: background var(--lo-transition), color var(--lo-transition);\n}\n.lo-tab:last-child { border-right: none; }\n.lo-tab:hover { background: var(--lo-primary-pale); color: var(--lo-ink); }\n.lo-tab[aria-selected=\"true\"] {\n    background: var(--lo-primary);\n    color: #fff;\n}\n\n.lo-sort {\n    padding: 9px 12px;\n    font-size: 0.85rem;\n    border: 1px solid var(--lo-border);\n    border-radius: var(--lo-radius);\n    background: var(--lo-bg);\n    color: var(--lo-text);\n    font-family: inherit;\n    cursor: pointer;\n}\n.lo-sort:focus { outline: none; border-color: var(--lo-primary); box-shadow: 0 0 0 2px rgba(63,95,117,0.12); }\n\n\/* Filter-Chips \u2014 identisch zu bf-filter-btn *\/\n.lo-filters {\n    display: flex;\n    gap: 6px;\n    flex-wrap: wrap;\n    align-items: center;\n}\n.lo-filters-label {\n    font-size: 0.7rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.06em;\n    color: var(--lo-muted);\n    margin-right: 2px;\n}\n.lo-chip {\n    padding: 5px 12px;\n    font-size: 0.82rem;\n    font-family: inherit;\n    border: 1px solid var(--lo-border);\n    border-radius: var(--lo-radius);\n    background: var(--lo-bg);\n    color: var(--lo-muted);\n    cursor: pointer;\n    transition: background var(--lo-transition), color var(--lo-transition), border-color var(--lo-transition);\n    line-height: 1.4;\n    display: inline-flex;\n    align-items: center;\n    gap: 5px;\n}\n.lo-chip:hover { background: var(--lo-primary-pale); border-color: var(--lo-primary); color: var(--lo-ink); }\n.lo-chip[aria-pressed=\"true\"] {\n    background: var(--lo-primary);\n    color: #fff;\n    border-color: var(--lo-primary);\n}\n.lo-chip:focus { outline: 2px solid var(--lo-primary); outline-offset: 1px; }\n\/* Farb-Chips: kleine Farbkugel im Chip *\/\n.lo-chip-dot {\n    width: 12px; height: 12px;\n    border-radius: 50%;\n    border: 1px solid rgba(0,0,0,0.12);\n    display: inline-block;\n    flex-shrink: 0;\n}\n.lo-chip-dot--yellow { background: var(--lo-mark-yellow); }\n.lo-chip-dot--green  { background: var(--lo-mark-green); }\n.lo-chip-dot--orange { background: var(--lo-mark-orange); }\n\n.lo-reset {\n    margin-left: auto;\n    background: none;\n    border: none;\n    color: var(--lo-muted);\n    font-family: inherit;\n    font-size: 0.8rem;\n    text-decoration: underline;\n    cursor: pointer;\n    padding: 4px 2px;\n}\n.lo-reset:hover { color: var(--lo-primary-dark); }\n.lo-reset:focus-visible { outline: 2px solid var(--lo-primary); outline-offset: 1px; }\n\n\/* Bulk-Bar *\/\n.lo-bulkbar {\n    display: none;\n    padding: 10px 22px;\n    background: var(--lo-primary-light);\n    border-bottom: 1px solid var(--lo-border);\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n}\n.lo-bulkbar.lo-bulkbar--visible { display: flex; }\n.lo-bulkbar-count {\n    font-size: 0.85rem;\n    font-weight: 700;\n    color: var(--lo-primary-dark);\n    margin-right: auto;\n}\n.lo-bulkbar-btn {\n    padding: 6px 12px;\n    font-size: 0.78rem;\n    font-weight: 600;\n    border: 1px solid var(--lo-border);\n    background: var(--lo-bg);\n    color: var(--lo-text);\n    border-radius: var(--lo-radius);\n    font-family: inherit;\n    cursor: pointer;\n    transition: background var(--lo-transition), border-color var(--lo-transition), color var(--lo-transition);\n}\n.lo-bulkbar-btn:hover { border-color: var(--lo-primary); background: var(--lo-primary-pale); color: var(--lo-primary-dark); }\n.lo-bulkbar-btn:focus-visible { outline: 2px solid var(--lo-primary); outline-offset: 1px; }\n.lo-bulkbar-btn--danger:hover { border-color: var(--lo-danger); color: var(--lo-danger); background: rgba(192,57,43,0.06); }\n.lo-bulkbar-recolor { position: relative; display: inline-block; }\n.lo-bulkbar-recolor-menu {\n    display: none;\n    position: absolute;\n    top: 100%;\n    left: 0;\n    margin-top: 4px;\n    background: var(--lo-bg);\n    border: 1px solid var(--lo-border);\n    border-radius: var(--lo-radius);\n    box-shadow: var(--lo-shadow-md);\n    padding: 6px;\n    z-index: 100;\n    gap: 6px;\n}\n.lo-bulkbar-recolor.lo-open .lo-bulkbar-recolor-menu { display: flex; }\n.lo-bulkbar-recolor-menu .lo-color-btn {\n    width: 26px; height: 26px;\n    border-radius: 50%;\n    border: 2px solid var(--lo-border);\n    cursor: pointer;\n    padding: 0;\n    transition: transform var(--lo-transition);\n}\n.lo-bulkbar-recolor-menu .lo-color-btn:hover { transform: scale(1.1); }\n.lo-bulkbar-recolor-menu .lo-color-btn:focus-visible { outline: 2px solid var(--lo-primary); outline-offset: 2px; }\n.lo-bulkbar-recolor-menu .lo-color-btn--yellow { background: var(--lo-mark-yellow); }\n.lo-bulkbar-recolor-menu .lo-color-btn--green  { background: var(--lo-mark-green); }\n.lo-bulkbar-recolor-menu .lo-color-btn--orange { background: var(--lo-mark-orange); }\n\n\/* Hauptbereich *\/\n.lo-main { padding: 18px 22px 22px; background: var(--lo-surface); min-height: 280px; }\n.lo-select-all {\n    font-size: 0.78rem;\n    color: var(--lo-muted);\n    margin-bottom: 12px;\n    display: flex;\n    align-items: center;\n    gap: 6px;\n}\n.lo-select-all-cb { margin: 0; cursor: pointer; }\n.lo-select-all-label { cursor: pointer; user-select: none; }\n\n\/* Seiten-Karten (gruppierte Ansicht) \u2014 Pattern aus bf-card *\/\n.lo-page-card {\n    background: var(--lo-bg);\n    border: 1px solid var(--lo-border-light);\n    border-left: 3px solid var(--lo-primary);\n    border-radius: 0 var(--lo-radius) var(--lo-radius) 0;\n    margin-bottom: 14px;\n    box-shadow: var(--lo-shadow);\n    overflow: hidden;\n}\n.lo-page-head {\n    padding: 12px 16px 10px;\n    background: var(--lo-bg);\n    border-bottom: 1px solid var(--lo-border-light);\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n}\n.lo-page-icon {\n    width: 22px; height: 22px;\n    color: var(--lo-primary);\n    flex-shrink: 0;\n}\n.lo-page-info { flex: 1 1 240px; min-width: 0; }\n.lo-page-title {\n    font-size: 1.02rem;\n    font-weight: 700;\n    color: var(--lo-ink);\n    margin: 0;\n    line-height: 1.3;\n    word-wrap: break-word;\n}\n.lo-page-url {\n    font-size: 0.74rem;\n    color: var(--lo-muted);\n    word-wrap: break-word;\n    overflow-wrap: anywhere;\n    margin-top: 2px;\n}\n.lo-page-meta { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }\n.lo-page-count {\n    font-size: 0.7rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.06em;\n    color: var(--lo-muted);\n    background: var(--lo-primary-light);\n    padding: 3px 8px;\n    border-radius: var(--lo-radius);\n}\n.lo-page-link {\n    font-size: 0.78rem;\n    color: var(--lo-primary);\n    text-decoration: none;\n    font-weight: 600;\n    padding: 5px 10px;\n    border: 1px solid var(--lo-border);\n    border-radius: var(--lo-radius);\n    background: var(--lo-bg);\n    transition: background var(--lo-transition), border-color var(--lo-transition);\n    white-space: nowrap;\n}\n.lo-page-link:hover { background: var(--lo-primary-pale); border-color: var(--lo-primary); color: var(--lo-primary-dark); }\n.lo-page-link:focus-visible { outline: 2px solid var(--lo-primary); outline-offset: 1px; }\n\n\/* Eintrags-Liste innerhalb einer Seitenkarte (gruppiert) *\/\n.lo-entries { list-style: none; margin: 0; padding: 0; }\n\n\/* Eintrag \u2014 Grid analog Sidebar .lb-item *\/\n.lo-entry {\n    display: grid;\n    grid-template-columns: 22px 8px 1fr auto;\n    gap: 10px;\n    align-items: flex-start;\n    padding: 11px 16px;\n    border-top: 1px solid var(--lo-border-light);\n    cursor: default;\n    transition: background var(--lo-transition);\n}\n.lo-entry:first-child { border-top: none; }\n.lo-entry:hover { background: var(--lo-primary-pale); }\n.lo-entry-cb { margin: 2px 0 0; cursor: pointer; }\n.lo-entry-swatch {\n    width: 8px;\n    min-height: 24px;\n    align-self: stretch;\n    border-radius: 2px;\n    margin-top: 2px;\n}\n.lo-entry-swatch--yellow { background: var(--lo-mark-yellow); }\n.lo-entry-swatch--green  { background: var(--lo-mark-green); }\n.lo-entry-swatch--orange { background: var(--lo-mark-orange); }\n.lo-entry-swatch--accent { background: var(--lo-accent); }\n.lo-entry-swatch--primary { background: var(--lo-primary); }\n.lo-entry-body { min-width: 0; }\n.lo-entry-meta {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    flex-wrap: wrap;\n    margin-bottom: 2px;\n}\n.lo-entry-type {\n    font-size: 0.65rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.07em;\n    color: var(--lo-muted);\n}\n.lo-entry-page-badge {\n    font-size: 0.66rem;\n    font-weight: 600;\n    color: var(--lo-primary-dark);\n    background: var(--lo-primary-light);\n    padding: 2px 7px;\n    border-radius: var(--lo-radius);\n    white-space: nowrap;\n    max-width: 240px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n.lo-entry-text {\n    font-size: 0.88rem;\n    line-height: 1.5;\n    color: var(--lo-ink);\n    word-wrap: break-word;\n    overflow-wrap: break-word;\n    white-space: pre-wrap;\n    display: -webkit-box;\n    -webkit-line-clamp: 4;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n}\n.lo-entry-time {\n    font-size: 0.7rem;\n    color: var(--lo-muted);\n    margin-top: 3px;\n}\n.lo-entry-actions {\n    display: flex;\n    gap: 2px;\n    align-self: flex-start;\n}\n.lo-entry-action {\n    background: none;\n    border: none;\n    color: var(--lo-muted);\n    cursor: pointer;\n    padding: 4px 6px;\n    min-width: 34px;\n    min-height: 34px;\n    border-radius: var(--lo-radius);\n    transition: background var(--lo-transition), color var(--lo-transition);\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n}\n.lo-entry-action svg { width: 16px; height: 16px; }\n.lo-entry-action:hover { background: var(--lo-primary-light); color: var(--lo-primary-dark); }\n.lo-entry-action--del:hover { background: rgba(192,57,43,0.08); color: var(--lo-danger); }\n.lo-entry-action:focus-visible { outline: 2px solid var(--lo-primary); outline-offset: 1px; }\n\n\/* Flache Liste (chronologisch) *\/\n.lo-flat {\n    background: var(--lo-bg);\n    border: 1px solid var(--lo-border-light);\n    border-left: 3px solid var(--lo-primary);\n    border-radius: 0 var(--lo-radius) var(--lo-radius) 0;\n    box-shadow: var(--lo-shadow);\n}\n.lo-flat .lo-entry { padding: 11px 16px; }\n\n\/* Inline-Edit-Modus *\/\n.lo-entry--editing { background: var(--lo-primary-pale); cursor: default; }\n.lo-entry--editing .lo-entry-actions { display: none; }\n.lo-entry--editing .lo-entry-text { display: none; }\n.lo-entry--editing .lo-entry-time { display: none; }\n.lo-edit-area { margin-top: 6px; }\n.lo-edit-colors {\n    display: flex;\n    gap: 6px;\n    align-items: center;\n    margin: 4px 0 6px;\n    flex-wrap: wrap;\n}\n.lo-edit-colors-label {\n    font-size: 0.62rem;\n    font-weight: 700;\n    color: var(--lo-muted);\n    margin-right: 2px;\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n}\n.lo-edit-color {\n    width: 20px; height: 20px;\n    border-radius: 50%;\n    border: 2px solid var(--lo-border);\n    cursor: pointer;\n    padding: 0;\n    transition: transform var(--lo-transition);\n}\n.lo-edit-color:hover { transform: scale(1.1); }\n.lo-edit-color:focus-visible { outline: 2px solid var(--lo-primary); outline-offset: 2px; }\n.lo-edit-color[aria-pressed=\"true\"] {\n    box-shadow: 0 0 0 1px var(--lo-bg), 0 0 0 2px var(--lo-primary);\n    transform: scale(1.05);\n}\n.lo-edit-color--yellow { background: var(--lo-mark-yellow); }\n.lo-edit-color--green  { background: var(--lo-mark-green); }\n.lo-edit-color--orange { background: var(--lo-mark-orange); }\n.lo-edit-textarea {\n    display: block;\n    width: 100%;\n    min-height: 80px;\n    padding: 7px 10px;\n    border: 1px solid var(--lo-primary);\n    border-radius: var(--lo-radius);\n    font-family: inherit;\n    font-size: 0.88rem;\n    line-height: 1.5;\n    color: var(--lo-ink);\n    background: var(--lo-bg);\n    resize: vertical;\n    outline: none;\n    box-shadow: 0 0 0 2px var(--lo-primary-light);\n    margin-bottom: 5px;\n}\n.lo-edit-textarea[readonly] {\n    background: var(--lo-surface);\n    color: var(--lo-muted);\n    cursor: not-allowed;\n}\n.lo-edit-actions { display: flex; gap: 6px; flex-wrap: wrap; }\n.lo-edit-btn {\n    padding: 5px 12px;\n    min-height: 34px;\n    border: 1px solid var(--lo-border);\n    background: var(--lo-bg);\n    color: var(--lo-text);\n    border-radius: var(--lo-radius);\n    font-family: inherit;\n    font-size: 0.74rem;\n    font-weight: 600;\n    cursor: pointer;\n    transition: background var(--lo-transition), border-color var(--lo-transition), color var(--lo-transition);\n}\n.lo-edit-btn:hover { border-color: var(--lo-primary); background: var(--lo-primary-pale); color: var(--lo-primary-dark); }\n.lo-edit-btn:focus-visible { outline: 2px solid var(--lo-primary); outline-offset: 1px; }\n.lo-edit-btn--save { background: var(--lo-primary); border-color: var(--lo-primary); color: #fff; }\n.lo-edit-btn--save:hover { background: var(--lo-primary-dark); border-color: var(--lo-primary-dark); color: #fff; }\n.lo-edit-hint {\n    font-size: 0.65rem;\n    color: var(--lo-muted);\n    margin-top: 4px;\n    line-height: 1.35;\n}\n\n\/* Empty State *\/\n.lo-empty {\n    text-align: center;\n    padding: 56px 24px;\n    color: var(--lo-muted);\n}\n.lo-empty-icon {\n    width: 64px; height: 64px;\n    color: var(--lo-faint);\n    margin-bottom: 12px;\n}\n.lo-empty-title {\n    font-size: 1.1rem;\n    font-weight: 700;\n    color: var(--lo-ink);\n    margin: 0 0 8px;\n}\n.lo-empty-text {\n    font-size: 0.9rem;\n    line-height: 1.6;\n    max-width: 460px;\n    margin: 0 auto 16px;\n}\n.lo-empty-list {\n    text-align: left;\n    max-width: 380px;\n    margin: 0 auto 16px;\n    font-size: 0.85rem;\n    line-height: 1.7;\n    color: var(--lo-text);\n    padding-left: 0;\n    list-style: none;\n}\n.lo-empty-list li::before { content: '\u00b7  '; color: var(--lo-primary); font-weight: 700; }\n\n\/* Aktionsleiste unten *\/\n.lo-actions {\n    display: flex;\n    gap: 8px;\n    padding: 14px 22px;\n    border-top: 1px solid var(--lo-border-light);\n    background: var(--lo-surface);\n    flex-wrap: wrap;\n}\n.lo-btn {\n    flex: 1 1 auto;\n    min-width: 0;\n    padding: 9px 14px;\n    border: 1px solid var(--lo-border);\n    background: var(--lo-bg);\n    color: var(--lo-text);\n    border-radius: var(--lo-radius);\n    font-family: inherit;\n    font-size: 0.85rem;\n    font-weight: 600;\n    cursor: pointer;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 6px;\n    transition: border-color var(--lo-transition), background var(--lo-transition), color var(--lo-transition);\n    white-space: nowrap;\n}\n.lo-btn:hover { border-color: var(--lo-primary); background: var(--lo-primary-pale); color: var(--lo-primary-dark); }\n.lo-btn:focus { outline: 2px solid var(--lo-primary); outline-offset: 1px; }\n.lo-btn svg { width: 16px; height: 16px; }\n.lo-btn--primary { background: var(--lo-primary); color: #fff; border-color: var(--lo-primary); }\n.lo-btn--primary:hover { background: var(--lo-primary-dark); border-color: var(--lo-primary-dark); color: #fff; }\n.lo-btn--danger:hover { border-color: var(--lo-danger); color: var(--lo-danger); background: rgba(192,57,43,0.06); }\n\n\/* Toast *\/\n.lo-toast {\n    position: fixed;\n    bottom: 20px;\n    left: 50%;\n    transform: translateX(-50%) translateY(20px);\n    background: var(--lo-ink);\n    color: #fff;\n    padding: 10px 18px;\n    border-radius: var(--lo-radius);\n    font-size: 0.85rem;\n    font-weight: 500;\n    box-shadow: var(--lo-shadow-md);\n    z-index: 100000;\n    opacity: 0;\n    pointer-events: none;\n    transition: opacity 0.25s ease, transform 0.25s ease;\n}\n.lo-toast.lo-toast--visible { opacity: 1; transform: translateX(-50%) translateY(0); }\n\n\/* !important: \u00fcberschreibt WP-Theme-Display-Regeln *\/\n.lo-hidden { display: none !important; }\n\n.lo-root button:disabled,\n.lo-root button[disabled] {\n    opacity: 0.5;\n    cursor: not-allowed;\n}\n\n\/* Responsive *\/\n@media (max-width: 900px) {\n    .cad-hero { padding: 17px 24px; min-height: 92px; }\n    .cad-compass { width: 270px; height: 270px; right: -82px; opacity: 0.34; }\n    .cad-hero-title { font-size: 1.26rem; }\n}\n@media (max-width: 600px) {\n    .cad-hero { padding: 17px 20px; min-height: 106px; }\n    .cad-compass { width: 230px; height: 230px; right: -92px; top: 52%; opacity: 0.30; }\n    .cad-hero-title { font-size: 1.2rem; }\n    .lo-toolbar { padding: 14px 16px; }\n    .lo-main { padding: 14px 14px 18px; }\n    .lo-actions { padding: 12px 14px; }\n    .lo-entry { padding: 10px 12px; grid-template-columns: 20px 6px 1fr; }\n    .lo-entry-actions { grid-column: 1 \/ -1; justify-content: flex-end; margin-top: 4px; }\n    .lo-page-head { padding: 10px 12px 8px; }\n    .lo-btn { font-size: 0.8rem; padding: 8px 10px; }\n}\n\n\/* PRINT: !important n\u00f6tig, um UI-Chrome beim Drucken zuverl\u00e4ssig auszublenden, auch wenn das WP-Theme eigene Print-Styles setzt *\/\n@media print {\n    .lo-root {\n        border: none;\n        box-shadow: none;\n        margin: 0;\n        background: #fff;\n    }\n    .lo-toolbar,\n    .lo-bulkbar,\n    .lo-actions,\n    .lo-select-all,\n    .lo-entry-cb,\n    .lo-entry-actions,\n    .lo-page-link,\n    .lo-toast,\n    .lo-reset { display: none !important; }\n    .cad-hero {\n        background: none !important;\n        color: #000 !important;\n        border: none;\n        box-shadow: none;\n        padding: 6px 0;\n        margin-bottom: 14px;\n        min-height: 0;\n    }\n    .cad-hero::before,\n    .cad-compass { display: none !important; }\n    .cad-hero-eyebrow { color: #64748b !important; }\n    .cad-hero-title { color: #000 !important; }\n    .cad-hero-meta { color: #334155 !important; }\n    .lo-privacy { display: none; }\n    .lo-page-card {\n        page-break-inside: avoid;\n        break-inside: avoid;\n        border: 1px solid #c8d6e0;\n        box-shadow: none;\n        margin-bottom: 12px;\n    }\n    .lo-page-card + .lo-page-card { page-break-before: auto; }\n    .lo-entry { page-break-inside: avoid; break-inside: avoid; }\n    .lo-entry-text {\n        -webkit-line-clamp: unset;\n        display: block;\n        overflow: visible;\n    }\n    .lo-entry-swatch,\n    .lo-chip-dot,\n    .lo-page-count,\n    .lo-entry-page-badge {\n        -webkit-print-color-adjust: exact;\n        print-color-adjust: exact;\n    }\n    .lo-main { padding: 12px 0; background: #fff; }\n    @page { margin: 18mm 15mm; }\n}\n<\/style>\n\n<div class=\"lo-page\">\n\n<section class=\"cad-hero\" aria-labelledby=\"lo-hero-title\">\n    <div class=\"cad-hero-text\">\n        <div class=\"cad-hero-eyebrow\">Logbuch \u00b7 \u00dcbersicht<\/div>\n        <h1 class=\"cad-hero-title\" id=\"lo-hero-title\">Hier laufen alle deine Markierungen und Notizen zusammen<\/h1>\n        <div class=\"cad-hero-meta\" id=\"loHeroMeta\">Daten werden geladen\u2026<\/div>\n    <\/div>\n    <!-- Kompass: unver\u00e4ndert lassen -->\n    <div class=\"cad-compass\" aria-hidden=\"true\">\n        <svg viewBox=\"0 0 200 200\" fill=\"none\" stroke=\"currentColor\">\n            <defs>\n                <filter id=\"cadLogNeedleGlow\" x=\"-60%\" y=\"-60%\" width=\"220%\" height=\"220%\">\n                    <feGaussianBlur stdDeviation=\"3\" result=\"cadGlow\"\/>\n                    <feMerge><feMergeNode in=\"cadGlow\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge>\n                <\/filter>\n            <\/defs>\n            <circle cx=\"100\" cy=\"100\" r=\"96\" stroke=\"rgba(255,255,255,0.32)\" stroke-width=\"1.2\"\/>\n            <circle cx=\"100\" cy=\"100\" r=\"88\" stroke=\"rgba(255,255,255,0.18)\" stroke-width=\"0.8\"\/>\n            <g stroke=\"rgba(255,255,255,0.7)\" stroke-width=\"1.6\">\n                <line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"16\"\/>\n                <line x1=\"184\" y1=\"100\" x2=\"196\" y2=\"100\"\/>\n                <line x1=\"100\" y1=\"184\" x2=\"100\" y2=\"196\"\/>\n                <line x1=\"4\" y1=\"100\" x2=\"16\" y2=\"100\"\/>\n            <\/g>\n            <g stroke=\"rgba(255,255,255,0.5)\" stroke-width=\"1.2\">\n                <g transform=\"rotate(30 100 100)\"><line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"13\"\/><\/g>\n                <g transform=\"rotate(60 100 100)\"><line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"13\"\/><\/g>\n                <g transform=\"rotate(120 100 100)\"><line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"13\"\/><\/g>\n                <g transform=\"rotate(150 100 100)\"><line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"13\"\/><\/g>\n                <g transform=\"rotate(210 100 100)\"><line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"13\"\/><\/g>\n                <g transform=\"rotate(240 100 100)\"><line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"13\"\/><\/g>\n                <g transform=\"rotate(300 100 100)\"><line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"13\"\/><\/g>\n                <g transform=\"rotate(330 100 100)\"><line x1=\"100\" y1=\"4\" x2=\"100\" y2=\"13\"\/><\/g>\n            <\/g>\n            <g fill=\"rgba(255,255,255,0.92)\" stroke=\"none\" font-family=\"ui-monospace, monospace\" font-weight=\"700\" font-size=\"11\" text-anchor=\"middle\">\n                <text x=\"100\" y=\"29\">N<\/text>\n                <text x=\"171\" y=\"104\">O<\/text>\n                <text x=\"100\" y=\"178\">S<\/text>\n                <text x=\"29\" y=\"104\">W<\/text>\n            <\/g>\n            <g class=\"cad-compass-secondary\">\n                <circle cx=\"100\" cy=\"100\" r=\"80\" stroke=\"rgba(255,255,255,0.18)\" stroke-width=\"0.6\" stroke-dasharray=\"2 6\"\/>\n            <\/g>\n            <g class=\"cad-compass-rose\">\n                <circle cx=\"100\" cy=\"100\" r=\"72\" stroke=\"rgba(255,255,255,0.16)\" stroke-width=\"0.6\" stroke-dasharray=\"3 5\"\/>\n                <g stroke=\"none\">\n                    <!-- Norden = leuchtender Messing-Funken, Rest wei\u00df -->\n                    <g filter=\"url(#cadLogNeedleGlow)\">\n                        <polygon points=\"100,18 105,96 100,100\" fill=\"#ffbe3d\"\/>\n                        <polygon points=\"100,18 100,100 95,96\" fill=\"#c47a1e\"\/>\n                    <\/g>\n                    <polygon points=\"182,100 104,105 100,100\" fill=\"rgba(255,255,255,0.85)\"\/>\n                    <polygon points=\"182,100 100,100 104,95\" fill=\"rgba(255,255,255,0.5)\"\/>\n                    <polygon points=\"100,182 105,104 100,100\" fill=\"rgba(255,255,255,0.45)\"\/>\n                    <polygon points=\"100,182 100,100 95,104\" fill=\"rgba(255,255,255,0.25)\"\/>\n                    <polygon points=\"18,100 96,105 100,100\" fill=\"rgba(255,255,255,0.85)\"\/>\n                    <polygon points=\"18,100 100,100 96,95\" fill=\"rgba(255,255,255,0.5)\"\/>\n                <\/g>\n                <g stroke=\"none\">\n                    <g transform=\"rotate(45 100 100)\"><polygon points=\"100,42 103,98 100,100\" fill=\"rgba(255,255,255,0.7)\"\/><polygon points=\"100,42 100,100 97,98\" fill=\"rgba(255,255,255,0.4)\"\/><\/g>\n                    <g transform=\"rotate(135 100 100)\"><polygon points=\"100,42 103,98 100,100\" fill=\"rgba(255,255,255,0.6)\"\/><polygon points=\"100,42 100,100 97,98\" fill=\"rgba(255,255,255,0.35)\"\/><\/g>\n                    <g transform=\"rotate(225 100 100)\"><polygon points=\"100,42 103,98 100,100\" fill=\"rgba(255,255,255,0.6)\"\/><polygon points=\"100,42 100,100 97,98\" fill=\"rgba(255,255,255,0.35)\"\/><\/g>\n                    <g transform=\"rotate(315 100 100)\"><polygon points=\"100,42 103,98 100,100\" fill=\"rgba(255,255,255,0.6)\"\/><polygon points=\"100,42 100,100 97,98\" fill=\"rgba(255,255,255,0.35)\"\/><\/g>\n                <\/g>\n            <\/g>\n            <circle cx=\"100\" cy=\"100\" r=\"9\" fill=\"#2a4a5c\" stroke=\"rgba(255,255,255,0.95)\" stroke-width=\"1.4\"\/>\n            <circle cx=\"100\" cy=\"100\" r=\"2.8\" fill=\"#ffbe3d\"\/>\n        <\/svg>\n    <\/div>\n<\/section>\n\n<section class=\"lo-root\" id=\"loRoot\" role=\"region\" aria-label=\"Mein Logbuch: \u00dcbersicht aller Notizen\">\n\n    <div class=\"lo-privacy\">\n        <span class=\"lo-privacy-text\">Alle Notizen bleiben nur in deinem Browser. Kein Server, keine Cookies, kein Tracking.<\/span>\n        <span class=\"lo-info-wrap\">\n            <button type=\"button\" class=\"lo-info-trigger\" id=\"loInfoTrigger\" aria-expanded=\"false\" aria-controls=\"loInfoPop\" aria-label=\"Mehr zur Speicherung\" title=\"Wie funktioniert die Speicherung?\">i<\/button>\n            <div class=\"lo-info-pop\" id=\"loInfoPop\" role=\"dialog\" aria-label=\"Hinweise zur Speicherung\">\n                <h4>So funktioniert die Speicherung<\/h4>\n                <ul>\n                    <li>Alle Eintr\u00e4ge liegen im <code>localStorage<\/code> deines Browsers, also direkt auf deinem Ger\u00e4t.<\/li>\n                    <li>Kein Server, keine Cookies, kein Tracking, keine externen Dienste.<\/li>\n                    <li>Sichtbar nur in diesem Browser auf diesem Ger\u00e4t. Ein anderer Browser oder ein anderes Profil sieht die Notizen nicht.<\/li>\n                    <li>Werden die Browserdaten dieser Seite gel\u00f6scht, gehen auch die Notizen verloren. Vorher exportieren!<\/li>\n                    <li>Mit Export und Import als JSON-Datei kannst du deine Daten sichern oder auf ein anderes Ger\u00e4t bringen.<\/li>\n                    <li>Speicherplatz pro Domain ca. 5 MB, reicht f&uuml;r tausende Eintr&auml;ge.<\/li>\n                <\/ul>\n                <p>Rechtsgrundlage: TTDSG &sect;25 Abs. 2 Nr. 2 (nutzerinitiierte Funktion).<\/p>\n            <\/div>\n        <\/span>\n    <\/div>\n\n    <div class=\"lo-toolbar\">\n        <div class=\"lo-toolbar-row\">\n            <input type=\"search\" class=\"lo-search\" id=\"loSearch\" placeholder=\"Notizen durchsuchen\u2026\" autocomplete=\"off\">\n            <div class=\"lo-tabs\" role=\"tablist\" aria-label=\"Ansicht\">\n                <button class=\"lo-tab\" id=\"loTabGrouped\" type=\"button\" role=\"tab\" aria-selected=\"true\">Nach Seiten<\/button>\n                <button class=\"lo-tab\" id=\"loTabFlat\" type=\"button\" role=\"tab\" aria-selected=\"false\">Chronologisch<\/button>\n            <\/div>\n            <select class=\"lo-sort\" id=\"loSort\" aria-label=\"Sortierung\">\n                <option value=\"date-desc\">Neueste zuerst<\/option>\n                <option value=\"date-asc\">\u00c4lteste zuerst<\/option>\n                <option value=\"page-asc\">Seite A\u2013Z<\/option>\n                <option value=\"type\">Nach Typ<\/option>\n            <\/select>\n        <\/div>\n        <div class=\"lo-toolbar-row\">\n            <div class=\"lo-filters\" id=\"loFiltersType\" role=\"group\" aria-label=\"Typ-Filter\">\n                <span class=\"lo-filters-label\">Typ<\/span>\n                <button class=\"lo-chip\" type=\"button\" data-filter-type=\"highlight\" aria-pressed=\"false\">Marker<\/button>\n                <button class=\"lo-chip\" type=\"button\" data-filter-type=\"note\" aria-pressed=\"false\">Notiz<\/button>\n                <button class=\"lo-chip\" type=\"button\" data-filter-type=\"bookmark\" aria-pressed=\"false\">Lesezeichen<\/button>\n                <button class=\"lo-chip\" type=\"button\" data-filter-type=\"tool-note\" aria-pressed=\"false\">Schnellnotiz<\/button>\n            <\/div>\n            <div class=\"lo-filters\" id=\"loFiltersColor\" role=\"group\" aria-label=\"Farb-Filter\">\n                <span class=\"lo-filters-label\">Farbe<\/span>\n                <button class=\"lo-chip\" type=\"button\" data-filter-color=\"yellow\" aria-pressed=\"false\"><span class=\"lo-chip-dot lo-chip-dot--yellow\"><\/span>Gelb<\/button>\n                <button class=\"lo-chip\" type=\"button\" data-filter-color=\"green\"  aria-pressed=\"false\"><span class=\"lo-chip-dot lo-chip-dot--green\"><\/span>Gr\u00fcn<\/button>\n                <button class=\"lo-chip\" type=\"button\" data-filter-color=\"orange\" aria-pressed=\"false\"><span class=\"lo-chip-dot lo-chip-dot--orange\"><\/span>Orange<\/button>\n            <\/div>\n            <button class=\"lo-reset\" id=\"loReset\" type=\"button\" hidden>Filter zur\u00fccksetzen<\/button>\n        <\/div>\n    <\/div>\n\n    <div class=\"lo-bulkbar\" id=\"loBulkbar\" role=\"region\" aria-label=\"Mehrfachauswahl-Aktionen\">\n        <span class=\"lo-bulkbar-count\" id=\"loBulkbarCount\">0 ausgew\u00e4hlt<\/span>\n        <button class=\"lo-bulkbar-btn\" id=\"loBulkExport\" type=\"button\">Auswahl exportieren<\/button>\n        <div class=\"lo-bulkbar-recolor\" id=\"loBulkRecolor\">\n            <button class=\"lo-bulkbar-btn\" id=\"loBulkRecolorBtn\" type=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\">Auswahl umf\u00e4rben \u25be<\/button>\n            <div class=\"lo-bulkbar-recolor-menu\" role=\"menu\" aria-label=\"Farbe w\u00e4hlen\">\n                <button class=\"lo-color-btn lo-color-btn--yellow\" type=\"button\" data-recolor=\"yellow\" aria-label=\"Gelb\"><\/button>\n                <button class=\"lo-color-btn lo-color-btn--green\"  type=\"button\" data-recolor=\"green\"  aria-label=\"Gr\u00fcn\"><\/button>\n                <button class=\"lo-color-btn lo-color-btn--orange\" type=\"button\" data-recolor=\"orange\" aria-label=\"Orange\"><\/button>\n            <\/div>\n        <\/div>\n        <button class=\"lo-bulkbar-btn lo-bulkbar-btn--danger\" id=\"loBulkDelete\" type=\"button\">Auswahl l\u00f6schen<\/button>\n    <\/div>\n\n    <main class=\"lo-main\">\n        <div class=\"lo-select-all\" id=\"loSelectAllWrap\" hidden>\n            <input type=\"checkbox\" class=\"lo-select-all-cb\" id=\"loSelectAllCb\">\n            <label for=\"loSelectAllCb\" class=\"lo-select-all-label\">Alle sichtbaren ausw\u00e4hlen<\/label>\n        <\/div>\n        <div class=\"lo-grouped\" id=\"loGrouped\" role=\"region\" aria-label=\"Eintr&auml;ge nach Seiten gruppiert\"><\/div>\n        <div class=\"lo-flat lo-hidden\" id=\"loFlat\" role=\"region\" aria-label=\"Chronologische Eintragsliste\"><\/div>\n        <div class=\"lo-empty lo-hidden\" id=\"loEmpty\">\n            <svg class=\"lo-empty-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                <path d=\"M4 4h12a2 2 0 0 1 2 2v14H6a2 2 0 0 1-2-2V4z\"><\/path>\n                <path d=\"M4 4v14a2 2 0 0 0 2 2\"><\/path>\n                <path d=\"M8 8h6M8 12h6M8 16h4\"><\/path>\n            <\/svg>\n            <h3 class=\"lo-empty-title\">Noch keine Notizen vorhanden.<\/h3>\n            <p class=\"lo-empty-text\">Sobald du in einem Tutorial oder Tool etwas markierst, eine Notiz pinnst, ein Lesezeichen setzt oder eine Schnellnotiz schreibst, taucht der Eintrag hier auf.<\/p>\n            <ul class=\"lo-empty-list\">\n                <li><strong>Textmarker:<\/strong> Text ausw\u00e4hlen und im Marker-Modus einf\u00e4rben<\/li>\n                <li><strong>Notiz:<\/strong> Sticky-Note an eine beliebige Stelle pinnen<\/li>\n                <li><strong>Lesezeichen:<\/strong> aktuellen Abschnitt f\u00fcr sp\u00e4ter merken<\/li>\n                <li><strong>Schnellnotiz:<\/strong> beliebigen Hinweis auf Tool-Seiten ablegen<\/li>\n            <\/ul>\n        <\/div>\n    <\/main>\n\n    <div class=\"lo-actions\">\n        <button class=\"lo-btn\" id=\"loBtnExport\" type=\"button\" title=\"Alle Notizen als Datei herunterladen\">\n            <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                <path d=\"M10 3v10\"><\/path>\n                <path d=\"M6 9l4 4 4-4\"><\/path>\n                <path d=\"M3 17h14\"><\/path>\n            <\/svg>\n            <span>Komplett-Export<\/span>\n        <\/button>\n        <button class=\"lo-btn\" id=\"loBtnImport\" type=\"button\" title=\"Notizen aus Datei laden\">\n            <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                <path d=\"M10 13V3\"><\/path>\n                <path d=\"M6 7l4-4 4 4\"><\/path>\n                <path d=\"M3 17h14\"><\/path>\n            <\/svg>\n            <span>Import<\/span>\n        <\/button>\n        <input type=\"file\" id=\"loFileInput\" accept=\".json,.cadlog,application\/json\" style=\"display:none;\">\n        <button class=\"lo-btn\" id=\"loBtnPrint\" type=\"button\" title=\"Druckansicht \u00f6ffnen\">\n            <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                <path d=\"M6 7V3h8v4\"><\/path>\n                <path d=\"M4 7h12a2 2 0 0 1 2 2v5h-3v3H5v-3H2V9a2 2 0 0 1 2-2z\"><\/path>\n                <path d=\"M5 14h10\"><\/path>\n            <\/svg>\n            <span>Drucken<\/span>\n        <\/button>\n        <button class=\"lo-btn lo-btn--danger\" id=\"loBtnClear\" type=\"button\" title=\"Alle Notizen l\u00f6schen\">\n            <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                <path d=\"M4 6h12\"><\/path>\n                <path d=\"M7 6V4h6v2\"><\/path>\n                <path d=\"M6 6l1 11h6l1-11\"><\/path>\n            <\/svg>\n            <span>Alles l\u00f6schen<\/span>\n        <\/button>\n    <\/div>\n\n<\/section>\n\n<\/div>\n\n<div class=\"lo-toast\" id=\"loToast\" role=\"status\" aria-live=\"polite\"><\/div>\n\n<script>\n(function () {\n    'use strict';\n    \/\/ ---- Setup und Doppel-Init-Schutz ----\n    var root = document.getElementById('loRoot');\n    if (!root) { return; }\n    if (root.dataset.loInit === '1') { return; }\n    root.dataset.loInit = '1';\n\n    var STORAGE_KEY = 'cadk_logbook_v1';\n\n    \/\/ ---- Storage-Helpers (identisch zur Sidebar) ----\n    function loadStore() {\n        try {\n            var raw = localStorage.getItem(STORAGE_KEY);\n            if (!raw) { return { version: 1, pages: {} }; }\n            var parsed = JSON.parse(raw);\n            if (!parsed.pages) { parsed.pages = {}; }\n            return parsed;\n        } catch (e) { return { version: 1, pages: {} }; }\n    }\n    function saveStore(store) {\n        try { localStorage.setItem(STORAGE_KEY, JSON.stringify(store)); return true; }\n        catch (e) { showToast('Speichern fehlgeschlagen (Speicher voll?)'); return false; }\n    }\n\n    \/\/ ---- State ----\n    \/\/ Flacher Cache aller Eintr\u00e4ge mit pageKey\/pageTitle\/pageUrl\n    var allEntries = [];\n    var state = {\n        search: '',\n        types: {},   \/\/ { highlight: true, note: true, ... } \u2014 leeres Objekt = \"alle\"\n        colors: {},  \/\/ dito\n        sort: 'date-desc',\n        view: 'grouped',\n        selected: {} \/\/ Set per id\n    };\n\n    function rebuildIndex() {\n        var store = loadStore();\n        var out = [];\n        var pk;\n        for (pk in store.pages) {\n            if (!Object.prototype.hasOwnProperty.call(store.pages, pk)) { continue; }\n            var page = store.pages[pk];\n            if (!page) { continue; }\n            if (!Array.isArray(page.entries)) { continue; }\n            for (var i = 0; i < page.entries.length; i++) {\n                var e = page.entries[i];\n                if (!e) { continue; }\n                out.push({\n                    raw: e,\n                    id: e.id,\n                    type: e.type,\n                    color: e.color || null,\n                    text: e.text || '',\n                    createdAt: e.createdAt || e.updatedAt || '',\n                    updatedAt: e.updatedAt || e.createdAt || '',\n                    pageKey: pk,\n                    pageTitle: page.title || pk,\n                    pageUrl: page.url || pk\n                });\n            }\n        }\n        allEntries = out;\n    }\n\n    \/\/ ---- Toast ----\n    var toastEl = document.getElementById('loToast');\n    var toastTimer = null;\n    function showToast(msg) {\n        if (!toastEl) { return; }\n        toastEl.textContent = msg;\n        toastEl.classList.add('lo-toast--visible');\n        if (toastTimer) { clearTimeout(toastTimer); }\n        toastTimer = setTimeout(function () { toastEl.classList.remove('lo-toast--visible'); }, 2400);\n    }\n\n    \/\/ ---- Helpers ----\n    var AMP = String.fromCharCode(38);\n    function escapeHtml(s) {\n        if (!s) { return ''; }\n        return s.replace(new RegExp(AMP, 'g'), AMP + 'amp;').replace(\/<\/g, AMP + 'lt;').replace(\/>\/g, AMP + 'gt;').replace(\/\"\/g, AMP + 'quot;');\n    }\n    function pad(n) { if (n < 10) { return '0' + n; } return '' + n; }\n    function formatTime(iso) {\n        if (!iso) { return ''; }\n        try {\n            var d = new Date(iso);\n            if (isNaN(d.getTime())) { return ''; }\n            return pad(d.getDate()) + '.' + pad(d.getMonth() + 1) + '.' + d.getFullYear() + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes());\n        } catch (e) { return ''; }\n    }\n    function formatDateOnly(iso) {\n        if (!iso) { return ''; }\n        try {\n            var d = new Date(iso);\n            if (isNaN(d.getTime())) { return ''; }\n            return pad(d.getDate()) + '.' + pad(d.getMonth() + 1) + '.' + d.getFullYear();\n        } catch (e) { return ''; }\n    }\n    function typeLabel(type) {\n        if (type === 'highlight') { return 'Marker'; }\n        if (type === 'note') { return 'Notiz'; }\n        if (type === 'bookmark') { return 'Lesezeichen'; }\n        if (type === 'tool-note') { return 'Schnellnotiz'; }\n        return 'Eintrag';\n    }\n    function swatchClass(entry) {\n        if (entry.color === 'yellow') { return 'lo-entry-swatch--yellow'; }\n        if (entry.color === 'green')  { return 'lo-entry-swatch--green'; }\n        if (entry.color === 'orange') { return 'lo-entry-swatch--orange'; }\n        if (entry.type === 'bookmark') { return 'lo-entry-swatch--primary'; }\n        if (entry.type === 'tool-note') { return 'lo-entry-swatch--accent'; }\n        if (entry.type === 'note') { return 'lo-entry-swatch--accent'; }\n        return 'lo-entry-swatch--yellow';\n    }\n    function hasAnyKey(obj) {\n        for (var k in obj) {\n            if (Object.prototype.hasOwnProperty.call(obj, k)) {\n                if (obj[k]) { return true; }\n            }\n        }\n        return false;\n    }\n    function countKeys(obj) {\n        var n = 0;\n        for (var k in obj) {\n            if (Object.prototype.hasOwnProperty.call(obj, k)) {\n                if (obj[k]) { n = n + 1; }\n            }\n        }\n        return n;\n    }\n\n    \/\/ ---- Filter-Pipeline ----\n    function tokenizeQuery(q) {\n        if (!q) { return []; }\n        var raw = q.toLowerCase().trim().split(\/\\s+\/);\n        var out = [];\n        for (var i = 0; i < raw.length; i++) {\n            if (raw[i]) { out.push(raw[i]); }\n        }\n        return out;\n    }\n    function applyFilters() {\n        var tokens = tokenizeQuery(state.search);\n        var typeActive = hasAnyKey(state.types);\n        var colorActive = hasAnyKey(state.colors);\n        var out = [];\n        for (var i = 0; i < allEntries.length; i++) {\n            var e = allEntries[i];\n            if (typeActive) {\n                if (!state.types[e.type]) { continue; }\n            }\n            if (colorActive) {\n                \/\/ Eintr\u00e4ge ohne color (z.B. legacy bookmark) z\u00e4hlen nicht zu Farb-Filtern\n                if (!e.color) { continue; }\n                if (!state.colors[e.color]) { continue; }\n            }\n            if (tokens.length > 0) {\n                var hay = (e.text + ' ' + e.pageTitle).toLowerCase();\n                var allMatch = true;\n                for (var t = 0; t < tokens.length; t++) {\n                    if (hay.indexOf(tokens[t]) < 0) { allMatch = false; break; }\n                }\n                if (!allMatch) { continue; }\n            }\n            out.push(e);\n        }\n        return out;\n    }\n    function applySort(arr) {\n        var s = state.sort;\n        var copy = arr.slice();\n        copy.sort(function (a, b) {\n            if (s === 'date-asc') {\n                if (a.createdAt < b.createdAt) { return -1; }\n                if (a.createdAt > b.createdAt) { return 1; }\n                return 0;\n            }\n            if (s === 'page-asc') {\n                if (a.pageTitle.toLowerCase() < b.pageTitle.toLowerCase()) { return -1; }\n                if (a.pageTitle.toLowerCase() > b.pageTitle.toLowerCase()) { return 1; }\n                if (a.createdAt < b.createdAt) { return 1; }\n                if (a.createdAt > b.createdAt) { return -1; }\n                return 0;\n            }\n            if (s === 'type') {\n                if (a.type < b.type) { return -1; }\n                if (a.type > b.type) { return 1; }\n                if (a.createdAt < b.createdAt) { return 1; }\n                if (a.createdAt > b.createdAt) { return -1; }\n                return 0;\n            }\n            \/\/ date-desc (default)\n            if (a.createdAt < b.createdAt) { return 1; }\n            if (a.createdAt > b.createdAt) { return -1; }\n            return 0;\n        });\n        return copy;\n    }\n\n    \/\/ ---- Header-Stats ----\n    function updateStats() {\n        var pages = {};\n        var lastUpdate = '';\n        for (var i = 0; i < allEntries.length; i++) {\n            var e = allEntries[i];\n            pages[e.pageKey] = true;\n            var ts = e.updatedAt || e.createdAt;\n            if (ts) { if (ts > lastUpdate) { lastUpdate = ts; } }\n        }\n        var pageCount = 0;\n        for (var k in pages) { if (Object.prototype.hasOwnProperty.call(pages, k)) { pageCount = pageCount + 1; } }\n        var msg;\n        if (allEntries.length === 0) {\n            msg = 'Noch keine Eintr\u00e4ge.';\n        } else {\n            msg = allEntries.length + ' ' + (allEntries.length === 1 ? 'Eintrag' : 'Eintr\u00e4ge')\n                + ' \u00b7 ' + pageCount + ' ' + (pageCount === 1 ? 'Seite' : 'Seiten');\n            if (lastUpdate) { msg = msg + ' \u00b7 letzte \u00c4nderung: ' + formatDateOnly(lastUpdate); }\n        }\n        var metaEl = document.getElementById('loHeroMeta');\n        if (metaEl) { metaEl.textContent = msg; }\n    }\n\n    \/\/ ---- Render: Eintrags-DOM (gemeinsam f\u00fcr gruppiert + flach) ----\n    function entryHtml(e, options) {\n        var inFlat = options ? options.flat : false;\n        var sw = swatchClass(e);\n        var checked = state.selected[e.id] ? ' checked' : '';\n        var pageBadge = '';\n        if (inFlat) {\n            pageBadge = '<span class=\"lo-entry-page-badge\" title=\"' + escapeHtml(e.pageUrl) + '\">' + escapeHtml(e.pageTitle) + '<\/span>';\n        }\n        var typeColorParts = '<span class=\"lo-entry-type\">' + escapeHtml(typeLabel(e.type)) + (e.color ? ' \u00b7 ' + capitalize(e.color === 'yellow' ? 'Gelb' : e.color === 'green' ? 'Gr\u00fcn' : 'Orange') : '') + '<\/span>';\n        return ''\n            + '<li class=\"lo-entry\" data-id=\"' + escapeHtml(e.id) + '\" data-type=\"' + escapeHtml(e.type) + '\">'\n            +   '<input type=\"checkbox\" class=\"lo-entry-cb\" data-cb=\"' + escapeHtml(e.id) + '\"' + checked + ' aria-label=\"Eintrag ausw\u00e4hlen\">'\n            +   '<span class=\"lo-entry-swatch ' + sw + '\" aria-hidden=\"true\"><\/span>'\n            +   '<div class=\"lo-entry-body\">'\n            +     '<div class=\"lo-entry-meta\">' + typeColorParts + pageBadge + '<\/div>'\n            +     '<div class=\"lo-entry-text\">' + escapeHtml(e.text || '(leer)') + '<\/div>'\n            +     '<div class=\"lo-entry-time\">' + escapeHtml(formatTime(e.createdAt)) + '<\/div>'\n            +   '<\/div>'\n            +   '<div class=\"lo-entry-actions\">'\n            +     '<button type=\"button\" class=\"lo-entry-action\" data-action=\"jump\" data-id=\"' + escapeHtml(e.id) + '\" title=\"Zur Stelle springen (\u00f6ffnet Tutorial in neuem Tab)\" aria-label=\"Zur Stelle springen\">'\n            +       '<svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 3h6v6\"><\/path><path d=\"M17 3l-7 7\"><\/path><path d=\"M9 5H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-4\"><\/path><\/svg>'\n            +     '<\/button>'\n            +     '<button type=\"button\" class=\"lo-entry-action\" data-action=\"edit\" data-id=\"' + escapeHtml(e.id) + '\" title=\"Bearbeiten\" aria-label=\"Bearbeiten\">'\n            +       '<svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 3l3 3-9 9H5v-3l9-9z\"><\/path><\/svg>'\n            +     '<\/button>'\n            +     '<button type=\"button\" class=\"lo-entry-action lo-entry-action--del\" data-action=\"del\" data-id=\"' + escapeHtml(e.id) + '\" title=\"L\u00f6schen\" aria-label=\"L\u00f6schen\">'\n            +       '<svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 6h12\"><\/path><path d=\"M7 6V4h6v2\"><\/path><path d=\"M6 6l1 11h6l1-11\"><\/path><\/svg>'\n            +     '<\/button>'\n            +   '<\/div>'\n            + '<\/li>';\n    }\n    function capitalize(s) { if (!s) { return ''; } return s.charAt(0).toUpperCase() + s.slice(1); }\n\n    \/\/ ---- Render: gruppierte Ansicht ----\n    function renderGrouped(entries) {\n        var groupedEl = document.getElementById('loGrouped');\n        if (entries.length === 0) {\n            groupedEl.innerHTML = '<div class=\"lo-empty\"><p class=\"lo-empty-text\">Keine Eintr\u00e4ge passen zu den aktuellen Filtern.<\/p><\/div>';\n            return;\n        }\n        \/\/ gruppieren\n        var groupMap = {};\n        var groupOrder = [];\n        for (var i = 0; i < entries.length; i++) {\n            var e = entries[i];\n            if (!groupMap[e.pageKey]) {\n                groupMap[e.pageKey] = { title: e.pageTitle, url: e.pageUrl, items: [] };\n                groupOrder.push(e.pageKey);\n            }\n            groupMap[e.pageKey].items.push(e);\n        }\n        var html = '';\n        for (var g = 0; g < groupOrder.length; g++) {\n            var key = groupOrder[g];\n            var grp = groupMap[key];\n            var first = grp.items[0];\n            var lastUpdate = '';\n            for (var ii = 0; ii < grp.items.length; ii++) {\n                var ts = grp.items[ii].updatedAt || grp.items[ii].createdAt;\n                if (ts > lastUpdate) { lastUpdate = ts; }\n            }\n            html = html\n                + '<article class=\"lo-page-card\">'\n                + '  <header class=\"lo-page-head\">'\n                + '    <svg class=\"lo-page-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 4h12a2 2 0 0 1 2 2v14H6a2 2 0 0 1-2-2V4z\"><\/path><path d=\"M8 8h6M8 12h6M8 16h4\"><\/path><\/svg>'\n                + '    <div class=\"lo-page-info\">'\n                + '      <h3 class=\"lo-page-title\">' + escapeHtml(grp.title) + '<\/h3>'\n                + '      <div class=\"lo-page-url\">' + escapeHtml(grp.url) + '<\/div>'\n                + '    <\/div>'\n                + '    <div class=\"lo-page-meta\">'\n                + '      <span class=\"lo-page-count\">' + grp.items.length + ' ' + (grp.items.length === 1 ? 'Eintrag' : 'Eintr\u00e4ge') + '<\/span>'\n                + '      <a class=\"lo-page-link\" href=\"' + escapeHtml(grp.url) + '\" target=\"_blank\" rel=\"noopener noreferrer\">\u2197 Tutorial \u00f6ffnen<\/a>'\n                + '    <\/div>'\n                + '  <\/header>'\n                + '  <ul class=\"lo-entries\">';\n            for (var j = 0; j < grp.items.length; j++) {\n                html = html + entryHtml(grp.items[j], { flat: false });\n            }\n            html = html + '  <\/ul><\/article>';\n        }\n        groupedEl.innerHTML = html;\n    }\n\n    \/\/ ---- Render: flache Liste ----\n    function renderFlat(entries) {\n        var flatEl = document.getElementById('loFlat');\n        if (entries.length === 0) {\n            flatEl.innerHTML = '<div class=\"lo-empty\"><p class=\"lo-empty-text\">Keine Eintr\u00e4ge passen zu den aktuellen Filtern.<\/p><\/div>';\n            return;\n        }\n        var html = '<ul class=\"lo-entries\">';\n        for (var i = 0; i < entries.length; i++) {\n            html = html + entryHtml(entries[i], { flat: true });\n        }\n        html = html + '<\/ul>';\n        flatEl.innerHTML = html;\n    }\n\n    \/\/ ---- Render: Empty State und Selection-Counter ----\n    function updateUiState(visibleEntries) {\n        var emptyEl = document.getElementById('loEmpty');\n        var groupedEl = document.getElementById('loGrouped');\n        var flatEl = document.getElementById('loFlat');\n        var selectAllWrap = document.getElementById('loSelectAllWrap');\n        if (allEntries.length === 0) {\n            emptyEl.classList.remove('lo-hidden');\n            groupedEl.classList.add('lo-hidden');\n            flatEl.classList.add('lo-hidden');\n            selectAllWrap.hidden = true;\n            document.getElementById('loBulkbar').classList.remove('lo-bulkbar--visible');\n            return;\n        }\n        emptyEl.classList.add('lo-hidden');\n        if (state.view === 'flat') {\n            groupedEl.classList.add('lo-hidden');\n            flatEl.classList.remove('lo-hidden');\n        } else {\n            flatEl.classList.add('lo-hidden');\n            groupedEl.classList.remove('lo-hidden');\n        }\n        selectAllWrap.hidden = false;\n        updateBulkbar();\n        updateResetVisibility();\n        updateSelectAllCheckbox(visibleEntries);\n    }\n    function updateBulkbar() {\n        var bb = document.getElementById('loBulkbar');\n        var cnt = countKeys(state.selected);\n        if (cnt > 0) {\n            bb.classList.add('lo-bulkbar--visible');\n            document.getElementById('loBulkbarCount').textContent = cnt + ' ' + (cnt === 1 ? 'ausgew\u00e4hlt' : 'ausgew\u00e4hlt');\n        } else {\n            bb.classList.remove('lo-bulkbar--visible');\n        }\n    }\n    function updateResetVisibility() {\n        var hasFilter = false;\n        if (state.search) { hasFilter = true; }\n        if (hasAnyKey(state.types)) { hasFilter = true; }\n        if (hasAnyKey(state.colors)) { hasFilter = true; }\n        document.getElementById('loReset').hidden = !hasFilter;\n    }\n    function updateSelectAllCheckbox(visible) {\n        var cb = document.getElementById('loSelectAllCb');\n        if (!visible) { visible = []; }\n        if (visible.length === 0) { cb.checked = false; cb.indeterminate = false; return; }\n        var sel = 0;\n        for (var i = 0; i < visible.length; i++) { if (state.selected[visible[i].id]) { sel = sel + 1; } }\n        if (sel === 0) { cb.checked = false; cb.indeterminate = false; }\n        else if (sel === visible.length) { cb.checked = true; cb.indeterminate = false; }\n        else { cb.checked = false; cb.indeterminate = true; }\n    }\n\n    \/\/ ---- Master-Render ----\n    var lastVisible = [];\n    function renderAll() {\n        var filtered = applyFilters();\n        var sorted = applySort(filtered);\n        lastVisible = sorted;\n        renderGrouped(sorted);\n        renderFlat(sorted);\n        updateUiState(sorted);\n    }\n\n    \/\/ ---- Event Wiring ----\n    \/\/ Suche (debounced)\n    var searchTimer = null;\n    document.getElementById('loSearch').addEventListener('input', function (ev) {\n        if (searchTimer) { clearTimeout(searchTimer); }\n        var v = ev.target.value;\n        searchTimer = setTimeout(function () {\n            state.search = v;\n            renderAll();\n        }, 150);\n    });\n\n    \/\/ Tabs\n    function setView(v) {\n        state.view = v;\n        var g = document.getElementById('loTabGrouped');\n        var f = document.getElementById('loTabFlat');\n        g.setAttribute('aria-selected', v === 'grouped' ? 'true' : 'false');\n        f.setAttribute('aria-selected', v === 'flat' ? 'true' : 'false');\n        updateUiState(lastVisible);\n    }\n    document.getElementById('loTabGrouped').addEventListener('click', function () { setView('grouped'); });\n    document.getElementById('loTabFlat').addEventListener('click', function () { setView('flat'); });\n\n    \/\/ Sort\n    document.getElementById('loSort').addEventListener('change', function (ev) {\n        state.sort = ev.target.value;\n        renderAll();\n    });\n\n    \/\/ Typ-Filter Chips\n    var typeChips = document.querySelectorAll('#loFiltersType [data-filter-type]');\n    for (var ti = 0; ti < typeChips.length; ti++) {\n        typeChips[ti].addEventListener('click', function (ev) {\n            var t = ev.currentTarget.getAttribute('data-filter-type');\n            if (state.types[t]) {\n                state.types[t] = false;\n                ev.currentTarget.setAttribute('aria-pressed', 'false');\n            } else {\n                state.types[t] = true;\n                ev.currentTarget.setAttribute('aria-pressed', 'true');\n            }\n            renderAll();\n        });\n    }\n    \/\/ Farb-Filter Chips\n    var colorChips = document.querySelectorAll('#loFiltersColor [data-filter-color]');\n    for (var ci = 0; ci < colorChips.length; ci++) {\n        colorChips[ci].addEventListener('click', function (ev) {\n            var c = ev.currentTarget.getAttribute('data-filter-color');\n            if (state.colors[c]) {\n                state.colors[c] = false;\n                ev.currentTarget.setAttribute('aria-pressed', 'false');\n            } else {\n                state.colors[c] = true;\n                ev.currentTarget.setAttribute('aria-pressed', 'true');\n            }\n            renderAll();\n        });\n    }\n    \/\/ Reset\n    document.getElementById('loReset').addEventListener('click', function () {\n        state.search = '';\n        state.types = {};\n        state.colors = {};\n        document.getElementById('loSearch').value = '';\n        var allChips = root.querySelectorAll('.lo-chip[aria-pressed]');\n        for (var k = 0; k < allChips.length; k++) { allChips[k].setAttribute('aria-pressed', 'false'); }\n        renderAll();\n    });\n\n    \/\/ Select-All\n    document.getElementById('loSelectAllCb').addEventListener('change', function (ev) {\n        if (ev.target.checked) {\n            for (var i = 0; i < lastVisible.length; i++) { state.selected[lastVisible[i].id] = true; }\n        } else {\n            for (var j = 0; j < lastVisible.length; j++) { delete state.selected[lastVisible[j].id]; }\n        }\n        renderAll();\n    });\n\n    \/\/ Liste \u2014 Checkbox + Aktionen + Doppelklick\n    function attachListListeners(el) {\n        el.addEventListener('change', function (ev) {\n            var cb = ev.target;\n            if (!cb.classList.contains('lo-entry-cb')) { return; }\n            var id = cb.getAttribute('data-cb');\n            if (cb.checked) { state.selected[id] = true; }\n            else { delete state.selected[id]; }\n            updateBulkbar();\n            updateSelectAllCheckbox(lastVisible);\n        });\n        el.addEventListener('click', function (ev) {\n            var btn = ev.target.closest('[data-action]');\n            if (!btn) { return; }\n            ev.preventDefault();\n            ev.stopPropagation();\n            var action = btn.getAttribute('data-action');\n            var id = btn.getAttribute('data-id');\n            if (action === 'jump') { jumpToEntry(id); return; }\n            if (action === 'edit') { editEntry(id); return; }\n            if (action === 'del')  { deleteEntry(id); return; }\n        });\n        el.addEventListener('dblclick', function (ev) {\n            if (ev.target.closest('.lo-entry-cb')) { return; }\n            if (ev.target.closest('[data-action]')) { return; }\n            if (ev.target.closest('.lo-edit-area')) { return; }\n            var item = ev.target.closest('.lo-entry');\n            if (!item) { return; }\n            if (item.classList.contains('lo-entry--editing')) { return; }\n            editEntry(item.getAttribute('data-id'));\n        });\n    }\n    attachListListeners(document.getElementById('loGrouped'));\n    attachListListeners(document.getElementById('loFlat'));\n\n    \/\/ ---- Actions: jump, edit, delete ----\n    function findEntryById(id) {\n        for (var i = 0; i < allEntries.length; i++) { if (allEntries[i].id === id) { return allEntries[i]; } }\n        return null;\n    }\n    function jumpToEntry(id) {\n        var e = findEntryById(id);\n        if (!e) { showToast('Eintrag nicht gefunden.'); return; }\n        var sep = (e.pageUrl.indexOf('?') >= 0) ? AMP : '?';\n        var url = e.pageUrl + sep + 'lb-focus=' + encodeURIComponent(e.id);\n        window.open(url, '_blank', 'noopener');\n    }\n    function deleteEntry(id) {\n        var e = findEntryById(id);\n        if (!e) { return; }\n        var ok = window.confirm('Diesen Eintrag wirklich l\u00f6schen?\\n\\n' + (e.text || '(leer)').substring(0, 120));\n        if (!ok) { return; }\n        var store = loadStore();\n        var page = store.pages[e.pageKey];\n        if (!page) { return; }\n        if (!Array.isArray(page.entries)) { return; }\n        var newEntries = [];\n        for (var i = 0; i < page.entries.length; i++) {\n            if (page.entries[i].id !== id) { newEntries.push(page.entries[i]); }\n        }\n        page.entries = newEntries;\n        page.updatedAt = new Date().toISOString();\n        if (newEntries.length === 0) { delete store.pages[e.pageKey]; }\n        else { store.pages[e.pageKey] = page; }\n        saveStore(store);\n        delete state.selected[id];\n        rebuildIndex();\n        renderAll();\n        updateStats();\n        showToast('Eintrag gel\u00f6scht.');\n    }\n\n    \/\/ ---- Inline-Edit ----\n    function editEntry(id) {\n        var entry = findEntryById(id);\n        if (!entry) { return; }\n        var itemEl = root.querySelector('.lo-entry[data-id=\"' + CSS.escape(id) + '\"]');\n        if (!itemEl) { return; }\n        if (itemEl.classList.contains('lo-entry--editing')) { return; }\n        itemEl.classList.add('lo-entry--editing');\n        var body = itemEl.querySelector('.lo-entry-body');\n        if (!body) { return; }\n\n        var supportsColor = false;\n        if (entry.type === 'tool-note') { supportsColor = true; }\n        if (entry.type === 'note') { supportsColor = true; }\n        if (entry.type === 'highlight') { supportsColor = true; }\n        var textReadOnly = (entry.type === 'highlight');\n\n        var pendingColor = entry.color || 'yellow';\n        var editColorBtns = [];\n\n        var area = document.createElement('div');\n        area.className = 'lo-edit-area';\n\n        if (supportsColor) {\n            var crow = document.createElement('div');\n            crow.className = 'lo-edit-colors';\n            var clab = document.createElement('span');\n            clab.className = 'lo-edit-colors-label';\n            clab.textContent = 'Farbe';\n            crow.appendChild(clab);\n            var clist = ['yellow', 'green', 'orange'];\n            for (var ck = 0; ck < clist.length; ck++) {\n                var cb = makeEditColorBtn(clist[ck], pendingColor, editColorBtns, function (c) { pendingColor = c; });\n                editColorBtns.push(cb);\n                crow.appendChild(cb);\n            }\n            area.appendChild(crow);\n        }\n\n        var ta = document.createElement('textarea');\n        ta.className = 'lo-edit-textarea';\n        ta.value = entry.text || '';\n        if (textReadOnly) {\n            ta.readOnly = true;\n            ta.title = 'Marker-Text ist der Original-Auszug aus dem Tutorial, nur die Farbe ist hier \u00e4nderbar.';\n        }\n        var lines = (entry.text || '').split('\\n').length;\n        var rows = lines + 1;\n        if (rows < 3) { rows = 3; }\n        if (rows > 10) { rows = 10; }\n        ta.rows = rows;\n        area.appendChild(ta);\n\n        var actions = document.createElement('div');\n        actions.className = 'lo-edit-actions';\n        var btnSave = document.createElement('button');\n        btnSave.type = 'button';\n        btnSave.className = 'lo-edit-btn lo-edit-btn--save';\n        btnSave.textContent = 'Speichern';\n        var btnCancel = document.createElement('button');\n        btnCancel.type = 'button';\n        btnCancel.className = 'lo-edit-btn';\n        btnCancel.textContent = 'Abbrechen';\n        actions.appendChild(btnSave);\n        actions.appendChild(btnCancel);\n        area.appendChild(actions);\n\n        var hint = document.createElement('div');\n        hint.className = 'lo-edit-hint';\n        hint.textContent = textReadOnly\n            ? 'Marker-Text ist read-only. Strg+Enter speichert Farb-\u00c4nderung, Esc bricht ab.'\n            : 'Strg+Enter speichert, Esc bricht ab.';\n        area.appendChild(hint);\n\n        body.appendChild(area);\n        if (!textReadOnly) {\n            ta.focus();\n            ta.setSelectionRange(ta.value.length, ta.value.length);\n        }\n\n        function save() {\n            var v = textReadOnly ? entry.text : ta.value.trim();\n            if (!textReadOnly) {\n                if (v === '') { showToast('Eintrag darf nicht leer sein.'); ta.focus(); return; }\n            }\n            var store = loadStore();\n            var page = store.pages[entry.pageKey];\n            if (!page) { showToast('Eintrag nicht mehr vorhanden.'); renderAll(); return; }\n            var found = false;\n            for (var k = 0; k < page.entries.length; k++) {\n                if (page.entries[k].id === id) {\n                    if (!textReadOnly) { page.entries[k].text = v; }\n                    if (supportsColor) { page.entries[k].color = pendingColor; }\n                    page.entries[k].updatedAt = new Date().toISOString();\n                    found = true;\n                    break;\n                }\n            }\n            if (!found) { showToast('Eintrag nicht mehr vorhanden.'); renderAll(); return; }\n            page.updatedAt = new Date().toISOString();\n            saveStore(store);\n            rebuildIndex();\n            renderAll();\n            updateStats();\n            showToast('Eintrag aktualisiert.');\n        }\n        function cancel() { renderAll(); }\n        btnSave.addEventListener('click', save);\n        btnCancel.addEventListener('click', cancel);\n        ta.addEventListener('keydown', function (kev) {\n            if (kev.key === 'Escape') { kev.preventDefault(); cancel(); return; }\n            if (kev.key === 'Enter') {\n                if (kev.ctrlKey || kev.metaKey) { kev.preventDefault(); save(); }\n            }\n        });\n    }\n    function makeEditColorBtn(color, currentPending, list, setPending) {\n        var b = document.createElement('button');\n        b.type = 'button';\n        b.className = 'lo-edit-color lo-edit-color--' + color;\n        b.setAttribute('data-edit-color', color);\n        b.setAttribute('aria-pressed', color === currentPending ? 'true' : 'false');\n        b.setAttribute('aria-label', color);\n        b.addEventListener('click', function () {\n            setPending(color);\n            for (var i = 0; i < list.length; i++) {\n                var c = list[i].getAttribute('data-edit-color');\n                list[i].setAttribute('aria-pressed', c === color ? 'true' : 'false');\n            }\n        });\n        return b;\n    }\n\n    \/\/ ---- Bulk-Aktionen ----\n    document.getElementById('loBulkDelete').addEventListener('click', function () {\n        var ids = Object.keys(state.selected);\n        var count = ids.length;\n        if (count === 0) { return; }\n        var ok = window.confirm(count + ' Eintr' + (count === 1 ? 'ag' : '\u00e4ge') + ' l\u00f6schen?');\n        if (!ok) { return; }\n        var store = loadStore();\n        var byPage = {};\n        for (var i = 0; i < ids.length; i++) {\n            var e = findEntryById(ids[i]);\n            if (!e) { continue; }\n            if (!byPage[e.pageKey]) { byPage[e.pageKey] = {}; }\n            byPage[e.pageKey][ids[i]] = true;\n        }\n        for (var pk in byPage) {\n            if (!Object.prototype.hasOwnProperty.call(byPage, pk)) { continue; }\n            var page = store.pages[pk];\n            if (!page) { continue; }\n            var ne = [];\n            for (var j = 0; j < page.entries.length; j++) {\n                if (!byPage[pk][page.entries[j].id]) { ne.push(page.entries[j]); }\n            }\n            page.entries = ne;\n            page.updatedAt = new Date().toISOString();\n            if (ne.length === 0) { delete store.pages[pk]; }\n            else { store.pages[pk] = page; }\n        }\n        saveStore(store);\n        state.selected = {};\n        rebuildIndex();\n        renderAll();\n        updateStats();\n        showToast(count + ' Eintr' + (count === 1 ? 'ag' : '\u00e4ge') + ' gel\u00f6scht.');\n    });\n\n    document.getElementById('loBulkExport').addEventListener('click', function () {\n        var ids = Object.keys(state.selected);\n        if (ids.length === 0) { return; }\n        var store = loadStore();\n        var subset = { version: 1, exportedAt: new Date().toISOString(), pages: {} };\n        var idMap = {};\n        for (var i = 0; i < ids.length; i++) { idMap[ids[i]] = true; }\n        for (var pk in store.pages) {\n            if (!Object.prototype.hasOwnProperty.call(store.pages, pk)) { continue; }\n            var page = store.pages[pk];\n            if (!page) { continue; }\n            if (!Array.isArray(page.entries)) { continue; }\n            var matched = [];\n            for (var j = 0; j < page.entries.length; j++) {\n                if (idMap[page.entries[j].id]) { matched.push(page.entries[j]); }\n            }\n            if (matched.length > 0) {\n                subset.pages[pk] = {\n                    url: page.url, title: page.title,\n                    updatedAt: page.updatedAt, entries: matched\n                };\n            }\n        }\n        downloadJson(subset, 'cadkompass-logbuch-auswahl_');\n        showToast(ids.length + ' Eintr' + (ids.length === 1 ? 'ag' : '\u00e4ge') + ' exportiert.');\n    });\n\n    \/\/ Bulk-Recolor Dropdown\n    document.getElementById('loBulkRecolorBtn').addEventListener('click', function () {\n        var wrap = document.getElementById('loBulkRecolor');\n        var btn = document.getElementById('loBulkRecolorBtn');\n        if (wrap.classList.contains('lo-open')) {\n            wrap.classList.remove('lo-open');\n            btn.setAttribute('aria-expanded', 'false');\n        } else {\n            wrap.classList.add('lo-open');\n            btn.setAttribute('aria-expanded', 'true');\n        }\n    });\n    document.addEventListener('click', function (ev) {\n        var wrap = document.getElementById('loBulkRecolor');\n        if (!wrap) { return; }\n        if (!wrap.contains(ev.target)) { wrap.classList.remove('lo-open'); document.getElementById('loBulkRecolorBtn').setAttribute('aria-expanded', 'false'); }\n    });\n    var recolorBtns = document.querySelectorAll('[data-recolor]');\n    for (var ri = 0; ri < recolorBtns.length; ri++) {\n        recolorBtns[ri].addEventListener('click', function (ev) {\n            ev.stopPropagation();\n            var newColor = ev.currentTarget.getAttribute('data-recolor');\n            var ids = Object.keys(state.selected);\n            if (ids.length === 0) { return; }\n            var store = loadStore();\n            var idMap = {};\n            for (var i = 0; i < ids.length; i++) { idMap[ids[i]] = true; }\n            var changed = 0;\n            for (var pk in store.pages) {\n                if (!Object.prototype.hasOwnProperty.call(store.pages, pk)) { continue; }\n                var page = store.pages[pk];\n                if (!page) { continue; }\n                if (!Array.isArray(page.entries)) { continue; }\n                for (var j = 0; j < page.entries.length; j++) {\n                    if (idMap[page.entries[j].id]) {\n                        if (page.entries[j].type !== 'bookmark') {\n                            page.entries[j].color = newColor;\n                            page.entries[j].updatedAt = new Date().toISOString();\n                            changed = changed + 1;\n                        }\n                    }\n                }\n                page.updatedAt = new Date().toISOString();\n            }\n            saveStore(store);\n            document.getElementById('loBulkRecolor').classList.remove('lo-open');\n            document.getElementById('loBulkRecolorBtn').setAttribute('aria-expanded', 'false');\n            rebuildIndex();\n            renderAll();\n            showToast(changed + ' Eintr' + (changed === 1 ? 'ag' : '\u00e4ge') + ' umgef\u00e4rbt.');\n        });\n    }\n\n    \/\/ ---- Komplett-Export ----\n    function downloadJson(data, prefix) {\n        var json = JSON.stringify(data, null, 2);\n        var blob = new Blob([json], { type: 'application\/json' });\n        var url = URL.createObjectURL(blob);\n        var d = new Date();\n        var fname = prefix + d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) + '.cadlog.json';\n        var a = document.createElement('a');\n        a.href = url; a.download = fname;\n        document.body.appendChild(a);\n        a.click();\n        document.body.removeChild(a);\n        setTimeout(function () { URL.revokeObjectURL(url); }, 200);\n    }\n    document.getElementById('loBtnExport').addEventListener('click', function () {\n        var store = loadStore();\n        store.exportedAt = new Date().toISOString();\n        downloadJson(store, 'cadkompass-logbuch_');\n        showToast('Notizen exportiert.');\n    });\n\n    \/\/ ---- Komplett-Import ----\n    var fileInput = document.getElementById('loFileInput');\n    document.getElementById('loBtnImport').addEventListener('click', function () { fileInput.click(); });\n    fileInput.addEventListener('change', function () {\n        if (!fileInput.files) { return; }\n        if (fileInput.files.length === 0) { return; }\n        var file = fileInput.files[0];\n        var reader = new FileReader();\n        reader.onload = function () {\n            try {\n                var parsed = JSON.parse(reader.result);\n                if (!parsed) { showToast('Ung\u00fcltige Datei.'); return; }\n                if (!parsed.pages) { showToast('Datei hat kein g\u00fcltiges Logbuch-Format.'); return; }\n                var store = loadStore();\n                var imported = 0;\n                for (var p in parsed.pages) {\n                    if (!Object.prototype.hasOwnProperty.call(parsed.pages, p)) { continue; }\n                    var src = parsed.pages[p];\n                    if (!src) { continue; }\n                    if (!Array.isArray(src.entries)) { continue; }\n                    var dst = store.pages[p];\n                    if (!dst) {\n                        store.pages[p] = src;\n                        imported = imported + src.entries.length;\n                    } else {\n                        if (!Array.isArray(dst.entries)) { dst.entries = []; }\n                        var existingIds = {};\n                        for (var k = 0; k < dst.entries.length; k++) { existingIds[dst.entries[k].id] = true; }\n                        for (var m = 0; m < src.entries.length; m++) {\n                            if (!existingIds[src.entries[m].id]) {\n                                dst.entries.push(src.entries[m]);\n                                imported = imported + 1;\n                            }\n                        }\n                    }\n                }\n                saveStore(store);\n                rebuildIndex();\n                renderAll();\n                updateStats();\n                showToast(imported + ' Eintr' + (imported === 1 ? 'ag' : '\u00e4ge') + ' importiert.');\n            } catch (e) { showToast('Datei konnte nicht gelesen werden.'); }\n        };\n        reader.readAsText(file);\n        fileInput.value = '';\n    });\n\n    \/\/ ---- Drucken ----\n    document.getElementById('loBtnPrint').addEventListener('click', function () {\n        window.print();\n    });\n\n    \/\/ ---- Alles l\u00f6schen ----\n    document.getElementById('loBtnClear').addEventListener('click', function () {\n        if (allEntries.length === 0) { showToast('Keine Eintr\u00e4ge zum L\u00f6schen.'); return; }\n        var ok = window.confirm('Alle ' + allEntries.length + ' Eintr' + (allEntries.length === 1 ? 'ag' : '\u00e4ge') + ' aus allen Seiten endg\u00fcltig l\u00f6schen?');\n        if (!ok) { return; }\n        try { localStorage.removeItem(STORAGE_KEY); } catch (e) {}\n        state.selected = {};\n        rebuildIndex();\n        renderAll();\n        updateStats();\n        showToast('Alle Eintr\u00e4ge gel\u00f6scht.');\n    });\n\n    \/\/ ---- Storage-Change-Listener (synchron, wenn andere Tabs \u00e4ndern) ----\n    window.addEventListener('storage', function (ev) {\n        if (ev.key !== STORAGE_KEY) { return; }\n        rebuildIndex();\n        renderAll();\n        updateStats();\n    });\n\n    \/\/ ---- Info-Popover (Speicherung erkl\u00e4ren) ----\n    function initInfoPopover() {\n        var trigger = document.getElementById('loInfoTrigger');\n        var pop = document.getElementById('loInfoPop');\n        if (!trigger) { return; }\n        if (!pop) { return; }\n        function position() {\n            var rect = trigger.getBoundingClientRect();\n            pop.style.top = (rect.bottom + 8) + 'px';\n            pop.style.right = (window.innerWidth - rect.right) + 'px';\n            pop.style.left = 'auto';\n        }\n        function close() {\n            pop.removeAttribute('data-open');\n            trigger.setAttribute('aria-expanded', 'false');\n        }\n        function open() {\n            position();\n            pop.setAttribute('data-open', '1');\n            trigger.setAttribute('aria-expanded', 'true');\n        }\n        trigger.addEventListener('click', function (e) {\n            e.stopPropagation();\n            if (pop.getAttribute('data-open') === '1') { close(); }\n            else { open(); }\n        });\n        document.addEventListener('click', function (e) {\n            if (pop.getAttribute('data-open') !== '1') { return; }\n            if (pop.contains(e.target)) { return; }\n            if (e.target === trigger) { return; }\n            close();\n        });\n        document.addEventListener('keydown', function (e) {\n            if (e.key === 'Escape') {\n                if (pop.getAttribute('data-open') === '1') {\n                    close();\n                    trigger.focus();\n                }\n            }\n        });\n        window.addEventListener('scroll', function () {\n            if (pop.getAttribute('data-open') === '1') { close(); }\n        }, true);\n        window.addEventListener('resize', function () {\n            if (pop.getAttribute('data-open') === '1') { position(); }\n        });\n    }\n    initInfoPopover();\n\n    \/\/ ---- Initial render ----\n    rebuildIndex();\n    updateStats();\n    renderAll();\n})();\n\n(function () {\n    'use strict';\n    var prefersReducedMotion = window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)').matches : false;\n    var hasFinePointer = window.matchMedia ? window.matchMedia('(pointer: fine)').matches : false;\n\n    \/* === Kompassnadel folgt dem Mauszeiger (Standalone-Seite ohne Kartenraster, wie Kapit\u00e4n) === *\/\n    (function compassCursor() {\n        if (prefersReducedMotion) { return; }\n        if (!hasFinePointer) { return; }\n        var compass = document.querySelector('.cad-compass');\n        if (!compass) { return; }\n        var rose = compass.querySelector('.cad-compass-rose');\n        if (!rose) { return; }\n        var latestX = 0, latestY = 0, ticking = false;\n        function apply() {\n            var rect = compass.getBoundingClientRect();\n            if (rect.width === 0) { ticking = false; return; }\n            var angle = Math.atan2(latestY - (rect.top + rect.height \/ 2), latestX - (rect.left + rect.width \/ 2)) * 180 \/ Math.PI + 90;\n            rose.style.transform = 'rotate(' + angle.toFixed(2) + 'deg)';\n            ticking = false;\n        }\n        document.addEventListener('mousemove', function (e) {\n            latestX = e.clientX; latestY = e.clientY;\n            if (!ticking) { requestAnimationFrame(apply); ticking = true; }\n        }, { passive: true });\n    })();\n\n    \/* === Hero-Raster leicht parallax === *\/\n    (function heroParallax() {\n        if (prefersReducedMotion) { return; }\n        if (!hasFinePointer) { return; }\n        var hero = document.querySelector('.cad-hero');\n        if (!hero) { return; }\n        var lastX = 0, lastY = 0, ticking = false;\n        function apply() {\n            hero.style.setProperty('--cad-grid-x', lastX.toFixed(1) + 'px');\n            hero.style.setProperty('--cad-grid-y', lastY.toFixed(1) + 'px');\n            ticking = false;\n        }\n        hero.addEventListener('mousemove', function (e) {\n            var rect = hero.getBoundingClientRect();\n            var nx = (e.clientX - rect.left) \/ rect.width - 0.5;\n            var ny = (e.clientY - rect.top) \/ rect.height - 0.5;\n            lastX = nx * -16;\n            lastY = ny * -16;\n            if (!ticking) { requestAnimationFrame(apply); ticking = true; }\n        }, { passive: true });\n        hero.addEventListener('mouseleave', function () {\n            lastX = 0; lastY = 0;\n            if (!ticking) { requestAnimationFrame(apply); ticking = true; }\n        });\n    })();\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Logbuch \u00b7 \u00dcbersicht Hier laufen alle deine Markierungen und Notizen zusammen Daten werden geladen\u2026 N O S W Alle Notizen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":14,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"disabled","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-2356","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":false,"author_link":"https:\/\/cad-kompass.de\/?author=1"},"uagb_comment_info":0,"uagb_excerpt":"Logbuch \u00b7 \u00dcbersicht Hier laufen alle deine Markierungen und Notizen zusammen Daten werden geladen\u2026 N O S W Alle Notizen [&hellip;]","_links":{"self":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/pages\/2356","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2356"}],"version-history":[{"count":1,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/pages\/2356\/revisions"}],"predecessor-version":[{"id":2357,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/pages\/2356\/revisions\/2357"}],"wp:attachment":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}