/* Premium polish utilities for Boyodo admin panel — layered on top of the Stisla admin theme + boyodo.css tokens. */

.boyodo-btn-gradient{background:linear-gradient(135deg,var(--boyodo-blue,#0a63d8),var(--boyodo-indigo,#0100dc))!important;border:none!important;color:#fff!important;box-shadow:0 10px 24px -12px rgba(10,99,216,.55);transition:transform .18s cubic-bezier(.22,1,.36,1),box-shadow .18s cubic-bezier(.22,1,.36,1);}
.boyodo-btn-gradient:hover,.boyodo-btn-gradient:focus{color:#fff!important;transform:translateY(-1px);box-shadow:0 14px 30px -12px rgba(10,99,216,.65);}

.boyodo-card-premium{border:none;border-radius:20px;box-shadow:0 1px 2px rgba(18,54,85,.06),0 18px 45px -32px rgba(13,72,126,.45);overflow:hidden;}
.boyodo-card-premium .card-header{background:linear-gradient(135deg,rgba(10,99,216,.06),rgba(0,184,156,.05));border-bottom:1px solid #eef3f8;padding:18px 20px;}
.boyodo-card-premium .card-header strong{font-size:15px;color:#0b2038;}
.boyodo-card-premium .card-body{padding:20px;}

.boyodo-icon-badge{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:10px;background:linear-gradient(135deg,var(--boyodo-blue,#0a63d8),var(--boyodo-teal,#00b89c));color:#fff;margin-right:10px;font-size:14px;flex:none;}

.boyodo-chip-checkbox{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:999px;border:1px solid #d8e7f0;background:#fff;font-size:13px;color:#33475b;cursor:pointer;transition:all .18s cubic-bezier(.22,1,.36,1);user-select:none;}
.boyodo-chip-checkbox input{accent-color:var(--boyodo-blue,#0a63d8);}
.boyodo-chip-checkbox:has(input:checked){background:linear-gradient(135deg,rgba(10,99,216,.12),rgba(0,184,156,.10));border-color:var(--boyodo-blue,#0a63d8);color:#0a63d8;font-weight:600;}

.boyodo-badge-soft{display:inline-block;padding:4px 10px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.02em;}
.boyodo-badge-soft.is-pending{background:#fff4e0;color:#a9660b;}
.boyodo-badge-soft.is-approved{background:#e3f9ef;color:#0f9d63;}
.boyodo-badge-soft.is-rejected{background:#fdeaea;color:#c53030;}
.boyodo-badge-soft.is-new{background:#e5edff;color:#0a63d8;}

.boyodo-list-row{display:flex;justify-content:space-between;align-items:center;border:1px solid #eef3f8;border-radius:14px;padding:12px 14px;margin-bottom:10px;transition:box-shadow .18s cubic-bezier(.22,1,.36,1);}
.boyodo-list-row:hover{box-shadow:0 8px 20px -14px rgba(13,72,126,.35);}

.boyodo-toggle-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;border:1px solid #eef3f8;border-radius:14px;padding:14px 16px;margin-bottom:12px;background:#fff;}
.boyodo-toggle-row .boyodo-toggle-text strong{display:block;font-size:13px;color:#0b2038;}
.boyodo-toggle-row .boyodo-toggle-text span{display:block;font-size:12px;color:#61748a;margin-top:2px;}

.boyodo-empty-state{text-align:center;padding:32px 16px;color:#61748a;}
.boyodo-empty-state i{font-size:28px;color:#c6d7e4;margin-bottom:10px;display:block;}

/* Operations dashboard: responsive cards replace the legacy desktop tables. */
.bo-admin-home{font-family:'Plus Jakarta Sans',sans-serif;color:#0b2038;max-width:1500px;margin:0 auto}.bo-ahero{position:relative;display:flex;align-items:center;justify-content:space-between;gap:24px;margin:0 0 18px;padding:25px 28px;border-radius:24px;overflow:hidden;color:#fff;background:radial-gradient(circle at 85% 10%,rgba(31,214,188,.42),transparent 30%),linear-gradient(125deg,#073c88,#075ec8 58%,#009f91);box-shadow:0 22px 48px -30px rgba(5,65,135,.8)}.bo-ahero::after{content:"";position:absolute;right:-45px;bottom:-90px;width:230px;height:230px;border:34px solid rgba(255,255,255,.08);border-radius:50%;pointer-events:none}.bo-ahero__eyebrow{display:inline-flex;align-items:center;gap:8px;margin-bottom:7px;font-size:11px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:#c9fff7}.bo-ahero h1{margin:0;font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:clamp(24px,3vw,36px);font-weight:750;letter-spacing:-.035em;color:#fff}.bo-ahero p{max-width:680px;margin:7px 0 0;color:rgba(255,255,255,.82);font-size:14px;line-height:1.55}.bo-ahero__date{position:relative;z-index:1;display:grid;grid-template-columns:auto auto;gap:2px 9px;align-items:center;min-width:154px;padding:13px 15px;border:1px solid rgba(255,255,255,.2);border-radius:17px;background:rgba(1,31,71,.22);backdrop-filter:blur(8px)}.bo-ahero__date i{grid-row:1/3;font-size:21px;color:#8df3e4}.bo-ahero__date span{font-size:12px;color:#dcecff}.bo-ahero__date strong{font-size:13px;color:#fff}
.bo-akpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:13px;margin-bottom:16px}.bo-akpi{--kpi:#0a63d8;position:relative;display:grid;grid-template-columns:48px minmax(0,1fr);gap:12px;align-items:center;min-height:126px;padding:18px;border:1px solid #e4eef6;border-radius:21px;background:#fff;color:#0b2038;box-shadow:0 14px 38px -34px rgba(13,72,126,.7);overflow:hidden;transition:transform .2s cubic-bezier(.22,1,.36,1),box-shadow .2s}.bo-akpi:hover{color:#0b2038;text-decoration:none;transform:translateY(-3px);box-shadow:0 20px 42px -30px rgba(13,72,126,.65)}.bo-akpi::after{content:"";position:absolute;right:-22px;bottom:-28px;width:80px;height:80px;border-radius:50%;background:var(--kpi);opacity:.12}.bo-akpi__icon{display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:15px;color:#fff;background:var(--kpi);font-size:18px;box-shadow:0 12px 22px -14px var(--kpi)}.bo-akpi small,.bo-akpi em{display:block;font-style:normal;color:#657b91}.bo-akpi small{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.bo-akpi strong{display:block;margin:4px 0;font-family:'Sora',sans-serif;font-size:23px;line-height:1.1}.bo-akpi em{font-size:11px}.bo-akpi.is-teal{--kpi:#00a98f}.bo-akpi.is-cyan{--kpi:#078da8}.bo-akpi.is-navy{--kpi:#123a70}
.bo-aqueue{display:grid;grid-template-columns:minmax(0,1.75fr) minmax(300px,.85fr);gap:16px;margin-bottom:16px}.bo-apanel{border:1px solid #e4eef6;border-radius:22px;background:#fff;box-shadow:0 16px 42px -36px rgba(13,72,126,.7);overflow:hidden}.bo-apanel__head{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:17px 19px;border-bottom:1px solid #e8f0f6;background:linear-gradient(135deg,#fbfdff,#f5fbfa)}.bo-apanel__head span{display:block;font-size:10px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:#078d80}.bo-apanel__head h2{margin:2px 0 0;font-family:'Sora',sans-serif;font-size:16px;font-weight:750;color:#0b2038}.bo-apanel__head>a{font-size:12px;font-weight:800;color:#0a63d8}.bo-abookings{padding:8px}.bo-abooking{display:grid;grid-template-columns:102px minmax(0,1fr) 44px;gap:12px;align-items:center;padding:12px;border-radius:16px;transition:background .18s}.bo-abooking:hover{background:#f5f9fd}.bo-abooking__time strong,.bo-abooking__time span{display:block}.bo-abooking__time strong{font-size:13px}.bo-abooking__time span{margin-top:2px;font-size:10px;color:#6a7f93}.bo-abooking__main{min-width:0}.bo-abooking__main>strong{display:block;font-size:14px}.bo-abooking__main>span{display:block;margin:2px 0 7px;font-size:11px;color:#687d91;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bo-abooking>a{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:13px;background:#edf5fc;color:#0a63d8}.bo-astatus{display:inline-flex;margin:0 5px 3px 0;padding:4px 8px;border-radius:999px;font-size:10px;font-weight:800;background:#edf2f6;color:#54697d}.bo-astatus.is-success{background:#e3f8ef;color:#087c4d}.bo-astatus.is-danger{background:#fdeaea;color:#b32626}.bo-astatus.is-warning,.bo-astatus.is-pending{background:#fff2dc;color:#9b5c00}.bo-astatus.is-info{background:#eaf2fe;color:#0a5fce}.bo-astatus.is-neutral{background:#eef1f5;color:#4a5a6d}.bo-aempty{display:flex;flex-direction:column;align-items:center;padding:42px 16px;color:#687d91}.bo-aempty i{font-size:26px;margin-bottom:8px}.bo-aempty strong{color:#0b2038}.bo-aempty span{font-size:12px}
.bo-aattention{padding:8px}.bo-aattention>a{display:grid;grid-template-columns:42px minmax(0,1fr) 22px;gap:10px;align-items:center;min-height:64px;padding:10px;border-radius:15px;color:#0b2038}.bo-aattention>a:hover{background:#f5f9fd;text-decoration:none}.bo-aattention>a>i{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:13px;background:#eaf2fe;color:#0a63d8}.bo-aattention>a>i.is-red{background:#fdeaea;color:#b32626}.bo-aattention>a>i.is-amber{background:#fff2dc;color:#9b5c00}.bo-aattention>a>i.is-cyan{background:#e5f8f6;color:#087c70}.bo-aattention span{font-size:11px;color:#687d91}.bo-aattention strong{display:block;font-family:'Sora',sans-serif;font-size:18px;color:#0b2038}.bo-aattention b{color:#9aabba;font-size:11px}.bo-aquick{margin-bottom:22px}.bo-aquick__grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;padding:14px}.bo-aquick__grid a{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:9px;min-height:92px;padding:12px;border:1px solid #e4eef6;border-radius:16px;color:#20384f;text-align:center;font-size:11px;font-weight:750;transition:.18s}.bo-aquick__grid a:hover{border-color:#9bc9f5;background:#f2f8fe;color:#0a63d8;text-decoration:none;transform:translateY(-2px)}.bo-aquick__grid i{font-size:20px;color:#078d80}
@media(max-width:1100px){.bo-akpis{grid-template-columns:repeat(2,minmax(0,1fr))}.bo-aquick__grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:767px){.bo-admin-home{margin-top:-8px}.bo-ahero{display:block;padding:21px 18px;border-radius:20px}.bo-ahero__date{margin-top:16px;width:max-content}.bo-akpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}.bo-akpi{grid-template-columns:40px minmax(0,1fr);gap:9px;min-height:112px;padding:13px}.bo-akpi__icon{width:40px;height:40px}.bo-akpi strong{font-size:19px}.bo-aqueue{grid-template-columns:minmax(0,1fr)}.bo-abooking{grid-template-columns:76px minmax(0,1fr) 44px;padding:10px 7px}.bo-aquick__grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:390px){.bo-akpis,.bo-aquick__grid{grid-template-columns:minmax(0,1fr)}.bo-akpi{min-height:96px}.bo-abooking{grid-template-columns:minmax(0,1fr) 44px}.bo-abooking__time{grid-column:1/-1}}@media(prefers-reduced-motion:reduce){.bo-akpi,.bo-aquick__grid a{transition:none}.bo-akpi:hover,.bo-aquick__grid a:hover{transform:none}}

/* ==========================================================================
   DOCTOR CONSOLE  (bo-dd / bo-dstat / bo-drec / bo-dpill / bo-dbtn / bo-dtools)
   Added 2026-08-24 for the "doctor dashboard has too many UI issues" pass.
   --------------------------------------------------------------------------
   WHY A NEW NAMESPACE INSTEAD OF PATCHING THE THEME
   The Stisla stat card (.card.card-statistic-1) lays its 80x80 icon out with
   `float:left` and a 15px right margin, and .card-header carries padding-top:25px
   with a 13px uppercase h4. At 375px that leaves ~230px for a label like
   "Total Appointment", which wraps under the float and drags the number with it.
   Every fix in that block needs !important to clear the theme, which is exactly
   what the house rule forbids. So the markup was re-namespaced instead and this
   layer owns it outright.

   WHY NO !important IS NEEDED HERE
   This file is the LAST stylesheet in layout/partials/head_admin.blade.php
   (line 43, after style.css / components.css / admin_custom.css / boyodo.css).
   For equal specificity, later wins - so a plain single-class selector beats the
   theme's single-class selectors. Where the theme uses a compound selector
   (.card .card-header) there is nothing to beat, because the new markup carries
   no theme classes at all.

   TOKENS come from boyodo.css, which head_admin includes at line 42. Every
   var() below has a literal fallback so this file still renders correctly if
   that include is ever dropped.

   THE SIGNATURE ELEMENT is the status spine: a 4px full-height bar down the left
   edge of every appointment card, coloured by state. A doctor reads their day as
   a column of times and states, not as a table of fields, so the state is put on
   the edge where it can be scanned without reading. Everything else in this layer
   is deliberately quiet so the spine and the time are the only loud things.
   ========================================================================== */

.bo-dd{--bo-dd-line:#e4eef6;--bo-dd-ink:var(--boyodo-ink,#0b2038);--bo-dd-muted:var(--boyodo-muted,#61748a);--bo-dd-accent:var(--boyodo-blue,#0a63d8);font-family:'Plus Jakarta Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:var(--bo-dd-ink);}
.bo-dd *,.bo-dd *::before,.bo-dd *::after{box-sizing:border-box;}

/* Screen-reader-only text. Defined locally so this layer does not depend on
   whichever utility the surrounding theme happens to ship. */
.bo-dsr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;}

/* -------------------------------------------------------- booking switch card */
/* The single most consequential control on the page: while this is off, patients
   see "Coming Soon" and cannot book. It gets the full width and the strongest
   affordance rather than sitting in the card grid. */
.bo-dsw{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px 14px;align-items:start;margin:0 0 16px;padding:16px;border:1px solid var(--bo-dd-line);border-radius:20px;background:#fff;box-shadow:0 1px 2px rgba(18,54,85,.05),0 18px 40px -34px rgba(13,72,126,.5);}
.bo-dsw__icon{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:14px;font-size:17px;color:#fff;flex:none;}
.bo-dsw.is-on .bo-dsw__icon{background:linear-gradient(150deg,#0f9d63,#00b89c);}
.bo-dsw.is-off .bo-dsw__icon{background:linear-gradient(150deg,#c2410c,#e0821a);}
.bo-dsw__text{min-width:0;}
.bo-dsw__text h2{margin:0 0 3px;font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:16px;font-weight:700;line-height:1.25;letter-spacing:-.01em;}
.bo-dsw__state{display:inline-block;padding:1px 8px;margin-left:2px;border-radius:999px;font-size:12px;font-weight:700;vertical-align:1px;}
.bo-dsw.is-on .bo-dsw__state{background:#e3f9ef;color:#0f7f52;}
.bo-dsw.is-off .bo-dsw__state{background:#fdece0;color:#a2490c;}
.bo-dsw__text p{margin:0;font-size:13px;line-height:1.5;color:var(--bo-dd-muted);}
.bo-dsw__form{grid-column:1/-1;margin:2px 0 0;}
.bo-dsw__form button{width:100%;}

/* ------------------------------------------------------------------ stat tiles */
/* No floats. A two-up grid at phone width keeps the labels on one or two lines
   instead of wrapping around an icon, and the number stays next to its label. */
.bo-dd__stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0 0 16px;padding:0;list-style:none;}
.bo-dstat{display:flex;flex-direction:column;gap:8px;padding:14px;border:1px solid var(--bo-dd-line);border-radius:18px;background:#fff;box-shadow:0 1px 2px rgba(18,54,85,.04);}
.bo-dstat:last-child:nth-child(odd){grid-column:1/-1;flex-direction:row;align-items:center;justify-content:flex-start;gap:12px;}
.bo-dstat__icon{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:12px;font-size:14px;color:#fff;flex:none;}
.bo-dstat__icon.is-blue{background:linear-gradient(150deg,#0a63d8,#0100dc);}
.bo-dstat__icon.is-teal{background:linear-gradient(150deg,#00b89c,#0f9d63);}
.bo-dstat__icon.is-amber{background:linear-gradient(150deg,#e0821a,#c2410c);}
.bo-dstat__num{display:block;font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:24px;font-weight:700;line-height:1;letter-spacing:-.02em;}
.bo-dstat__label{display:block;margin-top:3px;font-size:12px;font-weight:600;line-height:1.35;color:var(--bo-dd-muted);}

/* ----------------------------------------------------------------- panel shell */
.bo-dpanel{margin:0 0 16px;border:1px solid var(--bo-dd-line);border-radius:20px;background:#fff;box-shadow:0 1px 2px rgba(18,54,85,.04);overflow:hidden;}
.bo-dpanel__head{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:baseline;justify-content:space-between;padding:15px 16px;border-bottom:1px solid var(--bo-dd-line);background:linear-gradient(135deg,rgba(10,99,216,.045),rgba(0,184,156,.035));}
.bo-dpanel__head h2{margin:0;font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:15px;font-weight:700;letter-spacing:-.01em;}
.bo-dpanel__head p{margin:0;font-size:12px;line-height:1.4;color:var(--bo-dd-muted);}
.bo-dpanel__body{padding:14px;}
.bo-dpanel__chart{position:relative;min-height:220px;padding:14px;}

/* -------------------------------------------------------------- search + sort */
.bo-dtools{display:grid;grid-template-columns:minmax(0,1fr);gap:8px;margin:0 0 12px;}
.bo-dtools__search{position:relative;display:block;margin:0;}
.bo-dtools__search i{position:absolute;top:50%;left:14px;transform:translateY(-50%);font-size:13px;color:var(--bo-dd-muted);pointer-events:none;}
.bo-dtools__search input{width:100%;min-height:44px;padding:10px 14px 10px 36px;border:1px solid var(--bo-dd-line);border-radius:14px;background:#f7fbff;font-size:15px;color:var(--bo-dd-ink);appearance:none;}
.bo-dtools__search input:focus{outline:2px solid rgba(10,99,216,.35);outline-offset:1px;border-color:var(--bo-dd-accent);background:#fff;}
.bo-dtools__sort{display:block;margin:0;}
.bo-dtools__sort select{width:100%;min-height:44px;padding:10px 14px;border:1px solid var(--bo-dd-line);border-radius:14px;background:#f7fbff;font-size:15px;color:var(--bo-dd-ink);}
.bo-dtools__sort select:focus{outline:2px solid rgba(10,99,216,.35);outline-offset:1px;border-color:var(--bo-dd-accent);}
.bo-dtools__count{margin:0;font-size:12px;font-weight:600;color:var(--bo-dd-muted);}

/* --------------------------------------------------------- appointment records */
.bo-drec{margin:0;padding:0;list-style:none;display:grid;gap:10px;}
/* [hidden] is a plain UA declaration, so the author `display:grid` below would
   defeat it and a filtered-out row would stay visible. This companion rule is
   mandatory, not decorative - the same trap bit the patient dashboard. */
.bo-drec__item[hidden]{display:none;}
.bo-drec__item{position:relative;display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px 12px;padding:13px 14px 13px 18px;border:1px solid var(--bo-dd-line);border-radius:18px;background:#fff;overflow:hidden;transition:box-shadow .22s cubic-bezier(.22,1,.36,1),transform .22s cubic-bezier(.22,1,.36,1);}
.bo-drec__item:hover{box-shadow:0 10px 26px -18px rgba(13,72,126,.45);transform:translateY(-1px);}
/* The signature: a state-coloured spine on the leading edge. */
.bo-drec__item::before{content:"";position:absolute;top:0;bottom:0;left:0;width:4px;background:#c6d7e4;}
.bo-drec__item.is-pending::before{background:linear-gradient(#e0821a,#c2410c);}
.bo-drec__item.is-approved::before{background:linear-gradient(#00b89c,#0f9d63);}
.bo-drec__item.is-cancelled::before{background:linear-gradient(#e05252,#c53030);}
.bo-drec__item.is-complete::before{background:linear-gradient(#0a63d8,#0100dc);}
/* Time first: the doctor's day is read by clock, then by patient. */
.bo-drec__time{display:flex;flex-direction:column;align-items:center;justify-content:center;width:58px;min-height:52px;padding:5px 4px;border-radius:14px;background:linear-gradient(160deg,#eef5ff,#e6fbf7);box-shadow:inset 0 0 0 1px rgba(10,99,216,.1);flex:none;}
.bo-drec__time strong{font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:14px;font-weight:700;line-height:1.1;letter-spacing:-.01em;}
.bo-drec__time small{font-size:10px;font-weight:600;line-height:1.2;color:var(--bo-dd-muted);text-transform:uppercase;letter-spacing:.03em;}
.bo-drec__head{min-width:0;}
.bo-drec__head strong{display:block;font-size:15px;font-weight:700;line-height:1.3;overflow-wrap:anywhere;}
.bo-drec__head small{display:block;margin-top:2px;font-size:12px;line-height:1.4;color:var(--bo-dd-muted);overflow-wrap:anywhere;}
.bo-drec__meta{display:flex;flex-wrap:wrap;gap:6px;grid-column:1/-1;margin:0;}
.bo-drec__meta>div{margin:0;}
.bo-drec__meta dt{display:inline;margin:0;font-size:11px;font-weight:600;color:var(--bo-dd-muted);}
.bo-drec__meta dd{display:inline;margin:0 0 0 3px;font-size:12px;font-weight:700;}
.bo-drec__pills{display:flex;flex-wrap:wrap;gap:6px;grid-column:1/-1;}
.bo-drec__actions{display:flex;flex-wrap:wrap;gap:8px;grid-column:1/-1;margin-top:2px;}

/* ------------------------------------------------------------------- state pill */
.bo-dpill{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:999px;font-size:11px;font-weight:700;line-height:1.5;letter-spacing:.01em;white-space:nowrap;}
.bo-dpill i{font-size:10px;}
.bo-dpill.is-pending{background:#fff4e0;color:#a2490c;}
.bo-dpill.is-approved{background:#e3f9ef;color:#0f7f52;}
.bo-dpill.is-cancelled{background:#fdeaea;color:#b02626;}
.bo-dpill.is-complete{background:#e5edff;color:#0a4fae;}
.bo-dpill.is-paid{background:#e3f9ef;color:#0f7f52;}
.bo-dpill.is-unpaid{background:#fdeaea;color:#b02626;}

/* ---------------------------------------------------------------------- buttons */
/* 44px minimum on every interactive target - the theme's btn-sm was 31px tall. */
.bo-dbtn{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-height:44px;padding:10px 15px;border:1px solid transparent;border-radius:14px;background:#f2f7fc;font-family:inherit;font-size:13px;font-weight:700;line-height:1.2;color:var(--bo-dd-ink);text-decoration:none;cursor:pointer;transition:transform .18s cubic-bezier(.22,1,.36,1),box-shadow .18s cubic-bezier(.22,1,.36,1),background-color .18s linear;}
.bo-dbtn:hover,.bo-dbtn:focus{text-decoration:none;color:var(--bo-dd-ink);transform:translateY(-1px);}
.bo-dbtn:focus-visible{outline:2px solid rgba(10,99,216,.5);outline-offset:2px;}
.bo-dbtn:active{transform:translateY(0);}
.bo-dbtn i{font-size:13px;}
.bo-dbtn--primary{background:linear-gradient(135deg,var(--boyodo-blue,#0a63d8),var(--boyodo-indigo,#0100dc));color:#fff;box-shadow:0 10px 24px -14px rgba(10,99,216,.6);}
.bo-dbtn--primary:hover,.bo-dbtn--primary:focus{color:#fff;box-shadow:0 14px 28px -14px rgba(10,99,216,.7);}
.bo-dbtn--go{background:linear-gradient(135deg,#0f9d63,#00b89c);color:#fff;box-shadow:0 10px 24px -14px rgba(15,157,99,.6);}
.bo-dbtn--go:hover,.bo-dbtn--go:focus{color:#fff;}
.bo-dbtn--stop{background:#fff;border-color:#f3c6c6;color:#b02626;}
.bo-dbtn--stop:hover,.bo-dbtn--stop:focus{background:#fdf3f3;color:#b02626;}
.bo-dbtn--ghost{background:#fff;border-color:var(--bo-dd-line);color:var(--bo-dd-ink);}
.bo-dbtn--ghost:hover,.bo-dbtn--ghost:focus{background:#f7fbff;}
/* A disabled action stays visible and readable, but is inert and says why via
   its title. The theme's .disabled class only dimmed an <a> - it still followed
   the link, so a completed appointment could be completed again. */
.bo-dbtn.is-off{opacity:.5;cursor:not-allowed;pointer-events:none;box-shadow:none;transform:none;}

/* ------------------------------------------------------------- patient rows */
.bo-dpat{margin:0;padding:0;list-style:none;display:grid;gap:8px;}
.bo-dpat__item[hidden]{display:none;}
.bo-dpat__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 12px;align-items:center;padding:11px 13px;border:1px solid var(--bo-dd-line);border-radius:16px;background:#fff;}
.bo-dpat__item img{width:40px;height:40px;border-radius:50%;object-fit:cover;background:#eef5ff;grid-row:1/3;}
.bo-dpat__name{min-width:0;font-size:14px;font-weight:700;line-height:1.3;color:var(--bo-dd-ink);text-decoration:none;overflow-wrap:anywhere;}
.bo-dpat__name:hover,.bo-dpat__name:focus{color:var(--bo-dd-accent);text-decoration:underline;}
.bo-dpat__links{display:flex;flex-wrap:wrap;gap:4px 12px;min-width:0;}
.bo-dpat__links a,.bo-dpat__links span{font-size:12px;line-height:1.4;color:var(--bo-dd-muted);text-transform:none;overflow-wrap:anywhere;}
.bo-dpat__links a{text-decoration:none;}
.bo-dpat__links a:hover,.bo-dpat__links a:focus{color:var(--bo-dd-accent);text-decoration:underline;}

/* ------------------------------------------------------------- empty / no hits */
.bo-dempty{margin:0;padding:26px 14px;text-align:center;font-size:13px;line-height:1.5;color:var(--bo-dd-muted);}
.bo-dempty i{display:block;margin:0 auto 8px;font-size:26px;color:#c6d7e4;}
.bo-dempty strong{display:block;margin-bottom:3px;font-size:14px;color:var(--bo-dd-ink);}
.bo-dnone{margin:10px 0 0;padding:14px;border:1px dashed var(--bo-dd-line);border-radius:14px;text-align:center;font-size:13px;color:var(--bo-dd-muted);}
.bo-dnone[hidden]{display:none;}

/* ------------------------------------------------------------------- motion */
/* One short entrance, staggered over the first few rows only, then never again -
   .bo-dstatic is set by the first interaction so filtering does not re-flash. */
@keyframes bo-drise{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
.bo-drec__item,.bo-dpat__item{animation:bo-drise .3s cubic-bezier(.22,1,.36,1) both;}
.bo-drec__item:nth-child(2),.bo-dpat__item:nth-child(2){animation-delay:.04s;}
.bo-drec__item:nth-child(3),.bo-dpat__item:nth-child(3){animation-delay:.08s;}
.bo-drec__item:nth-child(4),.bo-dpat__item:nth-child(4){animation-delay:.12s;}
.bo-drec__item:nth-child(n+5),.bo-dpat__item:nth-child(n+5){animation-delay:.16s;}
.bo-dstatic .bo-drec__item,.bo-dstatic .bo-dpat__item{animation:none;}

/* ------------------------------------------------------------------ 480px up */
@media (min-width:480px){
  .bo-dsw{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;}
  .bo-dsw__form{grid-column:auto;margin:0;}
  .bo-dsw__form button{width:auto;}
  .bo-drec__item{grid-template-columns:auto minmax(0,1fr) auto;}
  .bo-drec__pills{grid-column:3/4;grid-row:1/2;justify-content:flex-end;align-self:start;flex-direction:column;align-items:flex-end;}
  .bo-dtools{grid-template-columns:minmax(0,1fr) auto;align-items:center;}
  .bo-dtools__count{grid-column:1/-1;}
}

/* ------------------------------------------------------------------ 768px up */
@media (min-width:768px){
  .bo-dd__stats{grid-template-columns:repeat(3,minmax(0,1fr));}
  .bo-dstat:last-child:nth-child(odd){grid-column:auto;flex-direction:column;align-items:stretch;gap:8px;}
  .bo-dpanel__body{padding:16px;}
  .bo-dpat__item{grid-template-columns:auto minmax(0,14rem) minmax(0,1fr);}
  .bo-dpat__item img{grid-row:auto;}
  .bo-dtools{grid-template-columns:minmax(0,1fr) auto auto;}
  .bo-dtools__count{grid-column:auto;text-align:right;}
}

/* ----------------------------------------------------------------- 1024px up */
@media (min-width:1024px){
  .bo-dd__grid{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:16px;align-items:start;}
  .bo-dd__grid>*{margin-bottom:0;}
  .bo-dpanel__chart{min-height:280px;}
}

/* --------------------------------------------------------------- opt-outs */
@media (prefers-reduced-motion:reduce){
  .bo-drec__item,.bo-dpat__item{animation:none;}
  .bo-dbtn,.bo-drec__item{transition:none;}
  .bo-dbtn:hover,.bo-dbtn:focus,.bo-drec__item:hover{transform:none;}
}
@media print{
  .bo-dsw__form,.bo-dtools,.bo-drec__actions{display:none;}
  .bo-dpanel,.bo-drec__item,.bo-dstat{box-shadow:none;}
}

/* ==========================================================================
   DOCTOR FORMS  (bo-df* / bo-dnick*)
   Added 2026-08-24 with the doctor_profile.blade.php rewrite.
   --------------------------------------------------------------------------
   Mobile-first: one column is the default and the two-column grid only appears
   from 600px. The old page was the reverse - col-lg-6 pairs that collapsed into
   an undifferentiated 22-field stack on a phone.

   16px is the floor for every control's font-size, not a style choice: iOS
   Safari zooms the whole page when a focused input is smaller than that, and the
   doctor then has to pinch back out before they can reach the next field.

   THE .hide TRAP
   admin_custom.css:218 declares a bare `.hide{display:none}` and
   admin_custom.js:246/:326 toggle it on the custom-timeslot and commission
   fields. `.hide` is one class, and so is `.bo-dfield` - but this file loads
   later, so `.bo-dfield{display:block}` would beat it and permanently reveal
   both fields. `.bo-df .bo-dfield.hide` restores the intent at higher
   specificity. Same class of bug as the [hidden] companion rules above.
   jQuery's .show() sets an inline display:block, which is why .bo-dfield is
   block flow rather than a grid - the two must look identical either way.
   ========================================================================== */

.bo-df{padding-bottom:4px;}

/* ------------------------------------------------------------- error summary */
.bo-dfalert{display:flex;align-items:flex-start;gap:9px;margin:0 0 14px;padding:13px 15px;border-radius:16px;font-size:13px;font-weight:600;line-height:1.45;}
.bo-dfalert.is-bad{border:1px solid #f3c6c6;background:#fdf3f3;color:#a52020;}
.bo-dfalert i{margin-top:2px;font-size:14px;flex:none;}

/* ---------------------------------------------------------------- one field */
.bo-dfield{display:block;margin:0;min-width:0;}
/* Restores admin_custom.css:218 over this file's later, equal-specificity rule. */
.bo-df .bo-dfield.hide{display:none;}
.bo-dflabel{display:block;margin:0 0 6px;font-size:13px;font-weight:600;line-height:1.35;color:var(--bo-dd-ink,#0b2038);}
.bo-dfhint{display:block;margin:6px 0 0;font-size:12px;line-height:1.45;color:var(--bo-dd-muted,#61748a);}
/* Own class rather than Bootstrap's .invalid-feedback, which stays display:none
   until a sibling .is-invalid unhides it - a coupling that breaks silently the
   moment the markup nests differently. An unrendered error is the worst kind. */
.bo-dferr{display:block;margin:6px 0 0;font-size:12px;font-weight:600;line-height:1.45;color:#b02626;}

/* --------------------------------------------------------------- controls */
.bo-df .form-control{width:100%;min-height:44px;height:auto;padding:11px 14px;border:1px solid var(--bo-dd-line,#e4eef6);border-radius:12px;background:#f7fbff;font-family:inherit;font-size:16px;line-height:1.35;color:var(--bo-dd-ink,#0b2038);appearance:none;}
.bo-df .form-control:focus{outline:2px solid rgba(10,99,216,.35);outline-offset:1px;border-color:var(--boyodo-blue,#0a63d8);background:#fff;box-shadow:none;}
.bo-df .form-control[readonly],.bo-df .form-control:disabled{background:#eef3f8;color:#5b6b7d;cursor:not-allowed;}
.bo-df .form-control.is-invalid{border-color:#d94848;background:#fff8f8;}
.bo-df textarea.form-control{min-height:118px;resize:vertical;}
.bo-df select.form-control{padding-right:34px;background-image:linear-gradient(45deg,transparent 49%,#61748a 50%),linear-gradient(135deg,#61748a 50%,transparent 51%);background-position:calc(100% - 19px) 50%,calc(100% - 13px) 50%;background-size:6px 6px,6px 6px;background-repeat:no-repeat;}

/* select2 replaces the element, so it has to be restyled to match. The dropdown
   itself is appended to <body> and therefore out of this scope on purpose.
   width:100% matters in Firefox: admin_custom.js:29 asks select2 for
   `-webkit-fill-available`, which Firefox discards as invalid at parse time -
   dropping the inline width and letting this rule apply. In Chromium the valid
   inline value still wins, which is the same result. No !important either way. */
.bo-df .select2-container{width:100%;}
.bo-df .select2-container--default .select2-selection--single,
.bo-df .select2-container--default .select2-selection--multiple{height:auto;min-height:44px;padding:5px 7px;border:1px solid var(--bo-dd-line,#e4eef6);border-radius:12px;background:#f7fbff;}
.bo-df .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:6px;font-size:16px;line-height:32px;color:var(--bo-dd-ink,#0b2038);}
.bo-df .select2-container--default .select2-selection--single .select2-selection__arrow{height:42px;right:7px;}
.bo-df .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:3px 4px 0 0;padding:5px 9px;border:1px solid rgba(10,99,216,.25);border-radius:999px;background:rgba(10,99,216,.09);font-size:13px;color:#0a4fae;}
.bo-df .select2-container--default.select2-container--focus .select2-selection--multiple,
.bo-df .select2-container--default.select2-container--open .select2-selection--single{border-color:var(--boyodo-blue,#0a63d8);background:#fff;}

/* ------------------------------------------------------- identity + photo */
.bo-dfid{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;}
.bo-dfid__photo{min-width:0;}
.bo-dfid__fields{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;min-width:0;}
/* The theme's edit affordance is a 34px circle. Raised to 44px, and the "+"
   pseudo re-centred: it is positioned against .avatar-edit, not the label. */
.bo-df .avatar-upload .avatar-edit input+label{width:44px;height:44px;}
.bo-df .avatar-upload .avatar-edit input+label:after{top:50%;transform:translateY(-50%);font-size:23px;line-height:1;}
.bo-dfphone{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;align-items:start;}

/* ------------------------------------------------------------- field grid */
.bo-dfgrid{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;}

/* -------------------------------------------------------- sub-section head */
.bo-dfsub{margin:0;}
.bo-dfsub+.bo-dfsub{margin-top:18px;padding-top:18px;border-top:1px solid var(--bo-dd-line,#e4eef6);}
.bo-dfsub__title{margin:0 0 10px;font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:14px;font-weight:700;letter-spacing:-.01em;color:var(--bo-dd-ink,#0b2038);}
.bo-df .add-more{margin:10px 0 0;}

/* ----------------------------------------------------------- repeater rows */
/* These rows keep their Bootstrap grid markup because admin_custom.js:679/:716
   append new ones as HTML strings with exactly those classes, and that file is
   shared with the super-admin form. Restyling from the container means a
   JS-added row is indistinguishable from a server-rendered one, with no change
   to shared JS. Two classes beats .row / .col-*, so no !important. */
.bo-dfrep .education-cont,.bo-dfrep .awards-cont{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;margin:0 0 10px;padding:12px;border:1px solid var(--bo-dd-line,#e4eef6);border-radius:16px;background:#fbfdff;}
.bo-dfrep .education-cont>div,.bo-dfrep .awards-cont>div{min-width:0;max-width:none;padding:0;flex:none;width:auto;}
.bo-dfrep .education-cont .row{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;margin:0;}
.bo-dfrep .education-cont .row>div{min-width:0;max-width:none;padding:0;flex:none;width:auto;}
.bo-dfrep .form-group{margin:0;}
.bo-dfrep label{display:block;margin:0 0 6px;font-size:12px;font-weight:600;line-height:1.35;color:var(--bo-dd-muted,#61748a);}
/* The alignment spacer is .d-none/.d-md-block, both !important, so its display
   cannot be changed from here. Collapsing its box works without touching it. */
.bo-dfrep .education-cont>div>label,.bo-dfrep .awards-cont>div>label{height:0;margin:0;font-size:0;overflow:hidden;}
.bo-dfrep .form-control{width:100%;min-height:44px;height:auto;padding:11px 13px;border:1px solid var(--bo-dd-line,#e4eef6);border-radius:12px;background:#fff;font-family:inherit;font-size:16px;line-height:1.35;color:var(--bo-dd-ink,#0b2038);}
.bo-dfrep .form-control:focus{outline:2px solid rgba(10,99,216,.35);outline-offset:1px;border-color:var(--boyodo-blue,#0a63d8);}
.bo-dfrep .trash{display:inline-flex;align-items:center;justify-content:center;gap:7px;width:100%;min-height:44px;padding:10px 14px;border:1px solid #f3c6c6;border-radius:12px;background:#fff;font-size:13px;font-weight:700;color:#b02626;text-decoration:none;}
.bo-dfrep .trash:hover,.bo-dfrep .trash:focus{background:#fdf3f3;color:#b02626;}

/* ============================================================ nickname card */
/* The signature element of this page. The doctor is not told what the switch
   does - they are shown it, on the same card, updating as they type. */
.bo-dnick__preview{display:grid;gap:3px;margin:0 0 14px;padding:14px 15px;border:1px solid rgba(10,99,216,.14);border-radius:16px;background:linear-gradient(150deg,#eef5ff,#e9fbf7);}
.bo-dnick__tag{font-size:10px;font-weight:700;line-height:1.4;letter-spacing:.09em;text-transform:uppercase;color:var(--bo-dd-muted,#61748a);}
.bo-dnick__shown{font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:20px;font-weight:700;line-height:1.25;letter-spacing:-.02em;color:var(--bo-dd-ink,#0b2038);overflow-wrap:anywhere;transition:color .2s linear;}
.bo-dnick.is-on .bo-dnick__shown{color:var(--boyodo-blue,#0a63d8);}
.bo-dnick__legal{display:block;font-size:12px;line-height:1.45;color:var(--bo-dd-muted,#61748a);overflow-wrap:anywhere;}
.bo-dnick__legal[hidden]{display:none;}
.bo-dnick__switch{position:relative;display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:center;margin:14px 0 0;padding:12px 13px;min-height:44px;border:1px solid var(--bo-dd-line,#e4eef6);border-radius:16px;background:#fff;cursor:pointer;}
/* Visually hidden, still focusable and still hit by the wrapping label. */
.bo-dnick__switch input{position:absolute;top:50%;left:14px;width:1px;height:1px;opacity:0;margin:0;}
.bo-dnick__track{position:relative;display:block;width:52px;height:30px;border-radius:999px;background:#d7e3ee;transition:background-color .2s linear;flex:none;}
.bo-dnick__knob{position:absolute;top:3px;left:3px;width:24px;height:24px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(11,32,56,.28);transition:transform .22s cubic-bezier(.22,1,.36,1);}
.bo-dnick__switch input:checked+.bo-dnick__track{background:linear-gradient(135deg,var(--boyodo-blue,#0a63d8),var(--boyodo-teal,#00b89c));}
.bo-dnick__switch input:checked+.bo-dnick__track .bo-dnick__knob{transform:translateX(22px);}
.bo-dnick__switch input:focus-visible+.bo-dnick__track{outline:2px solid rgba(10,99,216,.5);outline-offset:2px;}
.bo-dnick__switchtext{min-width:0;}
.bo-dnick__switchtext strong{display:block;font-size:14px;font-weight:700;line-height:1.3;color:var(--bo-dd-ink,#0b2038);}
.bo-dnick__switchtext span{display:block;margin-top:2px;font-size:12px;line-height:1.45;color:var(--bo-dd-muted,#61748a);}

/* -------------------------------------------------------------- save bar */
/* sticky, not fixed - it stays in flow, so it cannot cover page content. If an
   ancestor's overflow defeats sticky, it simply renders where it sits. */
.bo-dfsave{position:sticky;bottom:0;z-index:5;display:grid;grid-template-columns:minmax(0,1fr);gap:10px;align-items:center;margin:16px 0 0;padding:12px 14px;border:1px solid var(--bo-dd-line,#e4eef6);border-radius:18px 18px 0 0;background:rgba(255,255,255,.96);box-shadow:0 -8px 26px -20px rgba(13,72,126,.55);}
.bo-dfsave p{margin:0;font-size:12px;line-height:1.45;color:var(--bo-dd-muted,#61748a);}
.bo-dfsave button{width:100%;}

/* ------------------------------------------------------------- 600px up */
@media (min-width:600px){
  .bo-dfid{grid-template-columns:auto minmax(0,1fr);align-items:start;}
  .bo-dfgrid{grid-template-columns:repeat(2,minmax(0,1fr));}
  .bo-dfgrid .is-wide{grid-column:1/-1;}
  .bo-dfrep .education-cont{grid-template-columns:minmax(0,1fr) auto;align-items:end;}
  .bo-dfrep .education-cont .row{grid-template-columns:repeat(2,minmax(0,1fr));}
  .bo-dfrep .awards-cont{grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto;align-items:end;}
  .bo-dfrep .trash{width:auto;min-width:44px;}
  .bo-dfsave{grid-template-columns:minmax(0,1fr) auto;}
  .bo-dfsave button{width:auto;}
}

/* ------------------------------------------------------------- 992px up */
@media (min-width:992px){
  .bo-dfrep .education-cont .row{grid-template-columns:repeat(3,minmax(0,1fr));}
  .bo-dnick__preview{padding:16px 18px;}
  .bo-dnick__shown{font-size:23px;}
}

@media (prefers-reduced-motion:reduce){
  .bo-dnick__knob,.bo-dnick__track,.bo-dnick__shown{transition:none;}
}
@media print{
  .bo-dfsave,.bo-df .add-more,.bo-dfrep .trash{display:none;}
}

/* ==========================================================================
   DOCTOR CONSOLE — SCHEDULE, REVIEWS, PASSWORD          (added 2026-08-24)
   ==========================================================================
   Loaded last in head_admin.blade.php, so every rule here beats the Stisla
   theme's single-class selectors on source order alone. Nothing below uses
   !important; the file's count stays at 4, all of them in .boyodo-btn-gradient.

   THE ONE THING THAT COULD NOT BE FIXED FROM CSS
   The time chips were emitted as `badge badge-primary ml-2 mt-5` from both the
   Blade views and admin_custom.js. Bootstrap generates spacing utilities with
   !important, so `.mt-5{margin-top:3rem!important}` put a 48px gap above every
   chip and no later layer could reach it. The class was replaced with
   `bo-dchip` in all eight places that emit it — three in admin_custom.js and
   five Blade views (doctor, superAdmin/doctor, lab, pharmacyAdmin/pharmacy,
   superAdmin/pharmacy) — so the server render and the AJAX render still match
   each other exactly. .bo-dchip below therefore has to carry the spacing for
   all five pages, which is why the box model is global and only the colour is
   scoped to .bo-dd.
   ========================================================================== */

/* --------------------------------------------------------------- time chips */
/* Global: replaces what ml-2/mt-5 used to do, on every page that shows slots. */
.bo-dchip{display:inline-flex;align-items:center;margin:0 8px 8px 0;padding:8px 13px;border-radius:999px;font-size:13px;font-weight:600;line-height:1.2;white-space:nowrap;}
/* Scoped: only the redesigned pages change hue. A saturated block of blue per
   chip fought the panel; a tint with dark blue text reads at a glance. */
.bo-dd .bo-dchip{border:1px solid #cfe1fb;background:#eaf2fe;color:#0a4fae;letter-spacing:.01em;}

/* ------------------------------------------------------------- day rail */
/* .nav is kept on the container so Bootstrap's tab plugin can still move
   `active` between the chips; its flex-wrap is replaced by a scroller. */
.bo-dsch__rail{display:flex;flex-wrap:nowrap;gap:8px;overflow-x:auto;overflow-y:hidden;padding:12px 14px;margin:0;border-bottom:1px solid var(--bo-dd-line);scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;scrollbar-width:thin;}
.bo-dsch__rail::-webkit-scrollbar{height:4px;}
.bo-dsch__rail::-webkit-scrollbar-thumb{border-radius:4px;background:#d3e3ef;}

.bo-dsch__day{position:relative;display:flex;flex-direction:column;justify-content:center;gap:2px;flex:none;min-width:104px;min-height:58px;padding:9px 12px;border:1px solid var(--bo-dd-line);border-radius:16px;background:#fff;color:var(--bo-dd-ink);text-align:left;scroll-snap-align:start;cursor:pointer;transition:transform .16s cubic-bezier(.22,1,.36,1),box-shadow .16s ease,border-color .16s ease;}
.bo-dsch__day:hover,.bo-dsch__day:focus{color:var(--bo-dd-ink);border-color:#b9d4ea;text-decoration:none;}
.bo-dsch__day:focus-visible{outline:2px solid var(--bo-dd-accent);outline-offset:2px;}
.bo-dsch__day strong{font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:14px;font-weight:700;line-height:1.2;letter-spacing:-.01em;}
.bo-dsch__day small{display:flex;align-items:center;gap:4px;font-size:11px;font-weight:600;line-height:1.2;color:var(--bo-dd-muted);}
.bo-dsch__day small i{font-size:9px;}
.bo-dsch__day.is-open small{color:#0f7f52;}
.bo-dsch__day.is-shut small{color:#a2490c;}
.bo-dsch__day.is-shut{background:#fbfcfd;}

/* Bootstrap moves `active` here on every tab click, so the selected state has
   to be declared on .active rather than a class of our own. */
.bo-dsch__day.active{border-color:transparent;background:linear-gradient(150deg,var(--boyodo-blue,#0a63d8),var(--boyodo-indigo,#0100dc));color:#fff;box-shadow:0 12px 26px -16px rgba(10,99,216,.75);transform:translateY(-1px);}
.bo-dsch__day.active strong,.bo-dsch__day.active small,.bo-dsch__day.active.is-open small,.bo-dsch__day.active.is-shut small{color:#fff;}
.bo-dsch__day.active:hover,.bo-dsch__day.active:focus{color:#fff;}

/* Today is a fact about the calendar, not about the selection, so it is marked
   separately — otherwise a doctor reading a Tuesday tab assumes it is today. */
.bo-dsch__todaytag{position:absolute;top:-7px;right:8px;padding:1px 7px;border-radius:999px;background:var(--boyodo-teal,#00b89c);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#fff;}
.bo-dsch__day.is-today{border-color:rgba(0,184,156,.55);}

/* --------------------------------------------------- the slot panel itself */
/* Flow, not floats: the chips wrap and the edit action is pushed to the end.
   float-right is !important and unreachable, but a float is simply ignored on a
   flex item, so the utility becomes inert instead of being fought. */
.bo-dsch .doc-times{display:flex;flex-wrap:wrap;align-items:center;gap:0;}
.bo-dsch .doc-times>.float-right{margin-left:auto;}
.bo-dsch .doc-times>.bo-dempty{flex:1 1 100%;}
/* btn-danger for "Edit Slot" is the theme's choice and comes from shared JS.
   Three classes beat .btn-danger, so the colour is corrected without touching
   the injected markup — red reads as "delete" next to a list of times. */
.bo-dsch .doc-times .btn-danger{display:inline-flex;align-items:center;gap:7px;min-height:44px;padding:10px 16px;border:none;border-radius:14px;background:linear-gradient(135deg,var(--boyodo-blue,#0a63d8),var(--boyodo-indigo,#0100dc));font-size:14px;font-weight:600;color:#fff;box-shadow:0 10px 24px -14px rgba(10,99,216,.6);}
.bo-dsch .doc-times .btn-danger:hover,.bo-dsch .doc-times .btn-danger:focus{background:linear-gradient(135deg,#0a58bd,#0a00c4);color:#fff;}
.bo-dsch__cta{margin:0;padding:0 14px 16px;text-align:center;}

/* ------------------------------------------------------ edit-slot modal */
/* A bottom sheet on a phone: the form is thumb-reachable and the page behind
   stays visible, which is how a native time editor behaves. */
.bo-dsch__modal .modal-dialog{align-items:flex-end;min-height:100%;max-width:none;margin:0;}
.bo-dsch__modal .modal-content{border:none;border-radius:22px 22px 0 0;box-shadow:0 -18px 50px -20px rgba(11,32,56,.45);}
.bo-dsch__modal .modal-dialog-scrollable .modal-content{max-height:88vh;}
.bo-dsch__modal .modal-header{align-items:center;padding:16px 18px;border-bottom:1px solid var(--bo-dd-line);}
.bo-dsch__modal .modal-title{font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:16px;font-weight:700;letter-spacing:-.01em;}
.bo-dsch__modal .modal-body{padding:16px 18px;}
.bo-dsch__foot{display:flex;gap:10px;padding:14px 18px;border-top:1px solid var(--bo-dd-line);background:#fbfdff;}
.bo-dsch__foot .bo-dbtn{flex:1 1 0;justify-content:center;}

.bo-dsch__status{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--bo-dd-line);border-radius:16px;background:#f7fbff;}
.bo-dsch__status>label{margin:0;flex:none;}
.bo-dsch__statustext{display:block;min-width:0;}
.bo-dsch__statustext strong{display:block;font-size:14px;font-weight:700;line-height:1.25;}
.bo-dsch__statustext span{display:block;margin-top:2px;font-size:12px;line-height:1.45;color:var(--bo-dd-muted);}

/* ================================================================ reviews */
.bo-drev__summary{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;padding:16px;}
.bo-drev__score{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;}
.bo-drev__score>strong{font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:38px;font-weight:700;line-height:1;letter-spacing:-.03em;}
.bo-drev__score small{flex:1 1 100%;font-size:12px;font-weight:600;color:var(--bo-dd-muted);}
.bo-drev__stars{display:inline-flex;gap:3px;font-size:14px;color:#dbe6ef;}
.bo-drev__stars .is-lit{color:#f0a52a;}

.bo-drev__spread{margin:0;padding:0;list-style:none;display:grid;gap:6px;}
.bo-drev__spread li{display:grid;grid-template-columns:34px minmax(0,1fr) 26px;align-items:center;gap:8px;font-size:12px;font-weight:600;color:var(--bo-dd-muted);}
.bo-drev__spreadstar{display:inline-flex;align-items:center;gap:3px;color:var(--bo-dd-ink);}
.bo-drev__spreadstar i{font-size:9px;color:#f0a52a;}
.bo-drev__bar{display:block;height:7px;border-radius:999px;background:#eef4f9;overflow:hidden;}
.bo-drev__bar>span{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#f0a52a,#e0821a);}
.bo-drev__spreadnum{text-align:right;}

.bo-drev__tools{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:0 0 12px;}
.bo-drev__search{position:relative;display:block;flex:1 1 220px;margin:0;}
.bo-drev__search>i{position:absolute;top:50%;left:14px;transform:translateY(-50%);font-size:13px;color:var(--bo-dd-muted);pointer-events:none;}
/* 16px, not 14: iOS Safari zooms the whole page when a focused control is
   smaller, and the user then has to pinch back out to read the results. */
.bo-drev__search input{width:100%;min-height:44px;padding:11px 14px 11px 38px;border:1px solid var(--bo-dd-line);border-radius:14px;background:#fff;font-size:16px;color:var(--bo-dd-ink);-webkit-appearance:none;appearance:none;}
.bo-drev__search input:focus{outline:none;border-color:var(--bo-dd-accent);box-shadow:0 0 0 3px rgba(10,99,216,.14);}
.bo-drev__count{margin:0;font-size:12px;font-weight:600;color:var(--bo-dd-muted);}

.bo-drev__list{display:grid;gap:12px;}
.bo-drev__card{padding:14px;border:1px solid var(--bo-dd-line);border-radius:18px;background:#fff;box-shadow:0 1px 2px rgba(18,54,85,.04);}
.bo-drev__card[hidden]{display:none;}
.bo-drev__head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 10px;}
.bo-drev__who{display:flex;align-items:center;gap:10px;min-width:0;}
.bo-drev__initial{display:flex;align-items:center;justify-content:center;width:38px;height:38px;flex:none;border-radius:13px;background:linear-gradient(150deg,rgba(10,99,216,.12),rgba(0,184,156,.14));font-family:'Sora','Plus Jakarta Sans',sans-serif;font-size:15px;font-weight:700;color:var(--bo-dd-accent);}
.bo-drev__who strong{display:block;font-size:14px;font-weight:700;line-height:1.3;overflow-wrap:anywhere;}
.bo-drev__who small{display:block;font-size:11px;font-weight:600;color:var(--bo-dd-muted);}
.bo-drev__rate{display:inline-flex;gap:3px;font-size:13px;color:#dbe6ef;}
.bo-drev__rate .is-lit{color:#f0a52a;}
/* The patient's own words are the content of this page, so they get the size. */
.bo-drev__text{margin:10px 0 0;font-size:14px;line-height:1.55;color:var(--bo-dd-ink);overflow-wrap:anywhere;}
.bo-drev__text.is-muted{font-size:13px;font-style:italic;color:var(--bo-dd-muted);}
.bo-drev__ref{display:flex;align-items:center;gap:6px;margin:10px 0 0;padding-top:10px;border-top:1px dashed var(--bo-dd-line);font-size:12px;font-weight:600;color:var(--bo-dd-muted);}
.bo-drev__ref span{color:var(--bo-dd-ink);overflow-wrap:anywhere;}
.bo-drev__none[hidden]{display:none;}
.bo-drev__none{border:1px dashed var(--bo-dd-line);border-radius:18px;background:#fff;}

/* ====================================================== change password */
.bo-dpw__card{max-width:520px;}
.bo-dpw__form{display:grid;gap:14px;}
.bo-dpw__wrap{position:relative;display:block;}
.bo-dpw__wrap .form-control{padding-right:50px;}
.bo-dpw__peek{position:absolute;top:50%;right:5px;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:none;border-radius:12px;background:transparent;font-size:15px;color:var(--bo-dd-muted);cursor:pointer;}
.bo-dpw__peek:hover,.bo-dpw__peek:focus{background:#eef5fc;color:var(--bo-dd-accent);}
.bo-dpw__peek:focus-visible{outline:2px solid var(--bo-dd-accent);outline-offset:1px;}
.bo-dpw__peek.is-on{color:var(--bo-dd-accent);}
.bo-dfhint.is-good{color:#0f7f52;}
.bo-dfhint.is-bad{color:#b02626;}
.bo-dbtn--block{width:100%;justify-content:center;}

/* ------------------------------------------------------------- ≥600px */
@media (min-width:600px){
  .bo-drev__summary{grid-template-columns:auto minmax(0,1fr);gap:20px;align-items:center;}
  .bo-drev__score{flex-direction:column;align-items:flex-start;gap:4px;padding-right:20px;border-right:1px solid var(--bo-dd-line);}
  .bo-drev__score small{flex:none;}
  .bo-drev__list{grid-template-columns:repeat(2,minmax(0,1fr));}
  .bo-dsch__modal .modal-dialog{align-items:center;min-height:calc(100% - 3.5rem);max-width:540px;margin:1.75rem auto;}
  .bo-dsch__modal .modal-content{border-radius:22px;}
  .bo-dsch__modal .modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem);}
  .bo-dsch__foot{justify-content:flex-end;}
  .bo-dsch__foot .bo-dbtn{flex:0 0 auto;min-width:132px;}
  .bo-dbtn--block{width:auto;min-width:180px;}
}

/* ------------------------------------------------------------- ≥992px */
@media (min-width:992px){
  .bo-dsch__day{min-width:118px;}
  .bo-drev__score>strong{font-size:44px;}
}

/* ------------------------------------------------------------------ press */
/* Doctors run this console on a phone between patients, and until now the only
   press feedback in the whole file was `.bo-dbtn:active`. Everything else was
   `:hover`, which on touch either never fires or sticks after the finger lifts.

   Tap-highlight first: Android draws a translucent grey rectangle over the
   tapped element, ignoring border-radius, so an 18px-radius card flashes a hard
   box. Suppressing it is only defensible because each element below supplies a
   visible press state of its own.

   Scoped to .bo-dd so it cannot reach the rest of the admin theme, whose
   buttons have no replacement press state and would be left with no tap
   feedback at all. Transform and border only - no colour tweens under a
   finger, which read as lag rather than as response. */
.bo-dd a,.bo-dd button,.bo-dd label{-webkit-tap-highlight-color:transparent;}

.bo-dbtn:active{transform:scale(.97);}
.bo-dsch__day:active{transform:scale(.97);}
.bo-dpw__peek:active{transform:scale(.92);}
.bo-dnick__switch:active .bo-dnick__track{box-shadow:0 0 0 4px rgba(10,99,216,.16);}
/* The booking on/off button is a .bo-dbtn already, so it needs no rule of its
   own here - a `.bo-dsw__form button` press state would only out-specify the
   line above with a different scale and show up as a real cascade conflict. */
/* The record is not a control, so it settles rather than scales: scaling a whole
   booking row under the thumb hides the line being read. */
.bo-drec__item:active{border-color:#b9dcff;box-shadow:0 1px 4px rgba(11,32,56,.08);}

@media (prefers-reduced-motion:reduce){
  .bo-dsch__day,.bo-dsch__day.active{transition:none;transform:none;}
  /* Movement goes; the border/shadow presses stay, because a reduced-motion
     user still needs to see that the tap landed. */
  .bo-dbtn:active,.bo-dsch__day:active,.bo-dpw__peek:active,
  .bo-dsw__form button:active{transform:none;}
}

@media print{
  .bo-drev__tools,.bo-dsch__rail,.bo-dpw__peek{display:none;}
  .bo-drev__card,.bo-dpanel{box-shadow:none;}
}

/* ==========================================================================
   Clinic pricing and availability (superAdmin/doctor/_clinic_pricing)
   --------------------------------------------------------------------------
   Uses the same tokens as the rest of this file - boyodo blue for primary,
   teal for success, ink for content text, #e4eef6 for lines, 44px controls,
   12-20px radii - so the section reads as part of the panel rather than as a
   bolted-on feature.

   The grid is auto-fill/minmax rather than a fixed column count: a doctor with
   one clinic gets one wide card, a doctor with four gets a sensible wrap, and
   at 360px every card is full width with no horizontal overflow. No media
   query needed for the layout itself, which is why there is none.
   ========================================================================== */
.bo-cp{--bo-cp-line:#e4eef6;--bo-cp-ink:var(--boyodo-ink,#0b2038);--bo-cp-muted:var(--boyodo-muted,#61748a);--bo-cp-blue:var(--boyodo-blue,#0a63d8);--bo-cp-teal:var(--boyodo-teal,#00b89c);}
.bo-cp .card-header{gap:8px 16px;}
.bo-cp__platform{font-size:12px;font-weight:600;color:var(--bo-cp-muted);}
.bo-cp__platform strong{color:var(--bo-cp-ink);}
.bo-cp__platform span{font-weight:500;}
.bo-cp__empty{margin:0;padding:26px 14px;border:1px dashed var(--bo-cp-line);border-radius:16px;text-align:center;font-size:13px;line-height:1.55;color:var(--bo-cp-muted);}
.bo-cp__empty strong{display:block;margin-bottom:4px;font-size:14px;color:var(--bo-cp-ink);}

.bo-cp__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,320px),1fr));gap:16px;}

.bo-cp__card{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--bo-cp-line);border-radius:18px;background:#fff;box-shadow:0 1px 2px rgba(18,54,85,.04);}
.bo-cp__card--error{border-color:#e0525f;box-shadow:0 0 0 3px rgba(224,82,95,.12);}

.bo-cp__head{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:4px 12px;align-items:center;}
.bo-cp__avatar{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:12px;background:linear-gradient(135deg,rgba(10,99,216,.10),rgba(0,184,156,.10));color:var(--bo-cp-blue);overflow:hidden;flex:none;}
.bo-cp__avatar img{width:100%;height:100%;object-fit:cover;}
.bo-cp__ident{min-width:0;}
.bo-cp__ident h4{margin:0;font-size:15px;font-weight:700;line-height:1.3;color:var(--bo-cp-ink);overflow-wrap:anywhere;}
.bo-cp__ident p{margin:2px 0 0;font-size:12px;line-height:1.4;color:var(--bo-cp-muted);overflow-wrap:anywhere;}

.bo-cp__badge{align-self:start;padding:4px 10px;border-radius:999px;font-size:11px;font-weight:700;line-height:1.3;white-space:nowrap;}
.bo-cp__badge.is-complete{background:rgba(0,184,156,.12);color:#00806c;}
.bo-cp__badge.is-incomplete{background:rgba(224,138,20,.14);color:#8a5200;}
.bo-cp__badge.is-disabled{background:rgba(97,116,138,.14);color:#4a5b6d;}
.bo-cp__badge.is-legacy{background:rgba(10,99,216,.10);color:#0a4fa8;}

.bo-cp__note{margin:0;padding:9px 12px;border-radius:12px;background:rgba(10,99,216,.06);font-size:12px;line-height:1.5;color:#0a4fa8;}

.bo-cp__switch{display:flex;gap:10px;align-items:center;min-height:44px;margin:0;font-size:14px;font-weight:600;color:var(--bo-cp-ink);cursor:pointer;}
.bo-cp__switch input{width:20px;height:20px;flex:none;accent-color:var(--bo-cp-blue);cursor:pointer;}
.bo-cp__switch input:focus-visible{outline:2px solid var(--bo-cp-blue);outline-offset:2px;}

.bo-cp__modes{display:flex;flex-direction:column;gap:10px;}
.bo-cp__mode{padding:10px 12px;border:1px solid var(--bo-cp-line);border-radius:14px;background:#f7fbff;}
.bo-cp__fee{margin-top:6px;}
.bo-cp__fee label{display:block;margin:0 0 6px;font-size:12px;font-weight:600;color:var(--bo-cp-ink);}
.bo-cp__fee .form-control{width:100%;min-height:44px;padding:10px 14px;border:1px solid var(--bo-cp-line);border-radius:12px;background:#fff;font-size:16px;color:var(--bo-cp-ink);}
.bo-cp__fee .form-control:focus{outline:2px solid rgba(10,99,216,.35);outline-offset:1px;border-color:var(--bo-cp-blue);box-shadow:none;}
.bo-cp__fee .form-control.is-invalid{border-color:#e0525f;}
/* Only ever applied by the script; with JS off the attribute is never removed
   from the markup either, so nothing is hidden and every field stays usable. */
.bo-cp__fee[data-bo-cp-collapsed]{display:none;}

.bo-cp__hint{margin:6px 0 0;font-size:12px;line-height:1.45;color:var(--bo-cp-muted);}
.bo-cp__hint--warn{color:#8a5200;}
.bo-cp__error{margin:6px 0 0;font-size:12px;line-height:1.45;font-weight:600;color:#c0392f;}

.bo-cp__foot{display:flex;justify-content:flex-end;margin-top:auto;padding-top:4px;}
.bo-cp__unlink{display:inline-flex;gap:7px;align-items:center;min-height:44px;padding:8px 12px;border:1px solid var(--bo-cp-line);border-radius:12px;background:#fff;font-size:12px;font-weight:700;color:#c0392f;cursor:pointer;}
.bo-cp__unlink:hover,.bo-cp__unlink:focus{background:rgba(192,57,47,.06);}
.bo-cp__unlink:focus-visible{outline:2px solid #c0392f;outline-offset:2px;}
.bo-cp__locked{display:inline-flex;gap:7px;align-items:center;font-size:12px;font-weight:600;color:var(--bo-cp-muted);}

.bo-cp__actions{display:flex;justify-content:flex-end;margin-top:16px;}
.bo-cp__actions .btn{min-height:44px;padding:11px 22px;border-radius:14px;font-weight:700;}

@media (max-width:480px){
  .bo-cp__head{grid-template-columns:auto minmax(0,1fr);}
  .bo-cp__badge{grid-column:1 / -1;justify-self:start;}
  .bo-cp__actions{justify-content:stretch;}
  .bo-cp__actions .btn{width:100%;}
}

/* ===========================================================================
   Legacy admin table adapter
   --------------------------------------------------------------------------
   admin_custom.js adds data-label from the real column headings. At <=820px
   each row becomes one readable record card; desktop keeps the native table.
   ========================================================================== */
.bo-responsive-table td,.bo-responsive-table th{overflow-wrap:anywhere;}

/* Revenue has many financial columns: keep desktop values aligned and turn
   each booking into a labelled record on narrow screens. */
.bo-revenue-table{min-width:1420px;table-layout:auto}
.bo-revenue-table th{white-space:nowrap!important;vertical-align:middle}
.bo-revenue-table td{vertical-align:top;white-space:nowrap}
.bo-revenue-table td small{white-space:normal}
@media (max-width: 767.98px){
  .bo-revenue-table{min-width:0!important;width:100%!important;border-collapse:separate!important;border-spacing:0 12px!important}
  .bo-revenue-table thead{display:none}
  .bo-revenue-table tbody,.bo-revenue-table tr,.bo-revenue-table td{display:block;width:100%}
  .bo-revenue-table tbody tr{padding:10px 14px;border:1px solid #e4eef6;border-radius:18px;background:#fff;box-shadow:0 12px 28px -24px rgba(13,72,126,.55)}
  .bo-revenue-table tbody td{display:grid;grid-template-columns:minmax(104px,38%) minmax(0,1fr);gap:10px;align-items:center;min-height:44px;padding:9px 0;border:0;border-bottom:1px solid #edf3f7;text-align:left;white-space:normal!important;overflow-wrap:anywhere}
  .bo-revenue-table tbody td:last-child{border-bottom:0}
  .bo-revenue-table tbody td::before{content:attr(data-label);font-size:11px;font-weight:800;line-height:1.35;letter-spacing:.035em;text-transform:uppercase;color:#61748a}
  .bo-revenue-table tbody td:first-child{display:flex;min-height:44px;padding-top:2px}
  .bo-revenue-table tbody td:first-child::before{display:none}
  .bo-revenue-table tbody td[colspan]{display:block!important;text-align:center}
  .bo-revenue-table tbody td[colspan]::before{display:none}
}
.dataTables_wrapper .dataTables_filter input,
.dataTables_wrapper .dataTables_length select{min-height:44px;border-radius:12px;}
.dataTables_wrapper .dataTables_paginate .paginate_button{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center;}

@media (max-width:820px){
  .table-responsive{overflow:visible;}
  .dataTables_wrapper{width:100%;overflow:visible;}
  .dataTables_wrapper>.row{gap:10px;margin-inline:0;}
  .dataTables_wrapper>.row>[class*="col-"]{flex:0 0 100%;max-width:100%;padding-inline:0;}
  .dataTables_wrapper .dataTables_length,
  .dataTables_wrapper .dataTables_filter,
  .dataTables_wrapper .dataTables_info,
  .dataTables_wrapper .dataTables_paginate{text-align:left;float:none;}
  .dataTables_wrapper .dataTables_filter label{display:grid;grid-template-columns:1fr;gap:6px;width:100%;}
  .dataTables_wrapper .dataTables_filter input{width:100%;margin:0;}

  table.bo-responsive-table{display:block;width:100%;border:0;background:transparent;}
  table.bo-responsive-table thead{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;}
  table.bo-responsive-table tbody{display:grid;width:100%;gap:12px;}
  table.bo-responsive-table tbody tr{display:block;width:100%;padding:8px 14px;border:1px solid #e4eef6;border-radius:18px;background:#fff;box-shadow:0 10px 28px -24px rgba(13,72,126,.5);}
  table.bo-responsive-table tbody td{display:grid;grid-template-columns:minmax(104px,38%) minmax(0,1fr);gap:10px;align-items:center;width:100%;min-height:44px;padding:9px 0;border:0;border-bottom:1px solid #edf3f7;text-align:left;white-space:normal;}
  table.bo-responsive-table tbody td:last-child{border-bottom:0;}
  table.bo-responsive-table tbody td::before{content:attr(data-label);font-size:11px;font-weight:800;line-height:1.35;letter-spacing:.035em;text-transform:uppercase;color:#61748a;}
  table.bo-responsive-table tbody td[colspan]{display:block;min-height:0;text-align:center;}
  table.bo-responsive-table tbody td[colspan]::before,
  table.bo-responsive-table tbody td[data-label=""]::before{display:none;}
  table.bo-responsive-table tbody td .btn,
  table.bo-responsive-table tbody td button,
  table.bo-responsive-table tbody td a[role="button"]{min-height:44px;min-width:44px;align-items:center;justify-content:center;}
  table.bo-responsive-table tbody td .custom-switch{min-height:44px;display:flex;align-items:center;}
  table.bo-responsive-table tbody td img{max-width:64px;height:auto;}
}

@media (max-width:390px){
  table.bo-responsive-table tbody td{grid-template-columns:minmax(88px,35%) minmax(0,1fr);gap:8px;}
}
.boyodo-doctor-table-wrap{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}
.boyodo-doctor-table{min-width:1420px!important;width:max-content!important;table-layout:auto!important}
.boyodo-doctor-table th,.boyodo-doctor-table td{white-space:nowrap!important;word-break:normal!important;overflow-wrap:normal!important;vertical-align:middle}
.boyodo-doctor-table td:nth-child(3){min-width:180px}
.boyodo-doctor-table td:nth-child(4){min-width:210px}
.boyodo-doctor-table td:nth-child(5){min-width:150px;white-space:normal!important}

@media (max-width:820px){
  .boyodo-doctor-table-wrap{overflow:visible!important}
  table.boyodo-doctor-table{min-width:0!important;width:100%!important;table-layout:auto!important}
  table.boyodo-doctor-table thead{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
  table.boyodo-doctor-table tbody{display:grid;width:100%;gap:12px}
  table.boyodo-doctor-table tbody tr{display:block;width:100%;padding:8px 14px;border:1px solid #e4eef6;border-radius:18px;background:#fff;box-shadow:0 10px 28px -24px rgba(13,72,126,.5)}
  table.boyodo-doctor-table tbody td{display:grid;grid-template-columns:minmax(104px,38%) minmax(0,1fr);gap:10px;align-items:center;width:100%;min-width:0!important;min-height:44px;padding:9px 0;border:0;border-bottom:1px solid #edf3f7;text-align:left;white-space:normal!important;overflow-wrap:anywhere}
  table.boyodo-doctor-table tbody td:last-child{border-bottom:0}
  table.boyodo-doctor-table tbody td::before{content:attr(data-label);font-size:11px;font-weight:800;line-height:1.35;letter-spacing:.035em;text-transform:uppercase;color:#61748a}
  table.boyodo-doctor-table tbody td:first-child{display:flex;min-height:44px;padding-top:2px}
  table.boyodo-doctor-table tbody td:first-child::before{display:none}
  table.boyodo-doctor-table tbody td .btn,
  table.boyodo-doctor-table tbody td button,
  table.boyodo-doctor-table tbody td a{min-height:44px;align-items:center}
  table.boyodo-doctor-table tbody td img{max-width:64px;height:auto}
}

/* Appointment records have many actions. Keep the table readable instead of
   allowing DataTables to squeeze headings into one letter per line. */
.boyodo-appointment-page .boyodo-appointment-table-wrap{
  width:100%;
  overflow-x:auto!important;
  overflow-y:hidden;
  -webkit-overflow-scrolling:touch;
}
.boyodo-appointment-page .boyodo-appointment-table{
  width:max-content!important;
  min-width:1280px!important;
  table-layout:auto!important;
}
.boyodo-appointment-page .boyodo-appointment-table thead th{
  min-width:86px;
  padding:14px 12px!important;
  white-space:nowrap!important;
  word-break:normal!important;
  overflow-wrap:normal!important;
  line-height:1.3;
  vertical-align:middle;
}
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(1){min-width:52px}
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(3){min-width:120px}
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(4){min-width:170px}
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(6){min-width:150px}
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(7){min-width:120px}
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(10),
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(11),
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(12),
.boyodo-appointment-page .boyodo-appointment-table thead th:nth-child(13){min-width:140px}
.boyodo-appointment-page .boyodo-appointment-table tbody td{
  min-width:86px;
  white-space:normal!important;
  word-break:normal!important;
  overflow-wrap:anywhere;
  vertical-align:middle;
}
@media (max-width:820px){
  .boyodo-appointment-page .boyodo-appointment-table-wrap{margin-inline:-10px;width:calc(100% + 20px);padding-inline:10px}
  .boyodo-appointment-page .boyodo-appointment-table{min-width:1120px!important}
  .boyodo-appointment-page .boyodo-appointment-table thead th{font-size:11px;padding:11px 9px!important}
}
.boyodo-doctor-table td:last-child{min-width:120px}

/* Secure bill and salary-slip controls. Kept independent from Bootstrap's
   nested row sizing so the settings remain readable on phone widths. */
.boyodo-setting-panel{display:grid;grid-template-columns:52px minmax(0,1fr);gap:16px;padding:18px;border:1px solid #dce8f2;border-radius:18px;background:linear-gradient(135deg,#f5f9ff,#f1fbfa)}
.boyodo-setting-panel__icon{width:52px;height:52px;display:grid;place-items:center;border-radius:16px;background:linear-gradient(135deg,#075fe6,#00a99d);color:#fff;font-size:20px}
.boyodo-setting-panel__content{display:grid;gap:9px;min-width:0;color:#102a43}
.boyodo-setting-panel__content>strong{font-size:16px}
.boyodo-setting-panel__content>small{color:#64748b}
.boyodo-setting-toggle{display:flex!important;align-items:flex-start;gap:10px;margin:0!important;padding:11px 13px;border:1px solid #dce8f2;border-radius:12px;background:#fff;color:#243b53;font-weight:700;line-height:1.35;cursor:pointer}
.boyodo-setting-toggle input{flex:0 0 auto;width:18px;height:18px;margin-top:1px;accent-color:#075fe6}
@media(max-width:575px){.boyodo-setting-panel{grid-template-columns:1fr;padding:14px}.boyodo-setting-panel__icon{width:44px;height:44px;border-radius:14px}}
