ব্র্যান্ডের সাথে সামঞ্জস্যপূর্ণ ফর্ম

ওয়েব ফিচার: accent-color

চেকবক্স ও রেডিও বোতামের মতো স্ট্যান্ডার্ড HTML ফর্ম এলিমেন্ট কাস্টমাইজ করা ঐতিহাসিকভাবে কঠিন ছিল। ডেভেলপারদের প্রায়ই ব্রাউজারের ডিফল্ট ব্যবহার করা অথবা একদম শুরু থেকে কাস্টম কম্পোনেন্ট তৈরি করার মধ্যে কোনও একটি বেছে নিতে হয়। কাস্টম কন্ট্রোল তৈরি করতে সময় লাগে এবং এর ফলে অ্যাক্সেসিবিলিটি সংক্রান্ত সমস্যা বা মিসিং স্টেট (যেমন, চেকবক্সের জন্য অনির্দিষ্ট স্টেট) সহজেই হতে পারে।

CSS প্রপার্টি accent-color, অ্যাক্সেসিবিলিটি বা বিল্ট-ইন ব্রাউজার ফিচারকে বাদ না দিয়ে, CSS-এর একটি লাইনের মাধ্যমে বিল্ট-ইন HTML ফর্ম ইনপুটে আপনার ব্র্যান্ডের রঙ নিয়ে আসার একটি সহজ উপায় প্রদান করে।

কীভাবে প্রয়োগ করতে হয়

ফর্ম কন্ট্রোলে আপনার ব্র্যান্ডের রঙ প্রয়োগ করতে:

  1. আপনার ব্র্যান্ডের রঙ শনাক্ত করুন: আপনার ব্র্যান্ডকে তুলে ধরে এমন একটি রঙ বেছে নিন।
  2. accent-color প্রপার্টি প্রয়োগ করুন: আপনার CSS-এ এলিমেন্ট বা কন্টেনার এলিমেন্টে (যেমন body বা নির্দিষ্ট ফর্ম) accent-color যোগ করুন।
  3. ডার্ক মোড সাপোর্ট (ঐচ্ছিক তবে সাজেস্ট করা হয়): আপনার সাইট যে ডার্ক মোড সাপোর্ট করে তা ব্রাউজারকে জানাতে color-scheme ব্যবহার করুন এবং আরও ভালো কনট্রাস্টের জন্য প্রয়োজন হলে accent-color অ্যাডজাস্ট করুন।

কোডের উদাহরণ: ব্র্যান্ডের সাথে সামঞ্জস্যপূর্ণ ফর্ম কন্ট্রোল

:root {
  --brand-color: #6200ee;
}

/* Apply accent-color to the body or a specific container */
body {
  accent-color: var(--brand-color);
}

/* Optional: Adjust for dark mode if needed */
@media (prefers-color-scheme: dark) {
  :root {
    --brand-color: #bb86fc; /* A lighter shade for dark mode */
  }
}
<form>
  <!-- Checkbox -->
  <label for="subscribe">
    <input type="checkbox" id="subscribe" checked>
    Subscribe to newsletter
  </label>

  <!-- Radio Buttons -->
  <label for="plan-monthly">
    <input type="radio" id="plan-monthly" name="plan" value="monthly">
    Monthly
  </label>
  <label for="plan-yearly">
    <input type="radio" id="plan-yearly" name="plan" value="yearly" checked>
    Yearly
  </label>

  <!-- Range Slider -->
  <label for="volume">Volume:</label>
  <input type="range" id="volume" min="0" max="100" value="70">

  <!-- Progress Bar -->
  <label for="file">Upload Progress:</label>
  <progress id="file" max="100" value="70">70%</progress>
</form>

