/* =====================================================================
   চকরিয়া HDSS তাপপ্রবাহ সতর্কীকরণ — ডিজাইন সিস্টেম  v4.0
   ---------------------------------------------------------------------
   পাবলিক সাইট ও অ্যাডমিন প্যানেল — দুটোই এই একই টোকেন ব্যবহার করে।
   নীতি: পরিষ্কার ও মিনিমাল বিন্যাস, রঙ শুধু ডেটার অর্থ বোঝাতে।

   v4.0-এ যা বদলাল:
   · তাপ-স্তরের প্যালেট নতুন করে তৈরি — আগে সতর্কতা ব্যানারে সাদা লেখা
     হলুদ পটভূমিতে ২.০:১ কনট্রাস্টে ছিল (পড়া যেত না)। এখন প্রতিটি স্তরের
     নিজস্ব পাঠযোগ্য লেখার রঙ আছে, সবগুলো WCAG AA (৪.৫:১) উত্তীর্ণ।
   · স্পেসিং ও টাইপ স্কেল যোগ — আগে ১৫টি এলোমেলো ফন্ট সাইজ ছিল
     (১০.৫, ১১.৫, ১২.৫, ১৩.৫ px...), h3 বডি টেক্সটের চেয়ে ছোট ছিল।
   · এলিভেশন হায়ারার্কি — আগে ৬টি আলাদা কম্পোনেন্টে একই ছায়া ছিল।
   · চার্ট কনটেইনার এখন aspect-ratio ভিত্তিক — মোবাইলে অনুপাত উল্টে
     যাওয়ার সমস্যা ঠিক হয়েছে।
   · ডার্ক মোড এখন সত্যিই কাজ করে (আগে index.php-তে data-theme="light"
     হার্ডকোড করা ছিল, তাই কখনো চালু হতো না)।
   ===================================================================== */

/* ---------------------------------------------------------- ১. টোকেন */
:root {
  /* পৃষ্ঠতল ও কালি */
  --paper:      #F5F7F4;
  --surface:    #FFFFFF;
  --surface-2:  #EDF1EC;
  --surface-3:  #E3E9E1;
  --ink:        #141A19;   /* 17.6:1 on white */
  --ink-2:      #41504C;   /*  8.5:1 */
  --ink-3:      #68766F;   /*  4.8:1 — ক্ষুদ্রতম পাঠযোগ্য */
  --line:       #DCE3DA;
  --line-2:     #C4CFC1;

  /* ব্র্যান্ড */
  --brand:      #0B6E6B;
  --brand-ink:  #075350;
  --brand-soft: #DDEFEC;

  /* তাপ স্তর ০–৪ — ক্রমবর্ধমান তীব্রতা, প্রতিটির নিজস্ব লেখার রঙ */
  --lvl0: #1B7F71;  --lvl0-fg: #FFFFFF;  --lvl0-soft: #DCEFEB;
  --lvl1: #E8B325;  --lvl1-fg: #141A19;  --lvl1-soft: #FBEFCE;
  --lvl2: #E2762A;  --lvl2-fg: #141A19;  --lvl2-soft: #FBE3D1;
  --lvl3: #C2371F;  --lvl3-fg: #FFFFFF;  --lvl3-soft: #F7D8D2;
  --lvl4: #8A1420;  --lvl4-fg: #FFFFFF;  --lvl4-soft: #F0D2D6;

  /* চার্ট সিরিজ — সতর্কতার রঙ থেকে আলাদা, যাতে "লাল" মানে বিপদই থাকে */
  --c1: #0E6E8C;  /* তাপমাত্রা */
  --c2: #C2371F;  /* অনুভূত তাপমাত্রা */
  --c3: #2E8F6F;  /* আর্দ্রতা */
  --c4: #8FA9C4;  /* অনিশ্চয়তার ব্যান্ড */
  --c5: #7A5AA6;  /* বিকল্প সিরিজ */
  --c6: #6B7A77;  /* নিরপেক্ষ */

  /* ==================================================================
     v11.0.0 — দুটি যন্ত্রের পরিচয়-রঙ
     ------------------------------------------------------------------
     ⚠ এগুলো **সিরিজের রঙ নয়, পরিচয়ের রঙ**। পাতার প্রতিটি ঘরে
       একই নিয়ম: কার্ডের বাঁ পটি, ট্যাগ, আর চার্টের প্রধান রেখা —
       যন্ত্র এক হলে রঙও এক। পাঠক তখন রঙ দেখেই জানেন সংখ্যাটি কোন
       যন্ত্রের, লেবেল না পড়েই।

     ⚠⚠ সতর্কতার রঙ-পরিবার থেকে ইচ্ছাকৃতভাবে দূরে রাখা হয়েছে
       (হলুদ/কমলা/লাল/মেরুন/সবুজ-টিল)। নইলে "লাল মানে বিপদ"
       নিয়মটি ভাঙত — কখনো লাল মানে বিপদ, কখনো নিছক একটি যন্ত্র।
       একটি সতর্কীকরণ ব্যবস্থায় সেটি গুরুতর ভুল।

     ⚠ জোড়াটি চোখে বাছা হয়নি, মেপে বাছা — dataviz-এর
       validate_palette.js দিয়ে দুই মোডেই চালানো:
           আলো     CVD ΔE ১১.২ (deutan) · স্বাভাবিক ২০.৩ — সব পাশ
           অন্ধকার CVD ΔE ১২.১ (deutan) · স্বাভাবিক ২০.৬ — সব পাশ
       প্রথম প্রার্থী ছিল নীল × বেগুনি; সেটি deutan-এ ΔE ৫.৪ দিয়ে
       **ব্যর্থ** হয়েছিল — অর্থাৎ বর্ণান্ধ পাঠকের কাছে দুটি যন্ত্র
       একই রঙের দেখাত, আর চোখে দেখে সেটি ধরা পড়ত না।
     ================================================================== */
  /* কাচের পৃষ্ঠ — অস্বচ্ছতা ৭২%, তাই blur না চললেও পড়া যায় */
  --glass:      rgba(255,255,255,.72);
  --glass-line: rgba(255,255,255,.85);
  --glass-2:    rgba(255,255,255,.55);

  --inst-heat:      #1E6FB8;
  --inst-heat-soft: #E4EEF8;
  --inst-air:       #9B3F7A;
  --inst-air-soft:  #F6E6F0;

  /* ---- BMD পূর্বাভাসের চার্ট — প্রতিটি চার্টে একটিমাত্র সিরিজ ----
     ⚠ তিনটি রঙ কখনো একই চার্টে থাকে না (তাপমাত্রা, বৃষ্টি ও আর্দ্রতা
       আলাদা চার্টে — এক অক্ষে দুই স্কেল কখনো নয়)। তবু তিনটিকে একসাথে
       যাচাই করা হয়েছে, যাতে পাশাপাশি চার্টেও আলাদা করে চেনা যায়:
       বর্ণান্ধতা ΔE ১৮.২, স্বাভাবিক দৃষ্টিতে ১৮.৯, পটভূমির সাথে
       বৈসাদৃশ্য ৩:১-এর উপরে — সব পাশ। */
  --usf-temp: #C2371F;
  --usf-rain: #256ABF;
  --usf-rh:   #2E8F6F;

  /* ------------------------------------------------------------------
     v6.5 — যাচাই-করা তুলনা-প্যালেট
     ------------------------------------------------------------------
     ⚠ --c2 (#C2371F) হুবহু --lvl3, অর্থাৎ "তীব্র তাপপ্রবাহ"-এর রঙ।
       "অনুভূত তাপমাত্রা" রেখাটি ঐ রঙে আঁকা মানে একটি সাধারণ সিরিজকে
       সতর্কতার রঙ ধার দেওয়া — তখন লাল দেখলে সেটা বিপদ না সিরিজ, বোঝার
       উপায় থাকে না। নিচের টোকেনগুলো তাই আলাদা, আর হাতে বাছা নয়:
       প্রতিটি সেট dataviz-এর validate_palette.js দিয়ে আলো ও অন্ধকার
       দুই মোডেই চালানো হয়েছে।

       --cmp1..3  বছরে-বছরে তুলনার রেখা (৩টি)
                  আলো: worst all-pairs CVD ΔE ৯.২, normal ২৪.০ — উত্তীর্ণ
                  অন্ধকার: CVD ৯.৪, normal ২০.৯ — উত্তীর্ণ
                  ⚠ তিনটির বেশি নয়। চতুর্থ রং যোগ করলে জোড়াগুলো
                    ফ্লোরের নিচে নামে; তখন সঠিক উত্তর ছোট-গুণিতক।
       --st1..6   স্টেশন-ভিত্তিক সিরিজ (৬টি পর্যন্ত)
                  পাশাপাশি জোড়ায় আলো: CVD ৯.১ / normal ১৯.৬ — উত্তীর্ণ
       --seq1..5  বৃষ্টির ক্রমিক র‍্যাম্প — এক রঙ, হালকা→গাঢ়
     ------------------------------------------------------------------ */
  --cmp1: #2a78d6;  --cmp2: #eb6834;  --cmp3: #1baf7a;
  --st1: #2a78d6; --st2: #eb6834; --st3: #1baf7a;
  --st4: #eda100; --st5: #e87ba4; --st6: #008300;
  --seq1: #cde2fb; --seq2: #9ec5f4; --seq3: #5598e7; --seq4: #256abf; --seq5: #104281;
  /* v8.1 — ষষ্ঠ ধাপ, কেবল বহু-বছরের রেখা-র‍্যাম্পের জন্য।
     পাঁচটি ধাপ ভরাট এলাকার (বৃষ্টির স্তম্ভ) জন্য যথেষ্ট ছিল, কিন্তু
     ১.৫ পিক্সেল সরু রেখায় সবচেয়ে হালকা ধাপটির কনট্রাস্ট ছিল মাত্র
     ১.৩২:১ — সাদার উপর কার্যত অদৃশ্য। র‍্যাম্পটি এক ধাপ গাঢ় দিকে
     বাড়িয়ে আর হালকা প্রান্তের ৪৫% বাদ দিয়ে এখন প্রতিটি রেখা
     ন্যূনতম ৩.৪:১ — দুই থিমেই মাপা। */
  --seq6: #08213f;
  /* v8.5 — উষ্ণ ক্রমিক র‍্যাম্প (মাস × বছর ম্যাট্রিক্স ও ঋতুর হিটম্যাপ)।
     কেন নীল --seq দিয়ে চলল না: ম্যাট্রিক্সের সংখ্যা তাপমাত্রা, আর নীল
     রঙ পাঠকের কাছে "ঠান্ডা" — গরমতম মাসটিকে গাঢ় নীলে দেখালে রঙটাই
     উল্টো কথা বলত। এটি একটি **ক্রমিক** র‍্যাম্প, শ্রেণিবাচক নয়, তাই
     validate_palette.js-এর "lightness band" ও "chroma floor" পরীক্ষা
     দুটি এর ক্ষেত্রে প্রযোজ্য নয় (স্ক্রিপ্ট নিজেই তা বলে দেয়);
     যেটি প্রযোজ্য — উজ্জ্বলতার একমুখিতা — সেটি মেপে দেখা হয়েছে:
       আলো   ০.৯৪১ → ০.৮৬৯ → ০.৭৮৩ → ০.৬৯২ → ০.৫৩৩ → ০.৪১২
       অন্ধকার ০.২৯৫ → ০.৪১১ → ০.৫৪৮ → ০.৬৯৪ → ০.৮১৪ → ০.৯১১
     ⚠ হালকা প্রান্তের ধাপগুলো পৃষ্ঠতলের সাথে ৩:১-এর নিচে (১.১৬:১ থেকে
       শুরু)। নিয়ম অনুযায়ী সেটি ক্ষমার্হ **কেবল তখনই** যখন সংখ্যাটি
       আলাদাভাবে লেখা থাকে — তাই ম্যাট্রিক্সের প্রতিটি ঘরে মান লেখা,
       আর ঘর বেশি হলে টেবিল-দৃশ্যের বোতাম। */
  --warm1: #FBEAC4; --warm2: #F4CE8C; --warm3: #E9AB55;
  --warm4: #D8862F; --warm5: #B8551F; --warm6: #832616;
  /* ডাইভার্জিং — উষ্ণায়ন-ডোরার জন্য (ঠান্ডা নীল ↔ নিরপেক্ষ ধূসর ↔ উষ্ণ লাল) */
  --div-cool: #256abf; --div-mid: #f0efec; --div-warm: #C2371F;

  /* অবস্থা */
  --ok:   #1B7F71;
  --warn: #A9720B;
  --bad:  #C2371F;

  /* স্পেসিং স্কেল (৪px ভিত্তি) */
  --s1: 4px;  --s2: 8px;  --s3: 12px; --s4: 16px;
  --s5: 24px; --s6: 32px; --s7: 48px; --s8: 64px;

  /* টাইপ স্কেল */
  --t-xs: 12px; --t-sm: 13px; --t-md: 15px; --t-base: 16px;
  --t-lg: 19px; --t-xl: 24px; --t-2xl: 30px; --t-3xl: 38px;

  /* কোণ */
  --r-sm: 6px; --r-md: 10px; --r-lg: 14px; --r-full: 999px;

  /* এলিভেশন — চারটি স্তর, একটি নয় */
  --e0: none;
  --e1: 0 1px 2px rgba(20,26,25,.06);
  --e2: 0 1px 3px rgba(20,26,25,.07), 0 4px 12px -6px rgba(20,26,25,.18);
  --e3: 0 2px 6px rgba(20,26,25,.09), 0 16px 32px -18px rgba(20,26,25,.34);

  /* মোশন */
  --dur-1: 120ms; --dur-2: 200ms; --dur-3: 320ms;
  --ease: cubic-bezier(.2,.6,.3,1);

  /* স্তর (z-index) */
  --z-map: 400; --z-legend: 500; --z-bar: 600; --z-pop: 700;

  color-scheme: light;
}

/* =====================================================================
   ডার্ক মোড — কেবল বোতাম চাপলে                                   v6.6
   ---------------------------------------------------------------------
   এখানে আগে একটি `@media (prefers-color-scheme: dark)` ব্লক ছিল, যা
   কম্পিউটারের নিজস্ব পছন্দ দেখে সাইটটিকে নিজে থেকেই অন্ধকারে খুলত।
   ব্যবহারকারীর সিদ্ধান্ত: ডিফল্ট সবসময় আলো, আর অন্ধকার একটি স্পষ্ট
   পছন্দ — টপবারের ◐ বোতাম।

   তাই ব্লকটি সরানো হলো, লুকানো হয়নি। মিডিয়া ব্লকটি রেখে দিলে সেটি
   কখনো চলত না (তিনটি পাতাই <html data-theme="light"> দিয়ে খোলে), কিন্তু
   ভবিষ্যতে কেউ নতুন একটি পাতা বানিয়ে ঐ অ্যাট্রিবিউটটি বসাতে ভুলে
   গেলে তার সাইট OS-ডার্কে নিজে থেকে অন্ধকার হয়ে যেত — একটি নীরব,
   ধরা কঠিন অসঙ্গতি। এখন নিয়মটি একটাই: data-theme="dark" থাকলে অন্ধকার,
   নইলে আলো।

   বাছাইটি মনে রাখা হয় localStorage['hews-theme']-এ, আর তিনটি এন্ট্রি
   পয়েন্টেই (index.php, admin/_layout.php, admin/login.php) পেইন্টের
   আগে পড়া হয় — তাই থিম বদলে পাতা বদলালেও ঝলকানি হয় না।
   ===================================================================== */
/* ডার্ক মোড — স্পষ্ট পছন্দ (টগল) */
:root[data-theme="dark"] {
  --paper: #0C1413; --surface: #141D1B; --surface-2: #1B2724; --surface-3: #24322E;
  --ink: #E9F0ED; --ink-2: #A9B8B3; --ink-3: #7C8C87;
  --line: #25332F; --line-2: #32433E;
  --brand: #3FC0B2; --brand-ink: #62D6C8; --brand-soft: #0E2E2C;
  /* v6.5 — অন্ধকার মোডে স্তর ১–৪ নতুন করে ধাপে বসানো।
     কারণ: আগের সেটে ‘তীব্র’ (#E86A50) ও ‘অতি তীব্র’ (#D4515C)
     পাশাপাশি জোড়ায় ΔE ছিল মাত্র ৭.৪ (স্বাভাবিক দৃষ্টিতে) —
     অর্থাৎ সবচেয়ে বিপজ্জনক দুটি শ্রেণি অন্ধকার মোডে প্রায়
     একই রঙ দেখাত। নতুন ধাপে সবচেয়ে খারাপ জোড়া ΔE ১৩.২,
     আর প্রতিটি CVD জোড়া ≥ ১০.৫। প্রতিটি লেখার রঙ WCAG AA
     (৪.৬:১ – ১১.৩:১)। আলো মোডের হেক্সগুলো ছোঁয়া হয়নি —
     সেগুলোই BMD-র প্রচলিত রঙ, যা মানুষ চেনে। */
  --lvl0: #2AA394; --lvl0-fg: #06201C; --lvl0-soft: #0E2E2A;
  --lvl1: #F5CE4B; --lvl1-fg: #221A05; --lvl1-soft: #33290C;
  --lvl2: #F5952B; --lvl2-fg: #241202; --lvl2-soft: #35200D;
  --lvl3: #E24634; --lvl3-fg: #240A05; --lvl3-soft: #38140E;
  --lvl4: #B02A55; --lvl4-fg: #FFFFFF; --lvl4-soft: #3A1020;
  --c1: #4FB6D4; --c2: #E86A50; --c3: #4FBE96; --c4: #6E86A3; --c5: #A98FD1; --c6: #8B9A96;
  /* v11.0.0 — যন্ত্রের পরিচয়-রঙ, অন্ধকারের জন্য আলাদা করে মাপা
     (উল্টে নেওয়া নয়): CVD ΔE ১২.১, স্বাভাবিক ২০.৬ — সব পাশ। */
  /* অন্ধকারে কাচ — সাদা নয়, সামান্য আলোকিত পৃষ্ঠতল */
  --glass:      rgba(26,37,35,.72);
  --glass-line: rgba(255,255,255,.08);
  --glass-2:    rgba(26,37,35,.5);

  --inst-heat: #4A9AD8; --inst-heat-soft: #14293C;
  --inst-air:  #C86A8E; --inst-air-soft:  #34202C;
  /* অন্ধকারের রঙগুলো আলাদা করে বাছা, উল্টে নেওয়া নয় — উজ্জ্বলতার
     ব্যান্ড ০.৪৮–০.৬৭-এর ভেতরে রাখতে হয়েছে, নইলে গাঢ় পটভূমিতে
     রঙগুলো জ্বলে উঠত। */
  --usf-temp: #DE5B41; --usf-rain: #3987E5; --usf-rh: #35A57E;
  --cmp1: #3987e5;  --cmp2: #d95926;  --cmp3: #199e70;
  --st1: #3987e5; --st2: #d95926; --st3: #199e70;
  --st4: #c98500; --st5: #d55181; --st6: #008300;
  --seq1: #104281; --seq2: #184f95; --seq3: #256abf; --seq4: #3987e5; --seq5: #86b6ef;
  --seq6: #c9e0fb;
  /* অন্ধকারে র‍্যাম্প উল্টো দিকে যায় — নিচু মান পৃষ্ঠতলের কাছাকাছি গাঢ়,
     উঁচু মান উজ্জ্বল। নীল --seq-এর সাথে একই নিয়ম, তাই দুটি র‍্যাম্প
     একই ভাষায় কথা বলে। */
  --warm1: #4A1D0E; --warm2: #7A3116; --warm3: #B04F1F;
  --warm4: #DC8434; --warm5: #EEB769; --warm6: #F8DEB0;
  --div-cool: #3987e5; --div-mid: #383835; --div-warm: #E24634;
  --ok: #2AA394; --warn: #E0AE3C; --bad: #E86A50;
  --e1: 0 1px 2px rgba(0,0,0,.4);
  --e2: 0 1px 3px rgba(0,0,0,.45), 0 4px 12px -6px rgba(0,0,0,.6);
  --e3: 0 2px 6px rgba(0,0,0,.5), 0 16px 32px -18px rgba(0,0,0,.75);
  color-scheme: dark;
}

/* ------------------------------------------------------- ২. ভিত্তি */
*, *::before, *::after { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: 'Hind Siliguri', system-ui, -apple-system, 'Segoe UI', sans-serif;
  font-size: var(--t-base);
  line-height: 1.7;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

h1, h2, h3, h4 {
  font-family: 'Anek Bangla', 'Hind Siliguri', system-ui, sans-serif;
  line-height: 1.25;
  margin: 0;
  font-weight: 600;
  letter-spacing: -0.01em;
}
h1 { font-size: var(--t-2xl); }
h2 { font-size: var(--t-xl); }
h3 { font-size: var(--t-lg); }   /* আগে ১৫.৫px ছিল — বডির চেয়েও ছোট */
h4 { font-size: var(--t-md); }

p { margin: 0 0 var(--s3); }
p:last-child { margin-bottom: 0; }

a { color: var(--brand); text-decoration-thickness: 1px; text-underline-offset: 2px; }
a:hover { color: var(--brand-ink); }

.mono, .num, .kpi .v, code, pre {
  font-family: 'IBM Plex Mono', ui-monospace, 'Cascadia Code', monospace;
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum' 1;
}
code {
  font-size: .9em; background: var(--surface-2);
  padding: 2px 6px; border-radius: var(--r-sm);
}

.muted { color: var(--ink-3); }
.ok  { color: var(--ok); }
.bad { color: var(--bad); }

:where(a, button, select, input, textarea, [tabindex]):focus-visible {
  outline: 2px solid var(--brand);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}

.wrap { max-width: 1240px; margin: 0 auto; padding: 0 var(--s5); }
@media (max-width: 600px) { .wrap { padding: 0 var(--s4); } }

.skip-link {
  position: absolute; left: -9999px; top: var(--s2);
  background: var(--surface); color: var(--ink);
  padding: var(--s2) var(--s4); border-radius: var(--r-md);
  box-shadow: var(--e3); z-index: var(--z-pop);
}
.skip-link:focus { left: var(--s4); }

/* ------------------------------------------------- ৩. টপবার / নেভ */
.topbar {
  position: sticky; top: 0; z-index: var(--z-bar);
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  background: var(--surface);
  border-bottom: 1px solid var(--line);
  transition: box-shadow var(--dur-2) var(--ease);
}
@supports (backdrop-filter: blur(10px)) {
  .topbar { background: color-mix(in srgb, var(--surface) 82%, transparent); backdrop-filter: blur(12px) saturate(1.4); }
}
.topbar.is-scrolled { box-shadow: var(--e2); }

.bar-inner {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s4); padding: var(--s3) 0; flex-wrap: wrap;
}
.brand { display: flex; align-items: center; gap: var(--s3); min-width: 0; }
.brand strong { display: block; font-family: 'Anek Bangla', sans-serif; font-size: var(--t-md); font-weight: 600; line-height: 1.3; }
.brand .sub { display: block; font-size: var(--t-xs); color: var(--ink-3); line-height: 1.4; }
.brand .dot {
  width: 12px; height: 12px; border-radius: 50%;
  background: var(--lvl0); flex: none;
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--lvl0) 20%, transparent);
  transition: background var(--dur-3) var(--ease), box-shadow var(--dur-3) var(--ease);
}
.bar-links { display: flex; align-items: center; gap: var(--s1); flex-wrap: wrap; }
.bar-links a {
  padding: var(--s2) var(--s3); border-radius: var(--r-sm);
  font-size: var(--t-sm); color: var(--ink-2); text-decoration: none;
  transition: background var(--dur-1) var(--ease), color var(--dur-1) var(--ease);
}
.bar-links a:hover { background: var(--surface-2); color: var(--ink); }
.bar-links a[aria-current="page"] { background: var(--brand-soft); color: var(--brand-ink); font-weight: 600; }

.theme-toggle {
  display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; padding: 0;
  border: 1px solid var(--line-2); border-radius: var(--r-sm);
  background: transparent; color: var(--ink-2); cursor: pointer;
  font-size: 15px; line-height: 1;
  transition: background var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease);
}
.theme-toggle:hover { background: var(--surface-2); border-color: var(--line-2); color: var(--ink); }

