/* cms.css — the #content (CMS/PIM) styling layer for the dcs.spa shell.
 *
 * Part C of the Datastar webd foundation: this was a ~135-line inline <style>
 * in shell.html, re-read + re-sent on EVERY request. Externalised here so it's
 * cached (one fetch, then 304s). Only the FOUC-critical theme-preload script +
 * the body background stay inline in shell.html.
 *
 * CASCADE: these rules are INTENTIONALLY UNLAYERED. base.css declares
 * `@layer reset, tokens, base, components, utilities, animations` and any
 * unlayered rule beats every layer regardless of specificity — which is what
 * the original inline block relied on to override base.css's component layer
 * (link colour, table styling, active-sort opacity). Keeping cms.css unlayered
 * AND loaded after base.css/site.css reproduces the original behaviour exactly.
 * Do not wrap these in an @layer without re-checking every #content override. */

/* CMS layer — scoped to #content so it never fights the dcs.spa chrome.
   The old CMS theme palette vars are remapped here onto dcs.spa's scheme
   (--accent comes from site.css; the rest derive from currentColor), so the
   existing handler markup (var(--head)/--card/--border, .card/.btn/.tag…)
   renders correctly and theme-aware inside the dcs.spa column. */
#content{
    --head: var(--fg-primary);
    --card: var(--glass);
    --border: var(--bg-tertiary);
    --accent2: var(--accent);
    --afg: #fff;
    color: var(--fg-primary);
    /* Solid content column: the sidebar surface (--bg-secondary) one shade
       stronger (--bg-tertiary), so the centre distinguishes from the
       sidebars/topnav. Cards (--card = --bg-secondary, the panel-title
       surface) then sit one shade lighter on top. Both flip light/dark. */
    background: var(--bg-tertiary);
}
#content .cms-wrap{max-width:60rem;margin:0 auto;padding:2.25rem 1.5rem 5rem;font-size:1rem;line-height:1.65}
#content a{color:var(--accent);text-decoration:none}
#content a:hover{text-decoration:underline}
#content h1{font-size:2rem;letter-spacing:-.025em;margin:.2rem 0 .6rem;color:var(--head)}
#content h2{letter-spacing:-.02em;color:var(--head)}
#content .muted{opacity:.62}
#content .small{font-size:.85rem}
#content .row{display:flex;gap:.5rem;align-items:center}
#content .grid{display:grid;gap:1rem}
#content .spacer{flex:1}
#content .who{font-size:.85rem;opacity:.62;margin:0 .3rem}
#content .card{background:var(--card);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--glass-border);border-radius:1rem;padding:1.5rem;box-shadow:0 2px 8px rgba(0,0,0,.10)}
#content .navlink{font-size:.9rem;font-weight:600;padding:.35rem .7rem;border-radius:.5rem}
#content .navlink:hover{background:color-mix(in srgb,var(--accent) 12%,transparent);text-decoration:none}
#content .btn{display:inline-block;background:linear-gradient(135deg,var(--accent),var(--accent2));color:var(--afg);font-weight:600;padding:.55rem 1.1rem;border-radius:.6rem;border:0;cursor:pointer;font-size:.92rem;transition:filter .15s ease,transform .15s ease,box-shadow .15s ease}
#content .btn:hover{filter:brightness(1.08);text-decoration:none;transform:translateY(-1px);box-shadow:0 4px 14px var(--accent-glow,rgba(0,0,0,.18))}
#content .btn:active{transform:translateY(0)}
#content .btn.ghost{background:transparent;color:var(--accent);border:1px solid var(--border)}
#content .btn.ghost:hover{box-shadow:none;background:color-mix(in srgb,var(--accent) 10%,transparent)}
#content .btn.danger{background:linear-gradient(135deg,#e11d48,#f43f5e)}
#content input,#content textarea,#content select{width:100%;box-sizing:border-box;background:var(--bg-primary);color:inherit;border:1px solid var(--border);border-radius:.6rem;padding:.6rem .75rem;font:inherit;font-size:.95rem;transition:border-color .15s ease,box-shadow .15s ease}
#content input:focus,#content textarea:focus,#content select:focus{outline:2px solid var(--accent);border-color:transparent}
/* Native-control polish (Part C): tame the "sad" default <select> — strip the
   platform chrome, add a theme-aware caret, and reserve room for it so long
   options don't collide. Fully-custom open-lists stay out of scope. */
#content select{appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:2rem;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23808a99' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center}
#content label{display:block;font-size:.8rem;font-weight:600;opacity:.7;margin:.9rem 0 .3rem}
#content .tag{display:inline-block;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:.15rem .5rem;border-radius:.4rem;background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}
#content .tag.draft{background:color-mix(in srgb,#d97706 24%,transparent);color:#b45309}
#content table{width:100%;border-collapse:collapse}
#content th,#content td{text-align:left;padding:.6rem .5rem;border-bottom:1px solid var(--border);font-size:.92rem}
#content th{opacity:.6;font-size:.72rem;text-transform:uppercase;letter-spacing:.04em}
/* DataTable widget (shared handlers/datatable.mix): sortable headers, global
   search, numbered pagination. Co-located here so it composes with the
   #content-scoped table/card/btn rules above and shares their vars. */