স্ট্র্যাটেজিক প্রয়োগ ও পেশাদার পদ্ধতি

  • আপনার ব্র্যান্ডের সাথে ম্যাচ করার জন্য ফর্ম কন্ট্রোল সহজে থিম করতে accent-color ব্যবহার করুন।
  • কনট্রাস্ট ম্যানেজ করার জন্য ব্রাউজারকে অন্ধভাবে বিশ্বাস করবেন না। ব্রাউজার অটোমেটিক উপযুক্ত কনট্রাস্ট কালার নির্ধারণ করে, তবে Safari (WebKit bug 244233) এবং Android Chrome (Chromium bug 343503163)-এর মতো ইমপ্লিমেন্টেশনে পরিচিত বাগ টিকচিহ্নের কালার ইনভার্ট করতে ব্যর্থ হতে পারে। এর ফলে ব্যাকগ্রাউন্ডের সাথে পর্যাপ্ত কনট্রাস্ট নেই এমন কালার ব্যবহার করার সময় (যেমন, লাইট মোডে হালকা কালার বা ডার্ক মোডে গাঢ় কালার) কন্ট্রোল অদৃশ্য বা দেখতে অসুবিধা হতে পারে।
  • লাইট ও ডার্ক থিম, দুটিতেই ফর্ম কন্ট্রোল যাতে ভাল দেখায় তা নিশ্চিত করতে accent-color-এর সাথে color-scheme: light dark একত্রিত করুন।
  • ব্যাকগ্রাউন্ড কালারের খুব কাছাকাছি কোনও কালার ব্যবহার করবেন না, যদিও ব্রাউজার কনট্রাস্টের গ্যারান্টি দেওয়ার চেষ্টা করে, তবুও ভাল বেস কনট্রাস্ট সহ কালার প্রদান করা সবচেয়ে ভাল।
  • accent-color সব ফর্ম এলিমেন্টে কাজ করে বলে ধরে নেবেন না। বর্তমানে, এটি শুধুমাত্র checkbox, radio, range এবং progress এলিমেন্টকে টিন্ট করে।

ফলব্যাক স্ট্র্যাটেজি

যেসব ব্রাউজারে accent-color কাজ করে না, সেগুলিতে ফর্ম কন্ট্রোল ব্রাউজারের ডিফল্ট চেহারায় ফিরে যায়। সব পরিবেশে ব্র্যান্ডের সম্পূর্ণ ধারাবাহিকতা এবং উচ্চ নির্ভরযোগ্যতা নিশ্চিত করতে, আপনাকে অবশ্যই প্রতিষ্ঠিত "ভিজ্যুয়ালি লুকানো ইনপুট" কৌশল ব্যবহার করে একটি কাস্টম ফলব্যাক স্ট্র্যাটেজি প্রয়োগ করতে হবে।

@supports not-এর সাথে প্রোগ্রেসিভ এনহ্যান্সমেন্ট

accent-color কাজ না করলে, কাস্টম ফলব্যাক স্টাইল প্রয়োগ করতে আপনাকে অবশ্যই @supports not নিয়ম ব্যবহার করতে হবে। এটি নিশ্চিত করে যে আপনি আধুনিক ব্রাউজারের জন্য accent-color-এর সরলতা ব্যবহার করছেন এবং একই সাথে পুরনো ব্রাউজারের জন্য একটি সামঞ্জস্যপূর্ণ ব্র্যান্ডেড অভিজ্ঞতার গ্যারান্টি দিচ্ছেন।

১. HTML স্ট্রাকচার

CSS-এ সিবলিং সিলেক্টরকে অনুমতি দিতে আপনার লেবেলগুলি যেন <span>-এ টেক্সট র‍্যাপ করে তা নিশ্চিত করুন:

<label for="subscribe-fallback">
  <input type="checkbox" id="subscribe-fallback" class="visually-hidden" checked>
  <span>Subscribe to newsletter</span>
</label>

২. CSS ফলব্যাক

@supports not ব্লকের মধ্যে কাস্টম স্টাইল প্রয়োগ করুন:

/* Fallback for older browsers without accent-color */
@supports not (accent-color: var(--brand-color)) {
  /* Visually hide the native input using the canonical accessible recipe */
  form input[type="checkbox"].visually-hidden {
    position: absolute !important;
    clip-path: inset(50%) !important;
    overflow: hidden !important;
    width: 1px !important;
    height: 1px !important;
    margin: -1px !important;
    padding: 0 !important;
    border: 0 !important;
    white-space: nowrap !important;
  }

  /* Style the wrapper label */
  label {
    position: relative;
    padding-left: 2rem;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
  }

  /* Custom box for checkbox */
  input[type="checkbox"] + span::before {
    content: "";
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
    width: 1.2rem;
    height: 1.2rem;
    border: 2px solid #ccc;
    background: white;
    border-radius: 4px;
    box-sizing: border-box;
    transition: all 0.2s ease;
  }

  /* Ensure custom checkbox shows focus for keyboard users */
  input[type="checkbox"]:focus-visible + span::before {
    outline: 2px solid #000;
    outline-offset: 2px;
  }

  /* Checked State */
  input[type="checkbox"]:checked + span::before {
    background-color: var(--brand-color, #6200ee);
    border-color: var(--brand-color, #6200ee);
  }

  /* Checkmark (Unicode) */
  input[type="checkbox"]:checked + span::after {
    content: "✓";
    position: absolute;
    left: 0.25rem;
    top: 50%;
    transform: translateY(-50%);
    color: white;
    font-weight: bold;
    font-size: 0.9rem;
  }

  /* Fallback for Range Slider */
  input[type="range"] {
    -webkit-appearance: none;
    appearance: none;
    background: transparent;
  }

  /* Webkit (Chrome, Safari, Edge) */
  input[type="range"]::-webkit-slider-runnable-track {
    width: 100%;
    height: 8px;
    /* Use gradient to show progress for a static value (e.g., 70%) or update with JS */
    background: linear-gradient(to right, var(--brand-color, #6200ee) 70%, #ccc 70%);
    border-radius: 4px;
  }

  input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    height: 16px;
    width: 16px;
    border-radius: 50%;
    background: var(--brand-color, #6200ee);
    cursor: pointer;
    margin-top: -4px; /* Center vertically */
  }

  /* Firefox */
  input[type="range"]::-moz-range-track {
    width: 100%;
    height: 8px;
    background: #ccc;
    border-radius: 4px;
  }

  input[type="range"]::-moz-range-thumb {
    height: 16px;
    width: 16px;
    border-radius: 50%;
    background: var(--brand-color, #6200ee);
    cursor: pointer;
  }

  /* Firefox specific progress bar */
  input[type="range"]::-moz-range-progress {
    background-color: var(--brand-color, #6200ee);
    height: 8px;
    border-radius: 4px;
  }

  /* Fallback for Progress Bar */
  progress {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    border: none;
    background: #ccc;
    height: 8px;
    border-radius: 4px;
  }

  progress::-webkit-progress-bar {
    background-color: #ccc;
    border-radius: 4px;
  }

  progress::-webkit-progress-value {
    background-color: var(--brand-color, #6200ee);
    border-radius: 4px;
  }

  progress::-moz-progress-bar {
    background-color: var(--brand-color, #6200ee);
    border-radius: 4px;
  }
}

Webkit Fallback-এ ডায়নামিক রেঞ্জ প্রগ্রেস

Webkit ব্রাউজারে (accent-color ছাড়া) রেঞ্জ স্লাইডারে থাম্বের সাথে প্রগ্রেস ফিল সরাতে, আপনি একটি CSS ভেরিয়েবল এবং অল্প পরিমাণ জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন।

  1. CSS আপডেট করুন: গ্রেডিয়েন্ট স্টপের জন্য CSS ভেরিয়েবল ব্যবহার করুন:

    input[type="range"]::-webkit-slider-runnable-track {
      background: linear-gradient(to right, var(--brand-color) var(--progress, 0%), #ccc var(--progress, 0%));
    }
    
  2. জাভাস্ক্রিপ্ট যোগ করুন: input ইভেন্টে ভেরিয়েবেল আপডেট করুন:

if (!CSS.supports('accent-color')) {
  const slider = document.getElementById('volume');
  slider.addEventListener('input', (e) => {
    e.target.style.setProperty('--progress', `${e.target.value}%`);
  });
}