/* v6.0 — ভাষা টগল। থিম টগলের সাথে একই আকার ও আচরণ, যাতে দুটি বোতাম
   পাশাপাশি বসলে সারি ভেঙে না যায়। পার্থক্য শুধু ভেতরে লেখা আছে বলে
   প্রস্থ স্থির নয়, ন্যূনতম — "EN" ও "বাং" দুটোই আঁটে। */
.lang-toggle {
  width: auto; min-width: 34px; padding: 0 9px;
  font-family: var(--font-ui, inherit); font-size: 12px; font-weight: 600;
  letter-spacing: .02em; text-decoration: none; white-space: nowrap;
}
.lang-toggle:hover { background: var(--surface-2); border-color: var(--line-2); color: var(--ink); }

/* -------------------------------------------------- ৪. ব্যানার (হিরো) */
.banner {
  border-radius: var(--r-lg);
  padding: var(--s6) var(--s5);
  margin: var(--s5) 0;
  background: var(--lvl0);
  color: var(--lvl0-fg);
  display: grid; grid-template-columns: 1fr auto; gap: var(--s5);
  align-items: center;
  box-shadow: var(--e2);
  transition: background var(--dur-3) var(--ease), color var(--dur-3) var(--ease);
}
.banner .eyebrow {
  font-size: var(--t-sm); text-transform: none;
  opacity: .82; margin-bottom: var(--s2); letter-spacing: .01em;
}
.banner h1 { font-size: clamp(var(--t-xl), 4.4vw, var(--t-3xl)); margin-bottom: var(--s2); }
.banner .lede { font-size: var(--t-md); opacity: .92; max-width: 56ch; margin: 0; }
.banner .figure { text-align: right; line-height: 1; }
.banner .big {
  font-family: 'IBM Plex Mono', monospace; font-variant-numeric: tabular-nums;
  font-size: clamp(40px, 8vw, 68px); font-weight: 500; display: block;
}
.banner .unit { font-size: var(--t-lg); opacity: .8; }
.banner .feels { font-size: var(--t-sm); opacity: .88; margin-top: var(--s2); }
@media (max-width: 720px) {
  .banner { grid-template-columns: 1fr; gap: var(--s4); padding: var(--s5) var(--s4); }
  .banner .figure { text-align: left; }
}

/* -------------------------------------------------------- ৫. KPI */
.kpis {
  display: grid; gap: var(--s3);
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
.kpi {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-md); padding: var(--s3) var(--s4);
  box-shadow: var(--e1);
  transition: box-shadow var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease);
}
.kpi:hover { box-shadow: var(--e2); border-color: var(--line-2); }
.kpi .k {
  font-size: var(--t-xs); color: var(--ink-3);
  display: block; margin-bottom: var(--s1); line-height: 1.4;
}
.kpi .v { font-size: var(--t-xl); font-weight: 500; line-height: 1.2; display: block; }
.kpi .v .u { font-size: var(--t-sm); color: var(--ink-3); font-weight: 400; }
/* ছোট ভ্যারিয়েন্ট — তারিখ/অনুপাতের জন্য (আগে inline style দিয়ে ঠিক করা হতো) */
.kpi.sm .v { font-size: var(--t-md); }
.kpi.md .v { font-size: var(--t-lg); }

/* ------------------------------------------------- ৬. সেকশন হেড */
main section { margin: var(--s7) 0; }
.shead {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--s4); flex-wrap: wrap;
  margin-bottom: var(--s4); padding-bottom: var(--s3);
  border-bottom: 1px solid var(--line);   /* আগে ২px near-black ছিল */
}
.shead h2 { font-size: var(--t-xl); }
.shead .meta { font-size: var(--t-sm); color: var(--ink-3); }

/* ---------------------------------------------------------- ৭. কার্ড */
.card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-md); padding: var(--s4);
  box-shadow: var(--e1);
}
.card h3 {
  font-size: var(--t-md); margin-bottom: var(--s3);
  display: flex; align-items: baseline; justify-content: space-between; gap: var(--s3);
}
.card h3 .tag {
  font-family: 'Hind Siliguri', sans-serif; font-size: var(--t-xs);
  color: var(--ink-3); font-weight: 400;
}
.grid2 { display: grid; gap: var(--s4); grid-template-columns: 1fr; }
.grid3 { display: grid; gap: var(--s4); grid-template-columns: 1fr; }
@media (min-width: 900px)  { .grid2 { grid-template-columns: 1fr 1fr; } }
@media (min-width: 760px)  { .grid3 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1080px) { .grid3 { grid-template-columns: repeat(3, 1fr); } }

/* ---------------------------------------------- ৮. পূর্বাভাস স্ট্রিপ */
.fc-strip {
  display: grid; gap: var(--s3);
  grid-template-columns: repeat(auto-fit, minmax(136px, 1fr));
}
.fc {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-md); overflow: hidden; box-shadow: var(--e1);
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.fc:hover { transform: translateY(-2px); box-shadow: var(--e2); }
.fc .stripe { height: 4px; background: var(--lvl0); }
.fc .body { padding: var(--s3); }
.fc .d  { font-size: var(--t-sm); font-weight: 600; }
.fc .dd { font-size: var(--t-xs); color: var(--ink-3); margin-bottom: var(--s2); }
.fc .t  { font-family: 'IBM Plex Mono', monospace; font-variant-numeric: tabular-nums; font-size: var(--t-lg); }
.fc .t small { font-size: var(--t-sm); color: var(--ink-3); margin-left: var(--s1); }
.fc .lv { font-size: var(--t-xs); font-weight: 600; margin-top: var(--s1); }
.fc .pr { font-size: var(--t-xs); color: var(--ink-3); }

/* স্তরের ব্যাজ */
.badge {
  display: inline-flex; align-items: center; gap: var(--s1);
  padding: 2px var(--s2); border-radius: var(--r-full);
  font-size: var(--t-xs); font-weight: 600; line-height: 1.6;
}
.badge.l0 { background: var(--lvl0-soft); color: var(--lvl0); }
.badge.l1 { background: var(--lvl1-soft); color: var(--warn); }
.badge.l2 { background: var(--lvl2-soft); color: var(--lvl2); }
.badge.l3 { background: var(--lvl3-soft); color: var(--lvl3); }
.badge.l4 { background: var(--lvl4-soft); color: var(--lvl4); }

/* --------------------------------------------------------- ৯. মানচিত্র */
.map-wrap {
  position: relative; border: 1px solid var(--line);
  border-radius: var(--r-md); overflow: hidden; box-shadow: var(--e1);
  background: var(--surface);
}
#leaflet { height: clamp(360px, 68vh, 620px); width: 100%; }
.legend {
  position: absolute; right: var(--s3); bottom: var(--s3); z-index: var(--z-legend);
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-md); padding: var(--s3);
  font-size: var(--t-xs); line-height: 1.9; box-shadow: var(--e2);
  max-width: 190px;
}
.legend i {
  display: inline-block; width: 12px; height: 12px;
  border-radius: 3px; margin-right: var(--s2); vertical-align: -1px;
}
.leaflet-container { font: inherit; background: var(--surface-2); }
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
  background: var(--surface); color: var(--ink); box-shadow: var(--e3);
}
.leaflet-popup-content { font-size: var(--t-sm); line-height: 1.65; margin: var(--s3); }
.note-line { font-size: var(--t-sm); color: var(--ink-3); margin-top: var(--s3); }

/* ------------------------------------------------------- ১০. কন্ট্রোল */
.controls { display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap; }
.controls label {
  display: inline-flex; align-items: center; gap: var(--s2);
  font-size: var(--t-sm); color: var(--ink-3);
}
select, .select {
  appearance: none;
  font: inherit; font-size: var(--t-sm);
  padding: var(--s2) calc(var(--s5) + var(--s1)) var(--s2) var(--s3);
  border: 1px solid var(--line-2); border-radius: var(--r-sm);
  background-color: var(--surface); color: var(--ink);
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
                    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 16px center, right 11px center;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
  cursor: pointer;
  transition: border-color var(--dur-1) var(--ease), box-shadow var(--dur-1) var(--ease);
}
select:hover { border-color: var(--brand); }

/* ----------------------------------------------------------- ১১. চার্ট */
/* মূল সংশোধন: স্থির উচ্চতার বদলে aspect-ratio — মোবাইলে চার্টের
   অনুপাত উল্টে গিয়ে অক্ষের লেবেল চেপে যাওয়ার সমস্যা এতে দূর হয়। */
.chart {
  width: 100%;
  aspect-ratio: 16 / 9;
  min-height: 260px;
  max-height: 380px;
}
.chart.tall { aspect-ratio: 21 / 9; min-height: 300px; max-height: 440px; }
@media (max-width: 700px) {
  .chart      { aspect-ratio: 4 / 3; min-height: 240px; }
  .chart.tall { aspect-ratio: 5 / 4; min-height: 280px; }
}
.chart-empty {
  display: flex; align-items: center; justify-content: center;
  height: 100%; padding: var(--s5);
  color: var(--ink-3); font-size: var(--t-sm); text-align: center;
}

/* ---------------------------------------------------------- ১২. টেবিল */
.tablewrap {
  overflow-x: auto; border: 1px solid var(--line);
  border-radius: var(--r-md); background: var(--surface); box-shadow: var(--e1);
  -webkit-overflow-scrolling: touch;
}
table { border-collapse: collapse; width: 100%; min-width: 520px; font-size: var(--t-sm); }
thead th {
  position: sticky; top: 0; z-index: 1;
  background: var(--surface-2); color: var(--ink-2);
  font-weight: 600; text-align: left; white-space: nowrap;
  padding: var(--s3); border-bottom: 1px solid var(--line);
}
tbody td { padding: var(--s3); border-bottom: 1px solid var(--line); }
tbody tr:last-child td { border-bottom: 0; }
tbody tr { transition: background var(--dur-1) var(--ease); }
tbody tr:nth-child(even) { background: color-mix(in srgb, var(--surface-2) 45%, transparent); }
tbody tr:hover { background: var(--surface-2); }
td.num, th.num { text-align: right; font-family: 'IBM Plex Mono', monospace; font-variant-numeric: tabular-nums; }
.table-empty { padding: var(--s6) var(--s4); text-align: center; color: var(--ink-3); }

/* ------------------------------------------------------- ১৩. ফর্ম */
.field { display: block; margin-bottom: var(--s4); }
.field > span {
  display: block; font-size: var(--t-sm); color: var(--ink-2);
  margin-bottom: var(--s1); font-weight: 500;
}
.field input, .field select, .field textarea, input[type="text"], input[type="email"],
input[type="password"], input[type="number"], input[type="date"], input[type="file"], textarea {
  width: 100%; font: inherit; font-size: var(--t-md);
  padding: var(--s2) var(--s3);
  border: 1px solid var(--line-2); border-radius: var(--r-sm);
  background: var(--surface); color: var(--ink);
  transition: border-color var(--dur-1) var(--ease), box-shadow var(--dur-1) var(--ease);
}
.field input:focus, .field select:focus, textarea:focus {
  border-color: var(--brand);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--brand) 16%, transparent);
  outline: none;
}
.field .hint { display: block; font-size: var(--t-xs); color: var(--ink-3); margin-top: var(--s1); }
.form-grid {
  display: grid; gap: var(--s4);
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  align-items: end;
}
.form-grid .field { margin-bottom: 0; }
/* v8.8 — একই সারিতে দুটি বাটন (যাচাই / সংরক্ষণ)। ছোট পর্দায় নিজে থেকেই
   নিচে নেমে যায়, তাই আলাদা মিডিয়া কোয়েরি লাগে না। */
.row-btns { display: flex; flex-wrap: wrap; gap: var(--s3); align-items: center; }

fieldset {
  border: 1px solid var(--line); border-radius: var(--r-md);
  padding: var(--s4); margin: 0 0 var(--s4);
}
legend { font-size: var(--t-sm); font-weight: 600; color: var(--ink-2); padding: 0 var(--s2); }

/* --------------------------------------------------------- ১৪. বাটন */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--s2);
  font: inherit; font-size: var(--t-md); font-weight: 600;
  padding: var(--s2) var(--s5);
  border: 1px solid transparent; border-radius: var(--r-sm);
  background: var(--brand); color: #fff; cursor: pointer;
  transition: background var(--dur-1) var(--ease), box-shadow var(--dur-1) var(--ease),
              transform var(--dur-1) var(--ease);
  text-decoration: none; white-space: nowrap;
}
.btn:hover  { background: var(--brand-ink); color: #fff; box-shadow: var(--e2); }
.btn:active { transform: translateY(1px); }
.btn[disabled], .btn.is-disabled { opacity: .5; cursor: not-allowed; pointer-events: none; }
.btn.block { width: 100%; }

.btn-ghost {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--s2);
  font: inherit; font-size: var(--t-sm); font-weight: 500;
  padding: var(--s2) var(--s3);
  border: 1px solid var(--line-2); border-radius: var(--r-sm);
  background: var(--surface); color: var(--ink-2); cursor: pointer;
  text-decoration: none; white-space: nowrap;
  transition: background var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease),
              color var(--dur-1) var(--ease);
}
.btn-ghost:hover { background: var(--surface-2); border-color: var(--line-2); color: var(--ink); }
.btn-ghost.bad         { color: var(--bad); border-color: color-mix(in srgb, var(--bad) 34%, var(--line-2)); }
.btn-ghost.bad:hover   { background: var(--lvl3-soft); color: var(--bad); }
.btn-ghost.is-on       { background: var(--brand-soft); border-color: var(--brand); color: var(--brand-ink); }
.btn-sm { padding: var(--s1) var(--s2); font-size: var(--t-xs); }

/* --------------------------------------------------------- ১৫. অ্যালার্ট */
/* ⚠ v8.0 — এখানে আগে শর্তহীনভাবে `display: flex` ছিল, আর সেটিই
   আপলোড পাতার লেখাগুলো ভেঙে দিচ্ছিল।

   flex কনটেইনারে প্রতিটি সন্তান-এলিমেন্ট একটি করে আইটেম হয়, আর
   তাদের মাঝের প্রতিটি লেখার টুকরোও আলাদা (anonymous) আইটেম। আমাদের
   অনেক বার্তায় লেখার মাঝে <code> ও <b> বসে — যেমন “পূর্ণাঙ্গ লগার
   ফাইল (chakadatalogger.csv, ৯৫ হাজারের বেশি সারি)…”। ফলে ঐ একটি
   বাক্য ২০-৩০টি আইটেমে ভেঙে যেত আর পর্দায় **এক লাইনে একটি করে শব্দ**
   নেমে আসত। ব্যবহারকারীর “deisgn poor and not organized” অভিযোগের
   একটি বাস্তব কারণ এটিই।

   সমাধান: ডিফল্ট block — লেখা স্বাভাবিকভাবে বয়ে যায়, <code>/<b>
   ঠিক লাইনের ভেতরেই থাকে। flex কেবল তখনই, যখন বার্তাটি সত্যিই
   ‘আইকন + লেখা’ ছাঁচে লেখা হয়েছে (প্রথম সন্তান aria-hidden আইকন)।

   :has() না বোঝা কোনো ব্রাউজারে সবগুলোই block থাকবে — আইকনটি লেখার
   আগে ইনলাইনে বসবে, যা পড়তে কোনো অসুবিধা করে না। অর্থাৎ ফলব্যাকটিও
   আজকের ভাঙা অবস্থার চেয়ে ভালো। */
.alert {
  padding: var(--s3) var(--s4); border-radius: var(--r-md);
  border: 1px solid var(--line); background: var(--surface-2);
  font-size: var(--t-sm); margin-bottom: var(--s4);
  display: block;
}
.alert > [aria-hidden="true"]:first-child { margin-right: var(--s2); }
.alert:has(> [aria-hidden="true"]:first-child) {
  display: flex; gap: var(--s3); align-items: flex-start;
}
.alert:has(> [aria-hidden="true"]:first-child) > [aria-hidden="true"]:first-child {
  margin-right: 0;
}
.alert.err, .alert-err {
  background: var(--lvl3-soft); color: var(--ink);
  border-color: color-mix(in srgb, var(--bad) 40%, transparent);
}
.alert.ok, .alert-ok {
  background: var(--lvl0-soft); color: var(--ink);
  border-color: color-mix(in srgb, var(--ok) 40%, transparent);
}
.alert.warn {
  background: var(--lvl1-soft); color: var(--ink);
  border-color: color-mix(in srgb, var(--warn) 40%, transparent);
}

/* ------------------------------------------------- ১৬. স্কেলিটন লোডার */
.skel {
  background: linear-gradient(90deg, var(--surface-2) 25%, var(--surface-3) 37%, var(--surface-2) 63%);
  background-size: 400% 100%;
  animation: skel 1.4s ease-in-out infinite;
  border-radius: var(--r-sm);
}
@keyframes skel { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } }
.skel-kpi { height: 74px; border-radius: var(--r-md); }
.skel-fc  { height: 128px; border-radius: var(--r-md); }

/* ------------------------------------------------------- ১৭. ফুটার */
.foot {
  border-top: 1px solid var(--line);
  margin-top: var(--s8); padding: var(--s5) 0 var(--s6);
  font-size: var(--t-sm); color: var(--ink-3);
}
.foot p { margin-bottom: var(--s2); }

/* ------------------------------------------------------ ১৮. লগইন */
.login-page {
  min-height: 100vh; min-height: 100dvh;
  display: grid; place-items: center; padding: var(--s5);
  background: var(--paper);
}
.login-card {
  width: 100%; max-width: 400px;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: var(--s6);
  box-shadow: var(--e3);
}
.login-card h1 { font-size: var(--t-xl); margin-bottom: var(--s2); }
.login-card .sub { font-size: var(--t-sm); color: var(--ink-3); margin-bottom: var(--s5); }

/* ------------------------------------------------ ১৯. অ্যাক্সেসিবিলিটি */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important; animation-iteration-count: 1 !important;
    transition-duration: .01ms !important; scroll-behavior: auto !important;
  }
}
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* ---------------------------------------------------------- ২০. প্রিন্ট */
@media print {
  .topbar, .controls, .legend, .bar-links, .theme-toggle, .skip-link { display: none !important; }
  body { background: #fff; color: #000; }
  .card, .kpi, .tablewrap, .map-wrap, .fc { box-shadow: none; border-color: #ccc; break-inside: avoid; }
  .grid2, .grid3 { grid-template-columns: 1fr; }
  main section { margin: var(--s5) 0; }
  a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 10px; color: #555; }
}

/* v6.0 — লগইন পাতার ভাষা লিংক। কার্ডের উপরে ডান কোণে, ছোট ও নিরুচ্চার —
   লগইনের আগে ভাষা বদলানো দরকার হতে পারে, কিন্তু সেটিই পাতার প্রধান কাজ নয়। */
.loginlang { margin: 0 0 var(--s2); text-align: right; font-size: 13px; }
.loginlang a { color: var(--ink-3); text-decoration: none; border-bottom: 1px solid var(--line-2); }
.loginlang a:hover { color: var(--brand-ink); border-color: var(--brand); }

/* =====================================================================
   ২১. v6.5 — ভিজ্যুয়ালাইজেশন পুনর্গঠন
   ---------------------------------------------------------------------
   নকশার সিদ্ধান্তগুলো এক জায়গায়, যাতে পরে কেউ "কেন এমন" জিজ্ঞেস করলে
   উত্তরটা কোডের পাশেই থাকে:

   ১) BMD-র পাঁচ শ্রেণির রঙই পাতার মেরুদণ্ড। সেগুলো উষ্ণ (হলুদ→কমলা→
      লাল→গাঢ় লাল), তাই বাকি সব ক্রোম ঠান্ডা ও চুপচাপ — নইলে দুটো জিনিস
      একসাথে চেঁচায় আর সতর্কতার রঙ আলাদা করে চোখে পড়ে না।

   ২) স্তরের রঙ **কখনোই একা** অর্থ বহন করে না। প্রতিটি সোয়াচের সাথে
      নাম ও তাপমাত্রার পরিসর লেখা থাকে, আর প্রতিটি খণ্ডের মাঝে ২px
      ফাঁক — কারণ তাপ-মাপকাঠির পাশাপাশি শ্রেণিগুলো রঙে স্বভাবতই কাছাকাছি
      (validate_palette.js পাশাপাশি জোড়ায় ΔE ১৩–১৪ দেখায়, ১৫-র ফ্লোরের
      সামান্য নিচে)। পৃথিবীর কোনো তাপ-সতর্কতার মাপকাঠিই ঐ ফ্লোর পার
      করে না — সমাধান রঙ বদলানো নয়, লেখা ও ফাঁক যোগ করা।

   ৩) একই পাঁচ-ধাপ কাঠামো তিন মাপে ফিরে আসে — হিরোর মাপকাঠি, ৭ দিনের
      চিপ, বছরের ডোরা। কাঠামোটি সাজসজ্জা নয়; এটি সত্যিই একটি ক্রমিক
      মাপকাঠি, তাই পুনরাবৃত্তিটি তথ্য বহন করে।
   ===================================================================== */

/* ------------------------------------------------------- ২১ক. ব্যান্ড */
/* প্রতিটি প্রধান অংশ নিজস্ব পৃষ্ঠতলে — একই প্যানেলে আলাদা যন্ত্রের মতো */
.band { padding: var(--s6) 0; }
/* =====================================================================
 *  ⚠ [hidden] সবসময় সত্যিই লুকাবে                          v10.5.1
 * ---------------------------------------------------------------------
 *  ব্যবহারকারী পাতার একদম উপরে **দুটি খালি বাক্স** দেখতে পাচ্ছিলেন —
 *  একটি কমলা কিনারার, একটি সবুজ কিনারার। দুটোই `hidden` অবস্থায়
 *  ছিল, তবু দেখা যাচ্ছিল।
 *
 *  কারণটি CSS-এর অগ্রাধিকার, কোডের যুক্তি নয়:
 *
 *      ব্রাউজারের নিজস্ব নিয়ম : [hidden] { display: none }   ← UA স্তর
 *      এই ফাইলের নিয়ম        : .stale-bar { display: flex }  ← লেখকের স্তর
 *
 *  লেখকের স্তর সবসময় UA স্তরকে হারায়। তাই `hidden` বসানো সত্ত্বেও
 *  `display:flex` টিকে যেত, আর একটি **খালি** ফ্লেক্স-বাক্স তার
 *  কিনারা ও প্যাডিং নিয়ে পর্দায় বসে থাকত।
 *
 *  ⚠ JavaScript ঠিকই কাজ করছিল — drawStaleBar()/drawModelBar() দুটোই
 *    `box.hidden = true` করে আর innerHTML খালি করে। অর্থাৎ বাগটি
 *    খুঁজতে গিয়ে JS-এ কিছুই পাওয়া যেত না।
 *
 *  ⚠ খুঁজে দেখা গেল একই সমস্যা **দশটি** ক্লাসে: alert, hero-live,
 *    hero-st, hint, map-days, map-pick, model-bar, ramp-legend,
 *    spread, stale-bar। তাই দশটি আলাদা নিয়ম নয় — একটিই বিশ্বজনীন
 *    নিয়ম, যা ভবিষ্যতে যোগ হওয়া ক্লাসগুলোকেও ঢেকে রাখবে।
 *
 *  ⚠ !important এখানে ন্যায্য: `hidden` মানে "এটি এখন পাতায় নেই" —
 *    এর উপরে কোনো নকশার নিয়ম থাকা উচিত নয়। ফাইলটিতে আগে থেকেই
 *    section[hidden]/.card[hidden]-এ একই কৌশল ব্যবহার হয়েছে।
 * ===================================================================== */
[hidden] { display: none !important; }

/* [hidden] ডিফল্টে display:none, কিন্তু .band-এর নিজস্ব display
   না থাকলেও স্পষ্ট করে লেখা হলো — কোনো ইউটিলিটি ক্লাস পরে
   display বসালে যেন hidden হেরে না যায়। */
.band[hidden] { display: none; }
.band + .band { border-top: 1px solid var(--line); }
.band-alt { background: var(--surface-2); }
.band > .wrap > section + section { margin-top: var(--s6); }

/* --------------------------------------------- ২১খ. তাপ-অবস্থার হিরো */
.heat-hero {
  display: grid; gap: var(--s5); align-items: center;
  grid-template-columns: 1fr;
  padding: var(--s5); border-radius: var(--r-lg);
  background: var(--surface); border: 1px solid var(--line); box-shadow: var(--e2);
  /* বাঁ পাশে স্তরের রঙের পটি — ব্যাজের চেয়ে শান্ত, তবু দূর থেকে দেখা যায় */
  border-left: 6px solid var(--hero-lvl, var(--lvl0));
}
@media (min-width: 860px) { .heat-hero { grid-template-columns: 1.35fr 1fr; } }

/* ---- হিরোর স্টেশন-নির্বাচক (v10.4.17) ----
   ⚠ ইচ্ছাকৃতভাবে শান্ত: এটি একটি নিয়ন্ত্রণ, বিবৃতি নয়। শিরোনামের
     সংখ্যাটিই পাতার প্রধান কথা — নির্বাচকটি তার চেয়ে জোরে কথা বললে
     চোখ প্রথমে ভুল জায়গায় যেত। */
.hero-st {
  display: flex; align-items: center; gap: var(--s2);
  flex-wrap: wrap; margin-bottom: var(--s3);
}
.hero-st > label {
  font-size: var(--t-xs); letter-spacing: .08em; text-transform: uppercase;
  color: var(--ink-3);
}
.hero-st-sel {
  font: inherit; font-size: var(--t-sm); color: var(--ink);
  background: var(--surface-2); border: 1px solid var(--line);
  border-radius: var(--r-sm); padding: 5px 10px; max-width: 100%;
  cursor: pointer;
}
.hero-st-sel:hover { border-color: var(--hero-lvl, var(--brand)); }
.hero-st-sel:focus-visible {
  outline: 2px solid var(--hero-lvl, var(--brand)); outline-offset: 2px;
}
.hero-st-note { font-size: var(--t-xs); color: var(--ink-3); }
/* বাছাই সক্রিয় থাকলে চোখে পড়া দরকার — নইলে কেউ একটি স্টেশন বেছে
   রেখে ভুলে যেতেন, আর ভাবতেন পাতাটি এলাকার সংখ্যা দেখাচ্ছে। */
.hero-st.is-picked .hero-st-sel {
  border-color: var(--hero-lvl, var(--brand));
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--hero-lvl, var(--brand)) 15%, transparent);
}
.hero-st-reset {
  font: inherit; font-size: var(--t-xs); cursor: pointer;
  background: none; border: 0; padding: 2px 4px; color: var(--brand);
  text-decoration: underline; text-underline-offset: 2px;
}

