qBitrr2 5.6.1__py3-none-any.whl → 5.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{j as e,I as P,C as V,u as W,g as J,a as Q,r as K,b as Y,c as Z,R as M}from"./app.js";import{r as i}from"./table.js";import{u as ee}from"./useInterval.js";import"./vendor.js";function se({title:r,message:t,confirmLabel:p="Confirm",cancelLabel:f="Cancel",onConfirm:y,onCancel:x,danger:_=!1}){return e.jsx("div",{className:"modal-backdrop",onClick:x,children:e.jsxs("div",{className:"modal",style:{maxWidth:"500px"},onClick:b=>b.stopPropagation(),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h2",{children:r}),e.jsx("button",{className:"btn ghost",onClick:x,children:e.jsx(P,{src:V})})]}),e.jsx("div",{className:"modal-body",children:e.jsx("p",{style:{margin:0,lineHeight:1.6},children:t})}),e.jsxs("div",{className:"modal-footer",children:[e.jsx("button",{className:"btn ghost",onClick:x,children:f}),e.jsx("button",{className:`btn ${_?"danger":"primary"}`,onClick:y,children:p})]})]})})}const re="/static/assets/build.svg",te=/\b(480p|576p|720p|1080p|2160p|4k|8k|web[-_. ]?(?:dl|rip)|hdrip|hdtv|bluray|bd(?:rip)?|brrip|webrip|remux|x264|x265|hevc|dts|truehd|atmos|proper|repack|dvdrip|hdr|amzn|nf)\b/i,ae=/\bS\d{1,3}E\d{1,3}\b/i,ne=/\bSeason\s+\d+\b/i;function ce(r){const t=r.trim();if(!t||/^\d+\s+queued item/i.test(t))return"";const p=t.replace(/\s+/g," "),f=p.match(/^(?<title>.+?)\s+(?<year>(?:19|20)\d{2})(?:\s+(?<rest>.*))?$/);if(f){const y=f.groups?.rest??"",x=ae.test(y)||ne.test(y);if(y&&!x&&te.test(y)){const b=(f.groups?.title??"").replace(/[-_.]/g," ").replace(/\s{2,}/g," ").trim(),R=f.groups?.year??"";if(b)return R?`${b} (${R})`:b}}return p}function oe(r,t){return r.category===t.category&&r.name===t.name&&r.kind===t.kind&&r.pid===t.pid&&r.alive===t.alive&&(r.rebuilding??!1)===(t.rebuilding??!1)&&(r.searchSummary??"")===(t.searchSummary??"")&&(r.searchTimestamp??"")===(t.searchTimestamp??"")&&(r.queueCount??null)===(t.queueCount??null)&&(r.categoryCount??null)===(t.categoryCount??null)&&(r.metricType??"")===(t.metricType??"")}function le(r,t){if(r===t)return!0;if(r.length!==t.length)return!1;for(let p=0;p<r.length;p+=1)if(!oe(r[p],t[p]))return!1;return!0}function ie(r,t){return r?1e3:null}function ge({active:r}){const[t,p]=i.useState([]),[f,y]=i.useState(!1),[x,_]=i.useState(!1),[b,R]=i.useState(!1),[I,D]=i.useState(null),[S,E]=i.useState(null),{push:u}=W(),F=i.useRef(!1),m=i.useCallback(async(a=!0)=>{if(!F.current){F.current=!0,a&&y(!0);try{const[c,g]=await Promise.all([J(),Q()]),j=(c.processes??[]).map(d=>{if(typeof d.searchSummary=="string"){const N=ce(d.searchSummary);return{...d,searchSummary:N}}return d});p(d=>le(d,j)?d:j),D(g)}catch(c){u(c instanceof Error?c.message:"Failed to load processes list","error")}finally{F.current=!1,a&&y(!1)}}},[u]);i.useEffect(()=>{m()},[m]),i.useEffect(()=>{r&&m()},[r,m]);const G=i.useMemo(()=>ie(r),[r,t]);ee(()=>{m(!1)},G);const z=i.useCallback(async(a,c)=>{try{await K(a,c),u(`Restarted ${a}:${c}`,"success"),m()}catch(g){u(g instanceof Error?g.message:`Failed to restart ${a}:${c}`,"error")}},[m,u]),B=i.useCallback(async()=>{E({title:"Restart All Processes",message:"Are you sure you want to restart all processes? This will temporarily interrupt all operations.",onConfirm:async()=>{E(null),_(!0);try{await Y(),u("Restarted all processes","success"),m()}catch(a){u(a instanceof Error?a.message:"Failed to restart all","error")}finally{_(!1)}}})},[m,u]),X=i.useCallback(async()=>{E({title:"Rebuild Arrs",message:"Are you sure you want to rebuild all Arr instances? This will refresh all connections and may take some time.",onConfirm:async()=>{E(null),R(!0);try{await Z(),u("Requested Arr rebuild","success"),m()}catch(a){u(a instanceof Error?a.message:"Failed to rebuild Arrs","error")}finally{R(!1)}}})},[m,u]),H=i.useMemo(()=>{const a=new Map,c=n=>{const o=(n.category??"").toLowerCase(),l=(n.name??"").toLowerCase();return o.includes("radarr")||l.includes("radarr")?"Radarr":o.includes("sonarr")||l.includes("sonarr")?"Sonarr":o.includes("lidarr")||l.includes("lidarr")?"Lidarr":o.includes("qbit")||o.includes("qbittorrent")||l.includes("qbit")||l.includes("qbittorrent")?"qBittorrent":"Other"},g=I?.arrs??[],j=g.some(n=>n.type==="radarr"),d=g.some(n=>n.type==="sonarr"),N=g.some(n=>n.type==="lidarr");t.forEach(n=>{const o=c(n);if(o==="Radarr"&&!j||o==="Sonarr"&&!d||o==="Lidarr"&&!N)return;a.has(o)||a.set(o,new Map);const l=a.get(o),h=n.name||n.category||`${n.category}:${n.kind}`;l.has(h)||l.set(h,[]),l.get(h).push(n)});const v=["Radarr","Sonarr","Lidarr","qBittorrent","Other"],k=Array.from(a.entries()).map(([n,o])=>{const l=Array.from(o.entries()).map(([h,C])=>({name:h,items:C.sort((w,T)=>w.kind.localeCompare(T.kind))})).sort((h,C)=>h.name.localeCompare(C.name));return{app:n,instances:l}}).filter(n=>n.instances.length);return k.sort((n,o)=>{const l=h=>{const C=v.indexOf(h);return C===-1?Number.MAX_SAFE_INTEGER:C};return l(n.app)-l(o.app)||n.app.localeCompare(o.app)}),k},[t,I]),U=i.useCallback(async a=>{try{await Promise.all(a.map(c=>K(c.category,c.kind))),u(`Restarted ${a[0]?.name??"group"}`,"success"),m()}catch(c){u(c instanceof Error?c.message:"Failed to restart process group","error")}},[m,u]),O=H.map(({app:a,instances:c})=>{const g=c.map(({name:j,items:d})=>{const N=d.filter(s=>s.alive).length,v=d.length,k=v===0?"":N===v?"status-indicator--ok":N===0?"status-indicator--bad":"",n=["status-indicator"];k&&n.push(k);const o=v===0?"No processes":N===v?"All running":N===0?"Stopped":`${N}/${v} running`,l=v===1?"1 process":`${v} processes`,h=j==="FreeSpaceManager"?"Free Space Manager":j,w=Array.from(new Set(d.map(s=>s.kind))).filter(s=>{const A=s.toLowerCase();return A!=="search"&&A!=="torrent"}),T=s=>s&&s.charAt(0).toUpperCase()+s.slice(1);return e.jsxs("div",{className:"process-card",children:[e.jsxs("div",{className:"process-card__header",children:[e.jsxs("div",{className:"process-card__title",children:[e.jsx("div",{className:"process-card__name",children:h}),e.jsx("div",{className:"process-card__summary",children:l}),w.length?e.jsx("div",{className:"process-card__badges",children:w.map(s=>e.jsx("span",{className:"process-card__badge",children:T(s)},`${j}:${s}:badge`))}):null]}),e.jsx("div",{className:n.join(" "),title:o})]}),e.jsx("div",{className:"process-card__list",children:d.map(s=>e.jsxs("div",{className:"process-chip",children:[e.jsxs("div",{className:"process-chip__top",children:[e.jsx("div",{className:"process-chip__name",children:T(s.kind)}),e.jsx("div",{className:`status-pill__dot ${s.alive?"text-success":"text-danger"}`})]}),e.jsx("div",{className:"process-chip__detail",children:(()=>{if(s.rebuilding)return"Rebuilding";const A=s.kind.toLowerCase();if(A==="search")return(s.searchSummary??"")||"No searches recorded";if(A==="torrent"){const $=s.metricType?.toLowerCase(),L=typeof s.categoryCount=="number"?s.categoryCount:null,q=typeof s.queueCount=="number"?s.queueCount:null;return $?$==="category"&&L!==null?`Torrent count ${L}`:$==="free-space"&&q!==null?`Torrent count ${q}`:"Torrent count unavailable":`Torrents in queue ${q!==null?q:"?"} / total ${L!==null?L:"?"}`}return""})()}),e.jsx("div",{className:"process-chip__actions",children:e.jsx("button",{className:"btn small",onClick:()=>z(s.category,s.kind),children:"Restart"})})]},`${s.category}:${s.kind}`))}),e.jsx("div",{className:"process-card__footer",children:e.jsx("button",{className:"btn small outline",onClick:()=>void U(d),children:"Restart All"})})]},j)});return{app:a,cards:g}});return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"card",children:[e.jsx("div",{className:"card-header",children:"Processes"}),e.jsxs("div",{className:"card-body stack",children:[e.jsx("div",{className:"row",children:e.jsxs("div",{className:"col inline",children:[e.jsxs("button",{className:"btn ghost",onClick:()=>void m(),disabled:f,children:[f&&e.jsx("span",{className:"spinner"}),e.jsx(P,{src:M}),f?"Refreshing...":"Refresh"]}),e.jsxs("button",{className:"btn",onClick:()=>void B(),disabled:x,children:[x&&e.jsx("span",{className:"spinner"}),e.jsx(P,{src:M}),x?"Restarting...":"Restart All"]}),e.jsxs("button",{className:"btn",onClick:()=>void X(),disabled:b,children:[b&&e.jsx("span",{className:"spinner"}),e.jsx(P,{src:re}),b?"Rebuilding...":"Rebuild Arrs"]})]})}),O.length?O.map(({app:a,cards:c})=>e.jsxs("div",{className:"process-section",children:[e.jsx("div",{className:"process-section__title",children:a}),e.jsx("div",{className:"process-grid",children:c})]},a)):e.jsx("div",{className:"empty-state",children:"No processes available."})]})]}),S&&e.jsx(se,{title:S.title,message:S.message,confirmLabel:"Confirm",cancelLabel:"Cancel",danger:!0,onConfirm:S.onConfirm,onCancel:()=>E(null)})]})}export{ge as ProcessesView};
1
+ import{j as e,I as P,C as V,u as W,g as J,a as Q,r as K,b as Y,c as Z,R as M}from"./app.js";import{r as i}from"./table.js";import{u as ee}from"./useInterval.js";import"./vendor.js";function se({title:r,message:t,confirmLabel:p="Confirm",cancelLabel:f="Cancel",onConfirm:y,onCancel:x,danger:_=!1}){return e.jsx("div",{className:"modal-backdrop",onClick:x,children:e.jsxs("div",{className:"modal",style:{maxWidth:"500px"},onClick:b=>b.stopPropagation(),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h2",{children:r}),e.jsx("button",{className:"btn ghost",onClick:x,children:e.jsx(P,{src:V})})]}),e.jsx("div",{className:"modal-body",children:e.jsx("p",{style:{margin:0,lineHeight:1.6},children:t})}),e.jsxs("div",{className:"modal-footer",children:[e.jsx("button",{className:"btn ghost",onClick:x,children:f}),e.jsx("button",{className:`btn ${_?"danger":"primary"}`,onClick:y,children:p})]})]})})}const re="/static/assets/build.svg",te=/\b(480p|576p|720p|1080p|2160p|4k|8k|web[-_. ]?(?:dl|rip)|hdrip|hdtv|bluray|bd(?:rip)?|brrip|webrip|remux|x264|x265|hevc|dts|truehd|atmos|proper|repack|dvdrip|hdr|amzn|nf)\b/i,ae=/\bS\d{1,3}E\d{1,3}\b/i,ne=/\bSeason\s+\d+\b/i;function ce(r){const t=r.trim();if(!t||/^\d+\s+queued item/i.test(t))return"";const p=t.replace(/\s+/g," "),f=p.match(/^(?<title>.+?)\s+(?<year>(?:19|20)\d{2})(?:\s+(?<rest>.*))?$/);if(f){const y=f.groups?.rest??"",x=ae.test(y)||ne.test(y);if(y&&!x&&te.test(y)){const b=(f.groups?.title??"").replace(/[-_.]/g," ").replace(/\s{2,}/g," ").trim(),R=f.groups?.year??"";if(b)return R?`${b} (${R})`:b}}return p}function oe(r,t){return r.category===t.category&&r.name===t.name&&r.kind===t.kind&&r.pid===t.pid&&r.alive===t.alive&&(r.rebuilding??!1)===(t.rebuilding??!1)&&(r.searchSummary??"")===(t.searchSummary??"")&&(r.searchTimestamp??"")===(t.searchTimestamp??"")&&(r.queueCount??null)===(t.queueCount??null)&&(r.categoryCount??null)===(t.categoryCount??null)&&(r.metricType??"")===(t.metricType??"")}function le(r,t){if(r===t)return!0;if(r.length!==t.length)return!1;for(let p=0;p<r.length;p+=1)if(!oe(r[p],t[p]))return!1;return!0}function ie(r,t){return r?1e3:null}function ge({active:r}){const[t,p]=i.useState([]),[f,y]=i.useState(!1),[x,_]=i.useState(!1),[b,R]=i.useState(!1),[I,D]=i.useState(null),[S,E]=i.useState(null),{push:u}=W(),F=i.useRef(!1),m=i.useCallback(async(a=!0)=>{if(!F.current){F.current=!0,a&&y(!0);try{const[c,g]=await Promise.all([J(),Q()]),j=(c.processes??[]).map(d=>{if(typeof d.searchSummary=="string"){const N=ce(d.searchSummary);return{...d,searchSummary:N}}return d});p(d=>le(d,j)?d:j),D(g)}catch(c){u(c instanceof Error?c.message:"Failed to load processes list","error")}finally{F.current=!1,a&&y(!1)}}},[u]);i.useEffect(()=>{m()},[m]),i.useEffect(()=>{r&&m()},[r,m]);const G=i.useMemo(()=>ie(r),[r,t]);ee(()=>{m(!1)},G);const z=i.useCallback(async(a,c)=>{try{await K(a,c),u(`Restarted ${a}:${c}`,"success"),m()}catch(g){u(g instanceof Error?g.message:`Failed to restart ${a}:${c}`,"error")}},[m,u]),B=i.useCallback(async()=>{E({title:"Restart All Processes",message:"Are you sure you want to restart all processes? This will temporarily interrupt all operations.",onConfirm:async()=>{E(null),_(!0);try{await Y(),u("Restarted all processes","success"),m()}catch(a){u(a instanceof Error?a.message:"Failed to restart all","error")}finally{_(!1)}}})},[m,u]),X=i.useCallback(async()=>{E({title:"Rebuild Arrs",message:"Are you sure you want to rebuild all Arr instances? This will refresh all connections and may take some time.",onConfirm:async()=>{E(null),R(!0);try{await Z(),u("Requested Arr rebuild","success"),m()}catch(a){u(a instanceof Error?a.message:"Failed to rebuild Arrs","error")}finally{R(!1)}}})},[m,u]),H=i.useMemo(()=>{const a=new Map,c=n=>{const o=(n.category??"").toLowerCase(),l=(n.name??"").toLowerCase();return o.includes("radarr")||l.includes("radarr")?"Radarr":o.includes("sonarr")||l.includes("sonarr")?"Sonarr":o.includes("lidarr")||l.includes("lidarr")?"Lidarr":o.includes("qbit")||o.includes("qbittorrent")||l.includes("qbit")||l.includes("qbittorrent")?"qBittorrent":"Other"},g=I?.arrs??[],j=g.some(n=>n.type==="radarr"),d=g.some(n=>n.type==="sonarr"),N=g.some(n=>n.type==="lidarr");t.forEach(n=>{const o=c(n);if(o==="Radarr"&&!j||o==="Sonarr"&&!d||o==="Lidarr"&&!N)return;a.has(o)||a.set(o,new Map);const l=a.get(o),h=n.name||n.category||`${n.category}:${n.kind}`;l.has(h)||l.set(h,[]),l.get(h).push(n)});const v=["Radarr","Sonarr","Lidarr","qBittorrent","Other"],k=Array.from(a.entries()).map(([n,o])=>{const l=Array.from(o.entries()).map(([h,C])=>({name:h,items:C.sort((w,T)=>w.kind.localeCompare(T.kind))})).sort((h,C)=>h.name.localeCompare(C.name));return{app:n,instances:l}}).filter(n=>n.instances.length);return k.sort((n,o)=>{const l=h=>{const C=v.indexOf(h);return C===-1?Number.MAX_SAFE_INTEGER:C};return l(n.app)-l(o.app)||n.app.localeCompare(o.app)}),k},[t,I]),U=i.useCallback(async a=>{try{await Promise.all(a.map(c=>K(c.category,c.kind))),u(`Restarted ${a[0]?.name??"group"}`,"success"),m()}catch(c){u(c instanceof Error?c.message:"Failed to restart process group","error")}},[m,u]),O=H.map(({app:a,instances:c})=>{const g=c.map(({name:j,items:d})=>{const N=d.filter(s=>s.alive).length,v=d.length,k=v===0?"":N===v?"status-indicator--ok":N===0?"status-indicator--bad":"",n=["status-indicator"];k&&n.push(k);const o=v===0?"No processes":N===v?"All running":N===0?"Stopped":`${N}/${v} running`,l=v===1?"1 process":`${v} processes`,h=j==="FreeSpaceManager"?"Free Space Manager":j,w=Array.from(new Set(d.map(s=>s.kind))).filter(s=>{const A=s.toLowerCase();return A!=="search"&&A!=="torrent"}),T=s=>s&&s.charAt(0).toUpperCase()+s.slice(1);return e.jsxs("div",{className:"process-card",children:[e.jsxs("div",{className:"process-card__header",children:[e.jsxs("div",{className:"process-card__title",children:[e.jsx("div",{className:"process-card__name",children:h}),e.jsx("div",{className:"process-card__summary",children:l}),w.length?e.jsx("div",{className:"process-card__badges",children:w.map(s=>e.jsx("span",{className:"process-card__badge",children:T(s)},`${j}:${s}:badge`))}):null]}),e.jsx("div",{className:n.join(" "),title:o})]}),e.jsx("div",{className:"process-card__list",children:d.map(s=>e.jsxs("div",{className:"process-chip",children:[e.jsxs("div",{className:"process-chip__top",children:[e.jsx("div",{className:"process-chip__name",children:T(s.kind)}),e.jsx("div",{className:`status-pill__dot ${s.alive?"text-success":"text-danger"}`})]}),e.jsx("div",{className:"process-chip__detail",children:(()=>{if(s.rebuilding)return"Rebuilding";const A=s.kind.toLowerCase();if(A==="search")return(s.searchSummary??"")||"No searches recorded";if(A==="torrent"){const $=s.metricType?.toLowerCase(),L=typeof s.categoryCount=="number"?s.categoryCount:null,q=typeof s.queueCount=="number"?s.queueCount:null;return $?$==="category"&&L!==null?`Torrent count ${L}`:$==="free-space"&&q!==null?`Torrent count ${q}`:"Torrent count unavailable":`Torrents in queue ${q!==null?q:"?"} / total ${L!==null?L:"?"}`}return""})()}),e.jsx("div",{className:"process-chip__actions",children:e.jsx("button",{className:"btn small",onClick:()=>z(s.category,s.kind),children:"Restart"})})]},`${s.category}:${s.kind}`))}),e.jsx("div",{className:"process-card__footer",children:e.jsx("button",{className:"btn small outline",onClick:()=>{U(d)},children:"Restart All"})})]},j)});return{app:a,cards:g}});return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"card",children:[e.jsx("div",{className:"card-header",children:"Processes"}),e.jsxs("div",{className:"card-body stack",children:[e.jsx("div",{className:"row",children:e.jsxs("div",{className:"col inline",children:[e.jsxs("button",{className:"btn ghost",onClick:()=>{m()},disabled:f,children:[f&&e.jsx("span",{className:"spinner"}),e.jsx(P,{src:M}),f?"Refreshing...":"Refresh"]}),e.jsxs("button",{className:"btn",onClick:()=>{B()},disabled:x,children:[x&&e.jsx("span",{className:"spinner"}),e.jsx(P,{src:M}),x?"Restarting...":"Restart All"]}),e.jsxs("button",{className:"btn",onClick:()=>{X()},disabled:b,children:[b&&e.jsx("span",{className:"spinner"}),e.jsx(P,{src:re}),b?"Rebuilding...":"Rebuild Arrs"]})]})}),O.length?O.map(({app:a,cards:c})=>e.jsxs("div",{className:"process-section",children:[e.jsx("div",{className:"process-section__title",children:a}),e.jsx("div",{className:"process-grid",children:c})]},a)):e.jsx("div",{className:"empty-state",children:"No processes available."})]})]}),S&&e.jsx(se,{title:S.title,message:S.message,confirmLabel:"Confirm",cancelLabel:"Cancel",danger:!0,onConfirm:S.onConfirm,onCancel:()=>E(null)})]})}export{ge as ProcessesView};
2
2
  //# sourceMappingURL=ProcessesView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProcessesView.js","sources":["../../../webui/src/components/ConfirmDialog.tsx","../../../webui/src/icons/build.svg","../../../webui/src/pages/ProcessesView.tsx"],"sourcesContent":["import type { JSX } from \"react\";\nimport { IconImage } from \"./IconImage\";\nimport CloseIcon from \"../icons/close.svg\";\n\ninterface ConfirmDialogProps {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm: () => void;\n onCancel: () => void;\n danger?: boolean;\n}\n\nexport function ConfirmDialog({\n title,\n message,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n onConfirm,\n onCancel,\n danger = false,\n}: ConfirmDialogProps): JSX.Element {\n return (\n <div className=\"modal-backdrop\" onClick={onCancel}>\n <div\n className=\"modal\"\n style={{ maxWidth: '500px' }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"modal-header\">\n <h2>{title}</h2>\n <button className=\"btn ghost\" onClick={onCancel}>\n <IconImage src={CloseIcon} />\n </button>\n </div>\n <div className=\"modal-body\">\n <p style={{ margin: 0, lineHeight: 1.6 }}>{message}</p>\n </div>\n <div className=\"modal-footer\">\n <button className=\"btn ghost\" onClick={onCancel}>\n {cancelLabel}\n </button>\n <button\n className={`btn ${danger ? 'danger' : 'primary'}`}\n onClick={onConfirm}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","export default \"__VITE_ASSET__DznMzWc1__\"","import { useCallback, useEffect, useMemo, useRef, useState, type JSX } from \"react\";\nimport {\n getProcesses,\n getStatus,\n rebuildArrs,\n restartAllProcesses,\n restartProcess,\n} from \"../api/client\";\nimport type { ProcessInfo, StatusResponse } from \"../api/types\";\nimport { useToast } from \"../context/ToastContext\";\nimport { useInterval } from \"../hooks/useInterval\";\nimport { IconImage } from \"../components/IconImage\";\nimport { ConfirmDialog } from \"../components/ConfirmDialog\";\n\nimport RefreshIcon from \"../icons/refresh-arrow.svg\";\nimport RestartIcon from \"../icons/refresh-arrow.svg\";\nimport ToolsIcon from \"../icons/build.svg\";\n\nconst RELEASE_TOKEN_REGEX =\n /\\b(480p|576p|720p|1080p|2160p|4k|8k|web[-_. ]?(?:dl|rip)|hdrip|hdtv|bluray|bd(?:rip)?|brrip|webrip|remux|x264|x265|hevc|dts|truehd|atmos|proper|repack|dvdrip|hdr|amzn|nf)\\b/i;\nconst EPISODE_TOKEN_REGEX = /\\bS\\d{1,3}E\\d{1,3}\\b/i;\nconst SEASON_TOKEN_REGEX = /\\bSeason\\s+\\d+\\b/i;\n\nfunction sanitizeSearchSummary(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return \"\";\n if (/^\\d+\\s+queued item/i.test(trimmed)) return \"\";\n const normalized = trimmed.replace(/\\s+/g, \" \");\n const releaseMatch = normalized.match(\n /^(?<title>.+?)\\s+(?<year>(?:19|20)\\d{2})(?:\\s+(?<rest>.*))?$/\n );\n\n if (releaseMatch) {\n const rest = releaseMatch.groups?.rest ?? \"\";\n const looksLikeEpisode =\n EPISODE_TOKEN_REGEX.test(rest) || SEASON_TOKEN_REGEX.test(rest);\n if (rest && !looksLikeEpisode && RELEASE_TOKEN_REGEX.test(rest)) {\n const rawTitle = releaseMatch.groups?.title ?? \"\";\n const cleanedTitle = rawTitle\n .replace(/[-_.]/g, \" \")\n .replace(/\\s{2,}/g, \" \")\n .trim();\n const year = releaseMatch.groups?.year ?? \"\";\n if (cleanedTitle) {\n return year ? `${cleanedTitle} (${year})` : cleanedTitle;\n }\n }\n }\n\n return normalized;\n}\n\nfunction isProcessEqual(a: ProcessInfo, b: ProcessInfo): boolean {\n return (\n a.category === b.category &&\n a.name === b.name &&\n a.kind === b.kind &&\n a.pid === b.pid &&\n a.alive === b.alive &&\n (a.rebuilding ?? false) === (b.rebuilding ?? false) &&\n (a.searchSummary ?? \"\") === (b.searchSummary ?? \"\") &&\n (a.searchTimestamp ?? \"\") === (b.searchTimestamp ?? \"\") &&\n (a.queueCount ?? null) === (b.queueCount ?? null) &&\n (a.categoryCount ?? null) === (b.categoryCount ?? null) &&\n (a.metricType ?? \"\") === (b.metricType ?? \"\")\n );\n}\n\nfunction areProcessListsEqual(a: ProcessInfo[], b: ProcessInfo[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let index = 0; index < a.length; index += 1) {\n if (!isProcessEqual(a[index], b[index])) {\n return false;\n }\n }\n return true;\n}\n\nfunction getRefreshDelay(active: boolean, processes: ProcessInfo[]): number | null {\n if (!active) return null;\n // Refresh every 1 second when active\n return 1000;\n}\n\ninterface ProcessesViewProps {\n active: boolean;\n}\n\nexport function ProcessesView({ active }: ProcessesViewProps): JSX.Element {\n const [processes, setProcesses] = useState<ProcessInfo[]>([]);\n const [loading, setLoading] = useState(false);\n const [restartingAll, setRestartingAll] = useState(false);\n const [rebuildingArrs, setRebuildingArrs] = useState(false);\n const [statusData, setStatusData] = useState<StatusResponse | null>(null);\n const [confirmAction, setConfirmAction] = useState<{\n title: string;\n message: string;\n onConfirm: () => void;\n } | null>(null);\n const { push } = useToast();\n const isFetching = useRef(false);\n\n const load = useCallback(async (showLoading = true) => {\n if (isFetching.current) {\n return;\n }\n isFetching.current = true;\n if (showLoading) {\n setLoading(true);\n }\n try {\n const [processData, status] = await Promise.all([\n getProcesses(),\n getStatus(),\n ]);\n const next = (processData.processes ?? []).map((process) => {\n if (typeof process.searchSummary === \"string\") {\n const sanitized = sanitizeSearchSummary(process.searchSummary);\n return {\n ...process,\n searchSummary: sanitized,\n };\n }\n return process;\n });\n setProcesses((prev) =>\n areProcessListsEqual(prev, next) ? prev : next\n );\n setStatusData(status);\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : \"Failed to load processes list\",\n \"error\"\n );\n } finally {\n isFetching.current = false;\n if (showLoading) {\n setLoading(false);\n }\n }\n }, [push]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n useEffect(() => {\n if (active) {\n void load();\n }\n }, [active, load]);\n\n const refreshDelay = useMemo(\n () => getRefreshDelay(active, processes),\n [active, processes]\n );\n\n useInterval(() => {\n void load(false); // Auto-refresh without showing loading spinner\n }, refreshDelay);\n\n const handleRestart = useCallback(\n async (category: string, kind: string) => {\n try {\n await restartProcess(category, kind);\n push(`Restarted ${category}:${kind}`, \"success\");\n void load();\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : `Failed to restart ${category}:${kind}`,\n \"error\"\n );\n }\n },\n [load, push]\n );\n\n const handleRestartAll = useCallback(async () => {\n setConfirmAction({\n title: \"Restart All Processes\",\n message: \"Are you sure you want to restart all processes? This will temporarily interrupt all operations.\",\n onConfirm: async () => {\n setConfirmAction(null);\n setRestartingAll(true);\n try {\n await restartAllProcesses();\n push(\"Restarted all processes\", \"success\");\n void load();\n } catch (error) {\n push(\n error instanceof Error ? error.message : \"Failed to restart all\",\n \"error\"\n );\n } finally {\n setRestartingAll(false);\n }\n }\n });\n }, [load, push]);\n\n const handleRebuildArrs = useCallback(async () => {\n setConfirmAction({\n title: \"Rebuild Arrs\",\n message: \"Are you sure you want to rebuild all Arr instances? This will refresh all connections and may take some time.\",\n onConfirm: async () => {\n setConfirmAction(null);\n setRebuildingArrs(true);\n try {\n await rebuildArrs();\n push(\"Requested Arr rebuild\", \"success\");\n void load();\n } catch (error) {\n push(\n error instanceof Error ? error.message : \"Failed to rebuild Arrs\",\n \"error\"\n );\n } finally {\n setRebuildingArrs(false);\n }\n }\n });\n }, [load, push]);\n\n const groupedProcesses = useMemo(() => {\n interface Instance {\n name: string;\n items: ProcessInfo[];\n }\n interface AppGroup {\n app: string;\n instances: Instance[];\n }\n const appBuckets = new Map<string, Map<string, ProcessInfo[]>>();\n\n const classifyApp = (proc: ProcessInfo): string => {\n const category = (proc.category ?? \"\").toLowerCase();\n const name = (proc.name ?? \"\").toLowerCase();\n if (category.includes(\"radarr\") || name.includes(\"radarr\")) return \"Radarr\";\n if (category.includes(\"sonarr\") || name.includes(\"sonarr\")) return \"Sonarr\";\n if (category.includes(\"lidarr\") || name.includes(\"lidarr\")) return \"Lidarr\";\n if (\n category.includes(\"qbit\") ||\n category.includes(\"qbittorrent\") ||\n name.includes(\"qbit\") ||\n name.includes(\"qbittorrent\")\n ) {\n return \"qBittorrent\";\n }\n return \"Other\";\n };\n\n // Check which Arr types are configured\n const arrs = statusData?.arrs ?? [];\n const hasRadarr = arrs.some((arr) => arr.type === \"radarr\");\n const hasSonarr = arrs.some((arr) => arr.type === \"sonarr\");\n const hasLidarr = arrs.some((arr) => arr.type === \"lidarr\");\n\n processes.forEach((proc) => {\n const app = classifyApp(proc);\n\n // Skip Arr processes if that Arr type is not configured\n if (app === \"Radarr\" && !hasRadarr) return;\n if (app === \"Sonarr\" && !hasSonarr) return;\n if (app === \"Lidarr\" && !hasLidarr) return;\n\n if (!appBuckets.has(app)) appBuckets.set(app, new Map());\n const instances = appBuckets.get(app)!;\n const instanceKey =\n proc.name || proc.category || `${proc.category}:${proc.kind}`;\n if (!instances.has(instanceKey)) instances.set(instanceKey, []);\n instances.get(instanceKey)!.push(proc);\n });\n\n const appOrder = [\"Radarr\", \"Sonarr\", \"Lidarr\", \"qBittorrent\", \"Other\"];\n\n const result: AppGroup[] = Array.from(appBuckets.entries())\n .map(([app, instances]) => {\n const sortedInstances = Array.from(instances.entries())\n .map(([name, items]) => ({\n name,\n items: items.sort((a, b) => a.kind.localeCompare(b.kind)),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n return { app, instances: sortedInstances };\n })\n .filter((group) => group.instances.length);\n\n result.sort((a, b) => {\n const order = (label: string) => {\n const index = appOrder.indexOf(label);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n };\n return order(a.app) - order(b.app) || a.app.localeCompare(b.app);\n });\n\n return result;\n }, [processes, statusData]);\n\n const handleRestartGroup = useCallback(\n async (items: ProcessInfo[]) => {\n try {\n await Promise.all(\n items.map((item) => restartProcess(item.category, item.kind))\n );\n push(`Restarted ${items[0]?.name ?? \"group\"}`, \"success\");\n void load();\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : \"Failed to restart process group\",\n \"error\"\n );\n }\n },\n [load, push]\n );\n\n const cardsByApp = groupedProcesses.map(({ app, instances }) => {\n const cards = instances.map(({ name, items }) => {\n const runningCount = items.filter((item) => item.alive).length;\n const totalCount = items.length;\n const tone =\n totalCount === 0\n ? \"\"\n : runningCount === totalCount\n ? \"status-indicator--ok\"\n : runningCount === 0\n ? \"status-indicator--bad\"\n : \"\";\n const statusClass = [\"status-indicator\"];\n if (tone) statusClass.push(tone);\n const statusLabel =\n totalCount === 0\n ? \"No processes\"\n : runningCount === totalCount\n ? \"All running\"\n : runningCount === 0\n ? \"Stopped\"\n : `${runningCount}/${totalCount} running`;\n const summaryLabel = totalCount === 1 ? \"1 process\" : `${totalCount} processes`;\n const displayName = name === \"FreeSpaceManager\" ? \"Free Space Manager\" : name;\n const uniqueKinds = Array.from(new Set(items.map((item) => item.kind)));\n const filteredKinds = uniqueKinds.filter((kind) => {\n const lower = kind.toLowerCase();\n return lower !== \"search\" && lower !== \"torrent\";\n });\n const formatKind = (kind: string) =>\n kind ? kind.charAt(0).toUpperCase() + kind.slice(1) : kind;\n\n return (\n <div className=\"process-card\" key={name}>\n <div className=\"process-card__header\">\n <div className=\"process-card__title\">\n <div className=\"process-card__name\">{displayName}</div>\n <div className=\"process-card__summary\">{summaryLabel}</div>\n {filteredKinds.length ? (\n <div className=\"process-card__badges\">\n {filteredKinds.map((kind) => (\n <span key={`${name}:${kind}:badge`} className=\"process-card__badge\">\n {formatKind(kind)}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n <div className={statusClass.join(\" \")} title={statusLabel} />\n </div>\n <div className=\"process-card__list\">\n {items.map((item) => (\n <div className=\"process-chip\" key={`${item.category}:${item.kind}`}>\n <div className=\"process-chip__top\">\n <div className=\"process-chip__name\">{formatKind(item.kind)}</div>\n <div className={`status-pill__dot ${item.alive ? \"text-success\" : \"text-danger\"}`} />\n </div>\n <div className=\"process-chip__detail\">\n {(() => {\n if (item.rebuilding) {\n return \"Rebuilding\";\n }\n const kindLower = item.kind.toLowerCase();\n if (kindLower === \"search\") {\n const summary = item.searchSummary ?? \"\";\n return summary || \"No searches recorded\";\n }\n if (kindLower === \"torrent\") {\n const metricType = item.metricType?.toLowerCase();\n const categoryTotal =\n typeof item.categoryCount === \"number\" ? item.categoryCount : null;\n const queueTotal =\n typeof item.queueCount === \"number\" ? item.queueCount : null;\n\n if (!metricType) {\n const queueLabel = queueTotal !== null ? queueTotal : \"?\";\n const categoryLabel = categoryTotal !== null ? categoryTotal : \"?\";\n return `Torrents in queue ${queueLabel} / total ${categoryLabel}`;\n }\n\n if (metricType === \"category\" && categoryTotal !== null) {\n return `Torrent count ${categoryTotal}`;\n }\n\n if (metricType === \"free-space\" && queueTotal !== null) {\n return `Torrent count ${queueTotal}`;\n }\n\n return \"Torrent count unavailable\";\n }\n return \"\";\n })()}\n </div>\n <div className=\"process-chip__actions\">\n <button\n className=\"btn small\"\n onClick={() => handleRestart(item.category, item.kind)}\n >\n Restart\n </button>\n </div>\n </div>\n ))}\n </div>\n <div className=\"process-card__footer\">\n <button\n className=\"btn small outline\"\n onClick={() => void handleRestartGroup(items)}\n >\n Restart All\n </button>\n </div>\n </div>\n );\n });\n return { app, cards };\n });\n\n return (\n <>\n <section className=\"card\">\n <div className=\"card-header\">Processes</div>\n <div className=\"card-body stack\">\n <div className=\"row\">\n <div className=\"col inline\">\n <button className=\"btn ghost\" onClick={() => void load()} disabled={loading}>\n {loading && <span className=\"spinner\" />}\n <IconImage src={RefreshIcon} />\n {loading ? 'Refreshing...' : 'Refresh'}\n </button>\n <button className=\"btn\" onClick={() => void handleRestartAll()} disabled={restartingAll}>\n {restartingAll && <span className=\"spinner\" />}\n <IconImage src={RestartIcon} />\n {restartingAll ? 'Restarting...' : 'Restart All'}\n </button>\n <button className=\"btn\" onClick={() => void handleRebuildArrs()} disabled={rebuildingArrs}>\n {rebuildingArrs && <span className=\"spinner\" />}\n <IconImage src={ToolsIcon} />\n {rebuildingArrs ? 'Rebuilding...' : 'Rebuild Arrs'}\n </button>\n </div>\n </div>\n {cardsByApp.length ? (\n cardsByApp.map(({ app, cards }) => (\n <div className=\"process-section\" key={app}>\n <div className=\"process-section__title\">{app}</div>\n <div className=\"process-grid\">{cards}</div>\n </div>\n ))\n ) : (\n <div className=\"empty-state\">No processes available.</div>\n )}\n </div>\n </section>\n {confirmAction && (\n <ConfirmDialog\n title={confirmAction.title}\n message={confirmAction.message}\n confirmLabel=\"Confirm\"\n cancelLabel=\"Cancel\"\n danger={true}\n onConfirm={confirmAction.onConfirm}\n onCancel={() => setConfirmAction(null)}\n />\n )}\n </>\n );\n}\n"],"names":["ConfirmDialog","title","message","confirmLabel","cancelLabel","onConfirm","onCancel","danger","jsx","jsxs","e","IconImage","CloseIcon","ToolsIcon","RELEASE_TOKEN_REGEX","EPISODE_TOKEN_REGEX","SEASON_TOKEN_REGEX","sanitizeSearchSummary","raw","trimmed","normalized","releaseMatch","rest","looksLikeEpisode","cleanedTitle","year","isProcessEqual","a","b","areProcessListsEqual","index","getRefreshDelay","active","processes","ProcessesView","setProcesses","useState","loading","setLoading","restartingAll","setRestartingAll","rebuildingArrs","setRebuildingArrs","statusData","setStatusData","confirmAction","setConfirmAction","push","useToast","isFetching","useRef","load","useCallback","showLoading","processData","status","getProcesses","getStatus","next","process","sanitized","prev","error","useEffect","refreshDelay","useMemo","useInterval","handleRestart","category","kind","restartProcess","handleRestartAll","restartAllProcesses","handleRebuildArrs","rebuildArrs","groupedProcesses","appBuckets","classifyApp","proc","name","arrs","hasRadarr","arr","hasSonarr","hasLidarr","app","instances","instanceKey","appOrder","result","sortedInstances","items","group","order","label","handleRestartGroup","item","cardsByApp","cards","runningCount","totalCount","tone","statusClass","statusLabel","summaryLabel","displayName","filteredKinds","lower","formatKind","kindLower","metricType","categoryTotal","queueTotal","Fragment","RefreshIcon","RestartIcon"],"mappings":"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"}
1
+ {"version":3,"file":"ProcessesView.js","sources":["../../../webui/src/components/ConfirmDialog.tsx","../../../webui/src/icons/build.svg","../../../webui/src/pages/ProcessesView.tsx"],"sourcesContent":["import type { JSX } from \"react\";\nimport { IconImage } from \"./IconImage\";\nimport CloseIcon from \"../icons/close.svg\";\n\ninterface ConfirmDialogProps {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm: () => void;\n onCancel: () => void;\n danger?: boolean;\n}\n\nexport function ConfirmDialog({\n title,\n message,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n onConfirm,\n onCancel,\n danger = false,\n}: ConfirmDialogProps): JSX.Element {\n return (\n <div className=\"modal-backdrop\" onClick={onCancel}>\n <div\n className=\"modal\"\n style={{ maxWidth: '500px' }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"modal-header\">\n <h2>{title}</h2>\n <button className=\"btn ghost\" onClick={onCancel}>\n <IconImage src={CloseIcon} />\n </button>\n </div>\n <div className=\"modal-body\">\n <p style={{ margin: 0, lineHeight: 1.6 }}>{message}</p>\n </div>\n <div className=\"modal-footer\">\n <button className=\"btn ghost\" onClick={onCancel}>\n {cancelLabel}\n </button>\n <button\n className={`btn ${danger ? 'danger' : 'primary'}`}\n onClick={onConfirm}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","export default \"__VITE_ASSET__DznMzWc1__\"","import { useCallback, useEffect, useMemo, useRef, useState, type JSX } from \"react\";\nimport {\n getProcesses,\n getStatus,\n rebuildArrs,\n restartAllProcesses,\n restartProcess,\n} from \"../api/client\";\nimport type { ProcessInfo, StatusResponse } from \"../api/types\";\nimport { useToast } from \"../context/ToastContext\";\nimport { useInterval } from \"../hooks/useInterval\";\nimport { IconImage } from \"../components/IconImage\";\nimport { ConfirmDialog } from \"../components/ConfirmDialog\";\n\nimport RefreshIcon from \"../icons/refresh-arrow.svg\";\nimport RestartIcon from \"../icons/refresh-arrow.svg\";\nimport ToolsIcon from \"../icons/build.svg\";\n\nconst RELEASE_TOKEN_REGEX =\n /\\b(480p|576p|720p|1080p|2160p|4k|8k|web[-_. ]?(?:dl|rip)|hdrip|hdtv|bluray|bd(?:rip)?|brrip|webrip|remux|x264|x265|hevc|dts|truehd|atmos|proper|repack|dvdrip|hdr|amzn|nf)\\b/i;\nconst EPISODE_TOKEN_REGEX = /\\bS\\d{1,3}E\\d{1,3}\\b/i;\nconst SEASON_TOKEN_REGEX = /\\bSeason\\s+\\d+\\b/i;\n\nfunction sanitizeSearchSummary(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return \"\";\n if (/^\\d+\\s+queued item/i.test(trimmed)) return \"\";\n const normalized = trimmed.replace(/\\s+/g, \" \");\n const releaseMatch = normalized.match(\n /^(?<title>.+?)\\s+(?<year>(?:19|20)\\d{2})(?:\\s+(?<rest>.*))?$/\n );\n\n if (releaseMatch) {\n const rest = releaseMatch.groups?.rest ?? \"\";\n const looksLikeEpisode =\n EPISODE_TOKEN_REGEX.test(rest) || SEASON_TOKEN_REGEX.test(rest);\n if (rest && !looksLikeEpisode && RELEASE_TOKEN_REGEX.test(rest)) {\n const rawTitle = releaseMatch.groups?.title ?? \"\";\n const cleanedTitle = rawTitle\n .replace(/[-_.]/g, \" \")\n .replace(/\\s{2,}/g, \" \")\n .trim();\n const year = releaseMatch.groups?.year ?? \"\";\n if (cleanedTitle) {\n return year ? `${cleanedTitle} (${year})` : cleanedTitle;\n }\n }\n }\n\n return normalized;\n}\n\nfunction isProcessEqual(a: ProcessInfo, b: ProcessInfo): boolean {\n return (\n a.category === b.category &&\n a.name === b.name &&\n a.kind === b.kind &&\n a.pid === b.pid &&\n a.alive === b.alive &&\n (a.rebuilding ?? false) === (b.rebuilding ?? false) &&\n (a.searchSummary ?? \"\") === (b.searchSummary ?? \"\") &&\n (a.searchTimestamp ?? \"\") === (b.searchTimestamp ?? \"\") &&\n (a.queueCount ?? null) === (b.queueCount ?? null) &&\n (a.categoryCount ?? null) === (b.categoryCount ?? null) &&\n (a.metricType ?? \"\") === (b.metricType ?? \"\")\n );\n}\n\nfunction areProcessListsEqual(a: ProcessInfo[], b: ProcessInfo[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let index = 0; index < a.length; index += 1) {\n if (!isProcessEqual(a[index], b[index])) {\n return false;\n }\n }\n return true;\n}\n\nfunction getRefreshDelay(active: boolean, processes: ProcessInfo[]): number | null {\n if (!active) return null;\n // Refresh every 1 second when active\n return 1000;\n}\n\ninterface ProcessesViewProps {\n active: boolean;\n}\n\nexport function ProcessesView({ active }: ProcessesViewProps): JSX.Element {\n const [processes, setProcesses] = useState<ProcessInfo[]>([]);\n const [loading, setLoading] = useState(false);\n const [restartingAll, setRestartingAll] = useState(false);\n const [rebuildingArrs, setRebuildingArrs] = useState(false);\n const [statusData, setStatusData] = useState<StatusResponse | null>(null);\n const [confirmAction, setConfirmAction] = useState<{\n title: string;\n message: string;\n onConfirm: () => void;\n } | null>(null);\n const { push } = useToast();\n const isFetching = useRef(false);\n\n const load = useCallback(async (showLoading = true) => {\n if (isFetching.current) {\n return;\n }\n isFetching.current = true;\n if (showLoading) {\n setLoading(true);\n }\n try {\n const [processData, status] = await Promise.all([\n getProcesses(),\n getStatus(),\n ]);\n const next = (processData.processes ?? []).map((process) => {\n if (typeof process.searchSummary === \"string\") {\n const sanitized = sanitizeSearchSummary(process.searchSummary);\n return {\n ...process,\n searchSummary: sanitized,\n };\n }\n return process;\n });\n setProcesses((prev) =>\n areProcessListsEqual(prev, next) ? prev : next\n );\n setStatusData(status);\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : \"Failed to load processes list\",\n \"error\"\n );\n } finally {\n isFetching.current = false;\n if (showLoading) {\n setLoading(false);\n }\n }\n }, [push]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n useEffect(() => {\n if (active) {\n void load();\n }\n }, [active, load]);\n\n const refreshDelay = useMemo(\n () => getRefreshDelay(active, processes),\n [active, processes]\n );\n\n useInterval(() => {\n void load(false); // Auto-refresh without showing loading spinner\n }, refreshDelay);\n\n const handleRestart = useCallback(\n async (category: string, kind: string) => {\n try {\n await restartProcess(category, kind);\n push(`Restarted ${category}:${kind}`, \"success\");\n void load();\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : `Failed to restart ${category}:${kind}`,\n \"error\"\n );\n }\n },\n [load, push]\n );\n\n const handleRestartAll = useCallback(async () => {\n setConfirmAction({\n title: \"Restart All Processes\",\n message: \"Are you sure you want to restart all processes? This will temporarily interrupt all operations.\",\n onConfirm: async () => {\n setConfirmAction(null);\n setRestartingAll(true);\n try {\n await restartAllProcesses();\n push(\"Restarted all processes\", \"success\");\n void load();\n } catch (error) {\n push(\n error instanceof Error ? error.message : \"Failed to restart all\",\n \"error\"\n );\n } finally {\n setRestartingAll(false);\n }\n }\n });\n }, [load, push]);\n\n const handleRebuildArrs = useCallback(async () => {\n setConfirmAction({\n title: \"Rebuild Arrs\",\n message: \"Are you sure you want to rebuild all Arr instances? This will refresh all connections and may take some time.\",\n onConfirm: async () => {\n setConfirmAction(null);\n setRebuildingArrs(true);\n try {\n await rebuildArrs();\n push(\"Requested Arr rebuild\", \"success\");\n void load();\n } catch (error) {\n push(\n error instanceof Error ? error.message : \"Failed to rebuild Arrs\",\n \"error\"\n );\n } finally {\n setRebuildingArrs(false);\n }\n }\n });\n }, [load, push]);\n\n const groupedProcesses = useMemo(() => {\n interface Instance {\n name: string;\n items: ProcessInfo[];\n }\n interface AppGroup {\n app: string;\n instances: Instance[];\n }\n const appBuckets = new Map<string, Map<string, ProcessInfo[]>>();\n\n const classifyApp = (proc: ProcessInfo): string => {\n const category = (proc.category ?? \"\").toLowerCase();\n const name = (proc.name ?? \"\").toLowerCase();\n if (category.includes(\"radarr\") || name.includes(\"radarr\")) return \"Radarr\";\n if (category.includes(\"sonarr\") || name.includes(\"sonarr\")) return \"Sonarr\";\n if (category.includes(\"lidarr\") || name.includes(\"lidarr\")) return \"Lidarr\";\n if (\n category.includes(\"qbit\") ||\n category.includes(\"qbittorrent\") ||\n name.includes(\"qbit\") ||\n name.includes(\"qbittorrent\")\n ) {\n return \"qBittorrent\";\n }\n return \"Other\";\n };\n\n // Check which Arr types are configured\n const arrs = statusData?.arrs ?? [];\n const hasRadarr = arrs.some((arr) => arr.type === \"radarr\");\n const hasSonarr = arrs.some((arr) => arr.type === \"sonarr\");\n const hasLidarr = arrs.some((arr) => arr.type === \"lidarr\");\n\n processes.forEach((proc) => {\n const app = classifyApp(proc);\n\n // Skip Arr processes if that Arr type is not configured\n if (app === \"Radarr\" && !hasRadarr) return;\n if (app === \"Sonarr\" && !hasSonarr) return;\n if (app === \"Lidarr\" && !hasLidarr) return;\n\n if (!appBuckets.has(app)) appBuckets.set(app, new Map());\n const instances = appBuckets.get(app)!;\n const instanceKey =\n proc.name || proc.category || `${proc.category}:${proc.kind}`;\n if (!instances.has(instanceKey)) instances.set(instanceKey, []);\n instances.get(instanceKey)!.push(proc);\n });\n\n const appOrder = [\"Radarr\", \"Sonarr\", \"Lidarr\", \"qBittorrent\", \"Other\"];\n\n const result: AppGroup[] = Array.from(appBuckets.entries())\n .map(([app, instances]) => {\n const sortedInstances = Array.from(instances.entries())\n .map(([name, items]) => ({\n name,\n items: items.sort((a, b) => a.kind.localeCompare(b.kind)),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n return { app, instances: sortedInstances };\n })\n .filter((group) => group.instances.length);\n\n result.sort((a, b) => {\n const order = (label: string) => {\n const index = appOrder.indexOf(label);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n };\n return order(a.app) - order(b.app) || a.app.localeCompare(b.app);\n });\n\n return result;\n }, [processes, statusData]);\n\n const handleRestartGroup = useCallback(\n async (items: ProcessInfo[]) => {\n try {\n await Promise.all(\n items.map((item) => restartProcess(item.category, item.kind))\n );\n push(`Restarted ${items[0]?.name ?? \"group\"}`, \"success\");\n void load();\n } catch (error) {\n push(\n error instanceof Error\n ? error.message\n : \"Failed to restart process group\",\n \"error\"\n );\n }\n },\n [load, push]\n );\n\n const cardsByApp = groupedProcesses.map(({ app, instances }) => {\n const cards = instances.map(({ name, items }) => {\n const runningCount = items.filter((item) => item.alive).length;\n const totalCount = items.length;\n const tone =\n totalCount === 0\n ? \"\"\n : runningCount === totalCount\n ? \"status-indicator--ok\"\n : runningCount === 0\n ? \"status-indicator--bad\"\n : \"\";\n const statusClass = [\"status-indicator\"];\n if (tone) statusClass.push(tone);\n const statusLabel =\n totalCount === 0\n ? \"No processes\"\n : runningCount === totalCount\n ? \"All running\"\n : runningCount === 0\n ? \"Stopped\"\n : `${runningCount}/${totalCount} running`;\n const summaryLabel = totalCount === 1 ? \"1 process\" : `${totalCount} processes`;\n const displayName = name === \"FreeSpaceManager\" ? \"Free Space Manager\" : name;\n const uniqueKinds = Array.from(new Set(items.map((item) => item.kind)));\n const filteredKinds = uniqueKinds.filter((kind) => {\n const lower = kind.toLowerCase();\n return lower !== \"search\" && lower !== \"torrent\";\n });\n const formatKind = (kind: string) =>\n kind ? kind.charAt(0).toUpperCase() + kind.slice(1) : kind;\n\n return (\n <div className=\"process-card\" key={name}>\n <div className=\"process-card__header\">\n <div className=\"process-card__title\">\n <div className=\"process-card__name\">{displayName}</div>\n <div className=\"process-card__summary\">{summaryLabel}</div>\n {filteredKinds.length ? (\n <div className=\"process-card__badges\">\n {filteredKinds.map((kind) => (\n <span key={`${name}:${kind}:badge`} className=\"process-card__badge\">\n {formatKind(kind)}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n <div className={statusClass.join(\" \")} title={statusLabel} />\n </div>\n <div className=\"process-card__list\">\n {items.map((item) => (\n <div className=\"process-chip\" key={`${item.category}:${item.kind}`}>\n <div className=\"process-chip__top\">\n <div className=\"process-chip__name\">{formatKind(item.kind)}</div>\n <div className={`status-pill__dot ${item.alive ? \"text-success\" : \"text-danger\"}`} />\n </div>\n <div className=\"process-chip__detail\">\n {(() => {\n if (item.rebuilding) {\n return \"Rebuilding\";\n }\n const kindLower = item.kind.toLowerCase();\n if (kindLower === \"search\") {\n const summary = item.searchSummary ?? \"\";\n return summary || \"No searches recorded\";\n }\n if (kindLower === \"torrent\") {\n const metricType = item.metricType?.toLowerCase();\n const categoryTotal =\n typeof item.categoryCount === \"number\" ? item.categoryCount : null;\n const queueTotal =\n typeof item.queueCount === \"number\" ? item.queueCount : null;\n\n if (!metricType) {\n const queueLabel = queueTotal !== null ? queueTotal : \"?\";\n const categoryLabel = categoryTotal !== null ? categoryTotal : \"?\";\n return `Torrents in queue ${queueLabel} / total ${categoryLabel}`;\n }\n\n if (metricType === \"category\" && categoryTotal !== null) {\n return `Torrent count ${categoryTotal}`;\n }\n\n if (metricType === \"free-space\" && queueTotal !== null) {\n return `Torrent count ${queueTotal}`;\n }\n\n return \"Torrent count unavailable\";\n }\n return \"\";\n })()}\n </div>\n <div className=\"process-chip__actions\">\n <button\n className=\"btn small\"\n onClick={() => handleRestart(item.category, item.kind)}\n >\n Restart\n </button>\n </div>\n </div>\n ))}\n </div>\n <div className=\"process-card__footer\">\n <button\n className=\"btn small outline\"\n onClick={() => void handleRestartGroup(items)}\n >\n Restart All\n </button>\n </div>\n </div>\n );\n });\n return { app, cards };\n });\n\n return (\n <>\n <section className=\"card\">\n <div className=\"card-header\">Processes</div>\n <div className=\"card-body stack\">\n <div className=\"row\">\n <div className=\"col inline\">\n <button className=\"btn ghost\" onClick={() => void load()} disabled={loading}>\n {loading && <span className=\"spinner\" />}\n <IconImage src={RefreshIcon} />\n {loading ? 'Refreshing...' : 'Refresh'}\n </button>\n <button className=\"btn\" onClick={() => void handleRestartAll()} disabled={restartingAll}>\n {restartingAll && <span className=\"spinner\" />}\n <IconImage src={RestartIcon} />\n {restartingAll ? 'Restarting...' : 'Restart All'}\n </button>\n <button className=\"btn\" onClick={() => void handleRebuildArrs()} disabled={rebuildingArrs}>\n {rebuildingArrs && <span className=\"spinner\" />}\n <IconImage src={ToolsIcon} />\n {rebuildingArrs ? 'Rebuilding...' : 'Rebuild Arrs'}\n </button>\n </div>\n </div>\n {cardsByApp.length ? (\n cardsByApp.map(({ app, cards }) => (\n <div className=\"process-section\" key={app}>\n <div className=\"process-section__title\">{app}</div>\n <div className=\"process-grid\">{cards}</div>\n </div>\n ))\n ) : (\n <div className=\"empty-state\">No processes available.</div>\n )}\n </div>\n </section>\n {confirmAction && (\n <ConfirmDialog\n title={confirmAction.title}\n message={confirmAction.message}\n confirmLabel=\"Confirm\"\n cancelLabel=\"Cancel\"\n danger={true}\n onConfirm={confirmAction.onConfirm}\n onCancel={() => setConfirmAction(null)}\n />\n )}\n </>\n );\n}\n"],"names":["ConfirmDialog","title","message","confirmLabel","cancelLabel","onConfirm","onCancel","danger","jsx","jsxs","e","IconImage","CloseIcon","ToolsIcon","RELEASE_TOKEN_REGEX","EPISODE_TOKEN_REGEX","SEASON_TOKEN_REGEX","sanitizeSearchSummary","raw","trimmed","normalized","releaseMatch","rest","looksLikeEpisode","cleanedTitle","year","isProcessEqual","a","b","areProcessListsEqual","index","getRefreshDelay","active","processes","ProcessesView","setProcesses","useState","loading","setLoading","restartingAll","setRestartingAll","rebuildingArrs","setRebuildingArrs","statusData","setStatusData","confirmAction","setConfirmAction","push","useToast","isFetching","useRef","load","useCallback","showLoading","processData","status","getProcesses","getStatus","next","process","sanitized","prev","error","useEffect","refreshDelay","useMemo","useInterval","handleRestart","category","kind","restartProcess","handleRestartAll","restartAllProcesses","handleRebuildArrs","rebuildArrs","groupedProcesses","appBuckets","classifyApp","proc","name","arrs","hasRadarr","arr","hasSonarr","hasLidarr","app","instances","instanceKey","appOrder","result","sortedInstances","items","group","order","label","handleRestartGroup","item","cardsByApp","cards","runningCount","totalCount","tone","statusClass","statusLabel","summaryLabel","displayName","filteredKinds","lower","formatKind","kindLower","metricType","categoryTotal","queueTotal","Fragment","RefreshIcon","RestartIcon"],"mappings":"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"}
@@ -1 +1 @@
1
- :root,[data-theme=dark]{--bg: #101114;--surface: #1b1e22;--on-surface: #eaeef2;--muted: #9aa3ac;--primary: #7aa2f7;--primary-variant: #3b82f6;--success: #22c55e;--danger: #ef4444;--warning: #facc15;--border: #2a2f36;--elev: 8px;--layout-max-width: 1200px}[data-theme=light]{--bg: #f5f5f7;--surface: #ffffff;--on-surface: #1d1d1f;--muted: #6e6e73;--primary: #0071e3;--primary-variant: #0077ed;--success: #34c759;--danger: #ff3b30;--warning: #ff9500;--border: #d2d2d7;--elev: 4px;--layout-max-width: 1200px}*{box-sizing:border-box}html{scroll-behavior:smooth}html,body{height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;margin:0;background:var(--bg);color:var(--on-surface);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-feature-settings:"kern" 1;font-kerning:normal}*::-webkit-scrollbar{width:12px;height:12px}*::-webkit-scrollbar-track{background:#0003;border-radius:6px}*::-webkit-scrollbar-thumb{background:#7aa2f74d;border-radius:6px;border:2px solid transparent;background-clip:padding-box}*::-webkit-scrollbar-thumb:hover{background:#7aa2f780;background-clip:padding-box}.appbar{position:sticky;top:0;z-index:100;display:flex;justify-content:center;padding:16px 20px;background:var(--surface);border-bottom:1px solid var(--border);box-shadow:0 2px 16px #0000000f;backdrop-filter:blur(12px) saturate(180%);-webkit-backdrop-filter:blur(12px) saturate(180%)}[data-theme=light] .appbar{background:#fffc}[data-theme=dark] .appbar{background:linear-gradient(180deg,#0b0c0ff2,#0d0e11f2);box-shadow:0 4px 16px #0006}.appbar__inner{width:100%;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 16px;flex-wrap:wrap}.appbar__title{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}.appbar h1{margin:0;font-size:20px;font-weight:700;letter-spacing:-.02em;background:linear-gradient(135deg,var(--on-surface) 0%,var(--primary) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}[data-theme=light] .appbar h1{background:linear-gradient(135deg,var(--on-surface) 0%,var(--primary) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.appbar__version{font-size:12px;color:var(--muted);letter-spacing:.4px}.appbar__status{font-size:12px}.appbar__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.appbar__update{display:inline-flex;align-items:center;gap:6px}.appbar__update-indicator{width:8px;height:8px;border-radius:50%;background:var(--danger);display:inline-block;animation:pulse 1s ease-in-out infinite;box-shadow:0 0 8px #ef444499}.container{padding:20px;display:grid;grid-template-columns:1fr;gap:20px;animation:fadeInUp .3s ease}.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;color:var(--muted)}.nav{display:flex;gap:8px;flex-wrap:wrap;width:100%}.nav button{color:var(--muted);background:transparent;border:1px solid var(--border);padding:10px 14px;display:inline-flex;align-items:center;gap:8px;border-radius:8px;cursor:pointer;font-weight:500;transition:all .15s ease;position:relative;overflow:hidden}.nav button:before{content:"";position:absolute;inset:0;background:linear-gradient(135deg,rgba(122,162,247,.1),transparent);opacity:0;transition:opacity .15s ease}.nav button .icon{width:1.4em;height:1.4em;transition:transform .15s ease}.nav button:hover .icon{transform:scale(1.1)}.nav button.active{color:var(--primary);border-color:var(--primary);background:#7aa2f71f;box-shadow:0 0 0 2px #7aa2f71a,0 2px 8px #7aa2f733;font-weight:600}[data-theme=light] .nav button.active{box-shadow:0 0 0 2px #0071e31a,0 2px 8px #0071e333}.nav button:hover:not(.active){color:var(--on-surface);border-color:#7aa2f766;background:#7aa2f70f;transform:translateY(-1px)}.nav button:hover:before{opacity:1}.card{background:var(--surface);border:1px solid var(--border);border-radius:14px;box-shadow:0 2px 8px #00000014,0 1px 2px #0000000f;overflow:hidden;transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease;position:relative}[data-theme=dark] .card{box-shadow:0 var(--elev) 24px #00000040,0 2px 4px #0000004d}.card:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(122,162,247,.1),transparent);opacity:0;transition:opacity .15s ease}.card:hover{transform:translateY(-2px);box-shadow:0 16px 40px #0000001f,0 4px 8px #00000014;border-color:#7aa2f74d}[data-theme=dark] .card:hover{box-shadow:0 12px 32px #00000059,0 4px 8px #0006}.card:hover:before{opacity:1}.card .card-header{padding:16px 20px;border-bottom:1px solid var(--border);font-weight:700;font-size:15px;letter-spacing:.01em;color:var(--on-surface);background:linear-gradient(180deg,#7aa2f70a,#7aa2f703);position:relative}[data-theme=light] .card .card-header{background:linear-gradient(180deg,rgba(0,113,227,.03) 0%,transparent 100%)}.card .card-header:after{content:"";position:absolute;bottom:0;left:20px;right:20px;height:1px;background:linear-gradient(90deg,transparent,var(--primary),transparent);opacity:.15}.card .card-body{padding:12px 14px}.btn{appearance:none;border:1px solid var(--border);background:var(--surface);color:var(--on-surface);padding:8px 14px;border-radius:8px;cursor:pointer;transition:all .15s ease;display:inline-flex;align-items:center;gap:6px;font-weight:500;position:relative;overflow:hidden}[data-theme=dark] .btn{background:#0f131a}.btn:before{content:"";position:absolute;inset:0;background:linear-gradient(135deg,#ffffff1a,#fff0);opacity:0;transition:opacity .15s ease}.btn:hover:not(:disabled):before{opacity:1}.btn.primary{border-color:var(--primary-variant);background:linear-gradient(135deg,#7aa2f72e,#7aa2f71f);color:var(--primary);font-weight:600;box-shadow:0 2px 8px #7aa2f726}[data-theme=light] .btn.primary{background:linear-gradient(135deg,#0071e31f,#0071e314);box-shadow:0 2px 8px #0071e326}.btn.danger{border-color:#ef444466;color:var(--danger);background:#ef44441f}.btn.danger:hover:not(:disabled){background:var(--danger);color:#0a0a0a;border-color:var(--danger);box-shadow:0 4px 12px #ef44444d}.btn.primary:hover:not(:disabled){background:var(--primary);color:#0a0a0a;border-color:var(--primary);box-shadow:0 4px 12px #7aa2f74d}.btn.ghost{background:transparent}.btn.ghost:hover:not(:disabled){background:#ffffff0d;border-color:#7aa2f74d}.btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 3px 10px #0006}.btn:active:not(:disabled){transform:translateY(0)}.btn:focus-visible{outline:none;box-shadow:0 0 0 3px #7aa2f74d}[data-theme=light] .btn:focus-visible{box-shadow:0 0 0 3px #0071e34d}.nav button:focus-visible{outline:none;box-shadow:0 0 0 3px #7aa2f740}[data-theme=light] .nav button:focus-visible{box-shadow:0 0 0 3px #0071e340}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.small{padding:6px 10px;font-size:12px}.btn.outline{background:transparent;border-color:var(--border)}.btn.outline:hover:not(:disabled){background:#ffffff0d;border-color:var(--primary-variant)}.btn.active{background:var(--primary);color:#0a0a0a;border-color:var(--primary)}.field{display:flex;flex-direction:column;gap:6px}.field--full-width{grid-column:1 / -1}.sonarr-hierarchical-view{display:flex;flex-direction:column;gap:8px}.series-details,.season-details{border:1px solid var(--border);border-radius:6px;background:var(--card-bg)}.series-summary,.season-summary{padding:12px 16px;cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:600;color:var(--text);background:var(--card-header-bg);border-radius:6px 6px 0 0;display:flex;align-items:center;justify-content:space-between;gap:8px}.series-summary:hover,.season-summary:hover{background:var(--hover-bg)}.series-title{font-size:1.1em;flex:1}.series-instance,.series-count,.series-quality,.artist-quality{font-size:.9em;color:var(--muted);font-weight:400;white-space:nowrap}.season-title{font-size:1em}.season-count{font-size:.9em;color:var(--muted);font-weight:400}.series-content,.season-content{padding:8px}.episodes-table-wrapper{overflow-x:auto}.episodes-table{width:100%;border-collapse:collapse;font-size:.9em}.episodes-table th,.episodes-table td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}.episodes-table th{background:var(--table-header-bg);font-weight:600;color:var(--text);position:sticky;top:0}.episodes-table tr:hover{background:var(--hover-bg)}.lidarr-hierarchical-view{display:flex;flex-direction:column;gap:8px}.artist-details{border:1px solid var(--border);border-radius:6px;background:var(--card-bg)}.artist-summary{padding:12px 16px;cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:600;color:var(--text);background:var(--card-header-bg);border-radius:6px 6px 0 0;display:flex;align-items:center;justify-content:space-between;gap:8px}.artist-summary:hover{background:var(--hover-bg)}.artist-title{font-size:1.1em;flex:1}.artist-instance,.artist-count{font-size:.9em;color:var(--muted);font-weight:400}.artist-content{padding:8px}.albums-table-wrapper{overflow-x:auto}.albums-table{width:100%;border-collapse:collapse;font-size:.9em}.albums-table th,.albums-table td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}.albums-table th{background:var(--table-header-bg);font-weight:600;color:var(--text);position:sticky;top:0}.albums-table tr:hover{background:var(--hover-bg)}.album-details{border:1px solid var(--border);border-radius:4px;background:var(--surface);margin-bottom:8px}.album-summary{padding:10px 14px;cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:500;color:var(--text);background:var(--card-header-bg);border-radius:4px 4px 0 0;display:flex;align-items:center;gap:12px}.album-summary:hover{background:var(--hover-bg)}.album-title{font-size:1em;flex:1}.album-date,.album-track-count{font-size:.85em;color:var(--muted);font-weight:400}.album-status{font-size:1.1em;font-weight:700}.album-status.has-file{color:var(--success)}.album-status.missing{color:var(--danger)}.album-content{padding:8px}.album-info{padding:8px 12px;font-size:.9em}.album-info p{margin:4px 0}.tracks-table-wrapper{overflow-x:auto}.tracks-table{width:100%;border-collapse:collapse;font-size:.85em;table-layout:fixed}.tracks-table th,.tracks-table td{padding:6px 10px;text-align:left;border-bottom:1px solid var(--border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tracks-table th:nth-child(1),.tracks-table td:nth-child(1){width:70px}.tracks-table th:nth-child(2),.tracks-table td:nth-child(2){width:auto;white-space:normal}.tracks-table th:nth-child(3),.tracks-table td:nth-child(3){width:100px}.tracks-table th:nth-child(4),.tracks-table td:nth-child(4){width:110px;text-align:center}.tracks-table th:nth-child(5),.tracks-table td:nth-child(5){width:180px}.tracks-table th{background:var(--table-header-bg);font-weight:600;color:var(--text);font-size:.9em}.tracks-table tr.track-available{opacity:1}.tracks-table tr.track-missing{opacity:.6}.tracks-table tr:hover{background:var(--hover-bg)}.track-status{display:inline-block;font-weight:700;font-size:1.1em}.track-status.available{color:var(--success)}.track-status.missing{color:var(--danger)}.table-badge{display:inline-block;padding:3px 8px;border-radius:6px;font-size:.8em;font-weight:600;border:1px solid transparent;transition:all .15s ease}.table-badge:hover{transform:scale(1.05)}.table-badge.monitored{background:#22c55e26;border-color:#22c55e4d;color:var(--success)}.table-badge.unmonitored{background:#facc1526;border-color:#facc154d;color:var(--warning)}.table-badge.has-file{background:#22c55e26;border-color:#22c55e4d;color:var(--success)}.table-badge.missing{background:#ef444426;border-color:#ef44444d;color:var(--danger)}.table-badge-reason{background:#facc1526;border-color:#facc154d;color:var(--warning);font-family:monospace;font-size:11px;font-weight:600}[data-theme=light] .table-badge-reason{background:#ff95001a;border-color:#ff95004d}.field label{color:var(--muted);font-size:12px}.field input,.field select,.field textarea{background:var(--surface);color:var(--on-surface);border:1px solid var(--border);border-radius:8px;padding:9px 12px;transition:all .15s ease}[data-theme=dark] .field input,[data-theme=dark] .field select,[data-theme=dark] .field textarea{background:#0f131a}.field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 4px #7aa2f71f,0 2px 8px #7aa2f726;background:var(--bg);transform:translateY(-1px)}[data-theme=light] .field input:focus,[data-theme=light] .field select:focus,[data-theme=light] .field textarea:focus{box-shadow:0 0 0 4px #0071e31a,0 2px 8px #0071e326}[data-theme=dark] .field input:focus,[data-theme=dark] .field select:focus,[data-theme=dark] .field textarea:focus{background:#12151a;box-shadow:0 0 0 4px #7aa2f71f,0 2px 8px #7aa2f733}.field input:hover:not(:focus),.field select:hover:not(:focus),.field textarea:hover:not(:focus){border-color:#7aa2f74d}.field input[type=checkbox]{width:auto}.field.mobile-instance-select{display:none}.field-description,.field-hint{display:block;margin:0;font-size:12px;line-height:1.35;color:var(--muted)}.field-description{margin-top:2px}.field-hint{color:var(--primary);font-weight:500;margin-top:4px}.row{display:flex;flex-wrap:wrap;gap:12px}.row .col{flex:1 1 260px}table{border-collapse:collapse;width:100%;border:1px solid var(--border);border-radius:12px;overflow:hidden;box-shadow:0 2px 8px #0000000a}[data-theme=dark] table{box-shadow:0 2px 8px #0003}th,td{border-bottom:1px solid var(--border);padding:10px 12px;font-size:13px;text-align:left}th{background:var(--surface);color:var(--muted);font-weight:600;text-transform:uppercase;font-size:11px;letter-spacing:.05em;border-bottom:2px solid var(--border)}[data-theme=dark] th{background:#12151a}tbody tr{transition:background-color .1s ease,transform .08s ease;border-left:3px solid transparent}tbody tr:hover{background:#7aa2f70d;cursor:default;border-left-color:var(--primary)}[data-theme=light] tbody tr:hover{background:#0071e30a}[data-theme=dark] tbody tr:hover{background:#7aa2f70f}th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sort-arrow{font-size:10px;margin-left:4px;color:var(--muted)}details{margin:6px 0}details summary{cursor:pointer;transition:all .15s ease;padding:4px;border-radius:6px}details summary:hover{background:#7aa2f70d;color:var(--primary)}.ok{color:var(--success)}.bad{color:var(--danger)}.hint{color:var(--muted);font-size:12px}.spacer{flex:1}pre{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:14px;color:var(--on-surface);max-height:420px;overflow:auto;transition:border-color .15s ease}[data-theme=dark] pre{background:#0f131a}pre:hover{border-color:#7aa2f74d}pre::-webkit-scrollbar{width:10px;height:10px}pre::-webkit-scrollbar-track{background:#0003;border-radius:6px}pre::-webkit-scrollbar-thumb{background:#7aa2f74d;border-radius:6px}pre::-webkit-scrollbar-thumb:hover{background:#7aa2f780}.loading{color:var(--muted);display:inline-flex;align-items:center;gap:8px;font-weight:500;animation:pulse 1.5s ease-in-out infinite}.spinner{width:14px;height:14px;border:2.5px solid rgba(122,162,247,.15);border-top-color:var(--primary);border-radius:50%;display:inline-block;animation:spin .6s linear infinite;box-shadow:0 0 8px #7aa2f733}[data-theme=light] .spinner{border:2.5px solid rgba(0,113,227,.15);border-top-color:var(--primary);box-shadow:0 0 8px #0071e333}@keyframes spin{to{transform:rotate(360deg)}}.toasts{position:fixed;right:16px;bottom:16px;display:grid;gap:10px;z-index:9999}.toast{background:var(--surface);color:var(--on-surface);border:1px solid var(--border);border-left:4px solid var(--primary);padding:12px 16px;border-radius:10px;box-shadow:0 12px 32px #0003;min-width:260px;transition:all .2s ease;animation:slideIn .2s ease}[data-theme=dark] .toast{background:#12151a;border:1px solid rgba(255,255,255,.1);box-shadow:0 12px 32px #00000080}.toast:hover{transform:translate(-4px)}[data-theme=dark] .toast:hover{box-shadow:0 16px 40px #0009}[data-theme=light] .toast:hover{box-shadow:0 16px 40px #00000040}.toast.success{border-left-color:var(--success)}.toast.warning{border-left-color:var(--warning)}.toast.error{border-left-color:var(--danger)}[data-theme=dark] .toast.success{background:linear-gradient(90deg,#22c55e14,#12151a 20%)}[data-theme=dark] .toast.warning{background:linear-gradient(90deg,#facc1514,#12151a 20%)}[data-theme=dark] .toast.error{background:linear-gradient(90deg,#ef444414,#12151a 20%)}[data-theme=light] .toast.success{background:linear-gradient(90deg,rgba(52,199,89,.08) 0%,var(--surface) 20%)}[data-theme=light] .toast.warning{background:linear-gradient(90deg,rgba(255,149,0,.08) 0%,var(--surface) 20%)}[data-theme=light] .toast.error{background:linear-gradient(90deg,rgba(255,59,48,.08) 0%,var(--surface) 20%)}.status-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:500;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);transition:all .15s ease}.status-pill:hover{background:#ffffff14;border-color:#ffffff26;transform:scale(1.02)}.stack{display:grid;gap:12px}.tabs{display:flex;gap:8px;flex-wrap:wrap}.tab-panel{margin-top:12px}.sidebar{display:grid;gap:8px;min-width:220px;align-content:start;align-items:start}.sidebar .btn{width:100%;text-align:left}.split{display:flex;gap:16px}.split .pane{flex:1}.split .pane.sidebar{flex:0 0 260px}.pagination{display:flex;justify-content:space-between;align-items:center;margin-top:16px;padding:12px 0;gap:12px;flex-wrap:wrap}.pagination-info{font-size:14px;color:var(--muted)}.pagination .inline{display:flex;gap:4px;align-items:center}.pagination .btn{min-width:70px;padding:8px 12px}.pagination-jump{width:80px;padding:8px 12px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--on-surface);font-size:14px;text-align:center;transition:all .2s ease}.pagination-jump:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px #7aa2f71a}.pagination-jump:disabled{opacity:.5;cursor:not-allowed}.pagination-jump::-webkit-inner-spin-button,.pagination-jump::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.pagination-jump[type=number]{-moz-appearance:textfield}.badge{display:inline-block;padding:3px 8px;border-radius:6px;font-size:11px;font-weight:600;background:#7aa2f726;border:1px solid rgba(122,162,247,.25);color:var(--primary);transition:all .15s ease}.badge:hover{background:#7aa2f740;border-color:#7aa2f766;transform:scale(1.05)}.icon{display:inline-block;width:1.4em;height:1.4em;vertical-align:middle;object-fit:contain}.icon--small{width:1.2em;height:1.2em}.icon--large{width:1.6em;height:1.6em}svg{max-width:2em;max-height:2em}svg[width],svg[height]{width:1.4em!important;height:1.4em!important}.btn .icon{margin:0;transition:transform .2s ease}.icon-rotate{transform:scaleX(-1);transform-origin:center}.btn:hover .icon{transform:translateY(-1px)}.responsive-table{width:100%;border-collapse:collapse;transition:box-shadow .2s ease}.responsive-table tbody tr{animation:fadeInUp .2s ease}.responsive-table tbody tr:nth-child(2n){background:#ffffff05}.responsive-table td,.responsive-table th{padding:8px 12px;text-align:left}.table-wrapper{overflow-x:auto;border-radius:12px}.table-wrapper::-webkit-scrollbar{height:8px}.table-wrapper::-webkit-scrollbar-thumb{background:#ffffff1f;border-radius:999px}.animate-fade-in{animation:fadeInUp .2s ease}.table-badge{display:inline-flex;align-items:center;gap:4px}.inline{display:inline-flex;align-items:center;gap:6px}.text-info{color:var(--primary)}.text-success{color:var(--success)}.text-danger{color:var(--danger)}@keyframes fadeInUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes slideIn{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.7}}@keyframes glow{0%,to{box-shadow:0 0 8px #7aa2f74d}50%{box-shadow:0 0 16px #7aa2f780}}@media(max-width:900px){.split{flex-direction:column}.split .pane.sidebar{display:none}.field.mobile-instance-select{display:grid;margin-bottom:12px}}@media(max-width:640px){.appbar__inner{flex-direction:column;align-items:stretch;gap:12px;padding:0}.appbar__actions{width:100%;justify-content:flex-start}.appbar__title{gap:8px}.nav{gap:6px}.nav button{flex:1 1 calc(50% - 6px);justify-content:center}}@media(max-width:420px){.nav button{flex-basis:100%}}@media(max-width:720px){.responsive-table thead{display:none}.responsive-table,.responsive-table tbody,.responsive-table tr,.responsive-table td{display:block;width:100%}.responsive-table tbody tr{background:#12151ab3;border:1px solid rgba(255,255,255,.06);border-radius:8px;padding:8px;margin-bottom:8px;box-shadow:0 4px 12px #0003;user-select:none;-webkit-user-select:none;-moz-user-select:none}.responsive-table td{padding:4px 0;display:flex;justify-content:space-between;align-items:center;gap:8px;border:none;font-size:14px;line-height:1.4}.responsive-table td:before{content:attr(data-label);font-weight:600;font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;min-width:80px}.table-wrapper{overflow:visible}.episodes-table thead{display:none}.episodes-table,.episodes-table tbody,.episodes-table tr,.episodes-table td{display:block;width:100%}.episodes-table tbody tr{background:#12151ab3;border:1px solid rgba(255,255,255,.06);border-radius:8px;padding:8px;margin-bottom:8px;box-shadow:0 4px 12px #0003}.episodes-table td{padding:4px 0;display:flex;justify-content:space-between;align-items:center;gap:8px;border:none;font-size:14px;line-height:1.4}.episodes-table td:before{content:attr(data-label);font-weight:600;font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;min-width:80px}.episodes-table-wrapper{overflow:visible}.tracks-table thead{display:none}.tracks-table,.tracks-table tbody,.tracks-table tr,.tracks-table td{display:block;width:100%}.tracks-table tbody tr{background:#12151ab3;border:1px solid rgba(255,255,255,.06);border-radius:8px;padding:8px;margin-bottom:8px;box-shadow:0 4px 12px #0003}.tracks-table td{padding:4px 0;display:flex;justify-content:space-between;align-items:center;gap:8px;border:none;font-size:14px;line-height:1.4}.tracks-table td:before{content:attr(data-label);font-weight:600;font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;min-width:80px}.tracks-table-wrapper{overflow:visible}}.process-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.process-section{display:grid;gap:12px}.process-section+.process-section{margin-top:12px}.process-section__title{font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--primary);padding:0 4px;display:inline-flex;align-items:center;gap:10px}.process-section__title:before{content:"";width:4px;height:18px;background:linear-gradient(180deg,var(--primary),var(--primary-variant));border-radius:3px;box-shadow:0 0 8px #7aa2f74d}.process-card{border:1px solid var(--border);border-radius:14px;background:var(--surface);padding:18px;display:flex;flex-direction:column;gap:14px;transition:all .15s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden;box-shadow:0 2px 8px #0000000f}[data-theme=dark] .process-card{background:#ffffff08;box-shadow:0 2px 8px #0003}.process-card:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--primary),var(--primary-variant));opacity:0;transition:opacity .15s ease}.process-card:after{content:"";position:absolute;inset:0;background:radial-gradient(circle at top right,rgba(122,162,247,.05),transparent 60%);opacity:0;transition:opacity .15s ease;pointer-events:none}.process-card:hover{border-color:#7aa2f766;transform:translateY(-3px);box-shadow:0 12px 32px #0000001f}[data-theme=dark] .process-card:hover{box-shadow:0 8px 24px #00000059}.process-card:hover:before,.process-card:hover:after{opacity:1}.process-card__header{position:relative;display:flex;justify-content:space-between;align-items:flex-start;gap:8px;flex-wrap:wrap;padding-right:18px}.process-card__name{font-weight:700;font-size:17px;letter-spacing:-.01em;line-height:1.3}.process-card__title{display:grid;gap:4px;min-width:0}.process-card__summary{font-size:12px;color:var(--muted)}.process-card__badges{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.process-card__badge{padding:3px 10px;border-radius:999px;font-size:11px;font-weight:600;background:#7aa2f726;border:1px solid rgba(122,162,247,.3);color:var(--primary);transition:all .15s ease}.process-card__badge:hover{background:#7aa2f740;border-color:#7aa2f780;transform:scale(1.05)}.status-indicator{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:#99a2ad99;box-shadow:0 0 6px #00000059;transition:all .2s ease}.status-indicator--ok{background:var(--success);box-shadow:0 0 12px #22c55e80;animation:pulse 1.5s ease-in-out infinite}.status-indicator--bad{background:var(--danger);box-shadow:0 0 12px #ef444480;animation:pulse 1s ease-in-out infinite}.process-card__footer{display:flex;justify-content:flex-end;margin-top:auto}.process-card__list{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.process-chip{display:grid;gap:10px;border:1px solid var(--border);border-radius:10px;padding:12px 14px;background:var(--bg);transition:all .15s ease}[data-theme=dark] .process-chip{border:1px solid rgba(255,255,255,.08);background:#0f131a99}.process-chip:hover{border-color:#7aa2f74d;transform:translate(2px)}[data-theme=dark] .process-chip:hover{background:#0f131acc;border-color:#7aa2f733}[data-theme=light] .process-chip:hover{background:#00000005}.process-chip__top{display:flex;justify-content:space-between;align-items:center;gap:10px}.process-chip__name{font-weight:600;font-size:14px}.process-chip__actions{display:flex;justify-content:flex-end}.process-chip .btn{padding:6px 10px}.process-chip__detail{margin-top:6px;font-size:12px;color:var(--muted);line-height:1.35}.process-chip__detail-time{font-style:italic;color:var(--muted)}.status-pill__dot{width:6px;height:6px;border-radius:50%;background:currentColor;display:inline-block;margin-right:6px}.status-pill--ok{border-color:#22c55e66;background:linear-gradient(135deg,#22c55e26,#22c55e14);color:var(--success);box-shadow:0 2px 8px #22c55e26}.status-pill--bad{border-color:#ef444466;background:linear-gradient(135deg,#ef444426,#ef444414);color:var(--danger);box-shadow:0 2px 8px #ef444426}[data-theme=light] .status-pill--ok{background:linear-gradient(135deg,#34c7591f,#34c7590f)}[data-theme=light] .status-pill--bad{background:linear-gradient(135deg,#ff3b301f,#ff3b300f)}.empty-state{border:2px dashed rgba(122,162,247,.25);border-radius:16px;padding:40px 32px;text-align:center;color:var(--muted);background:linear-gradient(135deg,#7aa2f708,#7aa2f703);transition:all .2s ease;position:relative;overflow:hidden}.empty-state:before{content:"";position:absolute;top:50%;left:50%;width:100px;height:100px;background:radial-gradient(circle,rgba(122,162,247,.08),transparent);transform:translate(-50%,-50%);border-radius:50%;opacity:0;transition:opacity .2s ease}.empty-state:hover{border-color:#7aa2f766;background:linear-gradient(135deg,#7aa2f70d,#7aa2f705)}.empty-state:hover:before{opacity:1}[data-theme=light] .empty-state{border-color:#0071e340;background:linear-gradient(135deg,rgba(0,113,227,.02) 0%,transparent 100%)}[data-theme=light] .empty-state:before{background:radial-gradient(circle,rgba(0,113,227,.06),transparent)}[data-theme=light] .empty-state:hover{border-color:#0071e366;background:linear-gradient(135deg,#0071e30a,#0071e303)}.config-card{border:1px solid var(--border);border-radius:12px;background:var(--surface)}.config-card summary{cursor:pointer;font-weight:600;color:var(--muted);list-style:none;outline:none;padding:12px 14px;border-bottom:1px solid var(--border)}.config-card summary::-webkit-details-marker{display:none}.config-card summary:before{content:">";display:inline-block;margin-right:8px;transition:transform .2s ease}.config-card[open] summary:before{transform:rotate(0)}.config-card:not([open]) summary:before{transform:rotate(-90deg)}.config-card>.card-body{display:grid;gap:12px}.config-summary-card{display:flex;flex-direction:column;gap:12px;min-height:160px;transition:transform .2s ease,box-shadow .2s ease}.config-summary-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000004d}.config-summary-card p{margin:0;color:var(--muted);line-height:1.4}.config-layout{display:grid;gap:16px}.config-actions{display:flex;flex-wrap:wrap;gap:8px}.config-grid{display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}.config-arr-groups{display:flex;flex-direction:column;gap:24px}.config-arr-group{display:flex;flex-direction:column;gap:12px}.config-arr-group__details{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:16px 18px;background:#ffffff08;box-shadow:0 2px 8px #0003}.config-arr-group__details summary{display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer;font-weight:600;font-size:15px;color:var(--on-surface);list-style:none;transition:color .2s ease}.config-arr-group__details summary:hover{color:var(--primary)}.config-arr-group__details summary::-webkit-details-marker{display:none}.config-arr-group__details[open] summary{margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid rgba(255,255,255,.06)}.config-arr-group__count{display:inline-flex;align-items:center;justify-content:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;background:#7aa2f726;border:1px solid rgba(122,162,247,.3);color:var(--primary)}.config-arr-group__title{margin:0;font-size:14px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.config-arr-grid{display:grid;gap:18px;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));margin-top:4px}.config-arr-grid .card-body{display:flex;flex-direction:column;gap:12px}.config-arr-card{min-height:220px;transition:transform .2s ease,box-shadow .2s ease}.config-arr-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000004d}.config-arr-summary{display:grid;gap:8px;margin:0}.config-arr-summary__item{display:grid;gap:2px}.config-arr-summary__item dt{margin:0;font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}.config-arr-summary__item dd{margin:0;color:var(--on-surface);font-weight:500;font-size:13px}.config-arr-summary__uri{word-break:break-all}.config-arr-actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.config-footer{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.field-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.modal .field-grid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}@media(max-width:720px){.modal .field-grid{grid-template-columns:minmax(0,1fr)}}.field-label{display:flex;align-items:center;gap:6px;font-weight:600;color:var(--muted)}.checkbox-field{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}.checkbox-field label{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-weight:600;color:var(--on-surface)}.checkbox-field input{margin:0;flex-shrink:0;cursor:pointer}.checkbox-field__content{display:flex;flex-direction:column;gap:6px;max-width:100%}.checkbox-field__text{display:inline-flex;align-items:center;gap:6px;font-weight:600;color:var(--muted);line-height:1.4}.secure-field{gap:8px}.secure-field__input-group{display:flex;align-items:center;gap:8px}.secure-field__input-group input{flex:1}.secure-field__controls{display:flex;gap:6px}.secure-field__controls .btn{padding:6px 10px}.help-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:11px;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:#ffffff14;color:var(--muted);cursor:help;transition:border-color .2s ease,color .2s ease}.help-icon:hover{border-color:var(--primary);color:var(--on-surface)}.config-section{border:1px solid rgba(255,255,255,.05);border-radius:10px;padding:8px 12px;background:#ffffff05}.config-section summary{cursor:pointer;font-weight:600;color:var(--muted);list-style:none;outline:none}.config-section summary::-webkit-details-marker{display:none}.config-section summary:before{content:">";display:inline-block;margin-right:8px;transition:transform .2s ease}.config-section[open] summary:before{transform:rotate(0)}.config-section:not([open]) summary:before{transform:rotate(-90deg)}.config-section__body{margin-top:12px}.modal-backdrop{position:fixed;inset:0;background:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:flex-start;justify-content:center;padding:24px;overflow-y:auto;overflow-x:hidden;z-index:120;animation:fadeIn .2s ease}[data-theme=dark] .modal-backdrop{background:#000000bf}[data-theme=light] .modal-backdrop{background:#0000004d}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.modal{background:var(--surface);border:1px solid var(--border);border-radius:20px;width:min(840px,calc(100% - 48px));max-height:min(92vh,calc(100vh - 80px));display:flex;flex-direction:column;margin:40px auto;box-shadow:0 24px 64px #0003,0 8px 16px #0000001a;animation:modalSlideIn .2s cubic-bezier(.4,0,.2,1);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}[data-theme=dark] .modal{background:#1b1e22f2;border:1px solid rgba(255,255,255,.1);box-shadow:0 20px 60px #0009,0 0 0 1px #ffffff0d}[data-theme=light] .modal{background:#fffffff2}@keyframes modalSlideIn{0%{opacity:0;transform:translateY(-20px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}.modal-header{padding:20px 24px;border-bottom:1px solid rgba(255,255,255,.08);display:flex;justify-content:space-between;align-items:center;gap:12px;background:#ffffff05;border-radius:16px 16px 0 0}.modal-header h2{margin:0;font-size:20px;font-weight:600;color:var(--on-surface);letter-spacing:-.01em}.modal-body{padding:24px;overflow-y:auto;overflow-x:hidden;display:grid;gap:20px}.modal-footer{padding:16px 24px 20px;border-top:1px solid rgba(255,255,255,.08);display:flex;justify-content:flex-end;gap:12px;background:#ffffff03;border-radius:0 0 16px 16px}.changelog-modal__body{gap:12px}.changelog-meta{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}.changelog-meta strong{color:var(--on-surface)}.changelog-body{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:14px;max-height:360px;overflow-y:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:13px;line-height:1.5;white-space:pre-wrap;transition:border-color .15s ease}[data-theme=dark] .changelog-body{background:#0f131a}.changelog-body:hover{border-color:#7aa2f74d}.changelog-body::-webkit-scrollbar{width:10px}.changelog-body::-webkit-scrollbar-track{background:#0003;border-radius:6px}.changelog-body::-webkit-scrollbar-thumb{background:#7aa2f74d;border-radius:6px}.changelog-body::-webkit-scrollbar-thumb:hover{background:#7aa2f780}.changelog-links{margin-right:auto;display:flex;align-items:center;gap:8px}.changelog-buttons{display:flex;align-items:center;gap:8px}.tracker-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}.tracker-card.card{background:#ffffff08;border-color:#ffffff14}.profile-mappings-grid{display:flex;flex-direction:column;gap:12px}.profile-mapping-row{display:grid;grid-template-columns:1fr 1fr auto;gap:12px;align-items:end}.profile-mapping-row .field{margin:0}.profile-mapping-row .btn.icon-only{height:38px;width:38px;padding:0;display:flex;align-items:center;justify-content:center}.tracker-card .card-header{display:flex;justify-content:space-between;align-items:center;gap:12px;font-weight:600;color:var(--on-surface)}.tracker-card .card-body{padding-top:0}.tracker-card .field-grid{grid-template-columns:minmax(0,1fr)}.keyboard-hint{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;border-radius:4px;font-size:10px;font-weight:600;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);color:var(--muted);font-family:monospace}.skeleton{background:linear-gradient(90deg,var(--surface) 0%,rgba(122,162,247,.1) 50%,var(--surface) 100%);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-table{display:flex;flex-direction:column;gap:8px;padding:16px}.skeleton-table-header{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:12px;margin-bottom:8px}.skeleton-header{height:24px}.skeleton-table-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:12px;padding:12px 0;border-bottom:1px solid var(--border)}.skeleton-cell{height:20px}.skeleton-card{padding:20px;background:var(--surface);border-radius:12px;border:1px solid var(--border)}.skeleton-title{height:28px;width:60%;margin-bottom:16px}.skeleton-text{height:16px;margin-bottom:12px}.skeleton-text:last-of-type{width:80%}.skeleton-button{height:40px;width:120px;margin-top:16px;border-radius:8px}.skeleton-text-group{display:flex;flex-direction:column;gap:12px}[data-density=compact] .responsive-table td,[data-density=compact] .responsive-table th{padding:4px 8px;font-size:12px;line-height:1.3}[data-density=compact] .responsive-table{font-size:12px}[data-density=compact] .episodes-table td,[data-density=compact] .episodes-table th{padding:4px 8px;font-size:12px}[data-density=compact] .card{padding:12px;border-radius:8px}[data-density=compact] .card-header{font-size:16px;padding:8px 12px;margin-bottom:8px}[data-density=compact] .card-body{padding:8px 12px}[data-density=compact] .btn{padding:4px 10px;font-size:12px;min-height:28px}[data-density=compact] .btn.small{padding:3px 8px;font-size:11px;min-height:24px}[data-density=compact] .field{margin-bottom:8px}[data-density=compact] .field label{font-size:11px;margin-bottom:2px}[data-density=compact] .field input,[data-density=compact] .field select,[data-density=compact] .field textarea{padding:4px 8px;font-size:12px;min-height:28px}[data-density=compact] .hint{font-size:11px;line-height:1.4}[data-density=compact] .stack{gap:8px}[data-density=compact] .row{gap:6px}[data-density=compact] .table-badge{padding:1px 4px;font-size:10px}[data-density=compact] .table-badge-reason{font-size:9px}[data-density=compact] .container{padding:12px}[data-density=compact] .nav{gap:4px;padding:8px 0}[data-density=compact] .nav button{padding:6px 12px;font-size:12px;gap:6px}[data-density=compact] .pagination{margin-top:8px;padding:8px 0;font-size:12px}[data-density=compact] .season-header{padding:8px 12px;font-size:13px}[data-density=compact] .season-content{padding:8px}[data-density=compact] .series-card{margin-bottom:12px}[data-density=compact] .field-grid{gap:8px}[data-density=compact] h2{font-size:18px;margin-bottom:12px}[data-density=compact] h3{font-size:14px;margin-bottom:8px}[data-density=compact] .modal{padding:16px}[data-density=compact] .modal-header{padding:12px 16px;margin-bottom:12px}[data-density=compact] .modal-body{padding:12px 16px}[data-density=compact] .modal-footer{padding:12px 16px;gap:8px}[data-density=compact] .process-grid{gap:10px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}[data-density=compact] .process-section{gap:8px}[data-density=compact] .process-section+.process-section{margin-top:8px}[data-density=compact] .process-section__title{font-size:11px;padding:0 2px;gap:6px}[data-density=compact] .process-section__title:before{width:3px;height:14px}[data-density=compact] .process-card{padding:10px;gap:8px;border-radius:10px}[data-density=compact] .process-card__header{padding-right:14px;gap:6px}[data-density=compact] .process-card__name{font-size:14px}[data-density=compact] .process-card__summary{font-size:11px}[data-density=compact] .process-card__badges{gap:4px;margin-top:2px}[data-density=compact] .process-card__badge{padding:2px 6px;font-size:10px}[data-density=compact] .process-card__list{gap:8px;grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}[data-density=compact] .process-chip{gap:6px;padding:8px 10px;border-radius:8px}[data-density=compact] .process-chip__top{gap:6px}[data-density=compact] .process-chip__name{font-size:12px}[data-density=compact] .process-chip__detail{margin-top:4px;font-size:11px;line-height:1.3}[data-density=compact] .process-chip .btn{padding:3px 8px;font-size:11px}[data-density=compact] .status-indicator{width:10px;height:10px}[data-density=compact] .status-pill{padding:3px 8px;font-size:11px;gap:4px}[data-density=compact] .status-pill__dot{width:5px;height:5px;margin-right:4px}[data-density=compact] .config-card{border-radius:10px}[data-density=compact] .config-card summary{padding:8px 10px;font-size:13px}[data-density=compact] .config-card summary:before{margin-right:6px}[data-density=compact] .config-card>.card-body{gap:8px}[data-density=compact] .config-summary-card{gap:8px;min-height:120px}[data-density=compact] .config-summary-card p{font-size:12px;line-height:1.3}[data-density=compact] .config-layout{gap:10px}[data-density=compact] .config-actions{gap:6px}[data-density=compact] .config-grid{gap:12px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}[data-density=compact] .config-arr-groups{gap:16px}[data-density=compact] .config-arr-group{gap:8px}[data-density=compact] .config-arr-group__details{padding:10px 12px;border-radius:10px}[data-density=compact] .config-arr-group__details summary{gap:8px;font-size:13px}[data-density=compact] .config-arr-group__details[open] summary{margin-bottom:10px;padding-bottom:8px}[data-density=compact] .config-arr-group__count{padding:3px 8px;font-size:11px}[data-density=compact] .config-arr-group__title{font-size:12px}[data-density=compact] .config-arr-grid{gap:12px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-top:2px}[data-density=compact] .config-arr-grid .card-body{gap:8px}[data-density=compact] .config-arr-card{min-height:160px}[data-density=compact] .config-arr-summary{gap:6px}[data-density=compact] .config-arr-summary__item{gap:1px}[data-density=compact] .config-arr-summary__item dt{font-size:10px}[data-density=compact] .config-arr-summary__item dd{font-size:12px}[data-density=compact] .config-arr-actions{gap:6px}[data-density=compact] .config-footer{gap:8px}[data-density=compact] .config-section{padding:6px 10px;border-radius:8px}[data-density=compact] .config-section summary{font-size:13px}[data-density=compact] .config-section summary:before{margin-right:6px}[data-density=compact] .config-section__body{margin-top:8px}[data-density=compact] .field-description,[data-density=compact] .field-hint{font-size:11px;line-height:1.3;margin-top:2px}[data-density=compact] .field-description{margin-top:1px}[data-density=compact] .field-hint{margin-top:3px}[data-density=compact] .field-label{gap:4px;font-size:11px}[data-density=compact] .checkbox-field{gap:4px;font-size:12px}[data-density=compact] .checkbox-field label{gap:6px}[data-density=compact] .checkbox-field__content{gap:4px}[data-density=compact] .checkbox-field__text{gap:4px;line-height:1.3;font-size:12px}[data-density=compact] .secure-field,[data-density=compact] .secure-field__input-group{gap:6px}[data-density=compact] .secure-field__controls{gap:4px}[data-density=compact] .secure-field__controls .btn{padding:4px 8px}[data-density=compact] .help-icon{width:14px;height:14px;font-size:10px}[data-density=compact] .badge{padding:2px 6px;border-radius:5px;font-size:10px}[data-density=compact] .empty-state{padding:24px 20px;border-radius:12px;font-size:13px}[data-density=compact] .tracker-grid{gap:10px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}[data-density=compact] .tracker-card .card-header{gap:8px;font-size:13px}[data-density=compact] .tracker-card .card-body{padding-top:0}[data-density=compact] .keyboard-hint{gap:3px;padding:2px 5px;border-radius:3px;font-size:9px}[data-density=compact] .changelog-modal__body{gap:8px}[data-density=compact] .changelog-meta{gap:4px;font-size:12px}[data-density=compact] .changelog-body{padding:10px;max-height:280px;font-size:12px;line-height:1.4}[data-density=compact] .changelog-links,[data-density=compact] .changelog-buttons{gap:6px}[data-density=compact] details{margin:4px 0}[data-density=compact] details summary{padding:3px;border-radius:5px}[data-density=compact] .series-details,[data-density=compact] .season-details{border-radius:5px}[data-density=compact] .series-summary,[data-density=compact] .season-summary{padding:8px 12px;font-size:13px;border-radius:5px 5px 0 0}[data-density=compact] .series-title{font-size:1em}[data-density=compact] .series-instance{font-size:.85em}[data-density=compact] .season-title{font-size:.95em}[data-density=compact] .season-count{font-size:.85em}[data-density=compact] .series-content,[data-density=compact] .season-content{padding:6px}[data-density=compact] pre{padding:10px;max-height:320px;border-radius:10px;font-size:12px}[data-density=compact] .icon{width:1.2em;height:1.2em}[data-density=compact] .icon--small{width:1em;height:1em}[data-density=compact] .icon--large{width:1.4em;height:1.4em}[data-density=compact] svg[width],[data-density=compact] svg[height]{width:1.2em!important;height:1.2em!important}[data-density=compact] .spinner{width:12px;height:12px;border-width:2px}[data-density=compact] .loading{gap:6px;font-size:12px}[data-density=compact] .toasts{gap:8px;right:12px;bottom:12px}[data-density=compact] .toast{padding:8px 12px;border-radius:8px;min-width:220px;font-size:12px}[data-density=compact] .logs-container{height:calc(100vh - 110px)}[data-density=compact] .logs-toolbar{margin-bottom:8px;gap:8px}[data-density=compact] .logs-toolbar .field{margin-bottom:0}[data-density=compact] .logs-toolbar label{font-size:11px;margin-bottom:2px}[data-density=compact] .logs-toolbar .btn{padding:4px 10px;font-size:12px}[data-density=compact] .logs-content{padding:10px;border-radius:8px}[data-density=compact] .logs-content pre{font-size:11px;line-height:1.4}[data-density=compact] .badge{padding:2px 6px;font-size:10px}[data-density=comfortable] .responsive-table td,[data-density=comfortable] .responsive-table th{padding:12px 16px}.view-density-toggle{display:flex;gap:4px;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:4px}.view-density-toggle button{padding:6px 12px;border:none;background:transparent;color:var(--muted);border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease}.view-density-toggle button:hover{color:var(--on-surface);background:#7aa2f71a}.view-density-toggle button.active{background:var(--primary);color:#fff}[data-density=compact] .css-13cymwt-control,[data-density=compact] .css-t3ipsp-control,[data-density=compact] .css-15evc9m-control,[data-density=compact] .css-hlgwow,[data-density=compact] [class*=-control]{min-height:32px!important;height:32px!important;font-size:12px!important}[data-density=compact] .css-hlgwow,[data-density=compact] [class*=-ValueContainer]{padding:2px 8px!important;font-size:12px!important}[data-density=compact] .css-1dimb5e-singleValue,[data-density=compact] .css-1jxntwc-singleValue,[data-density=compact] [class*=-singleValue]{font-size:12px!important;line-height:1.4!important}[data-density=compact] .css-1u3zge7,[data-density=compact] [class*=-Input]{padding:0!important;margin:0!important}[data-density=compact] .css-1u3zge7 input,[data-density=compact] [class*=-Input] input{font-size:12px!important;padding:0!important;margin:0!important}[data-density=compact] .css-1nmdiq5-menu,[data-density=compact] [class*=-menu]{font-size:12px!important}[data-density=compact] .css-1n6sfyn-MenuList,[data-density=compact] [class*=-MenuList]{padding:4px!important}[data-density=compact] .css-10wo9uf-option,[data-density=compact] [class*=-option]{padding:6px 10px!important;font-size:12px!important}[data-density=compact] .css-1wy0on6,[data-density=compact] [class*=-indicatorsContainer]{padding:0 4px!important}[data-density=compact] .css-1u9des2-indicatorSeparator,[data-density=compact] [class*=-indicatorSeparator]{margin-top:6px!important;margin-bottom:6px!important}[data-density=compact] .css-1hwfws3,[data-density=compact] .css-1xc3v61-indicatorContainer,[data-density=compact] [class*=-indicatorContainer]{padding:4px!important}[data-density=compact] .css-1xc3v61-indicatorContainer svg,[data-density=compact] [class*=-indicatorContainer] svg{width:16px!important;height:16px!important}[data-density=compact] .appbar{padding:6px 12px!important}[data-density=compact] .appbar__inner{padding:0 6px!important;gap:8px!important}[data-density=compact] .appbar__title{gap:6px!important}[data-density=compact] .appbar__title h1{font-size:15px!important;margin:0!important}[data-density=compact] .appbar__version{font-size:9px!important;padding:2px 5px!important;letter-spacing:.3px!important}[data-density=compact] .appbar__status{font-size:10px!important}[data-density=compact] .appbar__update{padding:4px 8px!important;font-size:10px!important;gap:3px!important}[data-density=compact] .appbar__update-indicator{width:5px!important;height:5px!important}[data-density=compact] .appbar__actions{gap:6px!important}[data-density=compact] .appbar__actions button,[data-density=compact] .appbar__actions a.btn{padding:4px 8px!important;font-size:10px!important;gap:4px!important}[data-density=compact] .appbar__actions .icon{width:14px!important;height:14px!important}[data-density=compact] .appbar__actions .badge{padding:2px 6px!important;font-size:9px!important}[data-density=compact] .spinner{width:11px!important;height:11px!important;border-width:2px!important}[data-density=compact] .view-density-toggle{padding:2px!important;gap:2px!important;border-radius:6px!important}[data-density=compact] .view-density-toggle button{padding:4px 8px!important;font-size:10px!important;border-radius:4px!important}.version-comparison{display:flex;align-items:center;gap:12px;padding:12px;background:#7aa2f70d;border:1px solid rgba(122,162,247,.2);border-radius:8px;margin-bottom:12px}.version-item{display:flex;align-items:center;gap:6px}.version-arrow{color:var(--primary);font-size:18px;font-weight:700}.version-badge{padding:4px 10px;border-radius:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;font-weight:600}.version-current{background:#9aa3ac26;border:1px solid rgba(154,163,172,.3);color:var(--muted)}.version-latest{background:#7aa2f726;border:1px solid rgba(122,162,247,.3);color:var(--primary)}.update-status{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px}.update-status.text-info{background:#3b82f61a;border:1px solid rgba(59,130,246,.3);color:#3b82f6}.update-status.text-success{background:#22c55e1a;border:1px solid rgba(34,197,94,.3);color:#22c55e}.update-status.text-danger{background:#ef44441a;border:1px solid rgba(239,68,68,.3);color:#ef4444}.changelog-section{display:flex;flex-direction:column;gap:8px}.changelog-section h3{margin:0;font-size:14px;font-weight:600;color:var(--on-surface)}[data-theme=light] .version-comparison{background:#0071e30d;border-color:#0071e326}[data-theme=light] .version-latest{background:#0071e31a;border-color:#0071e340}[data-density=compact] .version-comparison{padding:8px;gap:8px;font-size:12px}[data-density=compact] .version-badge{padding:3px 8px;font-size:11px}[data-density=compact] .version-arrow{font-size:14px}[data-density=compact] .update-status{padding:8px 12px;font-size:12px}[data-density=compact] .changelog-section h3{font-size:13px}.react-lazylog-searchbar{background:var(--surface)!important;border-bottom:1px solid var(--border)!important;padding:8px 12px!important}[data-theme=dark] .react-lazylog-searchbar{background:#0f131a!important}.react-lazylog-searchbar-input{background:var(--bg)!important;color:var(--on-surface)!important;border:1px solid var(--border)!important;border-radius:6px!important;padding:6px 10px!important;font-size:13px!important}[data-theme=dark] .react-lazylog-searchbar-input{background:#12151a!important}.react-lazylog-searchbar-input:focus{outline:none!important;border-color:var(--primary)!important;box-shadow:0 0 0 2px #7aa2f71a!important}[data-theme=light] .react-lazylog-searchbar-input:focus{box-shadow:0 0 0 2px #0071e31a!important}.react-lazylog-searchbar-input::placeholder{color:var(--muted)!important}.react-lazylog-searchbar-matches{color:var(--muted)!important;font-size:12px!important}.react-lazylog-searchbar-filter,.react-lazylog-searchbar-up-arrow,.react-lazylog-searchbar-down-arrow{background:transparent!important;border:1px solid var(--border)!important;border-radius:6px!important;padding:6px!important;cursor:pointer!important;transition:all .15s ease!important}.react-lazylog-searchbar-filter:hover,.react-lazylog-searchbar-up-arrow:hover,.react-lazylog-searchbar-down-arrow:hover{background:#7aa2f71a!important;border-color:var(--primary)!important}[data-theme=light] .react-lazylog-searchbar-filter:hover,[data-theme=light] .react-lazylog-searchbar-up-arrow:hover,[data-theme=light] .react-lazylog-searchbar-down-arrow:hover{background:#0071e314!important}.react-lazylog-searchbar-filter svg,.react-lazylog-searchbar-up-arrow svg,.react-lazylog-searchbar-down-arrow svg{fill:var(--on-surface)!important;width:16px!important;height:16px!important}.react-lazylog-searchbar-filter.inactive,.react-lazylog-searchbar-up-arrow.inactive,.react-lazylog-searchbar-down-arrow.inactive{opacity:.5!important;cursor:not-allowed!important}.react-lazylog-searchbar-matches.inactive{opacity:.5!important}.test-connection-section{margin:16px 0;padding:16px;background:#ffffff05;border:1px solid var(--border-color);border-radius:4px}.field-group-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.field-hint{font-size:.85em;color:var(--text-secondary);font-style:italic}.alert{padding:12px 16px;border-radius:4px;margin-top:12px;line-height:1.5}.alert.success{background:#4caf501a;border:1px solid rgba(76,175,80,.3);color:#66bb6a}[data-theme=light] .alert.success{background:#4caf5014;border-color:#4caf5066;color:#388e3c}.alert.error{background:#f443361a;border:1px solid rgba(244,67,54,.3);color:#ef5350}[data-theme=light] .alert.error{background:#f4433614;border-color:#f4433666;color:#d32f2f}.alert.info{background:#2196f31a;border:1px solid rgba(33,150,243,.3);color:#42a5f5}[data-theme=light] .alert.info{background:#2196f314;border-color:#2196f366;color:#1976d2}.alert.warning{background:#ffc1071a;border:1px solid rgba(255,193,7,.3);color:#ffb74d}[data-theme=light] .alert.warning{background:#ffc10714;border-color:#ffc10766;color:#f57c00}.alert-details{font-size:.9em;margin-top:6px;opacity:.9}.alert strong{font-weight:600}
1
+ :root,[data-theme=dark]{--bg: #101114;--surface: #1b1e22;--on-surface: #eaeef2;--muted: #9aa3ac;--primary: #7aa2f7;--primary-variant: #3b82f6;--success: #22c55e;--danger: #ef4444;--warning: #facc15;--border: #2a2f36;--elev: 8px;--layout-max-width: 1200px}[data-theme=light]{--bg: #f5f5f7;--surface: #ffffff;--on-surface: #1d1d1f;--muted: #6e6e73;--primary: #0071e3;--primary-variant: #0077ed;--success: #34c759;--danger: #ff3b30;--warning: #ff9500;--border: #d2d2d7;--elev: 4px;--layout-max-width: 1200px}*{box-sizing:border-box}html{scroll-behavior:smooth}html,body{height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;margin:0;background:var(--bg);color:var(--on-surface);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-feature-settings:"kern" 1;font-kerning:normal}*::-webkit-scrollbar{width:12px;height:12px}*::-webkit-scrollbar-track{background:#0003;border-radius:6px}*::-webkit-scrollbar-thumb{background:#7aa2f74d;border-radius:6px;border:2px solid transparent;background-clip:padding-box}*::-webkit-scrollbar-thumb:hover{background:#7aa2f780;background-clip:padding-box}.appbar{position:sticky;top:0;z-index:100;display:flex;justify-content:center;padding:16px 20px;background:var(--surface);border-bottom:1px solid var(--border);box-shadow:0 2px 16px #0000000f;backdrop-filter:blur(12px) saturate(180%);-webkit-backdrop-filter:blur(12px) saturate(180%)}[data-theme=light] .appbar{background:#fffc}[data-theme=dark] .appbar{background:linear-gradient(180deg,#0b0c0ff2,#0d0e11f2);box-shadow:0 4px 16px #0006}.appbar__inner{width:100%;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 16px;flex-wrap:wrap}.appbar__title{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.appbar h1{margin:0;font-size:20px;font-weight:700;letter-spacing:-.02em;background:linear-gradient(135deg,var(--on-surface) 0%,var(--primary) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.appbar__logo{width:42px;height:42px;object-fit:contain;image-rendering:auto;flex-shrink:0;user-select:none;-webkit-user-select:none;-moz-user-select:none;pointer-events:none}[data-theme=light] .appbar h1{background:linear-gradient(135deg,var(--on-surface) 0%,var(--primary) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.appbar__version{font-size:12px;color:var(--muted);letter-spacing:.4px}.appbar__status{font-size:12px}.appbar__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.appbar__update{display:inline-flex;align-items:center;gap:6px}.appbar__update-indicator{width:8px;height:8px;border-radius:50%;background:var(--danger);display:inline-block;animation:pulse 1s ease-in-out infinite;box-shadow:0 0 8px #ef444499}.container{padding:20px;display:grid;grid-template-columns:1fr;gap:20px;animation:fadeInUp .3s ease}.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;color:var(--muted)}.nav{display:flex;gap:8px;flex-wrap:wrap;width:100%}.nav button{color:var(--muted);background:transparent;border:1px solid var(--border);padding:10px 14px;display:inline-flex;align-items:center;gap:8px;border-radius:8px;cursor:pointer;font-weight:500;transition:all .15s ease;position:relative;overflow:hidden}.nav button:before{content:"";position:absolute;inset:0;background:linear-gradient(135deg,rgba(122,162,247,.1),transparent);opacity:0;transition:opacity .15s ease}.nav button .icon{width:1.4em;height:1.4em;transition:transform .15s ease}.nav button:hover .icon{transform:scale(1.1)}.nav button.active{color:var(--primary);border-color:var(--primary);background:#7aa2f71f;box-shadow:0 0 0 2px #7aa2f71a,0 2px 8px #7aa2f733;font-weight:600}[data-theme=light] .nav button.active{box-shadow:0 0 0 2px #0071e31a,0 2px 8px #0071e333}.nav button:hover:not(.active){color:var(--on-surface);border-color:#7aa2f766;background:#7aa2f70f;transform:translateY(-1px)}.nav button:hover:before{opacity:1}.card{background:var(--surface);border:1px solid var(--border);border-radius:14px;box-shadow:0 2px 8px #00000014,0 1px 2px #0000000f;overflow:hidden;transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease;position:relative}[data-theme=dark] .card{box-shadow:0 var(--elev) 24px #00000040,0 2px 4px #0000004d}.card:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(122,162,247,.1),transparent);opacity:0;transition:opacity .15s ease}.card:hover{transform:translateY(-2px);box-shadow:0 16px 40px #0000001f,0 4px 8px #00000014;border-color:#7aa2f74d}[data-theme=dark] .card:hover{box-shadow:0 12px 32px #00000059,0 4px 8px #0006}.card:hover:before{opacity:1}.card .card-header{padding:16px 20px;border-bottom:1px solid var(--border);font-weight:700;font-size:15px;letter-spacing:.01em;color:var(--on-surface);background:linear-gradient(180deg,#7aa2f70a,#7aa2f703);position:relative}[data-theme=light] .card .card-header{background:linear-gradient(180deg,rgba(0,113,227,.03) 0%,transparent 100%)}.card .card-header:after{content:"";position:absolute;bottom:0;left:20px;right:20px;height:1px;background:linear-gradient(90deg,transparent,var(--primary),transparent);opacity:.15}.card .card-body{padding:12px 14px}.btn{appearance:none;border:1px solid var(--border);background:var(--surface);color:var(--on-surface);padding:8px 14px;border-radius:8px;cursor:pointer;transition:all .15s ease;display:inline-flex;align-items:center;gap:6px;font-weight:500;position:relative;overflow:hidden}[data-theme=dark] .btn{background:#0f131a}.btn:before{content:"";position:absolute;inset:0;background:linear-gradient(135deg,#ffffff1a,#fff0);opacity:0;transition:opacity .15s ease}.btn:hover:not(:disabled):before{opacity:1}.btn.primary{border-color:var(--primary-variant);background:linear-gradient(135deg,#7aa2f72e,#7aa2f71f);color:var(--primary);font-weight:600;box-shadow:0 2px 8px #7aa2f726}[data-theme=light] .btn.primary{background:linear-gradient(135deg,#0071e31f,#0071e314);box-shadow:0 2px 8px #0071e326}.btn.danger{border-color:#ef444466;color:var(--danger);background:#ef44441f}.btn.danger:hover:not(:disabled){background:var(--danger);color:#0a0a0a;border-color:var(--danger);box-shadow:0 4px 12px #ef44444d}.btn.primary:hover:not(:disabled){background:var(--primary);color:#0a0a0a;border-color:var(--primary);box-shadow:0 4px 12px #7aa2f74d}.btn.ghost{background:transparent}.btn.ghost:hover:not(:disabled){background:#ffffff0d;border-color:#7aa2f74d}.btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 3px 10px #0006}.btn:active:not(:disabled){transform:translateY(0)}.btn:focus-visible{outline:none;box-shadow:0 0 0 3px #7aa2f74d}[data-theme=light] .btn:focus-visible{box-shadow:0 0 0 3px #0071e34d}.nav button:focus-visible{outline:none;box-shadow:0 0 0 3px #7aa2f740}[data-theme=light] .nav button:focus-visible{box-shadow:0 0 0 3px #0071e340}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.small{padding:6px 10px;font-size:12px}.btn.outline{background:transparent;border-color:var(--border)}.btn.outline:hover:not(:disabled){background:#ffffff0d;border-color:var(--primary-variant)}.btn.active{background:var(--primary);color:#0a0a0a;border-color:var(--primary)}.field{display:flex;flex-direction:column;gap:6px}.field--full-width{grid-column:1 / -1}.sonarr-hierarchical-view{display:flex;flex-direction:column;gap:8px}.series-details,.season-details{border:1px solid var(--border);border-radius:6px;background:var(--card-bg)}.series-summary,.season-summary{padding:12px 16px;cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:600;color:var(--text);background:var(--card-header-bg);border-radius:6px 6px 0 0;display:flex;align-items:center;justify-content:space-between;gap:8px}.series-summary:hover,.season-summary:hover{background:var(--hover-bg)}.series-title{font-size:1.1em;flex:1}.series-instance,.series-count,.series-quality,.artist-quality{font-size:.9em;color:var(--muted);font-weight:400;white-space:nowrap}.season-title{font-size:1em}.season-count{font-size:.9em;color:var(--muted);font-weight:400}.series-content,.season-content{padding:8px}.episodes-table-wrapper{overflow-x:auto}.episodes-table{width:100%;border-collapse:collapse;font-size:.9em}.episodes-table th,.episodes-table td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}.episodes-table th{background:var(--table-header-bg);font-weight:600;color:var(--text);position:sticky;top:0}.episodes-table tr:hover{background:var(--hover-bg)}.lidarr-hierarchical-view{display:flex;flex-direction:column;gap:8px}.artist-details{border:1px solid var(--border);border-radius:6px;background:var(--card-bg)}.artist-summary{padding:12px 16px;cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:600;color:var(--text);background:var(--card-header-bg);border-radius:6px 6px 0 0;display:flex;align-items:center;justify-content:space-between;gap:8px}.artist-summary:hover{background:var(--hover-bg)}.artist-title{font-size:1.1em;flex:1}.artist-instance,.artist-count{font-size:.9em;color:var(--muted);font-weight:400}.artist-content{padding:8px}.albums-table-wrapper{overflow-x:auto}.albums-table{width:100%;border-collapse:collapse;font-size:.9em}.albums-table th,.albums-table td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}.albums-table th{background:var(--table-header-bg);font-weight:600;color:var(--text);position:sticky;top:0}.albums-table tr:hover{background:var(--hover-bg)}.album-details{border:1px solid var(--border);border-radius:4px;background:var(--surface);margin-bottom:8px}.album-summary{padding:10px 14px;cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:500;color:var(--text);background:var(--card-header-bg);border-radius:4px 4px 0 0;display:flex;align-items:center;gap:12px}.album-summary:hover{background:var(--hover-bg)}.album-title{font-size:1em;flex:1}.album-date,.album-track-count{font-size:.85em;color:var(--muted);font-weight:400}.album-status{font-size:1.1em;font-weight:700}.album-status.has-file{color:var(--success)}.album-status.missing{color:var(--danger)}.album-content{padding:8px}.album-info{padding:8px 12px;font-size:.9em}.album-info p{margin:4px 0}.tracks-table-wrapper{overflow-x:auto}.tracks-table{width:100%;border-collapse:collapse;font-size:.85em;table-layout:fixed}.tracks-table th,.tracks-table td{padding:6px 10px;text-align:left;border-bottom:1px solid var(--border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tracks-table th:nth-child(1),.tracks-table td:nth-child(1){width:70px}.tracks-table th:nth-child(2),.tracks-table td:nth-child(2){width:auto;white-space:normal}.tracks-table th:nth-child(3),.tracks-table td:nth-child(3){width:100px}.tracks-table th:nth-child(4),.tracks-table td:nth-child(4){width:110px;text-align:center}.tracks-table th:nth-child(5),.tracks-table td:nth-child(5){width:180px}.tracks-table th{background:var(--table-header-bg);font-weight:600;color:var(--text);font-size:.9em}.tracks-table tr.track-available{opacity:1}.tracks-table tr.track-missing{opacity:.6}.tracks-table tr:hover{background:var(--hover-bg)}.track-status{display:inline-block;font-weight:700;font-size:1.1em}.track-status.available{color:var(--success)}.track-status.missing{color:var(--danger)}.table-badge{display:inline-block;padding:3px 8px;border-radius:6px;font-size:.8em;font-weight:600;border:1px solid transparent;transition:all .15s ease}.table-badge:hover{transform:scale(1.05)}.table-badge.monitored{background:#22c55e26;border-color:#22c55e4d;color:var(--success)}.table-badge.unmonitored{background:#facc1526;border-color:#facc154d;color:var(--warning)}.table-badge.has-file{background:#22c55e26;border-color:#22c55e4d;color:var(--success)}.table-badge.missing{background:#ef444426;border-color:#ef44444d;color:var(--danger)}.table-badge-reason{background:#facc1526;border-color:#facc154d;color:var(--warning);font-family:monospace;font-size:11px;font-weight:600}[data-theme=light] .table-badge-reason{background:#ff95001a;border-color:#ff95004d}.field label{color:var(--muted);font-size:12px}.field input,.field select,.field textarea{background:var(--surface);color:var(--on-surface);border:1px solid var(--border);border-radius:8px;padding:9px 12px;transition:all .15s ease}[data-theme=dark] .field input,[data-theme=dark] .field select,[data-theme=dark] .field textarea{background:#0f131a}.field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 4px #7aa2f71f,0 2px 8px #7aa2f726;background:var(--bg);transform:translateY(-1px)}[data-theme=light] .field input:focus,[data-theme=light] .field select:focus,[data-theme=light] .field textarea:focus{box-shadow:0 0 0 4px #0071e31a,0 2px 8px #0071e326}[data-theme=dark] .field input:focus,[data-theme=dark] .field select:focus,[data-theme=dark] .field textarea:focus{background:#12151a;box-shadow:0 0 0 4px #7aa2f71f,0 2px 8px #7aa2f733}.field input:hover:not(:focus),.field select:hover:not(:focus),.field textarea:hover:not(:focus){border-color:#7aa2f74d}.field input[type=checkbox]{width:auto}.field.mobile-instance-select{display:none}.field-description,.field-hint{display:block;margin:0;font-size:12px;line-height:1.35;color:var(--muted)}.field-description{margin-top:2px}.field-hint{color:var(--primary);font-weight:500;margin-top:4px}.row{display:flex;flex-wrap:wrap;gap:12px}.row .col{flex:1 1 260px}table{border-collapse:collapse;width:100%;border:1px solid var(--border);border-radius:12px;overflow:hidden;box-shadow:0 2px 8px #0000000a}[data-theme=dark] table{box-shadow:0 2px 8px #0003}th,td{border-bottom:1px solid var(--border);padding:10px 12px;font-size:13px;text-align:left}th{background:var(--surface);color:var(--muted);font-weight:600;text-transform:uppercase;font-size:11px;letter-spacing:.05em;border-bottom:2px solid var(--border)}[data-theme=dark] th{background:#12151a}tbody tr{transition:background-color .1s ease,transform .08s ease;border-left:3px solid transparent}tbody tr:hover{background:#7aa2f70d;cursor:default;border-left-color:var(--primary)}[data-theme=light] tbody tr:hover{background:#0071e30a}[data-theme=dark] tbody tr:hover{background:#7aa2f70f}th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sort-arrow{font-size:10px;margin-left:4px;color:var(--muted)}details{margin:6px 0}details summary{cursor:pointer;transition:all .15s ease;padding:4px;border-radius:6px}details summary:hover{background:#7aa2f70d;color:var(--primary)}.ok{color:var(--success)}.bad{color:var(--danger)}.hint{color:var(--muted);font-size:12px}.spacer{flex:1}pre{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:14px;color:var(--on-surface);max-height:420px;overflow:auto;transition:border-color .15s ease}[data-theme=dark] pre{background:#0f131a}pre:hover{border-color:#7aa2f74d}pre::-webkit-scrollbar{width:10px;height:10px}pre::-webkit-scrollbar-track{background:#0003;border-radius:6px}pre::-webkit-scrollbar-thumb{background:#7aa2f74d;border-radius:6px}pre::-webkit-scrollbar-thumb:hover{background:#7aa2f780}.loading{color:var(--muted);display:inline-flex;align-items:center;gap:8px;font-weight:500;animation:pulse 1.5s ease-in-out infinite}.spinner{width:14px;height:14px;border:2.5px solid rgba(122,162,247,.15);border-top-color:var(--primary);border-radius:50%;display:inline-block;animation:spin .6s linear infinite;box-shadow:0 0 8px #7aa2f733}[data-theme=light] .spinner{border:2.5px solid rgba(0,113,227,.15);border-top-color:var(--primary);box-shadow:0 0 8px #0071e333}@keyframes spin{to{transform:rotate(360deg)}}.toasts{position:fixed;right:16px;bottom:16px;display:grid;gap:10px;z-index:9999}.toast{background:var(--surface);color:var(--on-surface);border:1px solid var(--border);border-left:4px solid var(--primary);padding:12px 16px;border-radius:10px;box-shadow:0 12px 32px #0003;min-width:260px;transition:all .2s ease;animation:slideIn .2s ease}[data-theme=dark] .toast{background:#12151a;border:1px solid rgba(255,255,255,.1);box-shadow:0 12px 32px #00000080}.toast:hover{transform:translate(-4px)}[data-theme=dark] .toast:hover{box-shadow:0 16px 40px #0009}[data-theme=light] .toast:hover{box-shadow:0 16px 40px #00000040}.toast.success{border-left-color:var(--success)}.toast.warning{border-left-color:var(--warning)}.toast.error{border-left-color:var(--danger)}[data-theme=dark] .toast.success{background:linear-gradient(90deg,#22c55e14,#12151a 20%)}[data-theme=dark] .toast.warning{background:linear-gradient(90deg,#facc1514,#12151a 20%)}[data-theme=dark] .toast.error{background:linear-gradient(90deg,#ef444414,#12151a 20%)}[data-theme=light] .toast.success{background:linear-gradient(90deg,rgba(52,199,89,.08) 0%,var(--surface) 20%)}[data-theme=light] .toast.warning{background:linear-gradient(90deg,rgba(255,149,0,.08) 0%,var(--surface) 20%)}[data-theme=light] .toast.error{background:linear-gradient(90deg,rgba(255,59,48,.08) 0%,var(--surface) 20%)}.status-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:500;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);transition:all .15s ease}.status-pill:hover{background:#ffffff14;border-color:#ffffff26;transform:scale(1.02)}.stack{display:grid;gap:12px}.tabs{display:flex;gap:8px;flex-wrap:wrap}.tab-panel{margin-top:12px}.sidebar{display:grid;gap:8px;min-width:220px;align-content:start;align-items:start}.sidebar .btn{width:100%;text-align:left}.split{display:flex;gap:16px}.split .pane{flex:1}.split .pane.sidebar{flex:0 0 260px}.pagination{display:flex;justify-content:space-between;align-items:center;margin-top:16px;padding:12px 0;gap:12px;flex-wrap:wrap}.pagination-info{font-size:14px;color:var(--muted)}.pagination .inline{display:flex;gap:4px;align-items:center}.pagination .btn{min-width:70px;padding:8px 12px}.pagination-jump{width:80px;padding:8px 12px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--on-surface);font-size:14px;text-align:center;transition:all .2s ease}.pagination-jump:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px #7aa2f71a}.pagination-jump:disabled{opacity:.5;cursor:not-allowed}.pagination-jump::-webkit-inner-spin-button,.pagination-jump::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.pagination-jump[type=number]{-moz-appearance:textfield}.badge{display:inline-block;padding:3px 8px;border-radius:6px;font-size:11px;font-weight:600;background:#7aa2f726;border:1px solid rgba(122,162,247,.25);color:var(--primary);transition:all .15s ease}.badge:hover{background:#7aa2f740;border-color:#7aa2f766;transform:scale(1.05)}.icon{display:inline-block;width:1.4em;height:1.4em;vertical-align:middle;object-fit:contain}.icon--small{width:1.2em;height:1.2em}.icon--large{width:1.6em;height:1.6em}svg{max-width:2em;max-height:2em}svg[width],svg[height]{width:1.4em!important;height:1.4em!important}.btn .icon{margin:0;transition:transform .2s ease}.icon-rotate{transform:scaleX(-1);transform-origin:center}.btn:hover .icon{transform:translateY(-1px)}.responsive-table{width:100%;border-collapse:collapse;transition:box-shadow .2s ease}.responsive-table tbody tr{animation:fadeInUp .2s ease}.responsive-table tbody tr:nth-child(2n){background:#ffffff05}.responsive-table td,.responsive-table th{padding:8px 12px;text-align:left}.table-wrapper{overflow-x:auto;border-radius:12px}.table-wrapper::-webkit-scrollbar{height:8px}.table-wrapper::-webkit-scrollbar-thumb{background:#ffffff1f;border-radius:999px}.animate-fade-in{animation:fadeInUp .2s ease}.table-badge{display:inline-flex;align-items:center;gap:4px}.inline{display:inline-flex;align-items:center;gap:6px}.text-info{color:var(--primary)}.text-success{color:var(--success)}.text-danger{color:var(--danger)}@keyframes fadeInUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes slideIn{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.7}}@keyframes glow{0%,to{box-shadow:0 0 8px #7aa2f74d}50%{box-shadow:0 0 16px #7aa2f780}}@media(max-width:900px){.split{flex-direction:column}.split .pane.sidebar{display:none}.field.mobile-instance-select{display:grid;margin-bottom:12px}}@media(max-width:640px){.appbar{padding:12px 16px}.appbar__inner{flex-direction:column;align-items:stretch;gap:12px;padding:0}.appbar__actions{width:100%;justify-content:flex-start}.appbar__title{gap:8px;justify-content:center}.appbar__logo{width:32px;height:32px}.nav{gap:6px}.nav button{flex:1 1 calc(50% - 6px);justify-content:center}}@media(max-width:420px){.appbar{padding:10px 12px}.appbar__logo{width:28px;height:28px}.appbar h1{font-size:18px}.appbar__version{font-size:10px}.nav button{flex-basis:100%}}@media(-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.appbar__logo{image-rendering:auto}}@media(max-width:720px){.responsive-table thead{display:none}.responsive-table,.responsive-table tbody,.responsive-table tr,.responsive-table td{display:block;width:100%}.responsive-table tbody tr{background:#12151ab3;border:1px solid rgba(255,255,255,.06);border-radius:8px;padding:8px;margin-bottom:8px;box-shadow:0 4px 12px #0003;user-select:none;-webkit-user-select:none;-moz-user-select:none}.responsive-table td{padding:4px 0;display:flex;justify-content:space-between;align-items:center;gap:8px;border:none;font-size:14px;line-height:1.4}.responsive-table td:before{content:attr(data-label);font-weight:600;font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;min-width:80px}.table-wrapper{overflow:visible}.episodes-table thead{display:none}.episodes-table,.episodes-table tbody,.episodes-table tr,.episodes-table td{display:block;width:100%}.episodes-table tbody tr{background:#12151ab3;border:1px solid rgba(255,255,255,.06);border-radius:8px;padding:8px;margin-bottom:8px;box-shadow:0 4px 12px #0003}.episodes-table td{padding:4px 0;display:flex;justify-content:space-between;align-items:center;gap:8px;border:none;font-size:14px;line-height:1.4}.episodes-table td:before{content:attr(data-label);font-weight:600;font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;min-width:80px}.episodes-table-wrapper{overflow:visible}.tracks-table thead{display:none}.tracks-table,.tracks-table tbody,.tracks-table tr,.tracks-table td{display:block;width:100%}.tracks-table tbody tr{background:#12151ab3;border:1px solid rgba(255,255,255,.06);border-radius:8px;padding:8px;margin-bottom:8px;box-shadow:0 4px 12px #0003}.tracks-table td{padding:4px 0;display:flex;justify-content:space-between;align-items:center;gap:8px;border:none;font-size:14px;line-height:1.4}.tracks-table td:before{content:attr(data-label);font-weight:600;font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;min-width:80px}.tracks-table-wrapper{overflow:visible}}.process-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.process-section{display:grid;gap:12px}.process-section+.process-section{margin-top:12px}.process-section__title{font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--primary);padding:0 4px;display:inline-flex;align-items:center;gap:10px}.process-section__title:before{content:"";width:4px;height:18px;background:linear-gradient(180deg,var(--primary),var(--primary-variant));border-radius:3px;box-shadow:0 0 8px #7aa2f74d}.process-card{border:1px solid var(--border);border-radius:14px;background:var(--surface);padding:18px;display:flex;flex-direction:column;gap:14px;transition:all .15s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden;box-shadow:0 2px 8px #0000000f}[data-theme=dark] .process-card{background:#ffffff08;box-shadow:0 2px 8px #0003}.process-card:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--primary),var(--primary-variant));opacity:0;transition:opacity .15s ease}.process-card:after{content:"";position:absolute;inset:0;background:radial-gradient(circle at top right,rgba(122,162,247,.05),transparent 60%);opacity:0;transition:opacity .15s ease;pointer-events:none}.process-card:hover{border-color:#7aa2f766;transform:translateY(-3px);box-shadow:0 12px 32px #0000001f}[data-theme=dark] .process-card:hover{box-shadow:0 8px 24px #00000059}.process-card:hover:before,.process-card:hover:after{opacity:1}.process-card__header{position:relative;display:flex;justify-content:space-between;align-items:flex-start;gap:8px;flex-wrap:wrap;padding-right:18px}.process-card__name{font-weight:700;font-size:17px;letter-spacing:-.01em;line-height:1.3}.process-card__title{display:grid;gap:4px;min-width:0}.process-card__summary{font-size:12px;color:var(--muted)}.process-card__badges{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.process-card__badge{padding:3px 10px;border-radius:999px;font-size:11px;font-weight:600;background:#7aa2f726;border:1px solid rgba(122,162,247,.3);color:var(--primary);transition:all .15s ease}.process-card__badge:hover{background:#7aa2f740;border-color:#7aa2f780;transform:scale(1.05)}.status-indicator{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:#99a2ad99;box-shadow:0 0 6px #00000059;transition:all .2s ease}.status-indicator--ok{background:var(--success);box-shadow:0 0 12px #22c55e80;animation:pulse 1.5s ease-in-out infinite}.status-indicator--bad{background:var(--danger);box-shadow:0 0 12px #ef444480;animation:pulse 1s ease-in-out infinite}.process-card__footer{display:flex;justify-content:flex-end;margin-top:auto}.process-card__list{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.process-chip{display:grid;gap:10px;border:1px solid var(--border);border-radius:10px;padding:12px 14px;background:var(--bg);transition:all .15s ease}[data-theme=dark] .process-chip{border:1px solid rgba(255,255,255,.08);background:#0f131a99}.process-chip:hover{border-color:#7aa2f74d;transform:translate(2px)}[data-theme=dark] .process-chip:hover{background:#0f131acc;border-color:#7aa2f733}[data-theme=light] .process-chip:hover{background:#00000005}.process-chip__top{display:flex;justify-content:space-between;align-items:center;gap:10px}.process-chip__name{font-weight:600;font-size:14px}.process-chip__actions{display:flex;justify-content:flex-end}.process-chip .btn{padding:6px 10px}.process-chip__detail{margin-top:6px;font-size:12px;color:var(--muted);line-height:1.35}.process-chip__detail-time{font-style:italic;color:var(--muted)}.status-pill__dot{width:6px;height:6px;border-radius:50%;background:currentColor;display:inline-block;margin-right:6px}.status-pill--ok{border-color:#22c55e66;background:linear-gradient(135deg,#22c55e26,#22c55e14);color:var(--success);box-shadow:0 2px 8px #22c55e26}.status-pill--bad{border-color:#ef444466;background:linear-gradient(135deg,#ef444426,#ef444414);color:var(--danger);box-shadow:0 2px 8px #ef444426}[data-theme=light] .status-pill--ok{background:linear-gradient(135deg,#34c7591f,#34c7590f)}[data-theme=light] .status-pill--bad{background:linear-gradient(135deg,#ff3b301f,#ff3b300f)}.empty-state{border:2px dashed rgba(122,162,247,.25);border-radius:16px;padding:40px 32px;text-align:center;color:var(--muted);background:linear-gradient(135deg,#7aa2f708,#7aa2f703);transition:all .2s ease;position:relative;overflow:hidden}.empty-state:before{content:"";position:absolute;top:50%;left:50%;width:100px;height:100px;background:radial-gradient(circle,rgba(122,162,247,.08),transparent);transform:translate(-50%,-50%);border-radius:50%;opacity:0;transition:opacity .2s ease}.empty-state:hover{border-color:#7aa2f766;background:linear-gradient(135deg,#7aa2f70d,#7aa2f705)}.empty-state:hover:before{opacity:1}[data-theme=light] .empty-state{border-color:#0071e340;background:linear-gradient(135deg,rgba(0,113,227,.02) 0%,transparent 100%)}[data-theme=light] .empty-state:before{background:radial-gradient(circle,rgba(0,113,227,.06),transparent)}[data-theme=light] .empty-state:hover{border-color:#0071e366;background:linear-gradient(135deg,#0071e30a,#0071e303)}.config-card{border:1px solid var(--border);border-radius:12px;background:var(--surface)}.config-card summary{cursor:pointer;font-weight:600;color:var(--muted);list-style:none;outline:none;padding:12px 14px;border-bottom:1px solid var(--border)}.config-card summary::-webkit-details-marker{display:none}.config-card summary:before{content:">";display:inline-block;margin-right:8px;transition:transform .2s ease}.config-card[open] summary:before{transform:rotate(0)}.config-card:not([open]) summary:before{transform:rotate(-90deg)}.config-card>.card-body{display:grid;gap:12px}.config-summary-card{display:flex;flex-direction:column;gap:12px;min-height:160px;transition:transform .2s ease,box-shadow .2s ease}.config-summary-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000004d}.config-summary-card p{margin:0;color:var(--muted);line-height:1.4}.config-layout{display:grid;gap:16px}.config-actions{display:flex;flex-wrap:wrap;gap:8px}.config-grid{display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}.config-arr-groups{display:flex;flex-direction:column;gap:24px}.config-arr-group{display:flex;flex-direction:column;gap:12px}.config-arr-group__details{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:16px 18px;background:#ffffff08;box-shadow:0 2px 8px #0003}.config-arr-group__details summary{display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer;font-weight:600;font-size:15px;color:var(--on-surface);list-style:none;transition:color .2s ease}.config-arr-group__details summary:hover{color:var(--primary)}.config-arr-group__details summary::-webkit-details-marker{display:none}.config-arr-group__details[open] summary{margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid rgba(255,255,255,.06)}.config-arr-group__count{display:inline-flex;align-items:center;justify-content:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;background:#7aa2f726;border:1px solid rgba(122,162,247,.3);color:var(--primary)}.config-arr-group__title{margin:0;font-size:14px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.config-arr-grid{display:grid;gap:18px;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));margin-top:4px}.config-arr-grid .card-body{display:flex;flex-direction:column;gap:12px}.config-arr-card{min-height:220px;transition:transform .2s ease,box-shadow .2s ease}.config-arr-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0000004d}.config-arr-summary{display:grid;gap:8px;margin:0}.config-arr-summary__item{display:grid;gap:2px}.config-arr-summary__item dt{margin:0;font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}.config-arr-summary__item dd{margin:0;color:var(--on-surface);font-weight:500;font-size:13px}.config-arr-summary__uri{word-break:break-all}.config-arr-actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.config-footer{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.field-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.modal .field-grid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}@media(max-width:720px){.modal .field-grid{grid-template-columns:minmax(0,1fr)}}.field-label{display:flex;align-items:center;gap:6px;font-weight:600;color:var(--muted)}.checkbox-field{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}.checkbox-field label{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-weight:600;color:var(--on-surface)}.checkbox-field input{margin:0;flex-shrink:0;cursor:pointer}.checkbox-field__content{display:flex;flex-direction:column;gap:6px;max-width:100%}.checkbox-field__text{display:inline-flex;align-items:center;gap:6px;font-weight:600;color:var(--muted);line-height:1.4}.secure-field{gap:8px}.secure-field__input-group{display:flex;align-items:center;gap:8px}.secure-field__input-group input{flex:1}.secure-field__controls{display:flex;gap:6px}.secure-field__controls .btn{padding:6px 10px}.help-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:11px;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:#ffffff14;color:var(--muted);cursor:help;transition:border-color .2s ease,color .2s ease}.help-icon:hover{border-color:var(--primary);color:var(--on-surface)}.config-section{border:1px solid rgba(255,255,255,.05);border-radius:10px;padding:8px 12px;background:#ffffff05}.config-section summary{cursor:pointer;font-weight:600;color:var(--muted);list-style:none;outline:none}.config-section summary::-webkit-details-marker{display:none}.config-section summary:before{content:">";display:inline-block;margin-right:8px;transition:transform .2s ease}.config-section[open] summary:before{transform:rotate(0)}.config-section:not([open]) summary:before{transform:rotate(-90deg)}.config-section__body{margin-top:12px}.modal-backdrop{position:fixed;inset:0;background:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:flex-start;justify-content:center;padding:24px;overflow-y:auto;overflow-x:hidden;z-index:120;animation:fadeIn .2s ease}[data-theme=dark] .modal-backdrop{background:#000000bf}[data-theme=light] .modal-backdrop{background:#0000004d}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.modal{background:var(--surface);border:1px solid var(--border);border-radius:20px;width:min(840px,calc(100% - 48px));max-height:min(92vh,calc(100vh - 80px));display:flex;flex-direction:column;margin:40px auto;box-shadow:0 24px 64px #0003,0 8px 16px #0000001a;animation:modalSlideIn .2s cubic-bezier(.4,0,.2,1);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}[data-theme=dark] .modal{background:#1b1e22f2;border:1px solid rgba(255,255,255,.1);box-shadow:0 20px 60px #0009,0 0 0 1px #ffffff0d}[data-theme=light] .modal{background:#fffffff2}@keyframes modalSlideIn{0%{opacity:0;transform:translateY(-20px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}.modal-header{padding:20px 24px;border-bottom:1px solid rgba(255,255,255,.08);display:flex;justify-content:space-between;align-items:center;gap:12px;background:#ffffff05;border-radius:16px 16px 0 0}.modal-header h2{margin:0;font-size:20px;font-weight:600;color:var(--on-surface);letter-spacing:-.01em}.modal-body{padding:24px;overflow-y:auto;overflow-x:hidden;display:grid;gap:20px}.modal-footer{padding:16px 24px 20px;border-top:1px solid rgba(255,255,255,.08);display:flex;justify-content:flex-end;gap:12px;background:#ffffff03;border-radius:0 0 16px 16px}.changelog-modal__body{gap:12px}.changelog-meta{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}.changelog-meta strong{color:var(--on-surface)}.changelog-body{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:14px;max-height:360px;overflow-y:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:13px;line-height:1.5;white-space:pre-wrap;transition:border-color .15s ease}[data-theme=dark] .changelog-body{background:#0f131a}.changelog-body:hover{border-color:#7aa2f74d}.changelog-body::-webkit-scrollbar{width:10px}.changelog-body::-webkit-scrollbar-track{background:#0003;border-radius:6px}.changelog-body::-webkit-scrollbar-thumb{background:#7aa2f74d;border-radius:6px}.changelog-body::-webkit-scrollbar-thumb:hover{background:#7aa2f780}.changelog-links{margin-right:auto;display:flex;align-items:center;gap:8px}.changelog-buttons{display:flex;align-items:center;gap:8px}.tracker-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}.tracker-card.card{background:#ffffff08;border-color:#ffffff14}.profile-mappings-grid{display:flex;flex-direction:column;gap:12px}.profile-mapping-row{display:grid;grid-template-columns:1fr 1fr auto;gap:12px;align-items:end}.profile-mapping-row .field{margin:0}.profile-mapping-row .btn.icon-only{height:38px;width:38px;padding:0;display:flex;align-items:center;justify-content:center}.tracker-card .card-header{display:flex;justify-content:space-between;align-items:center;gap:12px;font-weight:600;color:var(--on-surface)}.tracker-card .card-body{padding-top:0}.tracker-card .field-grid{grid-template-columns:minmax(0,1fr)}.keyboard-hint{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;border-radius:4px;font-size:10px;font-weight:600;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);color:var(--muted);font-family:monospace}.skeleton{background:linear-gradient(90deg,var(--surface) 0%,rgba(122,162,247,.1) 50%,var(--surface) 100%);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-table{display:flex;flex-direction:column;gap:8px;padding:16px}.skeleton-table-header{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:12px;margin-bottom:8px}.skeleton-header{height:24px}.skeleton-table-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:12px;padding:12px 0;border-bottom:1px solid var(--border)}.skeleton-cell{height:20px}.skeleton-card{padding:20px;background:var(--surface);border-radius:12px;border:1px solid var(--border)}.skeleton-title{height:28px;width:60%;margin-bottom:16px}.skeleton-text{height:16px;margin-bottom:12px}.skeleton-text:last-of-type{width:80%}.skeleton-button{height:40px;width:120px;margin-top:16px;border-radius:8px}.skeleton-text-group{display:flex;flex-direction:column;gap:12px}[data-density=compact] .responsive-table td,[data-density=compact] .responsive-table th{padding:4px 8px;font-size:12px;line-height:1.3}[data-density=compact] .responsive-table{font-size:12px}[data-density=compact] .episodes-table td,[data-density=compact] .episodes-table th{padding:4px 8px;font-size:12px}[data-density=compact] .card{padding:12px;border-radius:8px}[data-density=compact] .card-header{font-size:16px;padding:8px 12px;margin-bottom:8px}[data-density=compact] .card-body{padding:8px 12px}[data-density=compact] .btn{padding:4px 10px;font-size:12px;min-height:28px}[data-density=compact] .btn.small{padding:3px 8px;font-size:11px;min-height:24px}[data-density=compact] .field{margin-bottom:8px}[data-density=compact] .field label{font-size:11px;margin-bottom:2px}[data-density=compact] .field input,[data-density=compact] .field select,[data-density=compact] .field textarea{padding:4px 8px;font-size:12px;min-height:28px}[data-density=compact] .hint{font-size:11px;line-height:1.4}[data-density=compact] .stack{gap:8px}[data-density=compact] .row{gap:6px}[data-density=compact] .table-badge{padding:1px 4px;font-size:10px}[data-density=compact] .table-badge-reason{font-size:9px}[data-density=compact] .container{padding:12px}[data-density=compact] .nav{gap:4px;padding:8px 0}[data-density=compact] .nav button{padding:6px 12px;font-size:12px;gap:6px}[data-density=compact] .pagination{margin-top:8px;padding:8px 0;font-size:12px}[data-density=compact] .season-header{padding:8px 12px;font-size:13px}[data-density=compact] .season-content{padding:8px}[data-density=compact] .series-card{margin-bottom:12px}[data-density=compact] .field-grid{gap:8px}[data-density=compact] h2{font-size:18px;margin-bottom:12px}[data-density=compact] h3{font-size:14px;margin-bottom:8px}[data-density=compact] .modal{padding:16px}[data-density=compact] .modal-header{padding:12px 16px;margin-bottom:12px}[data-density=compact] .modal-body{padding:12px 16px}[data-density=compact] .modal-footer{padding:12px 16px;gap:8px}[data-density=compact] .process-grid{gap:10px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}[data-density=compact] .process-section{gap:8px}[data-density=compact] .process-section+.process-section{margin-top:8px}[data-density=compact] .process-section__title{font-size:11px;padding:0 2px;gap:6px}[data-density=compact] .process-section__title:before{width:3px;height:14px}[data-density=compact] .process-card{padding:10px;gap:8px;border-radius:10px}[data-density=compact] .process-card__header{padding-right:14px;gap:6px}[data-density=compact] .process-card__name{font-size:14px}[data-density=compact] .process-card__summary{font-size:11px}[data-density=compact] .process-card__badges{gap:4px;margin-top:2px}[data-density=compact] .process-card__badge{padding:2px 6px;font-size:10px}[data-density=compact] .process-card__list{gap:8px;grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}[data-density=compact] .process-chip{gap:6px;padding:8px 10px;border-radius:8px}[data-density=compact] .process-chip__top{gap:6px}[data-density=compact] .process-chip__name{font-size:12px}[data-density=compact] .process-chip__detail{margin-top:4px;font-size:11px;line-height:1.3}[data-density=compact] .process-chip .btn{padding:3px 8px;font-size:11px}[data-density=compact] .status-indicator{width:10px;height:10px}[data-density=compact] .status-pill{padding:3px 8px;font-size:11px;gap:4px}[data-density=compact] .status-pill__dot{width:5px;height:5px;margin-right:4px}[data-density=compact] .config-card{border-radius:10px}[data-density=compact] .config-card summary{padding:8px 10px;font-size:13px}[data-density=compact] .config-card summary:before{margin-right:6px}[data-density=compact] .config-card>.card-body{gap:8px}[data-density=compact] .config-summary-card{gap:8px;min-height:120px}[data-density=compact] .config-summary-card p{font-size:12px;line-height:1.3}[data-density=compact] .config-layout{gap:10px}[data-density=compact] .config-actions{gap:6px}[data-density=compact] .config-grid{gap:12px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}[data-density=compact] .config-arr-groups{gap:16px}[data-density=compact] .config-arr-group{gap:8px}[data-density=compact] .config-arr-group__details{padding:10px 12px;border-radius:10px}[data-density=compact] .config-arr-group__details summary{gap:8px;font-size:13px}[data-density=compact] .config-arr-group__details[open] summary{margin-bottom:10px;padding-bottom:8px}[data-density=compact] .config-arr-group__count{padding:3px 8px;font-size:11px}[data-density=compact] .config-arr-group__title{font-size:12px}[data-density=compact] .config-arr-grid{gap:12px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-top:2px}[data-density=compact] .config-arr-grid .card-body{gap:8px}[data-density=compact] .config-arr-card{min-height:160px}[data-density=compact] .config-arr-summary{gap:6px}[data-density=compact] .config-arr-summary__item{gap:1px}[data-density=compact] .config-arr-summary__item dt{font-size:10px}[data-density=compact] .config-arr-summary__item dd{font-size:12px}[data-density=compact] .config-arr-actions{gap:6px}[data-density=compact] .config-footer{gap:8px}[data-density=compact] .config-section{padding:6px 10px;border-radius:8px}[data-density=compact] .config-section summary{font-size:13px}[data-density=compact] .config-section summary:before{margin-right:6px}[data-density=compact] .config-section__body{margin-top:8px}[data-density=compact] .field-description,[data-density=compact] .field-hint{font-size:11px;line-height:1.3;margin-top:2px}[data-density=compact] .field-description{margin-top:1px}[data-density=compact] .field-hint{margin-top:3px}[data-density=compact] .field-label{gap:4px;font-size:11px}[data-density=compact] .checkbox-field{gap:4px;font-size:12px}[data-density=compact] .checkbox-field label{gap:6px}[data-density=compact] .checkbox-field__content{gap:4px}[data-density=compact] .checkbox-field__text{gap:4px;line-height:1.3;font-size:12px}[data-density=compact] .secure-field,[data-density=compact] .secure-field__input-group{gap:6px}[data-density=compact] .secure-field__controls{gap:4px}[data-density=compact] .secure-field__controls .btn{padding:4px 8px}[data-density=compact] .help-icon{width:14px;height:14px;font-size:10px}[data-density=compact] .badge{padding:2px 6px;border-radius:5px;font-size:10px}[data-density=compact] .empty-state{padding:24px 20px;border-radius:12px;font-size:13px}[data-density=compact] .tracker-grid{gap:10px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}[data-density=compact] .tracker-card .card-header{gap:8px;font-size:13px}[data-density=compact] .tracker-card .card-body{padding-top:0}[data-density=compact] .keyboard-hint{gap:3px;padding:2px 5px;border-radius:3px;font-size:9px}[data-density=compact] .changelog-modal__body{gap:8px}[data-density=compact] .changelog-meta{gap:4px;font-size:12px}[data-density=compact] .changelog-body{padding:10px;max-height:280px;font-size:12px;line-height:1.4}[data-density=compact] .changelog-links,[data-density=compact] .changelog-buttons{gap:6px}[data-density=compact] details{margin:4px 0}[data-density=compact] details summary{padding:3px;border-radius:5px}[data-density=compact] .series-details,[data-density=compact] .season-details{border-radius:5px}[data-density=compact] .series-summary,[data-density=compact] .season-summary{padding:8px 12px;font-size:13px;border-radius:5px 5px 0 0}[data-density=compact] .series-title{font-size:1em}[data-density=compact] .series-instance{font-size:.85em}[data-density=compact] .season-title{font-size:.95em}[data-density=compact] .season-count{font-size:.85em}[data-density=compact] .series-content,[data-density=compact] .season-content{padding:6px}[data-density=compact] pre{padding:10px;max-height:320px;border-radius:10px;font-size:12px}[data-density=compact] .icon{width:1.2em;height:1.2em}[data-density=compact] .icon--small{width:1em;height:1em}[data-density=compact] .icon--large{width:1.4em;height:1.4em}[data-density=compact] svg[width],[data-density=compact] svg[height]{width:1.2em!important;height:1.2em!important}[data-density=compact] .spinner{width:12px;height:12px;border-width:2px}[data-density=compact] .loading{gap:6px;font-size:12px}[data-density=compact] .toasts{gap:8px;right:12px;bottom:12px}[data-density=compact] .toast{padding:8px 12px;border-radius:8px;min-width:220px;font-size:12px}[data-density=compact] .logs-container{height:calc(100vh - 110px)}[data-density=compact] .logs-toolbar{margin-bottom:8px;gap:8px}[data-density=compact] .logs-toolbar .field{margin-bottom:0}[data-density=compact] .logs-toolbar label{font-size:11px;margin-bottom:2px}[data-density=compact] .logs-toolbar .btn{padding:4px 10px;font-size:12px}[data-density=compact] .logs-content{padding:10px;border-radius:8px}[data-density=compact] .logs-content pre{font-size:11px;line-height:1.4}[data-density=compact] .badge{padding:2px 6px;font-size:10px}[data-density=comfortable] .responsive-table td,[data-density=comfortable] .responsive-table th{padding:12px 16px}.view-density-toggle{display:flex;gap:4px;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:4px}.view-density-toggle button{padding:6px 12px;border:none;background:transparent;color:var(--muted);border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease}.view-density-toggle button:hover{color:var(--on-surface);background:#7aa2f71a}.view-density-toggle button.active{background:var(--primary);color:#fff}[data-density=compact] .css-13cymwt-control,[data-density=compact] .css-t3ipsp-control,[data-density=compact] .css-15evc9m-control,[data-density=compact] .css-hlgwow,[data-density=compact] [class*=-control]{min-height:32px!important;height:32px!important;font-size:12px!important}[data-density=compact] .css-hlgwow,[data-density=compact] [class*=-ValueContainer]{padding:2px 8px!important;font-size:12px!important}[data-density=compact] .css-1dimb5e-singleValue,[data-density=compact] .css-1jxntwc-singleValue,[data-density=compact] [class*=-singleValue]{font-size:12px!important;line-height:1.4!important}[data-density=compact] .css-1u3zge7,[data-density=compact] [class*=-Input]{padding:0!important;margin:0!important}[data-density=compact] .css-1u3zge7 input,[data-density=compact] [class*=-Input] input{font-size:12px!important;padding:0!important;margin:0!important}[data-density=compact] .css-1nmdiq5-menu,[data-density=compact] [class*=-menu]{font-size:12px!important}[data-density=compact] .css-1n6sfyn-MenuList,[data-density=compact] [class*=-MenuList]{padding:4px!important}[data-density=compact] .css-10wo9uf-option,[data-density=compact] [class*=-option]{padding:6px 10px!important;font-size:12px!important}[data-density=compact] .css-1wy0on6,[data-density=compact] [class*=-indicatorsContainer]{padding:0 4px!important}[data-density=compact] .css-1u9des2-indicatorSeparator,[data-density=compact] [class*=-indicatorSeparator]{margin-top:6px!important;margin-bottom:6px!important}[data-density=compact] .css-1hwfws3,[data-density=compact] .css-1xc3v61-indicatorContainer,[data-density=compact] [class*=-indicatorContainer]{padding:4px!important}[data-density=compact] .css-1xc3v61-indicatorContainer svg,[data-density=compact] [class*=-indicatorContainer] svg{width:16px!important;height:16px!important}[data-density=compact] .appbar{padding:6px 12px!important}[data-density=compact] .appbar__inner{padding:0 6px!important;gap:8px!important}[data-density=compact] .appbar__title{gap:6px!important}[data-density=compact] .appbar__title h1{font-size:15px!important;margin:0!important}[data-density=compact] .appbar__logo{width:28px!important;height:28px!important}[data-density=compact] .appbar__version{font-size:9px!important;padding:2px 5px!important;letter-spacing:.3px!important}[data-density=compact] .appbar__status{font-size:10px!important}[data-density=compact] .appbar__update{padding:4px 8px!important;font-size:10px!important;gap:3px!important}[data-density=compact] .appbar__update-indicator{width:5px!important;height:5px!important}[data-density=compact] .appbar__actions{gap:6px!important}[data-density=compact] .appbar__actions button,[data-density=compact] .appbar__actions a.btn{padding:4px 8px!important;font-size:10px!important;gap:4px!important}[data-density=compact] .appbar__actions .icon{width:14px!important;height:14px!important}[data-density=compact] .appbar__actions .badge{padding:2px 6px!important;font-size:9px!important}[data-density=compact] .spinner{width:11px!important;height:11px!important;border-width:2px!important}[data-density=compact] .view-density-toggle{padding:2px!important;gap:2px!important;border-radius:6px!important}[data-density=compact] .view-density-toggle button{padding:4px 8px!important;font-size:10px!important;border-radius:4px!important}.version-comparison{display:flex;align-items:center;gap:12px;padding:12px;background:#7aa2f70d;border:1px solid rgba(122,162,247,.2);border-radius:8px;margin-bottom:12px}.version-item{display:flex;align-items:center;gap:6px}.version-arrow{color:var(--primary);font-size:18px;font-weight:700}.version-badge{padding:4px 10px;border-radius:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;font-weight:600}.version-current{background:#9aa3ac26;border:1px solid rgba(154,163,172,.3);color:var(--muted)}.version-latest{background:#7aa2f726;border:1px solid rgba(122,162,247,.3);color:var(--primary)}.update-status{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px}.update-status.text-info{background:#3b82f61a;border:1px solid rgba(59,130,246,.3);color:#3b82f6}.update-status.text-success{background:#22c55e1a;border:1px solid rgba(34,197,94,.3);color:#22c55e}.update-status.text-danger{background:#ef44441a;border:1px solid rgba(239,68,68,.3);color:#ef4444}.changelog-section{display:flex;flex-direction:column;gap:8px}.changelog-section h3{margin:0;font-size:14px;font-weight:600;color:var(--on-surface)}[data-theme=light] .version-comparison{background:#0071e30d;border-color:#0071e326}[data-theme=light] .version-latest{background:#0071e31a;border-color:#0071e340}[data-density=compact] .version-comparison{padding:8px;gap:8px;font-size:12px}[data-density=compact] .version-badge{padding:3px 8px;font-size:11px}[data-density=compact] .version-arrow{font-size:14px}[data-density=compact] .update-status{padding:8px 12px;font-size:12px}[data-density=compact] .changelog-section h3{font-size:13px}.react-lazylog-searchbar{background:var(--surface)!important;border-bottom:1px solid var(--border)!important;padding:8px 12px!important}[data-theme=dark] .react-lazylog-searchbar{background:#0f131a!important}.react-lazylog-searchbar-input{background:var(--bg)!important;color:var(--on-surface)!important;border:1px solid var(--border)!important;border-radius:6px!important;padding:6px 10px!important;font-size:13px!important}[data-theme=dark] .react-lazylog-searchbar-input{background:#12151a!important}.react-lazylog-searchbar-input:focus{outline:none!important;border-color:var(--primary)!important;box-shadow:0 0 0 2px #7aa2f71a!important}[data-theme=light] .react-lazylog-searchbar-input:focus{box-shadow:0 0 0 2px #0071e31a!important}.react-lazylog-searchbar-input::placeholder{color:var(--muted)!important}.react-lazylog-searchbar-matches{color:var(--muted)!important;font-size:12px!important}.react-lazylog-searchbar-filter,.react-lazylog-searchbar-up-arrow,.react-lazylog-searchbar-down-arrow{background:transparent!important;border:1px solid var(--border)!important;border-radius:6px!important;padding:6px!important;cursor:pointer!important;transition:all .15s ease!important}.react-lazylog-searchbar-filter:hover,.react-lazylog-searchbar-up-arrow:hover,.react-lazylog-searchbar-down-arrow:hover{background:#7aa2f71a!important;border-color:var(--primary)!important}[data-theme=light] .react-lazylog-searchbar-filter:hover,[data-theme=light] .react-lazylog-searchbar-up-arrow:hover,[data-theme=light] .react-lazylog-searchbar-down-arrow:hover{background:#0071e314!important}.react-lazylog-searchbar-filter svg,.react-lazylog-searchbar-up-arrow svg,.react-lazylog-searchbar-down-arrow svg{fill:var(--on-surface)!important;width:16px!important;height:16px!important}.react-lazylog-searchbar-filter.inactive,.react-lazylog-searchbar-up-arrow.inactive,.react-lazylog-searchbar-down-arrow.inactive{opacity:.5!important;cursor:not-allowed!important}.react-lazylog-searchbar-matches.inactive{opacity:.5!important}.test-connection-section{margin:16px 0;padding:16px;background:#ffffff05;border:1px solid var(--border-color);border-radius:4px}.field-group-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.field-hint{font-size:.85em;color:var(--text-secondary);font-style:italic}.alert{padding:12px 16px;border-radius:4px;margin-top:12px;line-height:1.5}.alert.success{background:#4caf501a;border:1px solid rgba(76,175,80,.3);color:#66bb6a}[data-theme=light] .alert.success{background:#4caf5014;border-color:#4caf5066;color:#388e3c}.alert.error{background:#f443361a;border:1px solid rgba(244,67,54,.3);color:#ef5350}[data-theme=light] .alert.error{background:#f4433614;border-color:#f4433666;color:#d32f2f}.alert.info{background:#2196f31a;border:1px solid rgba(33,150,243,.3);color:#42a5f5}[data-theme=light] .alert.info{background:#2196f314;border-color:#2196f366;color:#1976d2}.alert.warning{background:#ffc1071a;border:1px solid rgba(255,193,7,.3);color:#ffb74d}[data-theme=light] .alert.warning{background:#ffc10714;border-color:#ffc10766;color:#f57c00}.alert-details{font-size:.9em;margin-top:6px;opacity:.9}.alert strong{font-weight:600}