#content .visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
#content .datatable-scroll-wrapper{overflow-x:auto}
#content table.datatable{width:100%;border-collapse:collapse}
#content .datatable th.sortable-th{padding:0}
#content .datatable th.sortable-th a{display:inline-flex;align-items:center;gap:.25rem;color:inherit;text-decoration:none;padding:.6rem .5rem}
#content .datatable th.sortable-th a:hover{color:var(--accent);text-decoration:none}
#content .datatable th[aria-sort]{opacity:1}
#content .datatable th[aria-sort] a{color:var(--accent);font-weight:700}
#content .datatable .dt-caret{font-size:.8em}
#content .datatable tbody tr{transition:background .12s ease}
#content .datatable tbody tr:hover{background:color-mix(in srgb,var(--accent) 7%,transparent)}
#content .datatable-row-actions{text-align:right;white-space:nowrap}
#content .datatable-results-count{font-weight:400;margin-inline-start:.4rem}
#content .datatable-toolbar{margin:1rem 0}
#content .datatable-toolbar-actions{display:flex;gap:.5rem;align-items:center}
#content .datatable-empty-state{margin-top:1rem}
#content .datatable-pagination-bar{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.75rem;margin-top:1.5rem}
#content .datatable-page-list{display:flex;align-items:center;gap:.4rem;list-style:none;padding:0;margin:0}
#content .datatable-page-list li{margin:0}
#content .datatable-page-list .btn{padding:.3rem .7rem;font-size:.82rem}
#content .page-number-btn{display:inline-flex;min-width:2rem;justify-content:center;padding:.25rem .5rem;border-radius:.4rem;text-decoration:none;color:var(--fg-primary);opacity:.7}
#content .page-number-btn:hover{background:var(--bg-secondary);opacity:1;text-decoration:none}
#content .page-number-active{background:var(--accent);color:var(--afg);font-weight:700;opacity:1;pointer-events:none}
#content .dt-ellipsis{padding:0 .25rem;opacity:.5}
#content .datatable-page-info{margin-inline-start:.5rem;opacity:.62}
#content .datatable-pagesize{display:flex;align-items:center;gap:.4rem;justify-content:center;flex-wrap:wrap;margin-top:.6rem}
#content .datatable-pagesize a{padding:.1rem .45rem;border-radius:.3rem;text-decoration:none;color:var(--fg-primary);opacity:.7}
#content .datatable-pagesize a:hover{background:var(--bg-secondary);opacity:1;text-decoration:none}
#content .dt-pagesize-active{padding:.1rem .45rem;border-radius:.3rem;background:var(--accent);color:var(--afg);font-weight:700}
#content .dt-bulk-bar{display:flex;align-items:center;gap:.6rem;margin:.5rem 0}
#content .dt-bulk-cell{width:1.5rem;text-align:center}
#content .dt-bulk-cell input{width:auto}
#content .dt-bulk-del[disabled]{opacity:.45;cursor:default;filter:grayscale(.4)}
@media (max-width:768px){#content .datatable tbody tr:nth-child(odd){background:color-mix(in srgb,var(--accent) 5%,transparent)}}
#content .flash{background:color-mix(in srgb,var(--accent) 12%,transparent);border:1px solid color-mix(in srgb,var(--accent) 30%,transparent);border-radius:.6rem;padding:.7rem 1rem;margin-bottom:1.25rem;font-size:.9rem}
#content article.post{font-size:1.05rem}
#content article.post p{margin:1rem 0}
/* Rendered-markdown content (full GFM via the markdown() builtin). base.css
   resets ul/ol list-style, so restore it for prose. */
#content .post ul,#content .post ol{list-style:revert;padding-left:1.5rem;margin:1rem 0}
#content .post li{margin:.3rem 0}
#content .post h1,#content .post h2,#content .post h3,#content .post h4{margin:1.5rem 0 .6rem;color:var(--head)}
#content .post a{color:var(--accent)}
#content .post code{background:color-mix(in srgb,currentColor 8%,transparent);padding:.1rem .35rem;border-radius:.3rem;font-size:.9em}
#content .post pre{background:color-mix(in srgb,currentColor 8%,transparent);border:1px solid var(--border);border-radius:.6rem;padding:.8rem 1rem;overflow:auto}
#content .post pre code{background:none;padding:0}
#content .post blockquote{border-inline-start:3px solid var(--accent);margin:1rem 0;padding:.2rem 1rem;opacity:.85}
#content .post table{margin:1rem 0}
#content .post img{max-width:100%;border-radius:.5rem}
#content .post hr{border:0;border-top:1px solid var(--border);margin:1.5rem 0}
/* left-sidebar blog nav */
.cms-nav-section{margin:0 0 1.25rem}
.cms-nav-title{font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;opacity:.55;margin:0 0 .5rem}
.cms-nav-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.1rem}
.cms-nav-list a{display:block;padding:.4rem .55rem;border-radius:.5rem;font-size:.92rem;color:inherit;text-decoration:none}
.cms-nav-list a:hover{background:color-mix(in srgb,var(--accent) 14%,transparent)}
.cms-nav-empty{opacity:.5;font-size:.85rem;padding:.4rem .55rem}
.cms-tagline{font-size:.8rem;opacity:.6;line-height:1.4;margin:0 0 1.1rem}
.cms-footer{border-top:1px solid color-mix(in srgb,currentColor 12%,transparent);opacity:.6;font-size:.85rem;padding:1.5rem;text-align:center}
/* Only the title band ("Message of the Day" / "Appearance") gets the solid
   --bg-tertiary; the very top strip (pin/dots carousel-header) keeps the
   default glass sidebar surface. */