/* এইমাত্রের যন্ত্রপাঠ (v10.4.17) — শিরোনামের সংখ্যার নিচে, ছোট করে।
   ⚠ এটি দিনের সর্বোচ্চ নয়, **এই মুহূর্তের** পাঠ। শব্দ দুটি আলাদা
     রাখা জরুরি, নইলে ৩৪.১ দেখে কেউ ভাবতেন আজকের সর্বোচ্চ কমে গেছে। */
.hero-live {
  font-size: var(--t-xs); color: var(--ink-3); margin: var(--s2) 0 0;
  display: flex; gap: 6px; justify-content: center;
  align-items: center; flex-wrap: wrap;
}
.hero-live .dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--lvl0); flex: 0 0 auto;
}
.hero-live.is-stale .dot { background: var(--ink-3); }
.hero-live b { color: var(--ink-2); font-weight: 600; }

.heat-hero .eyebrow {
  font-size: var(--t-xs); letter-spacing: .08em; text-transform: uppercase;
  color: var(--ink-3); margin-bottom: var(--s2);
}
.heat-hero h1 {
  font-family: 'Anek Bangla', sans-serif; font-weight: 700; line-height: 1.15;
  font-size: clamp(var(--t-xl), 4vw, var(--t-3xl));
  color: var(--hero-lvl, var(--ink)); margin-bottom: var(--s2);
}
.heat-hero .lede { font-size: var(--t-md); color: var(--ink-2); max-width: 52ch; margin: 0; }

.hero-figure { text-align: center; }
.hero-figure .big {
  font-family: 'IBM Plex Mono', monospace; font-variant-numeric: tabular-nums;
  font-size: clamp(46px, 11vw, 84px); font-weight: 500; line-height: .95;
  color: var(--hero-lvl, var(--ink)); letter-spacing: -.03em;
}
.hero-figure .unit { font-size: var(--t-xl); color: var(--ink-3); margin-left: 2px; }
.hero-figure .feels { font-size: var(--t-sm); color: var(--ink-2); margin-top: var(--s2); }
.hero-figure .basis { font-size: var(--t-xs); color: var(--ink-3); margin-top: var(--s1); }

/* --------------------------------- ২১গ. BMD মাপকাঠি (পাঁচ খণ্ডের পটি) */
/* ⚠ gap: 2px ইচ্ছাকৃত — এটিই পাশাপাশি শ্রেণির মধ্যে দৃশ্যমান সীমানা।
   ফাঁক না থাকলে দুটি কাছাকাছি রঙ এক টানা পটির মতো দেখাত। */
.bmd-scale { margin-top: var(--s5); }
.bmd-scale .track { display: grid; grid-template-columns: repeat(5, 1fr); gap: 2px; }
.bmd-scale .seg-b {
  height: 12px; border-radius: 2px; position: relative;
  background: var(--lvl0);
}
.bmd-scale .seg-b:first-child { border-radius: var(--r-full) 2px 2px var(--r-full); }
.bmd-scale .seg-b:last-child  { border-radius: 2px var(--r-full) var(--r-full) 2px; }
.bmd-scale .seg-b.b1 { background: var(--lvl1); }
.bmd-scale .seg-b.b2 { background: var(--lvl2); }
.bmd-scale .seg-b.b3 { background: var(--lvl3); }
.bmd-scale .seg-b.b4 { background: var(--lvl4); }
/* বর্তমান শ্রেণি — বাকিগুলো একটু ম্লান, তাই "আমরা এখন কোথায়" এক নজরে।
   ⚠ প্রথমে .34 বসিয়েছিলাম; পর্দায় দেখে বদলাতে হলো। ঐ মাত্রায় BMD-র
   হলুদ-কমলা-লাল চারটি প্যাস্টেল হয়ে একাকার হয়ে যাচ্ছিল, অর্থাৎ
   মাপকাঠিটি আর মাপকাঠি থাকছিল না — শুধু একটি গোলাপি পটি। .58-এ
   প্রতিটি শ্রেণি নিজের রঙে চেনা যায়, তবু চলতি শ্রেণিটি আলাদা করে
   চোখে পড়ে (তার নিজের রিং আছে)। */
.bmd-scale .seg-b:not(.on) { opacity: .58; }
.bmd-scale .seg-b.on { box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px var(--ink-3); }

.bmd-scale .labels {
  display: grid; grid-template-columns: repeat(5, 1fr); gap: 2px; margin-top: var(--s2);
}
.bmd-scale .labels span {
  font-size: 10.5px; line-height: 1.3; color: var(--ink-3); text-align: center;
  overflow-wrap: anywhere;
}
.bmd-scale .labels span b {
  display: block; font-family: 'IBM Plex Mono', monospace;
  font-variant-numeric: tabular-nums; font-size: var(--t-xs); color: var(--ink-2);
}
.bmd-scale .labels span.on b, .bmd-scale .labels span.on { color: var(--ink); font-weight: 600; }

/* ------------------------------------------ ২১ঘ. খণ্ডিত চলক-নির্বাচক */
.seg {
  display: inline-flex; padding: 3px; gap: 2px;
  background: var(--surface-2); border: 1px solid var(--line);
  border-radius: var(--r-full); flex-wrap: wrap;
}
.seg button {
  font: inherit; font-size: var(--t-sm); font-weight: 500;
  padding: var(--s2) var(--s4); border: 0; border-radius: var(--r-full);
  background: transparent; color: var(--ink-2); cursor: pointer;
  transition: background var(--dur-1) var(--ease), color var(--dur-1) var(--ease);
  white-space: nowrap;
}
.seg button:hover { color: var(--ink); background: var(--surface-3); }
.seg button[aria-pressed="true"] {
  background: var(--surface); color: var(--brand-ink);
  box-shadow: var(--e1); font-weight: 600;
}
.seg button:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }

/* ------------------------------------- ২১ঙ. নিজস্ব স্টেশনের লাইভ কার্ড */
.st-grid {
  display: grid; gap: var(--s3);
  grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
}
.st-card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-md); padding: var(--s4);
  border-top: 3px solid var(--st-lvl, var(--line-2));
  display: flex; flex-direction: column; gap: var(--s1);
}
.st-card .nm { font-weight: 600; font-size: var(--t-sm); line-height: 1.35; }
.st-card .cd { font-family: 'IBM Plex Mono', monospace; font-size: var(--t-xs); color: var(--ink-3); }
.st-card .rd {
  font-family: 'IBM Plex Mono', monospace; font-variant-numeric: tabular-nums;
  font-size: var(--t-2xl); line-height: 1.05; margin-top: var(--s2);
}
.st-card .rd small { font-size: var(--t-sm); color: var(--ink-3); }
.st-card .sub { font-size: var(--t-xs); color: var(--ink-2); }
.st-card .age { font-size: var(--t-xs); color: var(--ink-3); margin-top: auto; padding-top: var(--s2); }
.st-card .age.stale { color: var(--warn); font-weight: 600; }
/* পাঠ নেই এমন স্টেশন — লুকানো হয় না, কিন্তু চোখ টানে না */
.st-card.silent { opacity: .72; border-top-color: var(--line); }
.st-card.silent .rd { color: var(--ink-3); font-size: var(--t-lg); }
.st-card .why { font-size: var(--t-xs); color: var(--warn); line-height: 1.4; }
.st-card .cmp { font-size: 10.5px; color: var(--ink-3); }

/* ------------------------------------------------- ২১চ. উষ্ণায়ন-ডোরা */
.stripes { display: flex; gap: 2px; align-items: stretch; overflow-x: auto; padding-bottom: var(--s2); }
.stripes .yr {
  flex: 1 0 14px; min-height: 92px; border-radius: 2px; position: relative;
  background: var(--sc, var(--surface-3)); cursor: default;
}
/* আংশিক বছর — তির্যক টেক্সচার, কারণ ঐ বছরের গড় পুরো বছরের গড় নয়।
   রঙ দিয়ে বললে সেটি আরেকটি মাত্রা হয়ে যেত; টেক্সচার আলাদা চ্যানেল। */
.stripes .yr.partial {
  background-image: repeating-linear-gradient(45deg,
    rgba(255,255,255,.55) 0 3px, transparent 3px 6px);
}
.stripes .yr:hover { outline: 2px solid var(--ink); outline-offset: 1px; }
.stripe-axis {
  display: flex; gap: 2px; margin-top: var(--s1);
  font-family: 'IBM Plex Mono', monospace; font-size: 10px; color: var(--ink-3);
}
.stripe-axis span { flex: 1 0 14px; text-align: center; }

/* ------------------------------------------------ ২১ছ. টেবিল-দৃশ্য */
/* dataviz-এর "relief rule": কনট্রাস্ট সতর্কতা থাকলে সংখ্যাগুলো
   পড়ার আরেকটি পথ থাকতেই হবে। তাই প্রতিটি বড় চার্টের নিচে টেবিল। */
.tbl-toggle {
  font: inherit; font-size: var(--t-xs); color: var(--ink-3);
  background: none; border: 0; border-bottom: 1px dashed var(--line-2);
  cursor: pointer; padding: 0 0 1px; margin-top: var(--s3);
}
.tbl-toggle:hover { color: var(--brand-ink); border-color: var(--brand); }
.tbl-panel[hidden] { display: none; }
.tbl-panel { margin-top: var(--s3); }
.tbl-panel table { font-size: var(--t-xs); }

/* ------------------------------------------------- ২১জ. ছোট সহায়ক */
.hint { font-size: var(--t-sm); color: var(--ink-3); margin-top: var(--s2); max-width: 70ch; }

/* v10.10.0 — সারণিতে না-ওঠা (এখনো শূন্য) উৎসের এক লাইন।
   ⚠ ইচ্ছাকৃতভাবে সতর্কবার্তার রঙ নয়: "এখনো চলেনি" কোনো ত্রুটি নয়,
   কেবল একটি তথ্য। লাল করলে .stale-bar-এর সঙ্গে গুলিয়ে যেত, আর
   সত্যিকারের থেমে-যাওয়া উৎসের সতর্কবার্তাটি দুর্বল হয়ে পড়ত। */
.src-empty {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--s2);
  margin-top: var(--s3); font-size: var(--t-xs); color: var(--ink-3);
}
.src-empty[hidden] { display: none; }
.src-none {
  font-family: 'IBM Plex Mono', monospace; font-size: var(--t-xs);
  padding: 1px var(--s2); border-radius: var(--r-sm);
  background: var(--surface-2); border: 1px dashed var(--line);
  color: var(--ink-3);
}
.chip-row { display: flex; gap: var(--s2); flex-wrap: wrap; align-items: center; }
.chip {
  font-size: var(--t-xs); padding: 2px var(--s3); border-radius: var(--r-full);
  background: var(--surface-2); border: 1px solid var(--line); color: var(--ink-2);
}
.chip.on { background: var(--brand-soft); border-color: var(--brand); color: var(--brand-ink); font-weight: 600; }
/* সেকশন নিজে থেকেই সরে যায় যখন তার কোনো ডেটা নেই */
section[hidden], .card[hidden] { display: none !important; }

/* ---------------------------------------------- ২২. v6.7 সতর্কবার্তা */
/* আপলোড অসম্পূর্ণ / স্ক্রিপ্ট চলেনি / জাভাস্ক্রিপ্ট বন্ধ — তিনটিই এই বাক্সে।
   ইচ্ছাকৃতভাবে তাপ-স্তরের কোনো রঙ ব্যবহার করা হয়নি: এটি ব্যবস্থার সমস্যা,
   আবহাওয়ার নয়। লাল দিলে পাঠক ভাবতেন তাপপ্রবাহের সতর্কতা এসেছে। */
.stale-note {
  background: var(--surface); border: 1px solid var(--line-2);
  border-left: 4px solid var(--warn);
  border-radius: var(--r-md); padding: var(--s4) var(--s5);
  box-shadow: var(--e1);
}
.stale-note strong {
  display: block; font-family: 'Anek Bangla', sans-serif;
  font-size: var(--t-lg); color: var(--warn); margin-bottom: var(--s2);
}
.stale-note p { font-size: var(--t-sm); color: var(--ink-2); max-width: 78ch; margin: 0 0 var(--s2); }
.stale-note p:last-child { margin-bottom: 0; }
.stale-note ul { margin: 0 0 var(--s3); padding-left: var(--s5); }
.stale-note li { font-size: var(--t-sm); color: var(--ink-2); }
.stale-note code {
  font-family: 'IBM Plex Mono', monospace; font-size: var(--t-xs);
  background: var(--surface-2); padding: 1px var(--s2); border-radius: var(--r-sm);
}
.stale-note .mono {
  font-family: 'IBM Plex Mono', monospace; font-size: var(--t-xs);
  color: var(--ink-3); overflow-wrap: anywhere;
}

/* ------------------------------------------ ২৩. v7.0 মানচিত্রের লেজেন্ড */
/* যন্ত্রের বিন্দু ও ফাঁকা ইউনিয়ন — দুটোই লেজেন্ডে, কারণ মানচিত্রে এখন
   দুই রকম জিনিস আঁকা হয়। আকৃতিই পার্থক্য বহন করে, শুধু রঙ নয়। */
.legend i.lg-dot {
  border-radius: 50%; background: var(--lvl2);
  box-shadow: 0 0 0 2px var(--surface), 0 0 0 3px var(--line-2);
}
.legend i.lg-none {
  background: var(--surface-3);
  border: 1px dashed var(--line-2); border-radius: 2px;
}

/* ------------------------------------------------ ২৪. v7.0 উৎসের ব্যাজ */
/* সংখ্যাটি কে মেপেছে — যন্ত্র, না মডেল। v7.0-এ ERA5 ব্যাকফিল প্রতিটি
   স্টেশনের নিজের স্থানাঙ্কে চলে, তাই "সংখ্যা আছে" আর "যন্ত্র চলছে"
   আর এক কথা নয়। ব্যাজটি ছোট ও নিরুচ্চার — তথ্য, সতর্কতা নয়। */
.src-tag {
  display: inline-block; margin-left: var(--s2);
  font-family: 'IBM Plex Mono', monospace; font-size: 10px; letter-spacing: .02em;
  padding: 1px var(--s2); border-radius: var(--r-sm);
  background: var(--surface-2); border: 1px solid var(--line);
  color: var(--ink-3); vertical-align: 1px;
}
.src-tag.inst {
  background: var(--brand-soft); border-color: color-mix(in srgb, var(--brand) 35%, transparent);
  color: var(--brand-ink);
}

/* =====================================================================
   ২৫. v7.0 — পরিমার্জনের পাস
   ---------------------------------------------------------------------
   লক্ষ্য: "clean minimal, colourful, premium"। এই তিনটি একসাথে চাইলে
   একটাই কৌশল কাজ করে — **রঙের বাজেট কমিয়ে জায়গা ও টাইপোগ্রাফিতে খরচ
   করা**। তাই এখানে নতুন কোনো রঙ যোগ করা হয়নি। যা করা হয়েছে:

     · ক্রোম আরও শান্ত — সীমানা পাতলা, ছায়া নরম, পৃষ্ঠতলের ধাপ স্পষ্ট
     · সংখ্যা বড় ও tabular — ড্যাশবোর্ডে সংখ্যাই নায়ক
     · প্রতিটি ব্যান্ডের শিরোনামে একটি সরু উল্লম্ব দাগ — কাঠামো বোঝায়
     · হোভারে সূক্ষ্ম উত্থান, কিন্তু prefers-reduced-motion মানা হয়

   একমাত্র রঙ যা চোখ টানে, সেটি BMD-র স্তরের রঙ — এবং সেটাই উদ্দেশ্য।
   ===================================================================== */

/* ------------------------------------------------- ২৫ক. সেকশন শিরোনাম */
/* সরু দাগটি সাজসজ্জা নয় — এটি বলে "এখান থেকে নতুন অংশ শুরু", যা
   দীর্ঘ স্ক্রলে স্ক্যান করতে সাহায্য করে। */
.shead h2 {
  font-family: 'Anek Bangla', sans-serif; font-weight: 600;
  letter-spacing: -.01em; position: relative; padding-left: var(--s4);
}
.shead h2::before {
  content: ''; position: absolute; left: 0; top: .18em; bottom: .18em;
  width: 3px; border-radius: var(--r-full);
  background: linear-gradient(to bottom, var(--brand), color-mix(in oklab, var(--brand) 30%, transparent));
}

/* --------------------------------------------------------- ২৫খ. কার্ড */
.card {
  transition: box-shadow var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease);
}
.card:hover { box-shadow: var(--e2); border-color: var(--line-2); }
.card h3 {
  font-family: 'Anek Bangla', sans-serif; font-weight: 600;
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--s3); flex-wrap: wrap;
}
.card h3 .tag {
  font-family: 'IBM Plex Mono', monospace; font-size: var(--t-xs);
  font-weight: 400; color: var(--ink-3); letter-spacing: 0;
  white-space: nowrap;
}

/* ---------------------------------------------------------- ২৫গ. KPI */
/* সংখ্যাগুলো tabular-nums — টাইল পাশাপাশি বসে, অঙ্ক এক লাইনে থাকে।
   না দিলে "৩৩.৮" আর "১১১.১"-এর প্রস্থ আলাদা হয়ে সারিটা নড়বড়ে দেখাত। */
.kpi {
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.kpi:hover { transform: translateY(-1px); }
.kpi .v {
  font-family: 'IBM Plex Mono', monospace;
  font-variant-numeric: tabular-nums; letter-spacing: -.02em;
}
.kpi .k {
  font-size: 11px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink-3); font-weight: 500;
}

/* ------------------------------------------- ২৫ঘ. হিরোর সংখ্যা ও পটি */
.hero-figure .big { font-variant-numeric: tabular-nums; }
/* স্তরের রঙে একটি খুব হালকা আভা — পটভূমি নয়, ইঙ্গিত।
   ৪% অস্বচ্ছতা ইচ্ছাকৃতভাবে কম: বেশি হলে লেখার কনট্রাস্ট নেমে যেত,
   আর হিরোটিই তখন একটি রঙিন ব্যানার হয়ে উঠত — যা এড়াতেই v6.5-এ
   পুরনো ব্যানারটি বাদ দেওয়া হয়েছিল। */
.heat-hero {
  background:
    linear-gradient(135deg,
      color-mix(in oklab, var(--hero-lvl, var(--lvl0)) 4%, transparent) 0%,
      transparent 45%),
    var(--surface);
}

/* ------------------------------------------------- ২৫ঙ. স্টেশন কার্ড */
.st-card {
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.st-card:hover { transform: translateY(-2px); box-shadow: var(--e2); }
.st-card .rd { font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
/* নিচের সারি: সময় বাঁয়ে, উৎস ডানে — দুটোই "এই সংখ্যাটা কোথা থেকে" */
.st-card .age {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s2); border-top: 1px solid var(--line); margin-top: auto;
}
.st-card .age .src-tag { margin-left: 0; }

/* ----------------------------------------------------- ২৫চ. চিপ সারি */
.chip { font-variant-numeric: tabular-nums; }

/* ------------------------------------------------------ ২৫ছ. টেবিল */
.tablewrap table { font-variant-numeric: tabular-nums; }
.tablewrap th { font-size: 11px; letter-spacing: .06em; text-transform: uppercase; }

/* ------------------------------------------------------ ২৫জ. মানচিত্র */
/* Leaflet-এর বিন্দুগুলো হোভারে একটু বাড়ে — JS-এ radius বদলায়, এখানে
   শুধু কার্সরটি বলে দেয় যে ক্লিক করা যায়। */
.leaflet-interactive { cursor: pointer; }

/* -------------------------------------------- ২৫ঝ. চার্টের প্রবেশ */
/* খুব সংক্ষিপ্ত fade — চার্ট বসার সময় ক্যানভাস ঝাঁকি দেয়, সেটি ঢাকা পড়ে।
   prefers-reduced-motion থাকলে অ্যানিমেশন এমনিতেই বাতিল (§১৯)। */
.chart { animation: hews-fade var(--dur-3) var(--ease) both; }
@keyframes hews-fade { from { opacity: 0; } to { opacity: 1; } }

/* ------------------------------- বছর-পরিসর নির্বাচক ও র‍্যাম্প (v8.1) */
.rangebar { align-items: center; gap: var(--s3); flex-wrap: wrap; }
.rangebar label { display: inline-flex; align-items: center; gap: var(--s2); }
.rangebar select { min-width: 5.5rem; }
.rangearrow { color: var(--ink-3); font-size: var(--t-lg); line-height: 1; }

/* র‍্যাম্প-কিংবদন্তি — ক্রমযুক্ত রঙের জন্য চিপ নয়, ধারাবাহিক পটি।
   ⚠ রঙই একমাত্র বাহক নয়: দুই প্রান্তে বছরের সংখ্যা লেখা, আর নিচের
     টেবিলে প্রতিটি বছরের মান সংখ্যায় আছে। */
.ramp-legend {
  display: flex; align-items: center; gap: var(--s2);
  margin-top: var(--s3); flex-wrap: wrap;
  font-size: var(--t-xs); color: var(--ink-2);
}
.ramp-bar {
  display: flex; height: 12px; border-radius: var(--r-sm); overflow: hidden;
  flex: 1 1 160px; min-width: 120px; max-width: 420px;
  border: 1px solid var(--line);
}
.ramp-step { flex: 1 1 auto; }
.ramp-end { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--ink); }
.ramp-cap { color: var(--ink-3); }

