143d2073cStracker-user/** 243d2073cStracker-user * Annotations plugin — stylesheet. 343d2073cStracker-user * 443d2073cStracker-user * Colour tokens use DokuWiki's __xxx__ replacement syntax so the theme 543d2073cStracker-user * controls the palette. Hard-coded colours are limited to the annotation- 643d2073cStracker-user * specific highlights (amber / green) which are intentionally opinionated. 743d2073cStracker-user * 843d2073cStracker-user * FF78 ESR safe: no :has(), :not() with selectors, aspect-ratio, container 943d2073cStracker-user * queries, or CSS nesting. 10*86c7806dStracker-user * 11*86c7806dStracker-user * The two highlight hues are driven by CSS custom properties that action.php 12*86c7806dStracker-user * injects from the color_open / color_resolved config (as "r,g,b" triplets); 13*86c7806dStracker-user * every fill/border/marker/pill tint below is that hue at a different opacity. 14*86c7806dStracker-user * The :root fallbacks here keep the built-in amber/green palette when the 15*86c7806dStracker-user * injected <style> is absent (e.g. annotations off, or a stripped template). 16*86c7806dStracker-user * 17*86c7806dStracker-user * NOTE: every rgba() that contains var() is LESS-escaped as ~"rgba(var(…), a)". 18*86c7806dStracker-user * DokuWiki compiles plugin CSS through lesserphp, which otherwise evaluates 19*86c7806dStracker-user * rgba() at compile time, reads var() as 0, and bakes the colour to #000000. 20*86c7806dStracker-user * The escape makes lesserphp emit the declaration verbatim so the browser 21*86c7806dStracker-user * resolves the custom property at render time. Keep new var()-based colours 22*86c7806dStracker-user * escaped the same way. 2343d2073cStracker-user */ 2443d2073cStracker-user 25*86c7806dStracker-user:root { 26*86c7806dStracker-user --ann-open-rgb: var(--ann-open-rgb); /* amber — open / unresolved */ 27*86c7806dStracker-user --ann-resolved-rgb: var(--ann-resolved-rgb); /* green — resolved */ 28*86c7806dStracker-user} 29*86c7806dStracker-user 3043d2073cStracker-user/* ========================================================================= 3143d2073cStracker-user Highlight spans 3243d2073cStracker-user ========================================================================= */ 3343d2073cStracker-user 3443d2073cStracker-user.ann-highlight-open { 35*86c7806dStracker-user background-color: ~"rgba(var(--ann-open-rgb), 0.35)"; /* amber-300 @ 35% */ 36*86c7806dStracker-user border-bottom: 2px solid ~"rgba(var(--ann-open-rgb), 0.7)"; 3743d2073cStracker-user border-radius: 2px; 3843d2073cStracker-user cursor: pointer; 3943d2073cStracker-user transition: background-color 0.15s ease; 4043d2073cStracker-user} 4143d2073cStracker-user 4243d2073cStracker-user.ann-highlight-open:hover { 43*86c7806dStracker-user background-color: ~"rgba(var(--ann-open-rgb), 0.55)"; 4443d2073cStracker-user} 4543d2073cStracker-user 4643d2073cStracker-user.ann-highlight-resolved { 47*86c7806dStracker-user background-color: ~"rgba(var(--ann-resolved-rgb), 0.30)"; /* green-300 @ 30% */ 48*86c7806dStracker-user border-bottom: 2px solid ~"rgba(var(--ann-resolved-rgb), 0.6)"; 4943d2073cStracker-user border-radius: 2px; 5043d2073cStracker-user cursor: pointer; 5143d2073cStracker-user transition: background-color 0.15s ease; 5243d2073cStracker-user} 5343d2073cStracker-user 5443d2073cStracker-user.ann-highlight-resolved:hover { 55*86c7806dStracker-user background-color: ~"rgba(var(--ann-resolved-rgb), 0.50)"; 5643d2073cStracker-user} 5743d2073cStracker-user 5843d2073cStracker-user/* ========================================================================= 5943d2073cStracker-user Counter bar 6043d2073cStracker-user ========================================================================= */ 6143d2073cStracker-user 6243d2073cStracker-user#ann-counter-bar { 6343d2073cStracker-user display: flex; 6443d2073cStracker-user align-items: center; 6543d2073cStracker-user flex-wrap: wrap; 6643d2073cStracker-user gap: 0.5em; 6743d2073cStracker-user padding: 0.4em 0.75em; 6843d2073cStracker-user margin-bottom: 0.75em; 6943d2073cStracker-user background: __background_alt__; 7043d2073cStracker-user border: 1px solid __border__; 7143d2073cStracker-user border-radius: 4px; 7243d2073cStracker-user color: __text__; 7343d2073cStracker-user} 7443d2073cStracker-user 7543d2073cStracker-user.ann-orphan-link { 7643d2073cStracker-user color: __link__; 7743d2073cStracker-user text-decoration: underline; 7843d2073cStracker-user cursor: pointer; 7943d2073cStracker-user} 8043d2073cStracker-user 8143d2073cStracker-user/* ========================================================================= 8243d2073cStracker-user Gutter markers 8343d2073cStracker-user ========================================================================= */ 8443d2073cStracker-user 85563f3b4cStracker-user/* Markers are appended to document.body as position:absolute elements so 86563f3b4cStracker-user that no template overflow:hidden can clip them. Top/left are set inline 87563f3b4cStracker-user via JS using getBoundingClientRect() + scroll offsets. All markers share 88563f3b4cStracker-user the same X position (left edge of the .page column) so they form a tidy 89563f3b4cStracker-user vertical column in the document margin. */ 9043d2073cStracker-user.ann-gutter-marker { 9143d2073cStracker-user position: absolute; 9243d2073cStracker-user padding: 0; 9343d2073cStracker-user border: none; 94563f3b4cStracker-user background: none; 95*86c7806dStracker-user color: ~"rgba(var(--ann-open-rgb), 0.8)"; /* amber — open */ 9643d2073cStracker-user cursor: pointer; 97563f3b4cStracker-user display: flex; 98563f3b4cStracker-user align-items: center; 99563f3b4cStracker-user justify-content: center; 100563f3b4cStracker-user z-index: 1000; 101563f3b4cStracker-user transition: color 0.15s ease, transform 0.12s ease; 102563f3b4cStracker-user} 103563f3b4cStracker-user 104563f3b4cStracker-user/* Suppress any UA button background on all interactive states. */ 105563f3b4cStracker-user.ann-gutter-marker:hover, 106563f3b4cStracker-user.ann-gutter-marker:focus, 107563f3b4cStracker-user.ann-gutter-marker:active { 108563f3b4cStracker-user background: none; 109563f3b4cStracker-user outline: none; 110563f3b4cStracker-user box-shadow: none; 11143d2073cStracker-user} 11243d2073cStracker-user 11343d2073cStracker-user.ann-gutter-marker:hover { 114*86c7806dStracker-user color: ~"rgba(var(--ann-open-rgb), 1)"; 115563f3b4cStracker-user} 116563f3b4cStracker-user 117563f3b4cStracker-user.ann-gutter-marker[data-status="resolved"] { 118*86c7806dStracker-user color: ~"rgba(var(--ann-resolved-rgb), 0.8)"; /* green — resolved */ 119563f3b4cStracker-user} 120563f3b4cStracker-user 121563f3b4cStracker-user.ann-gutter-marker[data-status="resolved"]:hover { 122*86c7806dStracker-user color: ~"rgba(var(--ann-resolved-rgb), 1)"; 12343d2073cStracker-user} 12443d2073cStracker-user 12543d2073cStracker-user/* ========================================================================= 12643d2073cStracker-user Annotation panel 12743d2073cStracker-user ========================================================================= */ 12843d2073cStracker-user 12943d2073cStracker-user.ann-panel { 13043d2073cStracker-user margin: 0.75em 0 1em; 13143d2073cStracker-user border: 1px solid __border__; 132*86c7806dStracker-user border-left: 3px solid ~"rgba(var(--ann-open-rgb), 0.7)"; 13343d2073cStracker-user background: __background_alt__; 134563f3b4cStracker-user box-shadow: 0 2px 8px rgba(0,0,0,0.10); 135563f3b4cStracker-user contain: layout; 13643d2073cStracker-user} 13743d2073cStracker-user 13843d2073cStracker-user/* ========================================================================= 13943d2073cStracker-user Thread entries (annotation + replies) 14043d2073cStracker-user ========================================================================= */ 14143d2073cStracker-user 14243d2073cStracker-user.ann-thread-entry { 14343d2073cStracker-user padding: 0.65em 0.85em; 14443d2073cStracker-user border-bottom: 1px solid __border__; 14543d2073cStracker-user} 14643d2073cStracker-user 14743d2073cStracker-user.ann-thread-entry:last-of-type { 14843d2073cStracker-user border-bottom: none; 14943d2073cStracker-user} 15043d2073cStracker-user 151563f3b4cStracker-user/* Root annotation entry: lighter background so it stands out from the panel. */ 152563f3b4cStracker-user.ann-thread-entry.ann-annotation { 153563f3b4cStracker-user background: __background__; 154563f3b4cStracker-user} 155563f3b4cStracker-user 156563f3b4cStracker-user/* Reply entries: inset card with the same lighter background. */ 15743d2073cStracker-user.ann-reply { 15843d2073cStracker-user margin-left: 1.5em; 15943d2073cStracker-user background: __background__; 16043d2073cStracker-user border-left: 2px solid __border__; 16143d2073cStracker-user} 16243d2073cStracker-user 16343d2073cStracker-user/* ========================================================================= 164563f3b4cStracker-user Meta row (avatar, author, time, status, close button) 16543d2073cStracker-user ========================================================================= */ 16643d2073cStracker-user 16743d2073cStracker-user.ann-meta { 16843d2073cStracker-user display: flex; 16943d2073cStracker-user align-items: center; 17043d2073cStracker-user gap: 0.4em; 17143d2073cStracker-user margin-bottom: 0.35em; 17243d2073cStracker-user flex-wrap: wrap; 17343d2073cStracker-user} 17443d2073cStracker-user 17543d2073cStracker-user.ann-avatar { 17643d2073cStracker-user display: inline-flex; 17743d2073cStracker-user align-items: center; 17843d2073cStracker-user justify-content: center; 17943d2073cStracker-user width: 1.8em; 18043d2073cStracker-user height: 1.8em; 18143d2073cStracker-user border-radius: 50%; 18243d2073cStracker-user background: __link__; 18343d2073cStracker-user color: #fff; 18443d2073cStracker-user font-size: 0.75em; 18543d2073cStracker-user font-weight: 700; 18643d2073cStracker-user flex-shrink: 0; 18743d2073cStracker-user} 18843d2073cStracker-user 18943d2073cStracker-user.ann-author { 19043d2073cStracker-user font-weight: 600; 19143d2073cStracker-user color: __text__; 19243d2073cStracker-user} 19343d2073cStracker-user 19443d2073cStracker-user.ann-time { 19543d2073cStracker-user color: __text_alt__; 19643d2073cStracker-user font-size: 0.85em; 19743d2073cStracker-user} 19843d2073cStracker-user 19943d2073cStracker-user.ann-status { 20043d2073cStracker-user display: inline-block; 20143d2073cStracker-user padding: 0.1em 0.45em; 20243d2073cStracker-user border-radius: 10em; 20343d2073cStracker-user font-size: 0.78em; 20443d2073cStracker-user font-weight: 600; 20543d2073cStracker-user letter-spacing: 0.02em; 20643d2073cStracker-user} 20743d2073cStracker-user 20843d2073cStracker-user.ann-status-open { 209*86c7806dStracker-user background: ~"rgba(var(--ann-open-rgb), 0.25)"; 21043d2073cStracker-user color: #92400e; 211*86c7806dStracker-user border: 1px solid ~"rgba(var(--ann-open-rgb), 0.5)"; 21243d2073cStracker-user} 21343d2073cStracker-user 21443d2073cStracker-user.ann-status-resolved { 215*86c7806dStracker-user background: ~"rgba(var(--ann-resolved-rgb), 0.25)"; 21643d2073cStracker-user color: #166534; 217*86c7806dStracker-user border: 1px solid ~"rgba(var(--ann-resolved-rgb), 0.4)"; 21843d2073cStracker-user} 21943d2073cStracker-user 22043d2073cStracker-user/* ========================================================================= 22143d2073cStracker-user Body text and quoted selection 22243d2073cStracker-user ========================================================================= */ 22343d2073cStracker-user 22443d2073cStracker-user.ann-body { 22543d2073cStracker-user white-space: pre-wrap; 22643d2073cStracker-user word-break: break-word; 22743d2073cStracker-user color: __text__; 22843d2073cStracker-user margin-bottom: 0.4em; 22943d2073cStracker-user} 23043d2073cStracker-user 23143d2073cStracker-user.ann-quote { 232563f3b4cStracker-user margin-bottom: 0.65em; 23343d2073cStracker-user padding: 0.25em 0.6em; 234*86c7806dStracker-user border-left: 3px solid ~"rgba(var(--ann-open-rgb), 0.6)"; 235563f3b4cStracker-user color: __text__; 23643d2073cStracker-user font-style: italic; 23743d2073cStracker-user font-size: 0.9em; 238*86c7806dStracker-user background: ~"rgba(var(--ann-open-rgb), 0.08)"; 23943d2073cStracker-user border-radius: 0 2px 2px 0; 24043d2073cStracker-user} 24143d2073cStracker-user 24243d2073cStracker-user/* ========================================================================= 24343d2073cStracker-user Action buttons row 24443d2073cStracker-user ========================================================================= */ 24543d2073cStracker-user 24643d2073cStracker-user.ann-actions { 24743d2073cStracker-user display: flex; 248563f3b4cStracker-user gap: 0.5em; 24943d2073cStracker-user flex-wrap: wrap; 250563f3b4cStracker-user margin-top: 0.65em; 25143d2073cStracker-user} 25243d2073cStracker-user 25343d2073cStracker-user.ann-btn { 25443d2073cStracker-user display: inline-block; 25543d2073cStracker-user padding: 0.2em 0.55em; 256563f3b4cStracker-user font-size: 0.85em; 25743d2073cStracker-user border: 1px solid __border__; 25843d2073cStracker-user border-radius: 3px; 259563f3b4cStracker-user background: __background__ !important; 26043d2073cStracker-user color: __text__; 26143d2073cStracker-user cursor: pointer; 26243d2073cStracker-user line-height: 1.4; 26343d2073cStracker-user transition: background-color 0.12s ease; 26443d2073cStracker-user} 26543d2073cStracker-user 26643d2073cStracker-user.ann-btn:hover { 267563f3b4cStracker-user background: __background_alt__ !important; 26843d2073cStracker-user} 26943d2073cStracker-user 27043d2073cStracker-user.ann-btn-primary { 271563f3b4cStracker-user background: __link__ !important; 27243d2073cStracker-user border-color: __link__; 27343d2073cStracker-user color: #fff; 27443d2073cStracker-user} 27543d2073cStracker-user 27643d2073cStracker-user.ann-btn-primary:hover { 277563f3b4cStracker-user background: __link__ !important; 278563f3b4cStracker-user color: #fff; 27943d2073cStracker-user opacity: 0.88; 28043d2073cStracker-user} 28143d2073cStracker-user 282563f3b4cStracker-user/* Disabled state: prevent UA-stylesheet background overrides and ensure 283563f3b4cStracker-user primary buttons keep their link colour. */ 284563f3b4cStracker-user.ann-btn:disabled, 285563f3b4cStracker-user.ann-btn[disabled] { 286563f3b4cStracker-user background: __background__; 287563f3b4cStracker-user opacity: 0.55; 288563f3b4cStracker-user cursor: not-allowed; 289563f3b4cStracker-user} 290563f3b4cStracker-user 291563f3b4cStracker-user.ann-btn:disabled:hover, 292563f3b4cStracker-user.ann-btn[disabled]:hover { 293563f3b4cStracker-user background: __background__; 294563f3b4cStracker-user} 295563f3b4cStracker-user 296563f3b4cStracker-user.ann-btn-primary:disabled, 297563f3b4cStracker-user.ann-btn-primary[disabled] { 298563f3b4cStracker-user background: __link__; 299563f3b4cStracker-user color: #fff; 300563f3b4cStracker-user} 301563f3b4cStracker-user 302563f3b4cStracker-user.ann-btn-primary:disabled:hover, 303563f3b4cStracker-user.ann-btn-primary[disabled]:hover { 304563f3b4cStracker-user background: __link__; 305563f3b4cStracker-user opacity: 0.55; 306563f3b4cStracker-user} 307563f3b4cStracker-user 308563f3b4cStracker-user/* Spinner shown while an AJAX request is in flight (set by setBusy()). 309563f3b4cStracker-user The translate(-50%,-50%) is baked into every keyframe so it stays perfectly 310563f3b4cStracker-user centred regardless of sub-pixel rounding and never jigles. */ 311563f3b4cStracker-user@keyframes ann-spin { 312563f3b4cStracker-user from { transform: translate(-50%, -50%) rotate(0deg); } 313563f3b4cStracker-user to { transform: translate(-50%, -50%) rotate(360deg); } 314563f3b4cStracker-user} 315563f3b4cStracker-user 316563f3b4cStracker-user.ann-btn-busy { 317563f3b4cStracker-user position: relative; 318563f3b4cStracker-user color: transparent; 319563f3b4cStracker-user} 320563f3b4cStracker-user 321563f3b4cStracker-user.ann-btn-busy::after { 322563f3b4cStracker-user content: ''; 323563f3b4cStracker-user position: absolute; 324563f3b4cStracker-user top: 50%; 325563f3b4cStracker-user left: 50%; 326563f3b4cStracker-user width: 0.75em; 327563f3b4cStracker-user height: 0.75em; 328563f3b4cStracker-user border: 2px solid rgba(0, 0, 0, 0.25); 329563f3b4cStracker-user border-top-color: rgba(0, 0, 0, 0.75); 330563f3b4cStracker-user border-radius: 50%; 331563f3b4cStracker-user animation: ann-spin 0.6s linear infinite; 332563f3b4cStracker-user} 333563f3b4cStracker-user 334563f3b4cStracker-user.ann-btn-primary.ann-btn-busy::after { 335563f3b4cStracker-user border-color: rgba(255, 255, 255, 0.35); 336563f3b4cStracker-user border-top-color: rgba(255, 255, 255, 0.9); 337563f3b4cStracker-user} 338563f3b4cStracker-user 33943d2073cStracker-user.ann-btn-danger { 34043d2073cStracker-user border-color: #dc2626; 34143d2073cStracker-user color: #dc2626; 34243d2073cStracker-user} 34343d2073cStracker-user 34443d2073cStracker-user.ann-btn-danger:hover { 34543d2073cStracker-user background: rgba(220, 38, 38, 0.08); 34643d2073cStracker-user} 34743d2073cStracker-user 34843d2073cStracker-user.ann-btn-admin { 34943d2073cStracker-user border-color: __border__; 350563f3b4cStracker-user color: __text__; 35143d2073cStracker-user} 35243d2073cStracker-user 353563f3b4cStracker-user/* Close button — lives inside .ann-meta, pushed right via margin-left:auto (set in JS). */ 35443d2073cStracker-user.ann-close { 355563f3b4cStracker-user font-size: 1.35em; 35643d2073cStracker-user line-height: 1; 357563f3b4cStracker-user padding: 0.05em 0.3em; 35843d2073cStracker-user border: none; 359563f3b4cStracker-user background: none !important; 36043d2073cStracker-user color: __text_alt__; 36143d2073cStracker-user cursor: pointer; 362563f3b4cStracker-user flex-shrink: 0; 36343d2073cStracker-user} 36443d2073cStracker-user 36543d2073cStracker-user.ann-close:hover { 36643d2073cStracker-user color: __text__; 367563f3b4cStracker-user background: none !important; 36843d2073cStracker-user} 36943d2073cStracker-user 37043d2073cStracker-user/* ========================================================================= 37143d2073cStracker-user Reply form + new-annotation form 37243d2073cStracker-user ========================================================================= */ 37343d2073cStracker-user 37443d2073cStracker-user.ann-reply-form, 37543d2073cStracker-user.ann-new-form { 37643d2073cStracker-user padding: 0.65em 0.85em; 37743d2073cStracker-user} 37843d2073cStracker-user 37943d2073cStracker-user.ann-new-form { 38043d2073cStracker-user margin: 0.75em 0 1em; 38143d2073cStracker-user border: 1px solid __border__; 382*86c7806dStracker-user border-left: 3px solid ~"rgba(var(--ann-open-rgb), 0.7)"; 38343d2073cStracker-user background: __background_alt__; 384563f3b4cStracker-user contain: layout; 38543d2073cStracker-user} 38643d2073cStracker-user 38743d2073cStracker-user.ann-body-input { 38843d2073cStracker-user display: block; 38943d2073cStracker-user width: 100%; 39043d2073cStracker-user box-sizing: border-box; 39143d2073cStracker-user padding: 0.4em 0.6em; 39243d2073cStracker-user font: inherit; 39343d2073cStracker-user border: 1px solid __border__; 39443d2073cStracker-user background: __background__; 39543d2073cStracker-user color: __text__; 39643d2073cStracker-user resize: vertical; 397563f3b4cStracker-user margin-bottom: 0.65em; 39843d2073cStracker-user} 39943d2073cStracker-user 40043d2073cStracker-user.ann-body-input:focus { 401563f3b4cStracker-user outline: 1px solid __link__; 40243d2073cStracker-user} 40343d2073cStracker-user 40443d2073cStracker-user.ann-form-row { 40543d2073cStracker-user display: flex; 40643d2073cStracker-user gap: 0.4em; 40743d2073cStracker-user} 40843d2073cStracker-user 409563f3b4cStracker-user.ann-form-row + .ann-quote { 410563f3b4cStracker-user margin-top: 0.65em; 411563f3b4cStracker-user} 412563f3b4cStracker-user 41343d2073cStracker-user/* ========================================================================= 41443d2073cStracker-user Selection tooltip 41543d2073cStracker-user ========================================================================= */ 41643d2073cStracker-user 41743d2073cStracker-user.ann-tooltip { 41843d2073cStracker-user position: absolute; 41943d2073cStracker-user z-index: 9000; 42043d2073cStracker-user border-radius: 4px; 42143d2073cStracker-user box-shadow: 0 2px 8px rgba(0,0,0,0.15); 42243d2073cStracker-user} 42343d2073cStracker-user 424*86c7806dStracker-user/* Static amber glow drawing the eye to the freshly-revealed "Annotate" button. 425*86c7806dStracker-user The rgba() is LESS-escaped (~"…") so DokuWiki's CSS compiler passes it through 426*86c7806dStracker-user verbatim instead of evaluating var() to black; the browser resolves the 427*86c7806dStracker-user custom property at render time. FF78 ESR safe. */ 428*86c7806dStracker-user.ann-tooltip .ann-btn { 429*86c7806dStracker-user box-shadow: 0 0 8px 2px ~"rgba(var(--ann-open-rgb), 0.45)", 0 1px 4px rgba(0,0,0,0.25); 430*86c7806dStracker-user} 431*86c7806dStracker-user 43243d2073cStracker-user/* ========================================================================= 43343d2073cStracker-user Orphan drawer 43443d2073cStracker-user ========================================================================= */ 43543d2073cStracker-user 43643d2073cStracker-user.ann-orphan-drawer { 437563f3b4cStracker-user display: flow-root; /* BFC: shrinks to avoid overlapping the floated TOC */ 438563f3b4cStracker-user margin-bottom: 0.65em; 43943d2073cStracker-user padding: 0.75em 1em; 44043d2073cStracker-user border: 1px dashed __border__; 44143d2073cStracker-user border-radius: 4px; 44243d2073cStracker-user background: __background_alt__; 44343d2073cStracker-user} 44443d2073cStracker-user 44543d2073cStracker-user.ann-orphan-drawer h4 { 44643d2073cStracker-user margin: 0 0 0.3em; 44743d2073cStracker-user font-size: 0.95em; 448563f3b4cStracker-user color: __text__; 44943d2073cStracker-user} 45043d2073cStracker-user 45143d2073cStracker-user.ann-orphan-note { 45243d2073cStracker-user font-size: 0.85em; 453563f3b4cStracker-user color: __text__; 45443d2073cStracker-user margin-bottom: 0.75em; 45543d2073cStracker-user} 45643d2073cStracker-user 45743d2073cStracker-user/* ========================================================================= 45843d2073cStracker-user Resolved annotation panels: shift to green accent 45943d2073cStracker-user ========================================================================= */ 46043d2073cStracker-user 46143d2073cStracker-user.ann-panel[data-status="resolved"] { 462*86c7806dStracker-user border-left-color: ~"rgba(var(--ann-resolved-rgb), 0.6)"; 46343d2073cStracker-user} 464