.sidebar .panel-title{background:var(--bg-tertiary)}
/* Bottom-left profile widget + popup (replaces the topnav user links). */
.profile{margin-top:auto;border-block-start:1px solid var(--border);padding:.55rem}
.profile-btn{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .55rem;border-radius:.6rem;background:transparent;border:0;color:inherit;cursor:pointer;font:inherit;text-decoration:none}
.profile-btn:hover{background:color-mix(in srgb,var(--accent) 12%,transparent)}
.profile-av{width:1.8rem;height:1.8rem;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.78rem;flex:none}
.profile-name{font-weight:600;font-size:.9rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.profile-pop{display:none;flex-direction:column;gap:.05rem;margin:.3rem 0 .1rem;padding:.3rem;border:1px solid var(--border);border-radius:.6rem;background:var(--bg-secondary)}
.profile.open .profile-pop{display:flex}
.profile-pop a{display:flex;align-items:center;gap:.55rem;padding:.45rem .6rem;border-radius:.5rem;font-size:.9rem;color:inherit;text-decoration:none}
.profile-pop a:hover{background:color-mix(in srgb,var(--accent) 14%,transparent)}
.profile-pop a svg{width:1rem;height:1rem;flex:none;opacity:.7}
.profile-pop form{margin:0}
.profile-pop form button{display:flex;align-items:center;gap:.55rem;width:100%;padding:.45rem .6rem;border-radius:.5rem;font:inherit;font-size:.9rem;color:inherit;background:none;border:0;cursor:pointer;text-align:left}
.profile-pop form button:hover{background:color-mix(in srgb,var(--accent) 14%,transparent)}
.profile-pop form button svg{width:1rem;height:1rem;flex:none;opacity:.7}
.profile-sep{height:1px;background:var(--border);margin:.3rem .2rem}
.profile-btn svg{width:1rem;height:1rem;flex:none;opacity:.8}
/* CMS nav (LHS Navigation/Posts panels + RHS Posts panel): side padding to
   match the Appearance panel (var(--space-4)); flex links with a leading
   Lucide icon, an ellipsised label, and a trailing lock for private items. */
.cms-nav{padding:var(--space-4)}
.cms-nav-list a{display:flex;align-items:center;gap:.55rem;transition:background .12s ease,color .12s ease}
.cms-nav-list a svg{width:1rem;height:1rem;flex:none;opacity:.6}
.cms-nav-list .nav-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cms-nav-list .nav-lock{flex:none;opacity:.55;display:inline-flex;align-items:center}
.cms-nav-list .nav-lock svg{width:.85rem;height:.85rem}
/* Active nav item (set by the boost shim on swap). */
.cms-nav-list a.active{background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}

/* Content-swap animation (Part A.4): swapped-in content fades + rises in. The
   first/no-JS full-page load animates via this rule directly; on a boosted
   swap the .cms-wrap element persists (only its innerHTML changes), so the
   boost shim restarts this animation with a reflow nudge. Honours
   reduced-motion. */
#content .cms-wrap{animation:cms-fade-in .28s var(--ease-out,cubic-bezier(.16,1,.3,1))}
@keyframes cms-fade-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* Top loading bar during a boosted nav (Part A.4 shim toggles `.on` + width).
   Fixed, above the chrome; accent-coloured with a soft glow. */
#nav-progress{position:fixed;top:0;left:0;height:2px;width:0;background:linear-gradient(90deg,var(--accent),var(--accent-hover,var(--accent)));box-shadow:0 0 8px var(--accent-glow,transparent);opacity:0;z-index:1000;transition:width .2s ease,opacity .2s ease;pointer-events:none}
#nav-progress.on{opacity:1}

@media (prefers-reduced-motion:reduce){
    #content .cms-wrap{animation:none}
    #content .btn{transition:none}
    #nav-progress{transition:opacity .15s ease}
}