/* ------------------------------ KPI ঘরে অবস্থার রঙ (v8.1)
   বাঁ পাশে একটি সরু পটি + হালকা আভা। রঙটি BMD স্তরের, ঠিক যেটি
   হিরো ব্যান্ড ও ৭ দিনের চিপে ব্যবহৃত — তাই পাতাজুড়ে একই রঙ সবসময়
   একই জিনিস বোঝায়।
   ⚠ রঙই একমাত্র বাহক নয়: স্তরের নামটি ঘরের নিচে লেখা থাকে (.kpi .n)। */
.kpi.has-lvl {
  border-left-width: 4px; border-left-style: solid;
  padding-left: calc(var(--s4) - 3px);
}
.kpi .n {
  display: block; margin-top: var(--s1);
  font-size: var(--t-xs); font-weight: 600; line-height: 1.3;
  /* ⚠ লেখাটি **স্তরের রঙ পায় না**, লেখার নিজস্ব রঙ পায়।
     ব্যাজে যে ছাঁচটি চলে (color: var(--lvlN) নিজের soft প্রেক্ষাপটে)
     সেটি মেপে দেখা গেল বেশ কয়েক জায়গায় পড়ার অযোগ্য — লাইট মোডে
     স্তর ১ (হলুদ) মাত্র ১.৬৮:১, ডার্ক মোডে স্তর ৪ ২.৬০:১। রঙ বহন
     করে বাঁ পাশের পটি ও হালকা আভা; নামটি শুধু পড়া গেলেই হলো। */
  color: var(--ink);
}
.kpi.has-lvl.l0 { border-left-color: var(--lvl0); background: var(--lvl0-soft); }
.kpi.has-lvl.l1 { border-left-color: var(--lvl1); background: var(--lvl1-soft); }
.kpi.has-lvl.l2 { border-left-color: var(--lvl2); background: var(--lvl2-soft); }
.kpi.has-lvl.l3 { border-left-color: var(--lvl3); background: var(--lvl3-soft); }
.kpi.has-lvl.l4 { border-left-color: var(--lvl4); background: var(--lvl4-soft); }

/* =====================================================================
   ২৬. v8.5 — মানচিত্র নতুন করে
   ---------------------------------------------------------------------
   ব্যবহারকারীর কথা: "map section very poor deisgn not information and
   not dynamic and not colorfull and the point have no value show there"।

   এখানকার প্রতিটি নিয়ম ঐ বাক্যের একটি করে টুকরোর উত্তর:

     .stn-pin     "the point have no value show there"
     .map-list    "not information" — সংখ্যাগুলো সাজানো, খুঁজতে হয় না
     .map-days    "not dynamic" — সাত দিন এক নজরে, ক্লিকযোগ্য
     .map-pick    "all area interconencteed" — কোন যন্ত্র বাছা হলো
   ===================================================================== */

/* ------------------------------------------------ ২৬ক. বিন্যাস */
/* মানচিত্র ও তালিকা পাশাপাশি। grid + gap, প্রতিটি ঘরে আলাদা margin নয় —
   margin দিলে দুটি ঘরের ফাঁক এক জায়গায় দ্বিগুণ, অন্যত্র শূন্য হতো। */
.map-grid {
  display: grid; gap: var(--s4);
  grid-template-columns: minmax(0, 1fr) 260px;
  align-items: start;
}
@media (max-width: 900px) {
  .map-grid { grid-template-columns: minmax(0, 1fr); }
}

.map-side { min-width: 0; }

/* ------------------------------------------ ২৬খ. যন্ত্রের ক্রমতালিকা */
.map-list {
  border: 1px solid var(--line); border-radius: var(--r-md);
  background: var(--surface); overflow: hidden;
  /* তালিকা মানচিত্রের চেয়ে বেঁটে — নিচে লেজেন্ডের জায়গা রাখতে হয় */
  max-height: clamp(220px, 40vh, 380px); overflow-y: auto;
}
.ml-head {
  display: flex; justify-content: space-between; gap: var(--s2);
  padding: var(--s2) var(--s3);
  font-size: var(--t-xs); font-weight: 600; color: var(--ink-2);
  background: var(--surface-2); border-bottom: 1px solid var(--line);
  position: sticky; top: 0; z-index: 1;
}
.ml-row {
  display: grid; grid-template-columns: 12px minmax(0, 1fr) auto;
  align-items: center; gap: var(--s2);
  width: 100%; padding: var(--s2) var(--s3);
  background: none; border: 0; border-bottom: 1px solid var(--line);
  font: inherit; font-size: var(--t-sm); color: var(--ink);
  text-align: left; cursor: pointer;
}
.ml-row:last-child { border-bottom: 0; }
.ml-row:hover  { background: var(--surface-2); }
.ml-row:focus-visible { outline: 2px solid var(--focus, var(--ink)); outline-offset: -2px; }
.ml-row i {
  width: 12px; height: 12px; border-radius: 3px; flex: none;
  box-shadow: 0 0 0 1px var(--line-2);
}
/* ⚠ এলাকার বাইরের যন্ত্র — রঙ নয়, আকৃতি ও লেখা দিয়ে আলাদা করা।
   রঙ একা পার্থক্য বহন করলে বর্ণান্ধ পাঠক ও সাদাকালো প্রিন্ট দুটোতেই
   "সতর্কতার ভিত্তি" আর "শুধু তুলনা" এক হয়ে যেত। */
.ml-row.is-out i { border-radius: 50%; opacity: .55; }
.ml-row.is-out .ml-name { color: var(--ink-2); }
.ml-tag {
  font-size: 10px; padding: 0 4px; border-radius: var(--r-sm);
  background: var(--surface-3); color: var(--ink-2);
}
.ml-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ml-val { font-variant-numeric: tabular-nums; font-weight: 600; }
.ml-row.is-sel {
  background: var(--surface-2);
  box-shadow: inset 3px 0 0 var(--ink);
}

/* ------------------------------------------------- ২৬গ. দিনের ফিতা */
.map-days {
  display: flex; gap: var(--s2); flex-wrap: wrap; align-items: center;
  margin: 0 0 var(--s3);
}
.md-lead {
  font-size: var(--t-xs); font-weight: 600; color: var(--ink-2);
  margin-right: var(--s2); align-self: center;
}
.md-day {
  display: grid; gap: 2px; justify-items: center;
  padding: var(--s2) var(--s3);
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-md); cursor: pointer;
  font: inherit; font-size: var(--t-xs); color: var(--ink-2);
  min-width: 62px;
}
.md-day:hover { border-color: var(--line-2); }
.md-day.is-on {
  border-color: var(--ink); color: var(--ink);
  box-shadow: 0 0 0 1px var(--ink);
}
.md-bar { display: block; width: 100%; height: 6px; border-radius: 3px; }
.md-val { font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; }

/* -------------------------------------------- ২৬ঘ. নির্বাচনের চিপ */
.map-pick {
  display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap;
  margin-top: var(--s3); padding: var(--s2) var(--s3);
  border: 1px solid var(--line); border-radius: var(--r-md);
  background: var(--surface-2); font-size: var(--t-sm);
}
.mp-label {
  font-size: var(--t-xs); font-weight: 600; color: var(--ink-2);
  text-transform: uppercase; letter-spacing: .04em;
}
.mp-go {
  margin-left: auto; padding: var(--s1) var(--s3);
  background: var(--surface); border: 1px solid var(--line-2);
  border-radius: var(--r-sm); font: inherit; font-size: var(--t-xs);
  color: var(--ink); cursor: pointer;
}
.mp-go:hover { background: var(--surface-3); }
@keyframes mp-flash {
  from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--ink) 35%, transparent); }
  to   { box-shadow: 0 0 0 10px transparent; }
}
.map-pick.mp-flash { animation: mp-flash .7s ease-out 1; }
@media (prefers-reduced-motion: reduce) {
  .map-pick.mp-flash { animation: none; }
}

/* ------------------------------------------------ ২৬ঙ. মান-বাহী বিন্দু */
/* ⚠ divIcon, circleMarker নয় — কারণটি dashboard.js-এ লেখা: SVG বৃত্তের
   ভেতরে লেখা বসানো যায় না। iconAnchor শূন্য, তাই অবস্থান ঠিক করা হয়
   translate দিয়ে; এতে লেবেলের প্রস্থ যা-ই হোক, কেন্দ্রটি স্থানাঙ্কেই থাকে। */
.stn-pin {
  display: grid; justify-items: center; gap: 1px;
  transform: translate(-50%, -50%);
  white-space: nowrap; pointer-events: auto;
}
.pin-v {
  display: inline-block; padding: 2px 7px;
  border-radius: 999px; font-size: 12px; font-weight: 700; line-height: 1.5;
  font-variant-numeric: tabular-nums;
  /* ২px পৃষ্ঠতলের বলয় — মার্ক স্পেকের নিয়ম: পরস্পরের উপর বসা চিহ্নের
     মাঝে পৃষ্ঠতলের ফাঁক থাকবে, নইলে দুটি বড়ি এক গোলা হয়ে যায় */
  box-shadow: 0 0 0 2px var(--surface), 0 1px 3px rgba(0, 0, 0, .28);
  background: var(--surface-3); color: var(--ink-2);
}
.pin-n {
  font-size: 9px; font-weight: 600; letter-spacing: .02em;
  color: var(--ink-2);
  background: color-mix(in srgb, var(--surface) 82%, transparent);
  padding: 0 3px; border-radius: var(--r-sm);
}
/* এলাকার বাইরের যন্ত্র — ভাঙা বলয়, যাতে দেখেই বোঝা যায় এটি সতর্কতার
   ভিত্তি নয়। v7.0-এর ফাঁপা বৃত্তের নিয়মটিই, নতুন আকৃতিতে। */
.stn-pin.is-out .pin-v {
  box-shadow: 0 0 0 2px var(--surface), 0 0 0 3px var(--line-2);
  opacity: .82;
}
.stn-pin.is-blank .pin-v { font-weight: 500; opacity: .7; }
.stn-pin.is-sel .pin-v,
.stn-pin.is-hot .pin-v {
  box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px var(--ink);
  transform: scale(1.12);
}
.stn-pin .pin-v { transition: transform .12s ease-out; }
@media (prefers-reduced-motion: reduce) {
  .stn-pin .pin-v { transition: none; }
}

/* --------------------------------------------------- ২৬চ. লেজেন্ড */
/* ⚠ v8.5 — লেজেন্ড এখন মানচিত্রের **পাশে**, উপরে নয়।
   পুরনো নিয়মটি ছিল `position:absolute; right; bottom` — ২৩ নং অংশে
   এখনো লেখা আছে, কারণ ঐ ছাঁচটি অন্য কোথাও ব্যবহার হতে পারে। এখানে
   সেটিকে বাতিল করা হচ্ছে, চুপচাপ মুছে নয়: absolute থাকলে লেজেন্ডটি
   পাশের কলামে গিয়েও নিজের জায়গা নিত না, আর তালিকার উপর বসে পড়ত। */
.map-side .legend {
  position: static; right: auto; bottom: auto;
  margin-top: var(--s3); box-shadow: none;
}
.legend { max-width: 260px; line-height: 1.5; }
.legend strong { display: block; margin-bottom: var(--s2); font-size: var(--t-xs); }
.lg-rows { display: grid; gap: 3px; }
.lg-row { display: grid; grid-template-columns: 12px minmax(0, 1fr) auto; gap: var(--s2);
          align-items: center; }
.lg-row span { color: var(--ink-2); }
.lg-row .muted { font-variant-numeric: tabular-nums; }
.lg-ramp { display: flex; height: 10px; border-radius: 3px; overflow: hidden; margin: 2px 0; }
.lg-ramp i { flex: 1; height: 100%; margin: 0; border-radius: 0; }
.lg-ends { display: flex; justify-content: space-between; color: var(--ink-3);
           font-variant-numeric: tabular-nums; }
.lg-sep { height: 1px; background: var(--line); margin: var(--s2) 0; }
.lg-fine { margin-top: var(--s2); color: var(--ink-3); line-height: 1.45; }
.legend i.lg-dot.lg-out { background: var(--surface-3); box-shadow: 0 0 0 2px var(--line-2); }

@media (max-width: 900px) {
  /* সরু পর্দায় লেজেন্ড মানচিত্রের উপরে বসলে অর্ধেক মানচিত্র ঢেকে দিত */
  .legend {
    position: static; max-width: none; margin-top: var(--s3);
    box-shadow: none;
  }
}

/* -------------------------------------------------- ২৬ছ. পপ-আপ */
.pop { min-width: 190px; }
.pop-lvl {
  display: inline-block; margin: var(--s2) 0;
  padding: 2px var(--s3); border-radius: var(--r-sm);
  font-size: var(--t-xs); font-weight: 700;
}
.pop-row {
  display: flex; justify-content: space-between; gap: var(--s3);
  padding: 2px 0; border-bottom: 1px dotted var(--line);
}
.pop-row:last-of-type { border-bottom: 0; }
.pop-row > span:first-child { color: var(--ink-2); }
.pop-row .num { font-variant-numeric: tabular-nums; }
/* বাছা চলকটি মোটা হরফে — বাকিগুলো প্রসঙ্গ, এটিই উত্তর */
.pop-row.is-cur > span:first-child { color: var(--ink); font-weight: 600; }
.pop-fine { font-size: var(--t-xs); color: var(--ink-3); line-height: 1.45; margin-top: 2px; }
.pop-go {
  margin-top: var(--s3); width: 100%; padding: var(--s2);
  background: var(--surface-2); border: 1px solid var(--line-2);
  border-radius: var(--r-sm); font: inherit; font-size: var(--t-xs);
  color: var(--ink); cursor: pointer;
}
.pop-go:hover { background: var(--surface-3); }

.leaflet-tooltip.map-tip {
  background: var(--surface); color: var(--ink);
  border: 1px solid var(--line); box-shadow: var(--e2);
  font-size: var(--t-xs); font-variant-numeric: tabular-nums;
}
.leaflet-tooltip.map-tip::before { border-top-color: var(--line); }

/* =====================================================================
   ২৭. v8.5 — ঘণ্টার চক্র ও ঋতুর কার্ড
   ===================================================================== */

/* ছোট চার্ট — এক্সপোজারের স্তম্ভ ও বৃষ্টির চক্র দুটোই সহায়ক ছবি,
   মূল ছবি নয়। উচ্চতা কম রাখলে চোখ আগে মূল চার্টে পড়ে। */
.chart.short { aspect-ratio: 32 / 9; min-height: 170px; max-height: 240px; }
@media (max-width: 700px) {
  .chart.short { aspect-ratio: 16 / 9; min-height: 180px; }
}

/* কার্ডের ভেতরের উপ-শিরোনাম — h3-র পর h4, ক্রম ভাঙা হয়নি */
.sub-h {
  margin: var(--s5) 0 var(--s3);
  font-family: 'Anek Bangla', system-ui, sans-serif;
  font-size: var(--t-md); font-weight: 600; color: var(--ink-2);
}

/* ছোট KPI — কার্ডের ভেতরে, পাতার উপরের বড় KPI-র চেয়ে হালকা */
.kpis-sm { grid-template-columns: repeat(auto-fit, minmax(128px, 1fr));
           gap: var(--s2); margin-bottom: var(--s4); }
.kpis-sm .kpi { padding: var(--s2) var(--s3); box-shadow: none; }
.kpis-sm .kpi .v { font-size: var(--t-lg); }

/* ------------------------- ২৭খ. v8.5 — লাইভ কার্ড ক্লিকযোগ্য */
/* পুরো কার্ডটি হিট-এরিয়া, কিন্তু হিট-এরিয়াটি একটি প্রকৃত <button> —
   কার্ডের ভেতরের লেখা তার উপরে থাকে (position + z-index), তাই লেখা
   নির্বাচন করা যায়, আর কীবোর্ডে Tab করলে বোতামটিই ফোকাস পায়। */
.st-card.is-pick { position: relative; cursor: pointer; }
.st-card .st-hit {
  position: absolute; inset: 0; z-index: 1;
  background: none; border: 0; padding: 0; margin: 0;
  border-radius: var(--r-md); cursor: pointer;
}
.st-card.is-pick > *:not(.st-hit) { position: relative; z-index: 2; pointer-events: none; }
.st-card .st-hit:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.st-card.is-pick:hover { border-color: var(--line-2); box-shadow: var(--e2); }
/* স্তরের নাম — রঙ নয়, কালি। কারণ dashboard.js-এর মন্তব্যে লেখা। */
.st-card .sub.lvname { font-weight: 600; color: var(--ink); }

/* .sr-only উপরে ৬৬১ নং লাইনে আগে থেকেই আছে — এখানে আবার লেখা হয়নি;
   দুটি একই নিয়ম থাকলে পরে একটি বদলালে অন্যটি নীরবে পুরনো থেকে যেত। */

/* ------------------ ২৭গ. v8.6 — গ্রামে যন্ত্র আছে কি না */
/* লেজেন্ডের দুটি নমুনা মানচিত্রের রূপরেখার হুবহু প্রতিরূপ — মোটা কালো
   বলতে "যন্ত্র বসানো", ভাঙা ধূসর বলতে "খানার লগার বাকি"। দুটি আলাদা
   জিনিস, তাই দুটি আলাদা আকৃতি; রঙ এখানে কিছুই বহন করে না। */
.legend i.lg-vill {
  background: var(--surface-3);
  border: 2px solid var(--ink); border-radius: 2px;
}
.legend i.lg-vill-need {
  background: var(--surface-3);
  border: 1px dashed var(--ink-3); border-radius: 2px;
}
/* গ্রামের পপ-আপে "এই গ্রামে যন্ত্র" সারি — বাকিগুলোর চেয়ে আলাদা,
   কারণ এটিই ঐ পপ-আপের সবচেয়ে কাজের তথ্য */
.pop-inst {
  margin-top: var(--s2); padding: var(--s1) var(--s2);
  background: var(--surface-2); border-radius: var(--r-sm);
  font-size: var(--t-xs);
}
.pop-fine .mono { font-family: 'IBM Plex Mono', monospace; }

/* ------------- ২৭ঘ. v8.6.2 — Config.local.php ব্যাখ্যার কার্ড */
/* ⚠ এই তিনটি ক্লাস আগে ছিল না, অথচ mailtest.php-এ ব্যবহার করা হয়েছিল।
   ক্লাস না থাকলে ব্রাউজার নীরবে কিছুই করে না — ব্যাজটি সাধারণ ধূসর
   লেখা হয়ে যেত আর "আছে / নেই" পার্থক্যটাই মুছে যেত। */
.card h3 .tag.ok   { color: var(--ok);   font-weight: 600; }
.card h3 .tag.warn { color: var(--warn); font-weight: 600; }

/* ফাইলের হুবহু লেখা — কপি করার জন্য, তাই নির্বাচনযোগ্য ও স্ক্রলযোগ্য */
pre.code-block {
  margin: var(--s3) 0 0; padding: var(--s3) var(--s4);
  background: var(--surface-2); border: 1px solid var(--line);
  border-radius: var(--r-sm);
  font-family: 'IBM Plex Mono', monospace; font-size: var(--t-xs);
  line-height: 1.8; color: var(--ink);
  overflow-x: auto; white-space: pre;
}
pre.code-block code { background: none; padding: 0; font-size: inherit; }

/* =====================================================================
   ২৮. v8.7 — এলাকার বিস্তার (সর্বনিম্ন · গড় · সর্বোচ্চ)
   ---------------------------------------------------------------------
   তিনটি ঘর পাশাপাশি, তারপর একটি ব্যাখ্যার লাইন। সর্বোচ্চ ঘরটিই
   সতর্কতার ভিত্তি, তাই সেটির বাঁয়ে একটি সরু পটি — রঙ একা নয়, লেখাও
   ("সর্বোচ্চ") পার্থক্যটি বহন করে।
   ===================================================================== */
.spread {
  display: grid; gap: var(--s3);
  grid-template-columns: repeat(3, minmax(0, 1fr));
  margin-bottom: var(--s4);
}
.sp-note { grid-column: 1 / -1; font-size: var(--t-sm); color: var(--ink-2); line-height: 1.6; }
.sp-note .muted { font-size: var(--t-xs); }
.sp-cell {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-md); padding: var(--s3) var(--s4);
  display: flex; flex-direction: column; gap: 2px;
}
.sp-cell.is-hi { border-left: 4px solid var(--lvl3); padding-left: calc(var(--s4) - 3px); }
.sp-k { font-size: var(--t-xs); color: var(--ink-3); }
.sp-v {
  font-family: 'IBM Plex Mono', monospace; font-variant-numeric: tabular-nums;
  font-size: var(--t-xl); line-height: 1.15;
}
.sp-v small { font-size: var(--t-sm); color: var(--ink-3); }
.sp-s {
  font-size: var(--t-xs); color: var(--ink-2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
@media (max-width: 640px) {
  .spread { grid-template-columns: 1fr; }
}

/* ---------------------------------------------------- v9.3 · ডেটা পুরনো
   স্তরের ব্যান্ডের উপরে বসে। রঙটি সতর্কতার, বিপদের নয় — ডেটা পুরনো
   হওয়া আর তাপপ্রবাহ হওয়া দুটো আলাদা জিনিস, আর দুটোকে একই লাল রঙে
   দেখালে পাঠক গুলিয়ে ফেলতেন। বাঁ পাশের মোটা দাগটি রঙ ছাড়াও চিহ্ন
   বহন করে (সাদাকালো ছাপা, বর্ণান্ধতা)। */
.stale-bar {
  display: flex; gap: var(--s3); align-items: flex-start;
  margin: 0 0 var(--s5);
  padding: var(--s3) var(--s4);
  border: 1px solid color-mix(in srgb, var(--warn) 40%, var(--line));
  border-left: 4px solid var(--warn);
  border-radius: var(--r-md);
  background: color-mix(in srgb, var(--warn) 8%, var(--surface));
  font-size: var(--t-sm); line-height: 1.6; color: var(--ink);
}
.stale-bar b { color: var(--ink); }
.stale-bar .why { color: var(--ink-2); display: block; margin-top: 2px; }
.stale-bar .ico { flex: 0 0 auto; font-size: var(--t-md); line-height: 1.4; }

/* -------------------------------------------------- v10.4.6 · কাঁচা/সংশোধিত
   মডেল প্রশিক্ষিত না হওয়া পর্যন্ত সর্বোচ্চ তাপমাত্রা কাঁচা NWP মান —
   এটি .stale-bar-এর মতোই কাঠামো, কিন্তু ইচ্ছাকৃতভাবে --warn নয়, --brand:
   এটি একটি ত্রুটি বা বিপদ নয় (P10/P90 তখনও নির্ভরযোগ্য), শুধু স্বচ্ছতা —
   লাল/হলুদ রঙে দেখালে পাঠক ভাবতেন কিছু ভেঙে গেছে। */
.model-bar {
  display: flex; gap: var(--s3); align-items: flex-start;
  margin: 0 0 var(--s5);
  padding: var(--s3) var(--s4);
  border: 1px solid color-mix(in srgb, var(--brand) 35%, var(--line));
  border-left: 4px solid var(--brand);
  border-radius: var(--r-md);
  background: color-mix(in srgb, var(--brand) 7%, var(--surface));
  font-size: var(--t-sm); line-height: 1.6; color: var(--ink);
}
.model-bar b { color: var(--ink); }
.model-bar .why { color: var(--ink-2); display: block; margin-top: 2px; }
.model-bar .ico { flex: 0 0 auto; font-size: var(--t-md); line-height: 1.4; }

/* =====================================================================
 *  BMD উপজেলা পূর্বাভাস প্যানেল — usf.bmd.gov.bd-র ধাঁচে    v10.5.0
 * ---------------------------------------------------------------------
 *  BMD-র পাতাটির চেহারা: উপরে একটি চওড়া পটি, নিচে সাত দিনের সমান
 *  কার্ড — প্রতিটিতে দিন, তারিখ, আইকন, সর্বোচ্চ/সর্বনিম্ন, বৃষ্টি,
 *  বাতাস, আর্দ্রতা। সেই গঠনটিই রাখা হলো, কিন্তু এই সাইটের রঙ ও
 *  টাইপোগ্রাফিতে — নইলে পাতার মাঝখানে অন্য একটি সাইট বসে থাকত।
 *
 *  ⚠ বাক্সটির রঙ ইচ্ছাকৃতভাবে **নিরপেক্ষ** (নীলচে-ধূসর), তাপপ্রবাহের
 *    সবুজ/হলুদ/লাল র‍্যাম্পের কোনোটি নয়। কারণ ঐ রঙগুলো এই সাইটে
 *    একটি নির্দিষ্ট অর্থ বহন করে — BMD-র শ্রেণি। মডেলের পূর্বাভাসে
 *    ঐ রঙ বসালে পাঠক ভাবতেন এখান থেকেই স্তর ঠিক হচ্ছে।
 * ===================================================================== */
.usf{
  border:1px solid var(--line,#E2E8E6);
  border-radius:12px;
  background:var(--card,#fff);
  padding:12px 13px 9px;
  margin:0 0 12px;
}
/* শিরোনাম-পটি — BMD-র পাতার মতো: বাঁয়ে জায়গা, ডানে আজকের অবস্থা */
/* =====================================================================
   BMD-র পটি — গাঢ় গ্র্যাডিয়েন্ট, সাদা লেখা            v10.7.1
   ---------------------------------------------------------------------
   ⚠ আগে এটি হালকা ধূসর ছিল। BMD-র আসল পাতাটি দেখে বদলানো হলো:
     ওদের পটিটি উপরে-বাঁয়ে প্রায় কালো থেকে নিচে-ডানে উষ্ণ বাদামি —
     আর সব লেখা সাদা। ব্যবহারকারী "হুবহু একই" চেয়েছেন।

   ⚠ গাঢ় পটিতে লেখার রঙও বদলাতে হয়েছে। আগে একবার শুধু background
     বদলে ফেলায় গাঢ় পটিতে গাঢ় নীল লেখা বসেছিল — প্রায় অদৃশ্য।
     তাই এখানে প্রতিটি লেখার রঙ স্পষ্ট করে লেখা।
   ===================================================================== */
.usf-band{
  display:flex; align-items:flex-start; gap:14px; flex-wrap:wrap;
  padding:14px 16px 11px; margin:0 0 11px;
  background:linear-gradient(115deg,#1A1512 0%,#3A2A1C 45%,#8A5A2B 100%);
  border:1px solid #2A1F17; border-radius:9px;
  color:#FFFFFF; position:relative;
}
.usf-band-l{ flex:1 1 210px; min-width:0 }
.usf-band-l .usf-title{ color:#FFFFFF }
.usf-band-l .usf-sub{ color:rgba(255,255,255,.82) }

/* ডান দিকে আজকের অবস্থা — BMD-র মতো তিন ভাগে */
.usf-band-r{
  display:flex; align-items:center; gap:20px; flex-wrap:wrap;
  font-size:.82rem; color:rgba(255,255,255,.9);
  font-variant-numeric:tabular-nums;
}
.usf-band-r > span{ display:flex; align-items:baseline; gap:5px; white-space:nowrap }
.usf-band-r .n{ font-weight:700; color:#FFFFFF; font-size:1rem }
.usf-band-r i{ font-style:normal; opacity:.85; margin-right:2px }

/* নিচে ডানে — তথ্যসূত্র ও সর্বশেষ আপডেট, BMD-র মতো ছোট করে */
.usf-src{
  position:absolute; right:12px; bottom:5px;
  font-size:.66rem; color:rgba(255,255,255,.62);
  font-variant-numeric:tabular-nums; white-space:nowrap;
}
@media (max-width:720px){
  .usf-src{ position:static; margin-top:6px; text-align:left }
}

.usf-title{
  font-size:.93rem; font-weight:700; margin:0 0 1px;
  color:#1C2C3A; letter-spacing:-.01em;
}
.usf-sub{ margin:0; font-size:.78rem; color:#5B7085 }
.usf-meta{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.usf-tag{
  font:600 .72rem/1 ui-monospace,SFMono-Regular,Menlo,monospace;
  letter-spacing:.06em; text-transform:uppercase;
  background:rgba(255,255,255,.16); color:#FFFFFF;
  border:1px solid rgba(255,255,255,.24);
  padding:5px 9px; border-radius:999px; white-space:nowrap;
}
.usf-stale{
  font-size:.74rem; font-weight:600; color:#8A6D3B;
  background:#FBF3E2; padding:5px 9px; border-radius:999px;
}

/* সাত দিনের সারি — BMD-র মতো সমান ঘর, ছোট পর্দায় পাশে গড়ায় */
.usf-days{
  display:grid; grid-auto-flow:column;
  grid-auto-columns:minmax(116px,1fr);
  gap:0; overflow-x:auto; scroll-snap-type:x proximity;
  border:1px solid var(--line,#E2E8E6); border-radius:10px;
}
.usf-day{
  scroll-snap-align:start;
  padding:10px 8px 12px; text-align:center;
  border-right:1px solid var(--line,#E2E8E6);
  display:flex; flex-direction:column; gap:6px; min-width:0;
}
.usf-day:last-child{ border-right:0 }
/* ⚠ v10.17.0 — এখানে হার্ডকোড করা ছিল #F4F8FA, একটি প্রায়-সাদা রঙ।
   অন্ধকার থিমে ঐ ঘরটি সাদা হয়ে যেত আর তার উপর হালকা কালি — আজকের
   দিনের কার্ডটিই পড়া যেত না। টোকেন ব্যবহার করলে দুই থিমেই ঠিক।
   ⚠ আর কেবল রঙ নয়, একটি দাগও: রঙ-অন্ধ পাঠকের কাছে হালকা আভা প্রায়
   অদৃশ্য, তাই "আজ" চেনাতে রঙই একমাত্র সংকেত হতে পারে না। */
.usf-day.is-today{
  background: var(--brand-soft);
  box-shadow: inset 0 3px 0 0 var(--brand);
}
.usf-dow{ font-size:.78rem; font-weight:700; color:var(--ink,#1C2422) }
.usf-date{ font-size:.72rem; color:var(--muted,#6B7A77) }
.usf-ico{ font-size:1.5rem; line-height:1.1 }
.usf-t{ font-size:.92rem; font-weight:700; font-variant-numeric:tabular-nums }
.usf-t .lo{ color:var(--muted,#6B7A77); font-weight:500 }
.usf-row{
  font-size:.72rem; color:var(--muted,#6B7A77);
  font-variant-numeric:tabular-nums;
  display:flex; align-items:center; justify-content:center; gap:4px;
}
.usf-foot{
  margin:10px 2px 0; font-size:.76rem; line-height:1.6;
  color:var(--muted,#6B7A77);
}
.usf-foot a{ color:inherit; text-decoration:underline }
.usf-foot b{ color:var(--ink,#1C2422) }

@media (max-width:640px){
  .usf{ padding:10px 10px 8px; border-radius:10px }
  .usf-days{ grid-auto-columns:minmax(102px,1fr) }
  .usf-band{ padding:9px 10px; gap:9px }
  .usf-band-r{ font-size:.76rem; gap:10px; width:100% }
}

/* =====================================================================
   বায়ুমান প্যানেল — BMD পটির স্টাইল ধার করে                v10.6.1
   ---------------------------------------------------------------------
   ⚠ .aq নিজে থেকে নতুন কিছু আঁকে না; .usf-এর গঠনটাই ব্যবহার করে।
     আলাদা স্টাইল লিখলে দুটি প্যানেল সময়ের সাথে আলাদা দেখাত —
     এই প্রকল্পের চেনা সমস্যা (এক নিয়ম, দুই জায়গা)।
   ===================================================================== */
/* ⚠ প্রথমে এখানে একটি **গাঢ়** গ্র্যাডিয়েন্ট বসানো হয়েছিল, আর
   সেটি নীরবে পটির সব লেখা অপাঠ্য করে দিয়েছিল: .usf-band-r-এর
   রঙ #41566B (গাঢ় নীল), যা গাঢ় পটিতে প্রায় অদৃশ্য। রেন্ডার করে
   ছবি দেখে ধরা পড়েছে। তাই পটিটি BMD-রই — একই হালকা গ্র্যাডিয়েন্ট,
   একই লেখার রঙ। পার্থক্য বোঝাতে কেবল বাঁয়ে একটি সরু রেখা। */
.usf.aq .usf-band{
  background:linear-gradient(115deg,#101A1E 0%,#1C3540 45%,#2E6E7E 100%);
  border-color:#16262C;
}
.usf.aq .usf-band-r .n { font-variant-numeric: tabular-nums; }
/* পটিতে PM-এর নামগুলো যেন ছোট লেবেল হয়ে দেখা যায় */
.usf.aq .usf-band-r i { font-size: .72em; letter-spacing: .02em; opacity: .8 }

/* পূর্বাভাসের দিনগুলো একটু ম্লান — মাপা/বিশ্লেষণ করা দিন থেকে
   আলাদা বোঝা যায়, অথচ পড়তে অসুবিধা হয় না */
.usf .usf-day.is-fc { opacity: .88; border-style: dashed; }
.usf .usf-fc-tag {
  font-size: .68em; font-weight: 600; letter-spacing: .02em;
  opacity: .75; white-space: nowrap;
}

/* দিন ও রাতের আইকন পাশাপাশি — BMD-র পাতার মতো            v10.7.1 */
.usf-ico{ display:flex; align-items:center; justify-content:center; gap:6px }
.usf-ico .d{ font-size:1.55rem; line-height:1 }
.usf-ico .n{
  font-size:.9rem; line-height:1; width:24px; height:24px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  background:#2B3440; /* গাঢ় গোলক — রাত বোঝাতে */
}
.usf-cond{
  margin:5px 0 0; font-size:.95rem; font-weight:600;
  color:#FFFFFF; letter-spacing:.01em;
}

/* =====================================================================
   BMD পূর্বাভাস ও বায়ুমানের চার্ট                          v10.7.2
   ---------------------------------------------------------------------
   ⚠ তিনটি চার্ট পাশাপাশি, ছোট পর্দায় একটির নিচে আরেকটি। উচ্চতা
     ইচ্ছাকৃতভাবে কম (১৪০px) — এগুলো প্রেক্ষাপট, পাতার প্রধান কথা নয়।
   ===================================================================== */
.usf-charts{
  display:grid; grid-template-columns:repeat(3,1fr); gap:14px;
  margin:14px 0 4px;
}
.usf-charts.one{ grid-template-columns:1fr }
@media (max-width:860px){ .usf-charts{ grid-template-columns:1fr } }
.usf-fig{ margin:0; min-width:0 }
.usf-fig figcaption{
  font-size:.78rem; font-weight:600; color:var(--ink-2,#3A4A47);
  margin:0 0 4px; letter-spacing:.01em;
}
.usf-fig figcaption span{ font-weight:400; color:var(--ink-3,#6B7A77) }
.usf-chart{ height:140px; width:100% }
.usf-charts.one .usf-chart{ height:170px }

/* =====================================================================
   ৩৩. গ্রামের তথ্য-প্যানেল ও জাল                    v10.8.0, নতুন
   ---------------------------------------------------------------------
   মানচিত্রে গ্রামে ক্লিক করলে পাশে যা খোলে। ক্রমতালিকার **উপরে**
   বসে, কারণ ক্লিকের সরাসরি উত্তরটিই সবার আগে চোখে পড়া দরকার।

   ⚠ সব রঙ টোকেন থেকে — কোনো literal নেই। আলো↔অন্ধকার দুটোতেই
     একই নিয়মে বদলায়, আর মানচিত্রের বৃত্তগুলোও একই টোকেন পড়ে
     (dashboard.js-এর css() দিয়ে), তাই দুটো কখনো আলাদা হয়ে যায় না।
   ===================================================================== */
.vill-info {
  border: 1px solid var(--line); border-radius: var(--r-md);
  background: var(--surface); padding: var(--s3);
  margin-bottom: var(--s3); font-size: var(--t-sm);
}
.vi-head { margin-bottom: var(--s2); }
.vi-head strong { display: block; color: var(--ink); font-size: var(--t-md); }
.vi-un { display: block; color: var(--ink-3); font-size: var(--t-xs); margin-top: 2px; }
.vi-row {
  display: flex; justify-content: space-between; gap: var(--s2);
  padding: 3px 0; color: var(--ink-2);
}
.vi-row .num { color: var(--ink); font-variant-numeric: tabular-nums; }
.vi-sep { height: 1px; background: var(--line); margin: var(--s2) 0; }
.vi-inst {
  background: var(--surface-2); border-radius: var(--r-sm);
  padding: 5px var(--s2); margin-bottom: var(--s2);
  font-size: var(--t-xs); color: var(--ink-2);
}
.vi-lvl {
  display: inline-block; margin-top: var(--s2);
  padding: 3px var(--s2); border-radius: var(--r-sm);
  font-size: var(--t-xs); font-weight: 600;
}
.vi-note {
  margin: var(--s2) 0 0; font-size: var(--t-xs);
  color: var(--ink-3); line-height: 1.5;
}

/* গ্রামের বৃত্ত — যন্ত্র বসানো থাকলে বলয়টি ঘন
   ⚠ ভরাট ও রেখার রঙ JS বসায় (স্তর অনুযায়ী), তাই এখানে কেবল
     যেটুকু CSS-এ থাকা দরকার: ইঙ্গিতের কার্সর ও হোভার। */
.vill-dot { cursor: pointer; transition: fill-opacity .12s ease; }
.vill-dot:hover { fill-opacity: 1; }

/* লেজেন্ডের দুটি নতুন চিহ্ন — জালের জন্য (v10.8.0) */
.legend i.lg-line {
  width: 14px; height: 0; border: 0;
  border-top: 2px solid var(--ink-3); border-radius: 0;
  align-self: center;
}
.legend i.lg-ring {
  background: transparent;
  border: 2.5px solid var(--ink-2);
  box-shadow: inset 0 0 0 3px var(--ink-3);
}

/* ---------------------------------------------------------------------
   গ্রামের জাল চালু থাকলে যন্ত্রের কোড-লেবেলটি লুকানো      v10.8.0
   ---------------------------------------------------------------------
   ⚠ কেন। ৪৯টি গ্রামের বৃত্ত + ১২টি যন্ত্রের বড়ি + ১২টি কোড-লেবেল
   একসাথে ৩৫০ পিক্সেল চওড়া একটি এলাকায় — ছবি তুলে দেখা গেছে সবকিছু
   একে অন্যের উপর উঠে গিয়ে কোনোটাই পড়া যাচ্ছে না।

   তিনটির মধ্যে কোন‌টি বাদ যাবে, সেটি ঠিক হয়েছে কাজ দেখে:
     · সংখ্যা (৩৬.৪°C) — মানচিত্রের মূল উত্তর, থাকবে
     · গ্রামের বৃত্ত    — এই সংস্করণের মূল সংযোজন, থাকবে
     · কোড (WC05)      — পরিচয়ের লেবেল, আর সেটি পাশের ক্রমতালিকায়
                          পুরো নামসহ আছে; হোভার বা বাছাইয়ে ফিরেও আসে

   অর্থাৎ কোনো তথ্য হারায়নি, কেবল একসাথে দেখানো হচ্ছে না।
   --------------------------------------------------------------------- */
.map-net .stn-pin .pin-n { display: none; }
.map-net .stn-pin:hover .pin-n,
.map-net .stn-pin:focus-within .pin-n,
.map-net .stn-pin.is-sel .pin-n { display: inline-block; }

/* খালি চার্টের ঘর — যতটুকু লেখা, ততটুকুই জায়গা (v10.8.0)
   কারণ emptyChart()-এর মন্তব্যে লেখা আছে। */
.chart.is-empty {
  aspect-ratio: auto; min-height: 0; max-height: none;
}
.chart.is-empty .chart-empty { padding: var(--s4) var(--s3); }

/* "সব ঘরে একই সংখ্যা" নিশ্চিতকরণের টিক (v10.9.0)
   ⚠ লাল ঘেরাটোপ ইচ্ছাকৃত — এটি একটি ব্যতিক্রম চাওয়ার জায়গা,
   আর ব্যতিক্রম চাওয়াটা সহজ দেখানো উচিত নয়। */
.confirm-flat {
  display: flex; gap: var(--s2); align-items: flex-start;
  margin-top: var(--s4); padding: var(--s3);
  border: 1px solid var(--bad); border-radius: var(--r-md);
  background: var(--surface); font-size: var(--t-sm); line-height: 1.6;
}
.confirm-flat input { margin-top: 3px; flex: 0 0 auto; }

/* =====================================================================
   ৩ দিনের ঘণ্টাভিত্তিক পূর্বাভাস — BMD-র নিচের অংশ    v10.10.0
   ---------------------------------------------------------------------
   BMD-র পাতায় এই অংশটি পূর্ণ-প্রস্থে, থাকে থাকে সাজানো, আর প্রতিটি
   থাকের বাঁয়ে ঘোরানো লেবেল। সেই গঠনটিই এখানে।

   ⚠ উপরের .usf-charts (সাতদিনের সারাংশ) পাশাপাশি তিন ভাগে; এটি
     থাকে থাকে। দুটোর প্রশ্ন আলাদা — একটি "সপ্তাহটা কেমন", অন্যটি
     "আগামী তিন দিনে ঘণ্টায় ঘণ্টায় কী"। গঠনও তাই আলাদা।
   ===================================================================== */
.usf-steps {
  margin-top: var(--s4);
  border-top: 1px solid var(--line);
  padding-top: var(--s4);
}
.usf-steps-h {
  margin: 0 0 var(--s3);
  font-size: var(--t-md); font-weight: 600; color: var(--ink);
  display: flex; align-items: baseline; gap: var(--s2);
}
.usf-steps-h span {
  font-size: var(--t-xs); font-weight: 400; color: var(--ink-3);
}
.usf-srow {
  display: grid; grid-template-columns: 74px minmax(0, 1fr);
  align-items: center; gap: var(--s2);
  margin: 0 0 2px;
}
.usf-srow figcaption {
  font-size: var(--t-xs); color: var(--ink-2); line-height: 1.35;
  text-align: right; padding-right: var(--s2);
}
.usf-srow figcaption span { display: block; color: var(--ink-3); }

/* ⚠ উচ্চতা কম, কারণ চারটি থাক একসাথে দেখতে হয়। শেষ থাকটি একটু
   লম্বা — ওখানেই x-অক্ষের তারিখ ও সময় দুই লাইনে বসে। */
.usf-schart { width: 100%; height: 104px; }
.usf-srow:last-child .usf-schart { height: 136px; }

@media (max-width: 700px) {
  .usf-srow { grid-template-columns: 56px minmax(0, 1fr); }
  .usf-schart { height: 92px; }
  .usf-srow:last-child .usf-schart { height: 126px; }
}

/* --------------------------------------- BMD_USF-এর ডেটা-ব্রাউজার v10.10.0
   ⚠ চার্টের নিচে সংখ্যার সারণি — কারণ উৎসটি স্টেশন নয়, তাই
     admin/data.php-র স্টেশন-ভিত্তিক ব্রাউজারে সে কখনো উঠবে না।
     এটিই তার নিজের ব্রাউজার। */
.usf-store {
  margin-top: var(--s4);
  border-top: 1px solid var(--line);
  padding-top: var(--s4);
}
.usf-store[hidden] { display: none; }
.usf-store-h {
  display: flex; flex-wrap: wrap; align-items: center;
  justify-content: space-between; gap: var(--s3);
  margin-bottom: var(--s3);
}
.usf-store-h h3 {
  margin: 0; font-size: var(--t-md); font-weight: 600; color: var(--ink);
}
.usf-store table { font-size: var(--t-xs); }
.usf-store .num { font-variant-numeric: tabular-nums; }

/* ------------------------------------------- উৎস-নির্বাচক  v10.11.0
   ⚠ পটিগুলোর **উপরে**, কিন্তু দেখতে শান্ত — এটি একটি নিয়ন্ত্রণ,
     কোনো সংখ্যা নয়। জোরালো করলে চোখ পাতার আসল কথা (তাপমাত্রা)
     থেকে সরে নিয়ন্ত্রণে যেত। */
.src-pick {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--s2);
  margin-bottom: var(--s3);
}
.src-pick[hidden] { display: none; }
.src-pick label {
  font-size: var(--t-xs); color: var(--ink-3); font-weight: 600;
  text-transform: uppercase; letter-spacing: .04em;
}
.src-pick select { max-width: min(100%, 38ch); }
.src-pick-note {
  font-size: var(--t-xs); color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
/* v10.20.0 — নির্বাচক থেকে বাদ পড়া উৎসের নাম। নিজস্ব সারিতে বসে,
   কারণ নির্বাচকের পাশে থাকলে সরু পর্দায় দুটো লেখা জড়িয়ে যেত। */
.src-pick-gone {
  flex-basis: 100%;
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--s2);
  font-size: var(--t-xs); color: var(--ink-3);
}
.src-pick-gone[hidden] { display: none; }

/* সাধারণ উৎস-দর্শক — usf পটির ধাঁচেই, তাই .usf-এর নিয়মগুলোই খাটে;
   এখানে কেবল সারণিটুকু। */
/* ⚠ .tablewrap th-এ text-transform: uppercase বসানো আছে (১১৩৬ নম্বর
   লাইন), আর সেটি এককের উপর দিয়ে গেলে "µg/m³" হয়ে যায় "ΜG/M³" —
   µ (micro) বদলে গ্রিক বড় হাতের Μ (Mu)। অর্থাৎ একক আর একক থাকে না,
   অন্য একটি অক্ষর হয়ে যায়। এককগুলো তাই ছাড় পায়।
   playwright-এ শিরোনাম পড়ে ধরা পড়েছে। */
.src-view thead th .muted,
.usf-store thead th .muted { text-transform: none; letter-spacing: 0; }

.src-view table { font-size: var(--t-xs); }
.src-view .num { font-variant-numeric: tabular-nums; }
.src-view .tablewrap { margin-top: var(--s3); max-height: 420px; overflow: auto; }
.src-view thead th { position: sticky; top: 0; background: var(--surface); z-index: 1; }

/* =====================================================================
 *  যন্ত্রের পাতা — station.php                            v10.12.0
 * ---------------------------------------------------------------------
 *  ⚠ কাচ (backdrop-filter) আছে, কিন্তু **সংখ্যার নিচে নয়**। ঝাপসা
 *    পটভূমির উপর সংখ্যা বসালে কনট্রাস্ট পড়ে যায়, আর এই পাতার পুরো
 *    কাজটাই সংখ্যা পড়া। তাই কাচটি কার্ডের পটভূমিতে, সংখ্যা তার
 *    উপরে নিরেট কালিতে।
 *
 *  ⚠ প্রতিটি রাশির রঙ কেবল **পরিচয়**, মাত্রা নয়। সতর্কতার স্তরের
 *    চারটি রঙ (--ok/--warn/--bad/--worse) এখানে ছোঁয়া হয়নি — একটি
 *    কমলা "বায়ুচাপ" কার্ড পাঠককে ভুল বার্তা দিত।
 *
 *  ⚠ প্রতিটি রঙই দুই থিমে আলাদা করে বসানো, উল্টে নেওয়া নয়।
 * ===================================================================== */
:root {
  --v-temp:  #C2371F;   --v-temp-s:  #FDEEEA;
  --v-hi:    #A9450B;   --v-hi-s:    #FCF0E4;
  --v-rh:    #1F6FB2;   --v-rh-s:    #E9F2FA;
  --v-dew:   #2B7FA8;   --v-dew-s:   #E7F4F9;
  --v-bar:   #5B5FA6;   --v-bar-s:   #EEEEF9;
  --v-wind:  #2E7D6B;   --v-wind-s:  #E6F4F0;
  --v-gust:  #3E8F5A;   --v-gust-s:  #E9F6EC;
  --v-solar: #A9720B;   --v-solar-s: #FBF2DE;
  --v-uv:    #7A4BA8;   --v-uv-s:    #F3ECFA;
  --v-rain:  #1E6C8C;   --v-rain-s:  #E6F3F8;
  --glass-bg: rgba(255, 255, 255, .62);
  --glass-br: rgba(255, 255, 255, .75);
}
:root[data-theme="dark"] {
  --v-temp:  #FF8B72;   --v-temp-s:  #2E1712;
  --v-hi:    #F2A65A;   --v-hi-s:    #2C1D0E;
  --v-rh:    #6FB6EE;   --v-rh-s:    #10202E;
  --v-dew:   #6EC6E6;   --v-dew-s:   #0F2530;
  --v-bar:   #A3A6EC;   --v-bar-s:   #1B1C33;
  --v-wind:  #5FD3B8;   --v-wind-s:  #0F2A26;
  --v-gust:  #77D493;   --v-gust-s:  #112a1b;
  --v-solar: #E8B75A;   --v-solar-s: #2C2310;
  --v-uv:    #C298EC;   --v-uv-s:    #221A31;
  --v-rain:  #66BEDC;   --v-rain-s:  #0F2630;
  --glass-bg: rgba(30, 42, 40, .55);
  --glass-br: rgba(255, 255, 255, .10);
}

.stn-band { padding-top: var(--s5); }
.stn-head {
  display: flex; flex-wrap: wrap; gap: var(--s4);
  align-items: flex-end; justify-content: space-between;
  margin-bottom: var(--s4);
}
.stn-h1 { margin: 0; font-size: var(--t-xl); font-weight: 700; color: var(--ink); }
.stn-sub { margin: var(--s1) 0 0; color: var(--ink-3); font-size: var(--t-sm); max-width: 60ch; }
.stn-pick { display: flex; align-items: center; gap: var(--s2); }
.stn-pick span {
  font-size: var(--t-xs); color: var(--ink-3); font-weight: 600;
  text-transform: uppercase; letter-spacing: .04em;
}
.stn-pick select { max-width: min(100%, 34ch); }

/* ---- কাচ ---- */
.glass {
  background: var(--glass-bg);
  border: 1px solid var(--glass-br);
  border-radius: var(--r-lg);
  /* @supports নয়, সরাসরি: সমর্থন না থাকলে ব্রাউজার নিয়মটি উপেক্ষা
     করে আর উপরের নিরেট background-টাই থাকে — পাতা ভাঙে না। */
  backdrop-filter: blur(14px) saturate(1.25);
  -webkit-backdrop-filter: blur(14px) saturate(1.25);
  box-shadow: 0 1px 2px rgb(0 0 0 / .04), 0 8px 28px rgb(0 0 0 / .06);
}

.stn-hero {
  display: flex; flex-wrap: wrap; gap: var(--s4);
  align-items: center; justify-content: space-between;
  padding: var(--s5); margin-bottom: var(--s5);
  position: relative; overflow: hidden;
}
.stn-hero[hidden] { display: none; }
/* কাচের পেছনে রঙ থাকলে তবেই কাচ বোঝা যায় — একটি শান্ত আভা */
.stn-hero::before {
  content: ''; position: absolute; inset: -40% -10% auto -10%; height: 160%;
  background:
    radial-gradient(40% 60% at 18% 30%, color-mix(in srgb, var(--brand) 22%, transparent), transparent 70%),
    radial-gradient(38% 55% at 82% 65%, color-mix(in srgb, var(--v-rh) 18%, transparent), transparent 70%);
  z-index: -1; pointer-events: none;
}
.stn-name { margin: 0; font-size: var(--t-lg); font-weight: 700; color: var(--ink); }
.stn-meta { margin: var(--s1) 0 0; color: var(--ink-2); font-size: var(--t-sm); }
.stn-src  { margin: var(--s2) 0 0; color: var(--ink-3); font-size: var(--t-xs); }
.stn-hero-r { display: flex; flex-wrap: wrap; gap: var(--s5); }
.stn-nw { text-align: right; }
.stn-nw b {
  display: block; font-size: var(--t-xl); font-weight: 700; color: var(--ink);
  font-variant-numeric: tabular-nums; line-height: 1.1;
}
.stn-nw span { font-size: var(--t-xs); color: var(--ink-3); }

/* ---- রাশির কার্ড ---- */
.var-grid {
  display: grid; gap: var(--s4);
  grid-template-columns: repeat(auto-fill, minmax(268px, 1fr));
}
.var-card {
  padding: var(--s4); position: relative; overflow: hidden;
  display: flex; flex-direction: column; gap: var(--s3);
}
/* রাশির রঙ কার্ডের মাথায় একটি সরু ফিতায় — পুরো কার্ড রাঙালে
   দশটি কার্ড একসাথে চিৎকার করত। */
.var-card::after {
  content: ''; position: absolute; inset: 0 0 auto 0; height: 3px;
  background: var(--vc, var(--brand));
}
.var-top { display: flex; align-items: center; gap: var(--s2); }
.var-ico {
  width: 30px; height: 30px; flex: none; border-radius: var(--r-md);
  display: grid; place-items: center; font-size: 16px;
  background: var(--vcs, var(--surface-2));
}
.var-label { font-size: var(--t-sm); font-weight: 600; color: var(--ink-2); }
/* =====================================================================
 *  ⚠⚠ v10.45.0 — সময়ের লেখাটি **সবসময়** নিজের লাইনে
 * ---------------------------------------------------------------------
 *  আগে এখানে ছিল `flex-wrap: wrap`, আর সবকিছু এক সারিতে বসত —
 *  সংখ্যা, একক, তারপর "· 2026-09-03 02:00"। ছোট সংখ্যায় সেটি
 *  ঠিকই এক লাইনে ধরত।
 *
 *  কিন্তু বায়ুচাপ ছয় অক্ষরের ("১০০৬.৭") আর তার একক তিন অক্ষরের
 *  ("hPa")। ফলে **শুধু ঐ কার্ডটিতেই** তারিখটি দ্বিতীয় লাইনে
 *  নেমে যেত, কার্ডটি এক লাইন লম্বা হতো, আর তার রেখাচিত্রটি
 *  পাশের তিনটি কার্ডের চেয়ে নিচে বসত। ছবি দেখে ধরা পড়েছে।
 *
 *  ⚠ সমাধানটি "বায়ুচাপের হরফ ছোট করা" নয় — সেটি একটি সংখ্যাকে
 *    অন্যদের চেয়ে আলাদা দেখাত, আর পরের বার সাত অক্ষরের কোনো
 *    রাশি এলে আবার একই ভাঙন হতো। বদলে গঠনটিই সব কার্ডে এক:
 *    সংখ্যা+একক এক লাইনে, সময় সবসময় পরের লাইনে। এগারোটি কার্ডের
 *    রেখাচিত্র তখন একই উচ্চতায় বসে, মানটি যত অঙ্কেরই হোক।
 *
 *  ⚠ nowrap — সংখ্যা আর একক কখনো আলাদা লাইনে যাবে না ("১০০৬.৭"
 *    এক লাইনে আর "hPa" পরের লাইনে হলে পড়তে হোঁচট লাগত)।
 * ===================================================================== */
.var-now {
  display: flex; align-items: baseline; gap: var(--s2);
  flex-wrap: nowrap; min-width: 0;
}
.var-now b {
  font-size: 30px; font-weight: 700; line-height: 1;
  color: var(--vc, var(--ink)); font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.var-now i { font-style: normal; font-size: var(--t-sm); color: var(--ink-3); }
/* একক ও কম্পাস-অক্ষর — সঙ্কুচিত হয় না, কিন্তু বাড়েও না */
.var-now i.var-u { white-space: nowrap; flex: 0 0 auto; }

/* =====================================================================
 *  ⚠⚠ শেষ ২px — আর কেন প্রথম অনুমানটি ভুল ছিল
 * ---------------------------------------------------------------------
 *  উপরের সারাইয়ের পরও এগারোটির মধ্যে একটি কার্ড (UV সূচক) বাকিদের
 *  চেয়ে ২px খাটো থেকে গেল। প্রথমে `.var-now`-এ min-height: 30px
 *  বসানো হয়েছিল — **কিছুই বদলায়নি**, কারণ অনুমানটাই ভুল ছিল।
 *
 *  মেপে দেখা গেল আসল কারণটি:
 *
 *      তাপমাত্রা : .var-now = 32.1px   একক `<i>` = 22.1px  ("°C")
 *      UV সূচক   : .var-now = 30.0px   একক `<i>` =  0.0px  ("")
 *
 *  UV একটি **সূচক**, তার কোনো একক নেই — তাই `<i>` খালি, আর একটি
 *  খালি ইনলাইন উপাদানের উচ্চতা শূন্য। বাকি কার্ডে ঐ `<i>`-টির
 *  descender baseline-এর ২.১px নিচে নামে আর ঘরটিকে ৩২.১px করে;
 *  UV-তে সেটি হয় না। min-height তাই কাজে আসেনি — ঘরটি ইতিমধ্যেই
 *  ৩০px, অর্থাৎ সীমার উপরে।
 *
 *  সমাধান: খালি হলেও `<i>`-টির একটি লাইন-বাক্স থাকুক। শূন্য-প্রস্থের
 *  স্পেস (U+200B) দৃশ্যত কিছুই যোগ করে না, কিন্তু লাইন-বাক্সটি
 *  তৈরি করে — ফলে একক থাকুক বা না থাকুক, প্রতিটি কার্ডের গঠন এক।
 *
 *  ⚠ JS-এ `&nbsp;` বসিয়েও করা যেত, কিন্তু তখন নিয়মটি ঐ একটি
 *    টেমপ্লেটে আটকে থাকত; পরের বার কেউ অন্য জায়গা থেকে কার্ড
 *    বানালে আবার ভাঙত। CSS-এ থাকায় নিয়মটি উপাদানটির সাথেই থাকে।
 * ===================================================================== */
.var-now i.var-u::after { content: "\200B"; }

/* সময় — নিজের লাইনে, প্রতিটি কার্ডে একইভাবে।
   ⚠ min-height: সময় না থাকলেও (latest_ts null) লাইনটির জায়গা
     থেকে যায়, নইলে ঐ একটি কার্ড আবার খাটো হয়ে যেত — যে
     সমস্যাটি সারানো হলো, ঠিক তারই উল্টো পিঠ। */
.var-when {
  font-size: var(--t-xs); color: var(--ink-3);
  margin-top: 5px; min-height: 1.2em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  font-variant-numeric: tabular-nums;
}
.var-spark { width: 100%; height: 46px; }

/* ⚠ table-layout: fixed — নইলে "সর্বনিম্ন/সর্বোচ্চ" শিরোনামগুলো
   নিজেদের প্রস্থ দাবি করে সারণিটিকে কার্ডের বাইরে ঠেলে দিত, আর
   .var-card-এ overflow: hidden থাকায় ডান দিকের ঘরগুলো **কেটে যেত**।
   ছবিতে ধরা পড়েছে: গড় ও সর্বোচ্চ কলাম দুটি একেবারেই দেখা যাচ্ছিল না।
   শিরোনামও ছোট করা হলো (নিম্ন/গড়/উচ্চ) — একই কারণে। */
.var-tbl {
  width: 100%; border-collapse: collapse; font-size: var(--t-xs);
  table-layout: fixed;
  /* ⚠ min-width: 0 — এটিই আসল সারাই, table-layout নয়।
     .var-card একটি flex column, আর flex আইটেমের ডিফল্ট
     min-width: auto মানে সে নিজের min-content-এর নিচে **সঙ্কুচিত
     হয় না**। ঘরে white-space: nowrap থাকায় min-content বড়, তাই
     সারণিটি ২৮৬px কার্ডের ভেতরে ৫২০px চওড়া হয়ে বসত আর ডান দিকটা
     overflow: hidden-এ কেটে যেত। মেপে ধরা পড়েছে (tableW 520 vs
     cardW 286) — ছবি দেখে নয়, কারণ ছবিতে কেবল "সংখ্যা নেই"
     দেখাচ্ছিল, কারণটা নয়। */
  min-width: 0;
}
/* একই কারণে গ্রিড-আইটেমটিও — নইলে কার্ডই কলামের বাইরে বেরোতে পারত */
.var-card { min-width: 0; }
.var-card > * { min-width: 0; max-width: 100%; }
.var-tbl col.c-lbl { width: 34%; }
.var-tbl th, .var-tbl td {
  padding: 3px 0; text-align: right;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.var-tbl th:first-child, .var-tbl td:first-child { text-align: left; color: var(--ink-3); }
.var-tbl thead th {
  font-size: 10px; letter-spacing: .05em; text-transform: uppercase;
  color: var(--ink-3); font-weight: 600; border-bottom: 1px solid var(--line);
}
.var-tbl td { font-variant-numeric: tabular-nums; color: var(--ink); }
.var-tbl tbody tr + tr td { border-top: 1px dashed var(--line-2); }
.var-empty { font-size: var(--t-xs); color: var(--ink-3); }

@media (max-width: 600px) {
  .var-grid { grid-template-columns: 1fr; }
  .stn-hero { padding: var(--s4); }
  .stn-hero-r { gap: var(--s4); }
}
/* ⚠ কাচ + ঝাপসা করা গতি-সংবেদনশীল ব্যবহারকারীর জন্য সমস্যা নয়,
   কিন্তু ছায়া ও আভা কমিয়ে দিলে পাতাটি শান্ত হয়। */
@media (prefers-reduced-motion: reduce) {
  .stn-hero::before { display: none; }
}

/* সংখ্যাটি দৈনিক সারি থেকে এসেছে — ছোট, শান্ত চিহ্ন। v10.13.0 */
.var-basis {
  margin-left: auto; flex: none;
  font-size: 10px; letter-spacing: .04em; text-transform: uppercase;
  padding: 1px 6px; border-radius: var(--r-full);
  background: var(--surface-2); color: var(--ink-3);
  border: 1px solid var(--line);
}

/* জানালার বোতাম — কার্ডগুলোর ঠিক উপরে। v10.15.0 */
.stn-win { margin: 0 0 var(--s4); }
.stn-win[hidden] { display: none; }
.stn-win .chip { cursor: pointer; }

/* কার্ড থেকে যন্ত্রের নিজস্ব পাতায়। v10.15.0
   ⚠ z-index দরকার: .st-hit একটি পূর্ণ-কার্ড অদৃশ্য বোতাম, তাই
   লিংকটি তার উপরে না বসালে ক্লিকটি বোতামেই চলে যেত। */
.st-more {
  position: relative; z-index: 2; align-self: flex-start;
  margin-top: var(--s2); font-size: var(--t-xs);
  color: var(--brand-ink); text-decoration: none;
  border-bottom: 1px solid transparent;
}
.st-more:hover, .st-more:focus-visible { border-bottom-color: currentColor; }

/* চকরিয়া অফিসের সারি — BMD পটির মতোই, কিন্তু মাথার রঙ আলাদা।
   ⚠ রঙটি সতর্কতার চার রঙের কোনোটিই নয় (--brand), কারণ এটি পরিচয়,
   মাত্রা নয়। v10.17.0 */
.usf.chk .usf-band {
  background: linear-gradient(100deg,
              color-mix(in srgb, var(--brand) 88%, #000 12%),
              color-mix(in srgb, var(--brand) 62%, #000 8%));
}
.usf.chk .usf-foot a { color: inherit; text-decoration: underline; }

/* =====================================================================
 *  ইতিহাসের ধারা — নিয়ন্ত্রণ ও সেগমেন্ট বোতাম          v10.27.0
 * ---------------------------------------------------------------------
 *  ব্যবহারকারীর নির্দেশ: দিন/সপ্তাহ/মাস বোতাম, গ্রিড-ভিত্তিক সাজ।
 *
 *  ⚠ তিনটি বিকল্পের জন্য ড্রপডাউন নয়, সেগমেন্ট — তিনটিই এক নজরে
 *    দেখা গেলে বদলানো এক ক্লিকে হয়, ড্রপডাউনে দুই ক্লিক আর একটি
 *    মেনু খোলা লাগে। এটি সবচেয়ে বেশি ছোঁয়া নিয়ন্ত্রণ, তাই পার্থক্যটি
 *    প্রতিদিনের।
 * ===================================================================== */
.trend-ctl { margin-bottom: var(--s3); }

.seg {
  display: inline-flex; align-items: stretch;
  border: 1px solid var(--line-2); border-radius: var(--r-sm);
  overflow: hidden; background: var(--surface-2);
}
.seg button {
  font: inherit; font-size: var(--t-sm); line-height: 1;
  padding: var(--s2) var(--s3); border: 0; background: transparent;
  color: var(--ink-3); cursor: pointer;
  /* ⚠ ডানদিকের বিভাজকটি শেষ বোতামে বাদ — নইলে সেগমেন্টের ভেতরের
     রেখাটি বাইরের বর্ডারের গায়ে দুই পুরু হয়ে বসত। */
  border-right: 1px solid var(--line-2);
}
.seg button:last-child { border-right: 0; }
.seg button:hover { color: var(--ink); background: var(--surface-3, var(--surface)); }
.seg button.on {
  background: var(--brand); color: #fff; font-weight: 600;
}
/* কীবোর্ডে চলাচল দেখা যায় — .seg button-এ outline না দিলে
   ফোকাস বোতামের ভেতরে হারিয়ে যেত */
.seg button:focus-visible { outline: 2px solid var(--brand); outline-offset: -2px; }

/* হিরোতে "এই সংখ্যাটি — কোন স্টেশনের" লাইনটি
   ⚠ basis লাইনের **উপরে** বসে, কারণ প্রশ্নটি আগে আসে:
     পাঠক সংখ্যাটি দেখেন, তারপর জানতে চান কার সংখ্যা। */
.hero-at {
  font-size: var(--t-xs); color: var(--ink-2);
  margin-top: var(--s2);
}
.hero-at[hidden] { display: none; }

/* =====================================================================
 *  মেনু — নোঙর বনাম অন্য পাতা, আর "এখন কোথায়"       v10.29.0
 * ---------------------------------------------------------------------
 *  ব্যবহারকারীর অভিযোগ: "menu bar not organize and not follow sequence"।
 *
 *  ⚠ দুটি জিনিস আলাদা করা হলো, আর দুটোই আচরণে সত্যিই আলাদা:
 *      · নোঙর (#map)      → পাতা স্ক্রল করে, পাতা বদলায় না
 *      · পাতার লিংক       → পাতা বদলে যায়
 *    আগে দুটোর চেহারা হুবহু এক ছিল আর তারা মাঝখানে মেশানো — তাই
 *    ক্লিক করার আগে বোঝার উপায় ছিল না কী ঘটবে।
 * ===================================================================== */
.bar-sep {
  width: 1px; align-self: stretch; margin: 4px var(--s2);
  background: var(--line-2);
}
/* অন্য পাতার লিংক — সামান্য আলাদা, চেঁচিয়ে নয়।
   ⚠ শুধু রঙ দিয়ে আলাদা করা হয়নি: রঙ-অন্ধ পাঠকের কাছে দুটো এক
     দেখাত। তাই বিভাজক (গঠন) + সামান্য হালকা রঙ — দুটো সংকেত। */
.bar-links a.bar-page { color: var(--ink-3); }
.bar-links a.bar-page:hover { color: var(--ink); }

/* স্ক্রল-স্পাই — পড়তে পড়তে কোথায় আছি
   ⚠ aria-current="true", "page" নয়। "page" মানে "এটিই চলতি পাতা",
     আর এখানে পাতা একটাই — অংশ বদলাচ্ছে। ভুল মান দিলে স্ক্রিন-রিডার
     প্রতিটি অংশকে আলাদা পাতা বলে ঘোষণা করত। */
.bar-links a[data-spy][aria-current="true"] {
  background: var(--brand-soft); color: var(--brand-ink); font-weight: 600;
}

/* =====================================================================
 *  স্বচ্ছ গ্রিড ও অংশভিত্তিক রঙ                          v10.30.0
 * ---------------------------------------------------------------------
 *  ব্যবহারকারীর নির্দেশ: "every section and box and grided added the
 *  colourful modern innovative and creative, full page use grid and
 *  transparent grid use"।
 *
 *  ⚠ পুরো নকশা ভেঙে নতুন করে লেখা হয়নি, আর সেটি ইচ্ছাকৃত। পাতাটির
 *    লেআউটের যুক্তি (কোন কার্ড কখন লুকায়, কোন গ্রিড কয় কলামে ভাঙে)
 *    ৩০টির বেশি সংস্করণে ঠিক করা হয়েছে — CSS-এর একটি স্তর যোগ করা
 *    নিরাপদ, HTML-এর গঠন নাড়া নয়। এখানে কেবল **পটভূমি ও রঙের
 *    সংকেত** যোগ হলো; একটিও উপাদানের জায়গা বদলায়নি।
 *
 *  ⚠ গ্রিডটি `background-image`, আসল বর্ডার নয় — তাই সে কোনো
 *    উপাদানের মাপ বা অবস্থান ছোঁয় না, আর print/forced-colors মোডে
 *    আপনাআপনি সরে যায়।
 * ===================================================================== */

/* ---- ১) স্বচ্ছ গ্রিড — ব্যান্ডের পটভূমিতে ----
   ⚠ রঙটি currentColor-ভিত্তিক নয়, টোকেন-ভিত্তিক ও **খুব** হালকা
     (৩.৫%)। বেশি গাঢ় করলে লেখার পেছনে জাল দেখা যেত আর পড়া কঠিন
     হতো — গ্রিড এখানে গঠনের ইঙ্গিত, নকশার চিৎকার নয়। */
.band {
  position: relative;
  background-image:
    linear-gradient(to right,  var(--grid-line) 1px, transparent 1px),
    linear-gradient(to bottom, var(--grid-line) 1px, transparent 1px);
  background-size: 48px 48px;
  background-position: center top;
}
/* ব্যান্ডের নিজের রঙ গ্রিডের নিচে থাকে — band-alt-এ সেটি সরাসরি
   background-color, তাই গ্রিডের সাথে সংঘর্ষ হয় না। */
.band-alt { background-color: var(--surface-2); }

:root { --grid-line: rgba(11, 110, 107, .055); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) { --grid-line: rgba(98, 214, 200, .05); }
}
:root[data-theme="dark"] { --grid-line: rgba(98, 214, 200, .05); }

/* ⚠ কার্ড ও প্যানেল গ্রিডের উপরে বসে, নইলে জালটি তাদের ভেতর দিয়ে
     দেখা যেত আর সংখ্যাগুলো পড়া কঠিন হতো। */
.band > .wrap { position: relative; z-index: 1; }

/* ---- ২) অংশভিত্তিক রঙের সংকেত ----
   প্রতিটি বড় অংশের শিরোনামের বাঁয়ে একটি রঙিন দাগ। রঙটি ঐ অংশের
   বিষয় অনুযায়ী, সাজসজ্জা নয়:
       আজকের অবস্থা → ব্র্যান্ড    পূর্বাভাস → নীল (মডেল)
       মানচিত্র      → সবুজ        ইতিহাস    → বেগুনি-ধূসর
       স্টেশন        → কমলা        উৎস       → নিরপেক্ষ
   ⚠ রঙই একমাত্র সংকেত নয় — প্রতিটি অংশের নিজের শিরোনাম আছে।
     রঙ-অন্ধ পাঠকের কাছে কিছুই হারায় না। */
.shead { border-left: 3px solid var(--sec-accent, var(--line)); padding-left: var(--s3); }
#heat    { --sec-accent: var(--brand); }
#outlook { --sec-accent: var(--cmp1); }
#map     { --sec-accent: var(--cmp3); }
#trend   { --sec-accent: var(--cmp2); }
#live    { --sec-accent: var(--lvl1, var(--cmp2)); }
#sources { --sec-accent: var(--ink-3); }

/* ---- ৩) কার্ডে সূক্ষ্ম গভীরতা ----
   ⚠ ছায়া বাড়ানো হয়নি — বাড়ালে ১৫টি কার্ড একসাথে ভাসত আর পাতাটি
     অস্থির দেখাত। বদলে উপরের প্রান্তে এক পিক্সেলের আলো, যা কার্ডটিকে
     পটভূমি থেকে আলাদা করে কিন্তু ওজন যোগ করে না। */
.card { position: relative; }
.card::before {
  content: ''; position: absolute; inset: 0 0 auto 0; height: 2px;
  border-radius: var(--r-md) var(--r-md) 0 0;
  background: linear-gradient(90deg,
    var(--sec-accent, var(--brand)) 0%, transparent 55%);
  opacity: .5; pointer-events: none;
}

/* ---- ৪) ছাপা ও forced-colors — গ্রিড সরে যায় ---- */
@media print, (forced-colors: active) {
  .band { background-image: none; }
  .card::before { display: none; }
}

/* মানচিত্র ↔ তালিকার যুগল আলো — v10.31.0
   ⚠ .is-hot ক্লাসটি দুই দিক থেকেই বসে, তাই স্টাইলটি এক জায়গায়।
     :hover-এর উপর ভরসা করা যেত না — মাউস তখন মানচিত্রে, তালিকায় নয়। */
.ml-row.is-hot {
  background: var(--brand-soft);
  box-shadow: inset 3px 0 0 0 var(--brand);
}

/* =====================================================================
 *  অ্যাডমিনের রেফারেন্স-অংশ — গুটিয়ে রাখা              v10.33.0
 * ---------------------------------------------------------------------
 *  ব্যবহারকারীর নির্দেশ: "admin panel redesign clean and minimal,
 *  unnecessary items remove"।
 *
 *  ⚠ "সরানো" আর "গুটিয়ে রাখা" এক নয়, আর এখানে দ্বিতীয়টিই ঠিক।
 *    পাইপলাইন পাতাটি ছিল ৯,০৮৩ পিক্সেল লম্বা; তার বড় অংশ সীমার
 *    সংজ্ঞা, ইন্টারলকের নিয়ম ও মডেলের সারণি — একবার পড়ার জিনিস,
 *    রোজ দেখার নয়। মুছে দিলে ঐ ব্যাখ্যাগুলো আর কোথাও থাকত না,
 *    অথচ সেগুলোই "কেন এই সংখ্যা" প্রশ্নের একমাত্র উত্তর।
 * ===================================================================== */
.adm-ref { margin-bottom: var(--s5); }
.adm-ref > summary {
  display: flex; align-items: baseline; gap: var(--s3); flex-wrap: wrap;
  cursor: pointer; list-style: none;
  padding: var(--s3) var(--s4);
  border: 1px solid var(--line); border-left: 3px solid var(--ink-3);
  border-radius: var(--r-md); background: var(--surface);
}
.adm-ref > summary::-webkit-details-marker { display: none; }
/* ⚠ ত্রিভুজটি নিজে আঁকা — ব্রাউজারভেদে ডিফল্ট মার্কারের মাপ ও
     অবস্থান আলাদা, আর flex summary-তে সেটি প্রায়ই লাইনের বাইরে বসে। */
.adm-ref > summary::before {
  content: '▸'; color: var(--ink-3); font-size: 13px;
  transition: transform var(--dur-1) var(--ease);
}
.adm-ref[open] > summary::before { transform: rotate(90deg); }
.adm-ref > summary:hover { background: var(--surface-2); }
.adm-ref > summary:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.adm-ref-h { font-size: var(--t-lg); font-weight: 600; color: var(--ink); }
.adm-ref-hint { font-size: var(--t-xs); color: var(--ink-3); }
.adm-ref[open] > summary { margin-bottom: var(--s4); }


/* =====================================================================
 *  ২৯. কাচ ও প্রিমিয়াম স্তর — সামনের পাতা ও অ্যাডমিন    v10.35.0
 * ---------------------------------------------------------------------
 *  ব্যবহারকারীর নির্দেশ: "colourful glass effect premium outlook … as
 *  same admin edit panel same reflection"।
 *
 *  ⚠ নীতিটি v10.32.0-এর মতোই: **স্তর যোগ, গঠন নয়**। একটিও উপাদানের
 *    জায়গা, মাপ বা ভাঙার নিয়ম এখানে বদলায়নি — কেবল পৃষ্ঠতল, আলো ও
 *    হোভার। পাতার লেআউটের যুক্তি ৩৫টি সংস্করণে ঠিক করা; CSS-এর একটি
 *    স্তর নিরাপদ, HTML-এর গঠন নাড়া নয়।
 *
 *  ⚠ কাচ কেন সব জায়গায় নয়: backdrop-filter প্রতিটি স্তরে একটি নতুন
 *    কম্পোজিটিং লেয়ার তৈরি করে। ১৫টি কার্ডে দিলে মোবাইলে স্ক্রল
 *    কেঁপে যায় (মাপা হয়নি, কিন্তু ঝুঁকিটি সুপরিচিত), আর কাচের
 *    পেছনে রঙ না থাকলে সেটি দেখতে শুধু ফ্যাকাশে সাদা। তাই কাচ
 *    সেখানেই যেখানে পেছনে সত্যিই একটি আভা আছে — চারটি প্যানেল।
 * ===================================================================== */

:root {
  --glass-blur: 16px;
  /* উপরের প্রান্তের এক-পিক্সেল আলো — কাচকে "উপরে ভাসছে" মনে হয়
     এই একটি রেখাতেই, ছায়ায় নয়। */
  --glass-hi:   rgba(255, 255, 255, .55);
  --glass-sh:   0 1px 2px rgb(0 0 0 / .04), 0 10px 34px -14px rgb(0 0 0 / .18);
  --glass-sh-h: 0 2px 5px rgb(0 0 0 / .06), 0 20px 46px -16px rgb(0 0 0 / .26);
  /* অংশভিত্তিক আভা — ব্যান্ডের পেছনে, কাচের নিচে */
  --wash: 0;
}
:root[data-theme="dark"] {
  --glass-hi:   rgba(255, 255, 255, .10);
  --glass-sh:   0 1px 2px rgb(0 0 0 / .5), 0 10px 34px -14px rgb(0 0 0 / .7);
  --glass-sh-h: 0 2px 5px rgb(0 0 0 / .55), 0 20px 46px -16px rgb(0 0 0 / .8);
}

/* ---- ১) কাচের ভিত্তি ----
   .glass ক্লাসটি station.php-তে আগে থেকেই ছিল; এখানে তাকে হোভার ও
   প্রান্তের আলো দেওয়া হলো, আর নতুন জায়গাগুলোতেও বসানো হলো। */
.glass, .usf, .map-side, .src-pick {
  background: var(--glass-bg, var(--surface));
  border: 1px solid var(--glass-br, var(--line));
  border-radius: var(--r-lg);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.3);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.3);
  box-shadow: var(--glass-sh);
  position: relative;
}
/* উপরের প্রান্তের আলোকরেখা — ::before নয়, কারণ .usf-এর ::before
   অন্য কাজে লাগে না বটে, কিন্তু .card-এর ::before ইতিমধ্যেই
   অংশের রঙের ফিতা আঁকে (v10.32.0)। দুটি নিয়ম এক ছদ্ম-উপাদানে
   বসালে একটি নীরবে অন্যটিকে হারাত — এই কোডবেসের সবচেয়ে চেনা বাগ। */
.glass::after, .usf::after, .map-side::after {
  content: ''; position: absolute; inset: 0 0 auto 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--glass-hi) 22%,
                                     var(--glass-hi) 78%, transparent);
  border-radius: var(--r-lg) var(--r-lg) 0 0;
  pointer-events: none;
}

/* ---- ২) ব্যান্ডের পেছনে অংশভিত্তিক আভা ----
   ⚠ কাচ কেবল তখনই কাচ, যখন পেছনে রঙ আছে। এই আভাটি ছাড়া উপরের
     blur()-টি কিছুই করত না — একটি সাদা বাক্স সাদা পটভূমিতে।
   ⚠ রঙটি ঐ অংশের নিজের --sec-accent (v10.32.0-এ ঠিক করা), নতুন
     রঙ নয়। ৬% স্বচ্ছতা — বেশি দিলে লেখার কনট্রাস্ট নেমে যেত। */
.band::after {
  content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background:
    radial-gradient(58% 46% at 12% 0%,
      color-mix(in srgb, var(--band-tint, var(--brand)) 9%, transparent), transparent 68%),
    radial-gradient(52% 44% at 92% 100%,
      color-mix(in srgb, var(--band-tint-2, var(--cmp1)) 7%, transparent), transparent 70%);
}
/* ব্যান্ডের ভেতরের প্রথম সেকশনের রঙই ব্যান্ডের আভা ঠিক করে */
.band:has(#heat)    { --band-tint: var(--brand);  --band-tint-2: var(--lvl1); }
.band:has(#outlook) { --band-tint: var(--cmp1);   --band-tint-2: var(--brand); }
.band:has(#map)     { --band-tint: var(--cmp3);   --band-tint-2: var(--cmp1); }
.band:has(#trend)   { --band-tint: var(--cmp2);   --band-tint-2: var(--cmp3); }
.band:has(#live)    { --band-tint: var(--lvl1);   --band-tint-2: var(--cmp2); }
.band:has(#sources) { --band-tint: var(--ink-3);  --band-tint-2: var(--brand); }
/* :has() না থাকলে (পুরনো ব্রাউজার) আভাটি ব্র্যান্ডের রঙেই বসে —
   পাতাটি তখনও ঠিক দেখায়, শুধু অংশে অংশে রঙ বদলায় না। */

/* ---- ৩) হোভার — ওঠা, চকচক নয় ----
   ⚠ transform ব্যবহার করা হলো, margin/top নয়: transform লেআউট
     পুনর্গণনা করায় না, তাই ১৫টি কার্ডে হোভার করলেও পাতাটি নড়ে না। */
.card, .usf, .kpi, .map-side {
  transition: box-shadow var(--dur-2) var(--ease),
              transform var(--dur-2) var(--ease),
              border-color var(--dur-2) var(--ease);
}
.card:hover, .usf:hover {
  box-shadow: var(--glass-sh-h);
  transform: translateY(-2px);
  border-color: color-mix(in srgb, var(--sec-accent, var(--brand)) 34%, var(--line));
}
/* কার্ডের মাথার রঙিন ফিতাটি হোভারে পুরো প্রস্থে ছড়ায় — v10.32.0-এ
   ফিতাটি ৫৫% পর্যন্ত ছিল, সেটিই বিশ্রাম-অবস্থা। */
.card::before { transition: opacity var(--dur-2) var(--ease); }
.card:hover::before { opacity: .95; }

/* ---- ৪) নিয়ন্ত্রণ — কাচের সাথে মানানসই ---- */
.controls label select,
.controls label input {
  transition: border-color var(--dur-1) var(--ease), box-shadow var(--dur-1) var(--ease);
}
.controls label select:hover {
  border-color: color-mix(in srgb, var(--brand) 45%, var(--line-2));
}
.seg button[aria-pressed="true"] {
  box-shadow: var(--e1), inset 0 0 0 1px color-mix(in srgb, var(--brand) 22%, transparent);
}

/* ---- ৫) স্তরের ব্যাজ — চকরিয়া অফিসের পটির ভেতরে ----  v10.35.0
   হিরো ব্লকটি সরে যাওয়ার পর সতর্কতার স্তরের নতুন ঘর। */
.chk-alert {
  margin: 0 0 11px; padding: var(--s4) var(--s4) var(--s3);
  border: 1px solid var(--line); border-radius: var(--r-md);
  background: color-mix(in srgb, var(--hero-lvl, var(--brand)) 7%, var(--surface));
  border-left: 3px solid var(--hero-lvl, var(--brand));
}
.chk-lvl {
  display: flex; align-items: baseline; gap: var(--s3);
  flex-wrap: wrap; margin: 0;
}
.chk-badge {
  flex: none;
  display: inline-block; padding: 3px var(--s3);
  border-radius: var(--r-full);
  font-size: var(--t-sm); font-weight: 700; letter-spacing: .01em;
  background: var(--hero-lvl, var(--ink-3));
  /* ⚠ লেখার রঙ স্তর অনুযায়ী — হলুদ ব্যাজে সাদা লেখা ২.০:১ ছিল,
     আর ঠিক সেই বাগটির জন্যই v4.0-এ প্রতিটি স্তরের নিজস্ব --lvlN-fg
     টোকেন তৈরি হয়েছিল। এখানে সেগুলোই ব্যবহার হচ্ছে। */
  color: var(--lvl0-fg);
}
.chk-badge.lv0 { color: var(--lvl0-fg); }
.chk-badge.lv1 { color: var(--lvl1-fg); }
.chk-badge.lv2 { color: var(--lvl2-fg); }
.chk-badge.lv3 { color: var(--lvl3-fg); }
.chk-badge.lv4 { color: var(--lvl4-fg); }
.chk-badge.lv-none { background: var(--ink-3); color: var(--surface); }
.chk-lvl-t { font-size: var(--t-sm); line-height: 1.65; color: var(--ink-2); }
.chk-alert .bmd-scale { margin-top: var(--s4); }
.chk-alert .basis {
  margin: var(--s3) 0 0; font-size: var(--t-xs); color: var(--ink-3);
}
.chk-alert .basis:empty { display: none; }

/* ---- ৬) ইতিহাসের ড্রপডাউনের দল-শিরোনাম ---- v10.35.0
   ⚠ optgroup-এর চেহারা ব্রাউজার নিজেই ঠিক করে; বেশিরভাগে
     font-style/weight ছাড়া কিছুই মানে না। তাই কেবল ততটুকুই দেওয়া
     হলো যতটুকু সব জায়গায় কাজ করে — বাকিটা চাপালে কোনো কোনো
     ব্রাউজারে শিরোনামটি একেবারে অদৃশ্য হয়ে যেত। */
.controls optgroup { font-weight: 700; font-style: normal; color: var(--ink-2); }
.controls optgroup option { font-weight: 400; color: var(--ink); }

/* ---- ৭) অ্যাডমিন — একই ভাষা, কম গলার জোর ----
   ব্যবহারকারীর নির্দেশ: "admin edit panel same reflection", আর আগের
   নির্দেশ: "admin panel clean and minimal"। দুটি একসাথে মানে —
   **একই উপাদান, কম আভা**: কাচ ও প্রান্তের আলো থাকে, কিন্তু
   ব্যান্ডের রঙিন আভা ও হোভারের ওঠা থাকে না। একটি প্রশাসনিক
   পাতায় প্রতিটি সারি নড়লে সেটি অস্থির লাগে, প্রিমিয়াম নয়। */
body.is-admin .band::after { display: none; }
body.is-admin .card:hover, body.is-admin .usf:hover { transform: none; }
body.is-admin .card, body.is-admin .adm-ref > summary {
  background: var(--glass-bg, var(--surface));
  backdrop-filter: blur(10px) saturate(1.15);
  -webkit-backdrop-filter: blur(10px) saturate(1.15);
  box-shadow: var(--glass-sh);
}
body.is-admin .adm-ref > summary { border-radius: var(--r-md); }

/* ---- ৮) মোশন ও ছাপা ---- */
@media (prefers-reduced-motion: reduce) {
  .card, .usf, .kpi, .map-side { transition: none; }
  .card:hover, .usf:hover { transform: none; }
}
@media print, (forced-colors: active) {
  .band::after { display: none; }
  .glass, .usf, .map-side, .src-pick {
    backdrop-filter: none; -webkit-backdrop-filter: none;
    box-shadow: none; background: var(--surface);
  }
  .glass::after, .usf::after, .map-side::after { display: none; }
}

/* =====================================================================
 *  ৩০ · পরিবেশ অধিদপ্তরের মাপা AQI — কক্সবাজার   v10.44.0, নতুন
 * ---------------------------------------------------------------------
 *  ⚠ কার্ডটি উপরের মডেল-কার্ডের সাথে **একই পরিবারে** থাকে
 *    (.usf.aq-র সব নিয়ম পায়), কিন্তু পটির রঙ আলাদা — সবুজাভ,
 *    নীল নয়। কারণটি নিছক সাজ নয়: দুটি কার্ড পাশাপাশি একই রঙে
 *    থাকলে পাঠক এক নজরে ভাবতেন দুটি একই জিনিসের দুই অংশ,
 *    অথচ একটি মডেলের অনুমান আর অন্যটি যন্ত্রের পাঠ।
 *
 *  ⚠ রঙটি সতর্কতার কোনো স্তরের রঙ নয় (LEVELS-এর পাঁচটি হেক্স
 *    থেকে আলাদা), ইচ্ছাকৃতভাবে। তাপ-সতর্কতার রঙ বায়ুমানের
 *    কার্ডে বসালে একদিন কেউ সবুজ দেখে "তাপপ্রবাহ নেই" পড়তেন।
 * ===================================================================== */
.usf.doe .usf-band{
  background:linear-gradient(115deg,#0E1F1A 0%,#173B31 45%,#2C7A5E 100%);
  border-color:#12241E;
}

/* "মাপা" ব্যাজটি ভরাট — বাকি ব্যাজগুলো ফাঁপা।
   ⚠ এটিই কার্ডটির একমাত্র দাবি, তাই এটিই একমাত্র ভরাট জিনিস। */
.usf.doe .doe-tag{
  background:rgba(255,255,255,.92); color:#12241E;
  border-color:rgba(255,255,255,.92);
}

/* ---------------------------------------------------------------------
 *  দূরত্বের পটি — ফুটনোটে নয়, সংখ্যার ঠিক নিচে
 * ---------------------------------------------------------------------
 *  ⚠ এই এক লাইনটিই কার্ডটিকে সৎ রাখে। যিনি কেবল বড় সংখ্যাটি
 *    দেখেন তিনি ফুটনোট পড়েন না — অথচ ঠিক তাঁরই জানা দরকার যে
 *    যন্ত্রটি চকরিয়ায় নয়। তাই এটি পটির ভেতরেই, পূর্ণ প্রস্থে।
 */
.usf.doe .doe-where{
  margin:0; padding:9px 14px;
  font-size:.78rem; line-height:1.5; font-weight:600;
  color:#1D3B33; background:#E8F4EE;
  border-bottom:1px solid #CFE5DA;
}
.usf.doe .doe-where:empty{ display:none }

@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]) .usf.doe .doe-where{
    color:#BFE6D5; background:#12241E; border-bottom-color:#1E3A31;
  }
}
:root[data-theme="dark"] .usf.doe .doe-where{
  color:#BFE6D5; background:#12241E; border-bottom-color:#1E3A31;
}

/* =====================================================================
 *  ৩১ · চকরিয়া অফিসের নিজস্ব বায়ুমান সেন্সর     v10.49.0, নতুন
 * ---------------------------------------------------------------------
 *  কার্ডটি #doePanel-এর কাঠামোই ধার করে (.usf .aq .glass), তাই
 *  এখানে কেবল যা **নতুন** তা-ই আছে: দুই সংখ্যার জোড়াটি।
 *
 *  ⚠⚠ দুটি রেখার রঙ — যাচাই করা, বেছে নেওয়া নয়
 *  ---------------------------------------------------------------
 *  --pa-epa (সংশোধিত) ও --pa-raw (কাঁচা) একই চার্টে পাশাপাশি
 *  থাকে, তাই দুটিকে বর্ণান্ধ পাঠকের চোখেও আলাদা হতে হয়।
 *  জোড়াটি dataviz-এর যাচাইকারক দিয়ে মেপে নেওয়া হয়েছে:
 *
 *      আলোয়  #009288 ↔ #8E5BC7   deutan ΔE ১২.০ · tritan ১৩.১
 *      অন্ধকারে #22A99B ↔ #A177DE   deutan ΔE ১০.৮ · tritan ১৫.৪
 *
 *  প্রথম পছন্দ ছিল --brand (#0B6E6B) ও --v-bar (#5B5FA6); সেটি
 *  **ব্যর্থ** হয়েছিল — স্বাভাবিক দৃষ্টিতেই ΔE ১৩.৮, অর্থাৎ
 *  সীমার নিচে। চোখে দেখে "আলাদাই তো লাগছে" বলা যেত, আর
 *  সেটিই ভুল হতো।
 *
 *  ⚠ রঙ একাই তথ্য বহন করে না: দুটি রেখার নাম সবসময় লেখা
 *    থাকে (legend + tooltip), আর নিচের দুটি টাইলেও নাম ও
 *    কৈফিয়ত দুটোই আছে।
 *
 *  ⚠ AQ_BANDS-এর সবুজ/হলুদ/কমলা/লাল এখানে ব্যবহার হয়নি —
 *    ওগুলো **অবস্থার** রঙ (ভালো/অস্বাস্থ্যকর), সিরিজের নয়।
 *    দুটি মিশিয়ে ফেললে একটি বেগুনি রেখা দেখে কেউ ভাবতেন
 *    বাতাস "খুব অস্বাস্থ্যকর"।
 * ===================================================================== */
:root {
  --pa-epa: #009288;  --pa-epa-s: #E3F5F2;
  --pa-raw: #8E5BC7;  --pa-raw-s: #F1EAFA;
}
:root[data-theme="dark"] {
  --pa-epa: #22A99B;  --pa-epa-s: #0E2A27;
  --pa-raw: #A177DE;  --pa-raw-s: #1E1730;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --pa-epa: #22A99B;  --pa-epa-s: #0E2A27;
    --pa-raw: #A177DE;  --pa-raw-s: #1E1730;
  }
}

/* ---- দুই সংখ্যার জোড়া ----
   ⚠ grid, দুটি সমান ঘর — আর সেটি ইচ্ছাকৃত। একটিকে চওড়া
     করলে পাঠক ধরে নিতেন অন্যটি গৌণ, অথচ দুটি আলাদা প্রশ্নের
     সমান-বৈধ উত্তর। "কোনটি বড় হরফে" আলাদা ব্যাপার, আর সেটি
     .is-lead দিয়ে হয়, ঘরের চওড়া দিয়ে নয়। */
.pa-pair {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--s3);
  margin: var(--s4) 0 var(--s3);
}
@media (max-width: 560px) { .pa-pair { grid-template-columns: 1fr; } }

.pa-cell {
  border: 1px solid var(--line); border-radius: var(--r-md);
  padding: var(--s3) var(--s4);
  background: var(--pa-cell-bg, transparent);
  border-left: 3px solid var(--pa-cell-ink, var(--line));
}
.pa-cell.epa { --pa-cell-ink: var(--pa-epa); --pa-cell-bg: var(--pa-epa-s); }
.pa-cell.raw { --pa-cell-ink: var(--pa-raw); --pa-cell-bg: var(--pa-raw-s); }

.pa-cell .pa-lab {
  font-size: .82rem; font-weight: 600; letter-spacing: .02em;
  color: var(--pa-cell-ink); margin: 0 0 2px;
}
/* ⚠ tabular-nums, কিন্তু monospace নয়: এই প্রকল্পে আগে দেখা
     গেছে monospace-এ বড় সংখ্যার দশমিক বিন্দুটি চোখে আলাদা
     হয়ে যায়, যেন দুটি সংখ্যা। */
.pa-cell .pa-aqi {
  font-size: 1.9rem; line-height: 1.1; font-weight: 700;
  font-variant-numeric: tabular-nums; color: var(--pa-cell-ink);
}
.pa-cell.is-lead .pa-aqi { font-size: 2.5rem; }
.pa-cell .pa-cat { font-size: .92rem; color: var(--ink-2); }
.pa-cell .pa-pm  {
  font-size: .86rem; color: var(--ink-2);
  font-variant-numeric: tabular-nums; margin-top: 2px;
}
.pa-cell .pa-note {
  font-size: .78rem; line-height: 1.5; color: var(--ink-3);
  margin: var(--s2) 0 0;
}

/* ---- সতর্কবার্তার পটি (বাসি / ঘড়ির অমিল / চ্যানেল গরমিল) ----
   ⚠ কার্ডটি লুকিয়ে ফেলা হয় না — সংখ্যাটি দেখানো হয়, পাশে
     কারণটি লেখা থাকে। লুকিয়ে ফেললে পাঠক বুঝতেন না যন্ত্রটি
     আছে অথচ কথা বলছে না। */
.pa-warn {
  display: block; margin: var(--s2) 0 0;
  font-size: .82rem; line-height: 1.55;
  color: var(--warn-ink, #8A5A00);
}
:root[data-theme="dark"] .pa-warn { color: #E8B75A; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .pa-warn { color: #E8B75A; }
}

/* ⚠ .doe-where-এর ভেতরের .pa-note বড় হরফে বসছিল — ঐ পটিটির
   নিজের font-size উত্তরাধিকারে চলে আসছিল। রেন্ডার করে ছবিতে
   ধরা পড়েছে: "প্রতিটি পাঠ ঐ মুহূর্তের" লাইনটি শিরোনামের মতো
   দেখাচ্ছিল, অথচ সেটি একটি পাদটীকা। */
.usf.pa .doe-where .pa-note {
  display: block; margin-top: var(--s1);
  font-size: .82rem; line-height: 1.55; color: var(--ink-3);
}

/* =====================================================================
 * =====================================================================
 *
 *   v11.0.0 — দুই যন্ত্রের পাতা
 *
 * ---------------------------------------------------------------------
 *  উপরের সবটুকু আগের নকশার, আর তার বেশিরভাগই টিকে আছে: রঙের
 *  টোকেন, স্তরের রঙ, টাইপোগ্রাফি, খোল ও মেনু। সেগুলো মাপা হয়েছিল
 *  (কনট্রাস্ট, বর্ণান্ধতা), তাই ফেলে দেওয়ার কোনো কারণ নেই —
 *  ফেলে দিলে ঐ মাপগুলোও ফেলে দেওয়া হতো।
 *
 *  নিচের সবটুকু **নতুন গঠনের**: একটি জায়গা, দুটি যন্ত্র, পাশাপাশি।
 * =====================================================================
 * ===================================================================== */

/* ---------------------------------------------------------------- এখন */
.now { padding: 28px 0 8px; }
.now-head { margin: 0 0 22px; }
.now-head h1 {
  font-size: clamp(22px, 3.4vw, 30px); line-height: 1.3;
  margin: 0 0 6px; letter-spacing: -.01em; text-wrap: balance;
}
.now-sub { margin: 0; color: var(--ink-2); font-size: 15px; max-width: 54ch; }

/* ⚠ দুটি কার্ড সমান ওজনে। `1fr 1fr`, `auto` নয় — নইলে যে কার্ডে
     বেশি লেখা তার প্রস্থ বেড়ে যেত, আর "দুটি যন্ত্র সমান গুরুত্বের"
     কথাটি নকশাতেই মিথ্যা হতো। */
.pair {
  display: grid; grid-template-columns: 1fr 1fr; gap: 18px;
  align-items: stretch;
}
@media (max-width: 860px) { .pair { grid-template-columns: 1fr; } }

/* =====================================================================
   v11.2.0 — ফ্ল্যাশকার্ড, কাচের মতো পৃষ্ঠ, আর উপরে রঙিন আয়তক্ষেত্র
   ---------------------------------------------------------------------
   ব্যবহারকারীর নির্দেশ: "clean minimal professional colorfull modern
   and innovative design and professional flashcard and glass effect
   scale top rectangle color based on the today top value"।

   ⚠⚠ কাচের প্রভাবটি (backdrop-filter) **সাজসজ্জা হিসেবে** বসানো,
     নির্ভরতা হিসেবে নয়। যে ব্রাউজার backdrop-filter জানে না
     (পুরনো Firefox, অনেক অ্যান্ড্রয়েড WebView — বাংলাদেশে যেগুলো
     এখনো বহুল ব্যবহৃত), সেখানে নিচের অস্বচ্ছ background-টিই থেকে
     যায়। অর্থাৎ ঝাপসা না হলেও কার্ডটি পুরোপুরি পড়া যায়।

     এটি গুরুত্বপূর্ণ: কাচের নকশায় সবচেয়ে সাধারণ ভুল হলো
     background-এ কেবল স্বচ্ছ রঙ দেওয়া — তখন blur না চললে লেখা
     সরাসরি পাতার পটভূমির উপর পড়ে, আর কনট্রাস্ট ভেঙে যায়।

   ⚠ উপরের আয়তক্ষেত্রটি **আজকের সর্বোচ্চ মানের** রঙ পায় — তাপে
     BMD-র শ্রেণি, বাতাসে EPA-র ব্যান্ড। রঙটি JS বসায়; CSS-এ
     কোনো ডিফল্ট রঙ নেই, নইলে ডেটা না এলে একটি ভুল রঙ (যেমন
     সবুজ "স্বাভাবিক") দেখা যেত যখন কোনো সংখ্যাই নেই।
   ===================================================================== */
.inst {
  position: relative; overflow: hidden;
  border-radius: 16px;
  padding: 0 0 18px;
  display: flex; flex-direction: column;
  /* কাচ — কিন্তু নিচে একটি অস্বচ্ছ ভিত্তি (উপরের মন্তব্য) */
  background: var(--glass);
  border: 1px solid var(--glass-line);
  box-shadow: 0 1px 2px rgba(20,26,25,.04), 0 12px 28px -18px rgba(20,26,25,.28);
  backdrop-filter: blur(14px) saturate(1.3);
  -webkit-backdrop-filter: blur(14px) saturate(1.3);
}
.inst > *:not(.inst-top) { padding-inline: 22px; }

/* উপরের রঙিন আয়তক্ষেত্র — আজকের সর্বোচ্চ মান */
.inst-top {
  height: 8px; width: 100%;
  background: var(--line);       /* ডেটা আসার আগে নিরপেক্ষ */
  transition: background .25s;
}
.inst-head { padding-top: 18px; }

.inst-head { margin: 0 0 14px; }
.inst-tag {
  display: inline-block; font-size: 11px; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase;
  padding: 4px 9px; border-radius: 999px; margin-bottom: 8px;
}
.inst-heat .inst-tag { background: var(--inst-heat-soft); color: var(--inst-heat); }
.inst-air  .inst-tag { background: var(--inst-air-soft);  color: var(--inst-air); }
.inst-head h2 { font-size: 17px; margin: 0; font-weight: 650; }

/* ---- বড় সংখ্যাটি ---- */
.big { margin: 0; line-height: 1; display: flex; align-items: baseline; gap: 4px; }
.big-n {
  font-size: clamp(46px, 8vw, 68px); font-weight: 700;
  letter-spacing: -.03em;
  /* ⚠ tabular-nums: সংখ্যাটি প্রতি দশ মিনিটে বদলায়, আর অনুপাতিক
       অঙ্কে প্রতিবার লেখাটি একটু নড়ত — পর্দায় সেটি অস্থির দেখায়। */
  font-variant-numeric: tabular-nums;
}
.big-u { font-size: 18px; font-weight: 600; color: var(--ink-3); }
.big-name { margin: 6px 0 0; font-size: 17px; font-weight: 650; }
.big-note { margin: 3px 0 16px; font-size: 13px; color: var(--ink-3); max-width: 34ch; }

/* ⚠ v11.2.1 — "দিন সবে শুরু" লাইন। আলাদা রঙ নয়, একটি নিচু-স্বরের
     কিনারা: এটি সতর্কতা নয়, একটি ব্যাখ্যা। লাল করলে পাঠক ভাবতেন
     যন্ত্রে গোলমাল হয়েছে, অথচ যন্ত্রটি ঠিকই আছে — দিনটাই নতুন। */
.big-warn {
  margin: -10px 0 16px; padding: 7px 10px; font-size: 12.5px; line-height: 1.5;
  color: var(--ink-2); background: var(--surface-2);
  border-left: 3px solid var(--line-2); border-radius: 0 7px 7px 0;
  max-width: 38ch;
}
.big-warn[hidden] { display: none; }

/* কার্ডের শিরোনাম-রঙ অনুভূত তাপ / AQI-র শ্রেণি অনুসরণ করে */
.inst-heat[data-hi="0"] .big-name { color: var(--lvl0); }
.inst-heat[data-hi="1"] .big-name { color: var(--lvl1-fg); }
.inst-heat[data-hi="2"] .big-name { color: var(--lvl2); }
.inst-heat[data-hi="3"] .big-name { color: var(--lvl3); }
.inst-heat[data-hi="4"] .big-name { color: var(--lvl4); }

/* ---- সারিগুলো ---- */
.rows { margin: 0; padding: 14px 0 0; border-top: 1px solid var(--line); }
.rows .row {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; padding: 7px 0;
}
.rows .row + .row { border-top: 1px dotted var(--line); }
.rows dt { margin: 0; color: var(--ink-3); font-size: 13.5px; }
.rows dd {
  margin: 0; font-size: 15px; font-weight: 600;
  font-variant-numeric: tabular-nums; text-align: right;
}
.row-lvl dd { font-weight: 500; }
.pill {
  display: inline-block; padding: 3px 11px; border-radius: 999px;
  font-size: 12.5px; font-weight: 700; background: var(--surface-2);
}
.inst-foot {
  margin: 14px 0 0; padding-top: 12px; border-top: 1px solid var(--line);
  font-size: 12.5px; color: var(--ink-3);
}

/* ---- সতর্কবাণী ---- */
/* ⚠ কোনোটাই "ত্রুটি" নয়, তাই লাল নয় — কিন্তু চেপে যাওয়াও চলে না।
     হলুদ-বাদামি: লক্ষ করা যায়, আতঙ্ক ছড়ায় না। */
.notes:empty { display: none; }
.notes { margin: 16px 0 0; display: grid; gap: 8px; }
.note {
  margin: 0; padding: 10px 14px; border-radius: 8px;
  border-left: 3px solid var(--warn);
  background: var(--warn-soft, var(--surface-2));
  color: var(--ink-2); font-size: 13.5px; line-height: 1.55;
}

/* ---- দুটি স্কেল-পটি ---- */
.scales {
  display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin: 26px 0 4px;
}
@media (max-width: 860px) { .scales { grid-template-columns: 1fr; } }
.scale { margin: 0; }
.scale figcaption {
  font-size: 11.5px; font-weight: 700; letter-spacing: .07em;
  text-transform: uppercase; color: var(--ink-3); margin-bottom: 7px;
}
.scale-strip { display: flex; gap: 2px; }
.scale-strip .seg {
  flex: 1 1 0; min-width: 0; padding: 7px 6px 6px; border-radius: 4px;
  text-align: center; opacity: .55; transition: opacity .15s;
}
/* ⚠ চলতি ধাপটি অস্বচ্ছ ও সামান্য উঁচু — রঙ ছাড়াও একটি দ্বিতীয়
     ইঙ্গিত, তাই বর্ণান্ধ পাঠকও বুঝতে পারেন কোন ধাপে আছি। */
.scale-strip .seg.on {
  opacity: 1; box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px var(--ink);
}
.scale-strip .seg b {
  display: block; font-size: 10.5px; font-weight: 700; line-height: 1.25;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.scale-strip .seg i {
  display: block; font-style: normal; font-size: 10px; opacity: .8;
  font-variant-numeric: tabular-nums;
}
#scaleHeatStrip .seg b { color: #fff; }
#scaleHeatStrip .seg:nth-child(2) b, #scaleHeatStrip .seg:nth-child(3) b { color: #141A19; }
#scaleHeatStrip .seg i { color: inherit; }

/* ------------------------------------------------------------- স্ট্রিপ */
.strip { padding: 34px 0 6px; border-top: 1px solid var(--line); margin-top: 30px; }
.strip-head { margin: 0 0 18px; }
.strip-head h2 { font-size: 20px; margin: 0 0 4px; letter-spacing: -.01em; }
.strip-sub { margin: 0; color: var(--ink-3); font-size: 14px; }

/* ---- আগামী সাত দিন ---- */
.days {
  display: grid; grid-template-columns: repeat(7, 1fr); gap: 10px;
}
@media (max-width: 900px) { .days { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 560px) { .days { grid-template-columns: repeat(2, 1fr); } }
.day {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 11px; padding: 12px 10px 11px; text-align: center;
}
.day h3 {
  margin: 0 0 8px; font-size: 12px; font-weight: 650; color: var(--ink-3);
  letter-spacing: .02em;
}
.day-feel {
  margin: 0; font-size: 24px; font-weight: 700; line-height: 1.1;
  font-variant-numeric: tabular-nums;
}
.day-feel-n {
  margin: 3px 0 0; font-size: 11px; line-height: 1.3; color: var(--ink-3);
  min-height: 2.6em;
}
.day-t {
  margin: 7px 0 0; padding-top: 7px; border-top: 1px dotted var(--line);
  font-size: 12.5px; color: var(--ink-2); font-variant-numeric: tabular-nums;
}
.day-lvl {
  margin: 8px 0 0; padding: 3px 6px; border-radius: 5px;
  font-size: 10.5px; font-weight: 700; line-height: 1.3;
}
.day[data-hi="3"] .day-feel { color: var(--lvl3); }
.day[data-hi="4"] .day-feel { color: var(--lvl4); }

.fc-air { margin-top: 26px; padding-top: 22px; border-top: 1px dashed var(--line); }
.fc-air h3 { font-size: 15px; margin: 0 0 12px; }
.empty {
  margin: 0; padding: 18px; border-radius: 10px;
  background: var(--surface-2); color: var(--ink-3);
  font-size: 13.5px; text-align: center;
}

/* ---- চার্ট ---- */
.chart-box { margin: 0 0 22px; }
.chart-box figcaption {
  font-size: 12px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--ink-3); margin-bottom: 8px;
}
.chart {
  height: 280px; width: 100%;
  background: var(--surface); border: 1px solid var(--line); border-radius: 12px;
}
@media (max-width: 600px) { .chart { height: 240px; } }

/* ---- যন্ত্রের তালিকা ---- */
.inst-list { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 860px) { .inst-list { grid-template-columns: 1fr; } }
.ins {
  position: relative; overflow: hidden;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 12px; padding: 16px 18px 15px 22px;
}
.ins-bar { position: absolute; inset: 0 auto 0 0; width: 4px; }
.ins-heat .ins-bar { background: var(--inst-heat); }
.ins-air  .ins-bar { background: var(--inst-air); }
.ins-tag {
  margin: 0 0 6px; font-size: 10.5px; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase;
}
.ins-heat .ins-tag { color: var(--inst-heat); }
.ins-air  .ins-tag { color: var(--inst-air); }
.ins h3 { margin: 0 0 4px; font-size: 15.5px; }
.ins-what { margin: 0 0 10px; font-size: 13px; color: var(--ink-2); }
.ins-last { margin: 0 0 4px; font-size: 13px; color: var(--ink-2); }
.ins-n { margin: 0; font-size: 12.5px; color: var(--ink-3); font-variant-numeric: tabular-nums; }
.ins-link { margin: 9px 0 0; font-size: 12.5px; }
/* ⚠⚠ সবুজ/ধূসর বিন্দু — কিন্তু রঙই একমাত্র ইঙ্গিত নয়, পাশে
     লেখাও থাকে ("শেষ পাঠ …" বনাম "এখনো কোনো পাঠ আসেনি")।
     কেবল রঙ দিয়ে অবস্থা বোঝালে বর্ণান্ধ পাঠক কিছুই জানতেন না। */
.dot {
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  margin-inline-end: 7px; vertical-align: baseline;
}
.dot.ok  { background: var(--ok); }
.dot.off { background: var(--ink-3); }

/* ⚠ খালি-বার্তাটি গ্রিডের **পুরো** প্রস্থ জুড়ে বসে। না লিখলে সে
     সাতটি কলামের প্রথমটিতে সেঁধিয়ে যেত — রেন্ডার করে চোখে দেখে
     ধরা পড়েছে: একটি সরু ধূসর বাক্স, যার ভেতরের বাক্যটি প্রতি
     শব্দে ভেঙে যাচ্ছিল, আর পড়াই যাচ্ছিল না। */
.days > .empty { grid-column: 1 / -1; }

/* ---------------------------------------------------- টাইমলাইন (১৫ ঘর) */
/* ⚠⚠ মাপা আর অনুমানের পার্থক্য **গঠনে**, রঙে নয়: মাপা ঘরের কঠিন
     সীমানা, অনুমানের ঘরের কাটা সীমানা, আজকের ঘরটি চওড়া ও উঁচু।
     রঙই একমাত্র ইঙ্গিত হলে বর্ণান্ধ পাঠক পার্থক্যটি ধরতেই পারতেন
     না — অথচ "এটি মাপা না অনুমান" এখানে সবচেয়ে জরুরি প্রশ্ন। */
.tl-wrap { overflow-x: auto; padding-bottom: 4px; }
.tl {
  display: grid; grid-template-columns: repeat(15, minmax(62px, 1fr));
  gap: 6px; min-width: 100%;
}
.tl-c {
  position: relative; text-align: center; border-radius: 9px;
  padding: 9px 4px 12px; background: var(--surface);
  border: 1px solid var(--line);
  display: flex; flex-direction: column; gap: 2px;
}
.tl-obs { }
.tl-fc  { border-style: dashed; background: transparent; }
.tl-now {
  border-width: 2px; border-color: var(--ink);
  box-shadow: var(--e2); transform: translateY(-3px);
}
.tl-empty { opacity: .45; }
.tl-d { font-size: 10.5px; color: var(--ink-3); line-height: 1.25; }
.tl-v {
  font-size: 17px; font-weight: 700; line-height: 1.15;
  font-variant-numeric: tabular-nums;
}
.tl-now .tl-v { font-size: 20px; }
.tl-s { font-size: 10px; color: var(--ink-3); min-height: 1.2em; line-height: 1.2; }
/* ⚠ v11.2.1 — পটিটি এখন একটি **ট্র্যাক**, তার ভেতরে একটি ভরাট অংশ।
     রঙ বলে BMD-র স্তর (বা AQI ব্যান্ড), আর দৈর্ঘ্য বলে ঐ পনেরো
     দিনের মধ্যে ঐ দিনের আপেক্ষিক অবস্থান। আগে গোটা পটিটাই এক রঙে
     ভরা থাকত, তাই এক ঋতুতে পনেরোটি ঘরই দেখতে হুবহু একরকম হতো —
     আর ঐ কারণেই কোডটি একসময় রঙের জন্য বিদেশি একটি মাপকাঠিতে সরে
     গিয়েছিল। ট্র্যাকটি নিজে খুব নিচু কনট্রাস্টে, যাতে ভরাট অংশটিই
     চোখে পড়ে। */
.tl-b {
  position: absolute; left: 6px; right: 6px; bottom: 5px; height: 4px;
  border-radius: 2px; background: var(--line); overflow: hidden;
}
.tl-bi {
  display: block; height: 100%; border-radius: 2px;
  min-width: 3px;              /* ০%-ও যেন একটি বিন্দু হয়ে দেখা যায় */
}
.tl-b-none { background: var(--line); }

.tl-legend { display: flex; gap: 16px; margin: 0 0 10px; flex-wrap: wrap; }
.tl-k { font-size: 11.5px; color: var(--ink-3); display: inline-flex; align-items: center; gap: 6px; }
.tl-k::before {
  content: ''; width: 16px; height: 11px; border-radius: 3px;
  border: 1px solid var(--line-2); background: var(--surface);
}
.tl-k-fc::before  { border-style: dashed; background: transparent; }
.tl-k-now::before { border: 2px solid var(--ink); }

/* -------------------------------------------------------- সুইচ */
.seg-switch {
  display: inline-flex; gap: 2px; padding: 3px; margin: 0 0 16px;
  background: var(--surface-2); border-radius: 10px;
}
.seg-switch button {
  appearance: none; border: 0; cursor: pointer;
  padding: 7px 16px; border-radius: 8px; font: inherit; font-size: 13.5px;
  font-weight: 600; color: var(--ink-2); background: transparent;
  transition: background .12s, color .12s;
}
.seg-switch button:hover { color: var(--ink); }
.seg-switch button[aria-selected="true"] {
  background: var(--surface); color: var(--ink); box-shadow: var(--e1);
}
.seg-switch button:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }

.cap-range { color: var(--ink-3); font-weight: 500; text-transform: none; letter-spacing: 0; }
.dotc {
  display: inline-block; width: 9px; height: 9px; border-radius: 2px;
  margin-inline-end: 7px;
}
.dotc-heat { background: var(--inst-heat); }
.dotc-air  { background: var(--inst-air); }

/* ------------------------------------------------------ যন্ত্রের মানচিত্র */
.mapbox { margin: 18px 0 0; }
.mapbox figcaption {
  font-size: 12px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--ink-3); margin-bottom: 8px;
}
.map {
  height: 260px; border-radius: 12px; overflow: hidden;
  border: 1px solid var(--line); background: var(--surface-2);
}
/* ⚠ Leaflet নিজের টাইলে সাদা পটভূমি ধরে নেয়; অন্ধকার মোডে
     সীমানাটি নইলে উধাও হয়ে যেত। */
.map .leaflet-container { background: var(--surface-2); }
.map-note { margin: 8px 0 0; font-size: 12.5px; color: var(--ink-3); }

/* -------------------------------------------------- ইতিহাসের তিনটি সংখ্যা */
.stat-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin: 0 0 24px; }
@media (max-width: 760px) { .stat-row { grid-template-columns: 1fr; } }
.stat {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 12px; padding: 15px 17px;
}
.stat-k { margin: 0 0 5px; font-size: 12px; color: var(--ink-3); font-weight: 600; }
.stat-v { margin: 0; font-size: 26px; font-weight: 700; font-variant-numeric: tabular-nums; }
.stat-s { margin: 3px 0 0; font-size: 12px; color: var(--ink-3); }

/* =====================================================================
   v11.2.0 — ফ্ল্যাশকার্ডের বাকি অংশ
   ===================================================================== */

/* শ্রেণির নামটি এখন পিল নয়, বড় রঙিন লেখা — পিলটি সরানো হলো কারণ
   রঙিন ভরাট পটভূমি আর উপরের আয়তক্ষেত্র দুটি একই কথা দুবার বলত। */
.big-name { font-size: 19px; font-weight: 700; letter-spacing: -.01em; }
.big { padding-top: 4px; }

/* ⚠ সারিগুলোর পটভূমি সামান্য স্বচ্ছ — কার্ডের কাচের ভাব ভেতরেও
     বজায় থাকে, কিন্তু লেখা কখনো সরাসরি পাতার উপর পড়ে না। */
.rows { border-top: 1px solid var(--glass-line); }
.rows .row + .row { border-top: 1px dotted var(--line); }
.inst-foot { border-top: 1px solid var(--glass-line); }

/* স্ট্রিপের কার্ডগুলোও একই ভাষায় */
.day, .tl-c, .ins, .chart, .stat {
  background: var(--glass);
  border-color: var(--glass-line);
  backdrop-filter: blur(10px) saturate(1.2);
  -webkit-backdrop-filter: blur(10px) saturate(1.2);
}
.tl-fc { background: var(--glass-2); }

/* ⚠ পাতার পটভূমিতে একটি খুব হালকা রঙের আভা — কাচের প্রভাব
     দেখতে হলে নিচে কিছু থাকা চাই। একদম সমতল পটভূমিতে blur
     কিছুই করে না, আর নকশাটি অকারণে ভারী মনে হতো। */
body {
  background-image:
    radial-gradient(1100px 520px at 12% -8%, rgba(30,111,184,.10), transparent 62%),
    radial-gradient(900px 460px at 92% 4%, rgba(155,63,122,.09), transparent 60%);
  background-attachment: fixed;
}
:root[data-theme="dark"] body {
  background-image:
    radial-gradient(1100px 520px at 12% -8%, rgba(74,154,216,.13), transparent 62%),
    radial-gradient(900px 460px at 92% 4%, rgba(200,106,142,.10), transparent 60%);
}

/* ⚠⚠ prefers-reduced-transparency — কিছু ব্যবহারকারী স্বচ্ছতা
     বন্ধ রাখেন (পড়ার অসুবিধা বা মাথা ঘোরার কারণে)। তাঁদের জন্য
     কাচ সম্পূর্ণ বন্ধ, অস্বচ্ছ পৃষ্ঠ। */
@media (prefers-reduced-transparency: reduce) {
  .inst, .day, .tl-c, .ins, .chart, .stat {
    background: var(--surface);
    backdrop-filter: none; -webkit-backdrop-filter: none;
  }
  body { background-image: none; }
}

/* ⚠ মাপকাঠির ঘরগুলো v11.2.0-তে চওড়া করা হলো। আগের মাপে বাংলা
     নামগুলো ("মৃদু তাপপ্রবাহ") আর পরিসরটি ("৩৬–৩৭.৯°C") একসাথে
     লেপ্টে যাচ্ছিল — রেন্ডার করে চোখে দেখে ধরা পড়েছে, কারণ
     কোডে দুটি আলাদা ব্লক-স্তরের উপাদানই ছিল, শুধু জায়গা ছিল না। */
.scale-strip .seg { padding: 9px 7px 8px; border-radius: 7px; }
.scale-strip .seg b {
  white-space: normal; font-size: 10px; line-height: 1.3;
  min-height: 2.6em; display: flex; align-items: center; justify-content: center;
}
.scale-strip .seg i { margin-top: 2px; font-size: 9.5px; }
@media (max-width: 720px) {
  .scale-strip { flex-wrap: wrap; }
  .scale-strip .seg { flex: 1 1 30%; }
}
