সিঙ্গেল ডিসক্লোজার কার্যকারিতাসহ সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন তৈরির কৌশল আয়ত্ত করুন, যা বিভিন্ন ওয়েব প্ল্যাটফর্মে ব্যবহারকারীর অভিজ্ঞতা এবং অ্যাক্সেসিবিলিটি বাড়ায়।
সিএসএস এক্সক্লুসিভ অ্যাকর্ডিয়ন: উন্নত UX-এর জন্য সিঙ্গেল ডিসক্লোজার উইজেট তৈরি
অ্যাকর্ডিয়ন আধুনিক ওয়েব ডিজাইনের একটি প্রধান উপাদান, যা প্রচুর তথ্যকে সহজবোধ্য বিন্যাসে পরিচ্ছন্ন এবং কার্যকরভাবে উপস্থাপন করে। এগুলি প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQs), পণ্যের বিবরণ এবং নেভিগেশন মেনুর জন্য বিশেষভাবে উপযোগী। এই নিবন্ধে আমরা সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন তৈরির পদ্ধতি নিয়ে আলোচনা করব, যেখানে সিঙ্গেল ডিসক্লোজার আচরণ থাকবে, অর্থাৎ একবারে কেবল একটি অ্যাকর্ডিয়ন বিভাগ খোলা যাবে। এই পদ্ধতিটি ব্যবহারকারীর অভিজ্ঞতা উন্নত করে, কারণ এটি অতিরিক্ত কন্টেন্টের চাপ কমায় এবং ব্যবহারকারীকে নির্দিষ্ট বিষয়ে মনোযোগ দিতে সাহায্য করে।
সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়নের সুবিধা বোঝা
প্রচলিত জাভাস্ক্রিপ্ট-ভিত্তিক অ্যাকর্ডিয়নে প্রায়শই স্টেট পরিচালনা এবং ইভেন্ট হ্যান্ডেলিংয়ের প্রয়োজন হয়, যা আপনার কোডকে জটিল করে তুলতে পারে। অন্যদিকে, সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন জাভাস্ক্রিপ্টের উপর নির্ভর না করেই কাঙ্ক্ষিত কার্যকারিতা অর্জনের জন্য সিএসএস সিলেক্টর এবং `:checked` সিউডো-ক্লাসের শক্তি ব্যবহার করে। এর ফলে যা হয়:
- উন্নত পারফরম্যান্স: জাভাস্ক্রিপ্ট বাদ দেওয়ায় পেজ লোড টাইম কমে এবং সামগ্রিক পারফরম্যান্স উন্নত হয়।
- উন্নত অ্যাক্সেসিবিলিটি: সঠিক HTML সিমেন্টিক্স এবং আরিয়া (ARIA) অ্যাট্রিবিউট ব্যবহার করে সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন সহজেই অ্যাক্সেসিবল করা যায়।
- সহজ রক্ষণাবেক্ষণ: কম কোড মানে রক্ষণাবেক্ষণ এবং ডিবাগিং করা সহজ।
- আরও ভালো এসইও: পরিচ্ছন্ন HTML এবং CSS সার্চ ইঞ্জিন অপটিমাইজেশন উন্নত করতে পারে।
বিল্ডিং ব্লক: HTML কাঠামো
আমাদের সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়নের ভিত্তি হলো একটি সুগঠিত HTML মার্কআপ। আমরা নিম্নলিখিত উপাদানগুলি ব্যবহার করব:
<input type="radio">
: রেডিও বাটন ব্যবহার করা হয় যাতে একবারে কেবল একটি বিভাগ খোলা থাকে। রেডিও বাটনগুলিকে গ্রুপ করার জন্য `name` অ্যাট্রিবিউটটি অত্যন্ত গুরুত্বপূর্ণ।<label>
: লেবেলগুলি রেডিও বাটনের সাথে যুক্ত থাকে এবং অ্যাকর্ডিয়নের হেডার হিসাবে কাজ করে।<div>
: অ্যাকর্ডিয়নের কন্টেন্ট রাখার জন্য একটি কন্টেইনার।
এখানে প্রাথমিক HTML কাঠামোটি দেওয়া হলো:
<div class="accordion-container">
<input type="radio" name="accordion" id="section1">
<label for="section1">Section 1 Title</label>
<div class="accordion-content">
<p>Content for Section 1.</p>
</div>
<input type="radio" name="accordion" id="section2">
<label for="section2">Section 2 Title</label>
<div class="accordion-content">
<p>Content for Section 2.</p>
</div>
<input type="radio" name="accordion" id="section3">
<label for="section3">Section 3 Title</label>
<div class="accordion-content">
<p>Content for Section 3.</p>
</div>
</div>
ব্যাখ্যা:
- `accordion-container` ক্লাসটি সামগ্রিক অ্যাকর্ডিয়ন কাঠামোর স্টাইলিংয়ের জন্য ব্যবহৃত হয়।
- প্রতিটি অ্যাকর্ডিয়ন বিভাগে একটি `input` (রেডিও বাটন), একটি `label` এবং কন্টেন্টসহ একটি `div` থাকে।
- রেডিও বাটনগুলির `name` অ্যাট্রিবিউট "accordion" সেট করা হয়েছে যাতে সেগুলি একসাথে গ্রুপ করা যায়, যা নিশ্চিত করে যে একবারে কেবল একটি নির্বাচন করা যাবে।
- `label`-এর `for` অ্যাট্রিবিউট সংশ্লিষ্ট `input`-এর `id`-এর সাথে মিলে যায়, যা লেবেলটিকে রেডিও বাটনের সাথে সংযুক্ত করে।
সিএসএস দিয়ে অ্যাকর্ডিয়ন স্টাইল করা
এবার, অ্যাকর্ডিয়ন স্টাইল করতে এবং সিঙ্গেল ডিসক্লোজার আচরণ প্রয়োগ করতে সিএসএস যোগ করা যাক।
.accordion-container {
width: 100%;
border: 1px solid #ccc;
margin-bottom: 10px;
}
input[type="radio"] {
display: none;
}
label {
display: block;
padding: 10px;
background-color: #f0f0f0;
border-bottom: 1px solid #ccc;
cursor: pointer;
}
.accordion-content {
padding: 10px;
background-color: #fff;
display: none; /* প্রাথমিকভাবে কন্টেন্ট লুকানো */
}
input[type="radio"]:checked + label {
background-color: #ddd;
}
input[type="radio"]:checked + label + .accordion-content {
display: block; /* রেডিও বাটন চেক করা হলে কন্টেন্ট দেখান */
}
ব্যাখ্যা:
.accordion-container
: কন্টেইনারটিকে একটি বর্ডার এবং মার্জিন দিয়ে স্টাইল করে।input[type="radio"]
: রেডিও বাটনগুলি লুকিয়ে রাখে, কারণ আমরা কেবল লেবেলগুলি প্রদর্শন করতে চাই।label
: লেবেলগুলিকে অ্যাকর্ডিয়নের হেডারের মতো দেখতে স্টাইল করে।.accordion-content
: `display: none` ব্যবহার করে প্রাথমিকভাবে কন্টেন্ট লুকিয়ে রাখে।input[type="radio"]:checked + label
: সংশ্লিষ্ট রেডিও বাটনটি চেক করা হলে লেবেলটিকে স্টাইল করে।input[type="radio"]:checked + label + .accordion-content
: এটিই সিঙ্গেল ডিসক্লোজার আচরণের মূল চাবিকাঠি। এটি অ্যাডজাসেন্ট সিবলিং সিলেক্টর (+) ব্যবহার করে চেক করা রেডিও বাটনের `label`-এর ঠিক পরে থাকা `accordion-content`-কে টার্গেট করে এবং এর `display` কে `block` সেট করে, যা এটিকে দৃশ্যমান করে তোলে।
আরিয়া (ARIA) অ্যাট্রিবিউট দিয়ে অ্যাক্সেসিবিলিটি বাড়ানো
আমাদের অ্যাকর্ডিয়নটি প্রতিবন্ধী ব্যবহারকারীদের জন্য অ্যাক্সেসিবল বা সহজগম্য তা নিশ্চিত করতে, আমাদের আরিয়া (ARIA) অ্যাট্রিবিউট যোগ করতে হবে। আরিয়া (অ্যাক্সেসিবল রিচ ইন্টারনেট অ্যাপ্লিকেশন) অ্যাট্রিবিউটগুলি স্ক্রিন রিডারের মতো সহায়ক প্রযুক্তিগুলিতে সিমেন্টিক তথ্য সরবরাহ করে।
এখানে আমরা কীভাবে অ্যাক্সেসিবিলিটি বাড়াতে পারি তা দেখানো হলো:
<div class="accordion-container" role="presentation">
<input type="radio" name="accordion" id="section1" aria-controls="content1">
<label for="section1" aria-expanded="false" aria-controls="content1">Section 1 Title</label>
<div id="content1" class="accordion-content" role="region" aria-labelledby="section1">
<p>Content for Section 1.</p>
</div>
<input type="radio" name="accordion" id="section2" aria-controls="content2">
<label for="section2" aria-expanded="false" aria-controls="content2">Section 2 Title</label>
<div id="content2" class="accordion-content" role="region" aria-labelledby="section2">
<p>Content for Section 2.</p>
</div>
<input type="radio" name="accordion" id="section3" aria-controls="content3">
<label for="section3" aria-expanded="false" aria-controls="content3">Section 3 Title</label>
<div id="content3" class="accordion-content" role="region" aria-labelledby="section3">
<p>Content for Section 3.</p>
</div>
</div>
ব্যাখ্যা:
- কন্টেইনারের উপর
role="presentation"
কন্টেইনারের সিমেন্টিক অর্থ লুকিয়ে রাখে, যা নেস্টেড আরিয়া রোলগুলিকে সঠিকভাবে কাঠামোটি বোঝাতে সাহায্য করে। aria-controls
: নির্দেশ করে যে কোন এলিমেন্টটি বর্তমান এলিমেন্ট দ্বারা নিয়ন্ত্রিত হয় (এই ক্ষেত্রে, কন্টেন্ট বিভাগ)।aria-expanded
: নিয়ন্ত্রিত এলিমেন্টটি বর্তমানে প্রসারিত (expanded) নাকি সংকুচিত (collapsed) তা নির্দেশ করে। যদিও আমরা জাভাস্ক্রিপ্ট দিয়ে এটি পরিবর্তন করছি না, তবে এটি অন্তর্ভুক্ত করা একটি ভালো অভ্যাস, এবং একটি আরও জটিল উদাহরণে জাভাস্ক্রিপ্ট ব্যবহার করে এর মান টগল করা যেতে পারে। প্রাথমিক মান `false` সেট করা হয়েছে।role="region"
: কন্টেন্ট বিভাগটিকে পৃষ্ঠার একটি স্বতন্ত্র অঞ্চল হিসাবে চিহ্নিত করে।aria-labelledby
: সেই লেবেলটিকে চিহ্নিত করে যা কন্টেন্ট বিভাগটিকে বর্ণনা করে।
অ্যাক্সেসিবিলিটির জন্য গুরুত্বপূর্ণ বিবেচ্য বিষয়:
- কিবোর্ড নেভিগেশন: নিশ্চিত করুন যে ব্যবহারকারীরা কিবোর্ড (যেমন, Tab কী) ব্যবহার করে অ্যাকর্ডিয়ন বিভাগগুলির মধ্যে নেভিগেট করতে পারে।
- স্ক্রিন রিডার সামঞ্জস্যতা: একটি স্ক্রিন রিডার দিয়ে অ্যাকর্ডিয়নটি পরীক্ষা করুন যাতে কন্টেন্ট সঠিকভাবে ঘোষণা করা হয়।
- রঙের কনট্রাস্ট: দৃষ্টি প্রতিবন্ধী ব্যবহারকারীদের জন্য টেক্সট এবং ব্যাকগ্রাউন্ডের মধ্যে পর্যাপ্ত রঙের কনট্রাস্ট নিশ্চিত করুন।
কাস্টমাইজেশন এবং উন্নতি
বেসিক সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়নকে নির্দিষ্ট ডিজাইনের প্রয়োজনীয়তা মেটাতে আরও কাস্টমাইজ এবং উন্নত করা যেতে পারে।
ট্রানজিশন যোগ করা
আরও মসৃণ ব্যবহারকারীর অভিজ্ঞতা তৈরি করতে, আমরা অ্যাকর্ডিয়নের কন্টেন্টে সিএসএস ট্রানজিশন যোগ করতে পারি।
.accordion-content {
padding: 10px;
background-color: #fff;
display: none;
transition: max-height 0.3s ease-out; /* ট্রানজিশন যোগ করুন */
max-height: 0;
overflow: hidden;
}
input[type="radio"]:checked + label + .accordion-content {
display: block;
max-height: 500px; /* ট্রানজিশনের জন্য একটি সর্বোচ্চ উচ্চতা সেট করুন */
}
ব্যাখ্যা:
- আমরা `.accordion-content`-এ একটি `transition` প্রোপার্টি যোগ করেছি `max-height` প্রোপার্টিকে অ্যানিমেট করার জন্য।
- কন্টেন্টটি লুকানোর জন্য আমরা প্রাথমিক `max-height` `0` সেট করেছি।
- যখন রেডিও বাটনটি চেক করা হয়, তখন আমরা `max-height` একটি যথেষ্ট বড় মান (যেমন, `500px`) সেট করি যাতে কন্টেন্টটি মসৃণভাবে প্রসারিত হতে পারে। `overflow: hidden` ট্রানজিশনের সময় কন্টেন্টকে ওভারফ্লো হওয়া থেকে বাধা দেয় যদি আসল কন্টেন্টের উচ্চতা 500px এর কম হয়।
আইকন দিয়ে স্টাইল করা
অ্যাকর্ডিয়নের হেডারে আইকন যোগ করলে তা দেখতে সুন্দর লাগে এবং ব্যবহারকারীর বুঝতে সুবিধা হয়। আপনি এই উদ্দেশ্যে সিএসএস সিউডো-এলিমেন্ট বা ফন্ট আইকন ব্যবহার করতে পারেন।
সিএসএস সিউডো-এলিমেন্ট ব্যবহার করে:
label::after {
content: '+'; /* প্রাথমিক আইকন */
float: right;
font-size: 1.2em;
}
input[type="radio"]:checked + label::after {
content: '-'; /* প্রসারিত হলে আইকন পরিবর্তন করুন */
}
ফন্ট আইকন ব্যবহার করে (যেমন, ফন্ট অসাম):
- আপনার HTML-এ ফন্ট অসাম সিএসএস অন্তর্ভুক্ত করুন:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" integrity="..." crossorigin="anonymous" />
- আপনার লেবেলে উপযুক্ত ফন্ট অসাম ক্লাস ব্যবহার করুন:
<label for="section1">Section 1 Title <i class="fas fa-plus"></i></label>
তারপর, বিভাগটি প্রসারিত হলে আইকন পরিবর্তন করতে সিএসএস ব্যবহার করুন:
input[type="radio"]:checked + label i.fas.fa-plus {
display: none;
}
input[type="radio"]:checked + label {
/* insert the minus icon */
}
input[type="radio"]:checked + label::before {
font-family: "Font Awesome 5 Free";
font-weight: 900;
content: "\f068"; /* fa-minus unicode */
float:right;
}
রেসপন্সিভ ডিজাইনের বিবেচ্য বিষয়
আপনার অ্যাকর্ডিয়নটি বিভিন্ন স্ক্রিন সাইজে ভালোভাবে কাজ করে তা নিশ্চিত করতে রেসপন্সিভ ডিজাইন কৌশল ব্যবহার করুন। স্ক্রিনের প্রস্থের উপর ভিত্তি করে অ্যাকর্ডিয়নের স্টাইলিং সামঞ্জস্য করতে আপনি মিডিয়া কোয়েরি ব্যবহার করতে পারেন।
উদাহরণ:
@media (max-width: 768px) {
.accordion-container {
width: 100%; /* ছোট স্ক্রিনের জন্য প্রস্থ সামঞ্জস্য করুন */
}
label {
padding: 8px;
font-size: 0.9em; /* ফন্টের আকার সামঞ্জস্য করুন */
}
}
উন্নত কৌশল
যদিও বেসিক সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন একটি শক্ত ভিত্তি প্রদান করে, তবে এর কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতাকে আরও উন্নত করার জন্য কিছু উন্নত কৌশল রয়েছে।
লোকাল স্টোরেজ দিয়ে স্টেট সংরক্ষণ করা
আপনি জাভাস্ক্রিপ্ট (যদিও এটি বিশুদ্ধ সিএসএস পদ্ধতির পরিপন্থী) এবং লোকাল স্টোরেজ ব্যবহার করে অ্যাকর্ডিয়নের অবস্থা মনে রাখতে পারেন, যাতে ব্যবহারকারী যখন পৃষ্ঠায় ফিরে আসে, তখন আগে খোলা বিভাগগুলি খোলা থাকে।
ডাইনামিক কন্টেন্ট লোডিং
প্রচুর কন্টেন্ট সহ অ্যাকর্ডিয়নের জন্য, আপনি AJAX ব্যবহার করে ডাইনামিকভাবে কন্টেন্ট লোড করতে পারেন। এটি প্রাথমিক পেজ লোড সময় উন্নত করতে পারে এবং ব্যান্ডউইথ ব্যবহার কমাতে পারে।
সাধারণ সমস্যার সমাধান
সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন প্রয়োগ করার সময় আপনি কিছু সাধারণ সমস্যার সম্মুখীন হতে পারেন এবং সেগুলি কীভাবে সমাধান করবেন তা এখানে দেওয়া হলো:
- অ্যাকর্ডিয়ন কাজ করছে না:
- নিশ্চিত করুন যে সমস্ত বিভাগের জন্য রেডিও বাটনগুলির `name` অ্যাট্রিবিউট একই।
- যাচাই করুন যে `label`-এর `for` অ্যাট্রিবিউট সংশ্লিষ্ট `input`-এর `id`-এর সাথে মেলে।
- আপনার সিএসএস সিলেক্টরে কোনো টাইপো বা ত্রুটি আছে কিনা তা পরীক্ষা করুন।
- কন্টেন্ট প্রথমে লুকানো থাকছে না:
- নিশ্চিত করুন যে `display: none` স্টাইলটি `.accordion-content` ক্লাসে প্রয়োগ করা হয়েছে।
- ট্রানজিশন কাজ করছে না:
- যাচাই করুন যে `transition` প্রোপার্টিটি সঠিক এলিমেন্টে (`.accordion-content`) প্রয়োগ করা হয়েছে।
- নিশ্চিত করুন যে `max-height` প্রাথমিকভাবে `0` এবং রেডিও বাটন চেক করা হলে একটি যথেষ্ট বড় মান সেট করা হয়েছে।
- অ্যাক্সেসিবিলিটি সমস্যা:
- অ্যাকর্ডিয়নটি পরীক্ষা করতে এবং কোনো অ্যাক্সেসিবিলিটি সমস্যা চিহ্নিত করতে একটি স্ক্রিন রিডার ব্যবহার করুন।
- নিশ্চিত করুন যে আরিয়া (ARIA) অ্যাট্রিবিউটগুলি সঠিকভাবে প্রয়োগ করা হয়েছে।
বাস্তব-বিশ্বের উদাহরণ
সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন বিভিন্ন বাস্তব-বিশ্বের পরিস্থিতিতে ব্যবহার করা যেতে পারে:
- প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ) পেজ: প্রায়শই জিজ্ঞাসিত প্রশ্নগুলি একটি সংক্ষিপ্ত এবং সংগঠিত পদ্ধতিতে উপস্থাপন করা।
উদাহরণ: একটি বিশ্ববিদ্যালয় ওয়েবসাইট আন্তর্জাতিক শিক্ষার্থীদের ভর্তির বিষয়ে প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী প্রদর্শনের জন্য একটি অ্যাকর্ডিয়ন ব্যবহার করছে, যেখানে ভিসার প্রয়োজনীয়তা, বিভিন্ন মুদ্রায় টিউশন ফি এবং আবাসন বিকল্পের মতো বিষয়গুলি অন্তর্ভুক্ত রয়েছে।
- পণ্যের বিবরণ: পণ্যের বিবরণ, স্পেসিফিকেশন এবং রিভিউ প্রদর্শন করা।
উদাহরণ: একটি ই-কমার্স ওয়েবসাইট একটি পণ্যের বিভিন্ন দিক, যেমন প্রযুক্তিগত স্পেসিফিকেশন (ভোল্টেজ, মাত্রা), উপাদানের গঠন এবং বিশ্বব্যাপী দর্শকদের জন্য উৎপত্তির দেশ দেখানোর জন্য একটি অ্যাকর্ডিয়ন ব্যবহার করছে।
- নেভিগেশন মেনু: জটিল নেভিগেশন কাঠামো সহ ওয়েবসাইটগুলির জন্য প্রসারণযোগ্য মেনু তৈরি করা।
উদাহরণ: একটি জটিল সাংগঠনিক কাঠামো সহ একটি সরকারি ওয়েবসাইট, যেখানে বিভিন্ন পটভূমির নাগরিকদের জন্য বিভাগ এবং পরিষেবাগুলি ভেঙে দেখানোর জন্য অ্যাকর্ডিয়ন ব্যবহার করা হয়েছে, যাতে ভাষা বা সরকারের সাথে পরিচিতি নির্বিশেষে কন্টেন্ট সহজে অ্যাক্সেসযোগ্য হয়।
- ফর্ম: দীর্ঘ ফর্মগুলিকে পরিচালনাযোগ্য বিভাগে ভাগ করা।
উদাহরণ: একটি বিশ্বব্যাপী বৃত্তি প্রোগ্রামের জন্য একটি অনলাইন আবেদনপত্র, যেখানে ব্যক্তিগত বিবরণ, শিক্ষাগত ইতিহাস এবং আর্থিক তথ্যের মতো বিভাগগুলিকে আলাদা করতে অ্যাকর্ডিয়ন ব্যবহার করা হয়েছে, যা বিভিন্ন দেশের এবং বিভিন্ন শিক্ষাব্যবস্থার আবেদনকারীদের জন্য ব্যবহারকারীর অভিজ্ঞতা উন্নত করে।
উপসংহার
সিঙ্গেল ডিসক্লোজার কার্যকারিতা সহ সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন আপনার ওয়েবসাইটে ব্যবহারকারীর অভিজ্ঞতা এবং অ্যাক্সেসিবিলিটি বাড়ানোর একটি শক্তিশালী এবং কার্যকর উপায়। সিএসএস সিলেক্টর এবং আরিয়া (ARIA) অ্যাট্রিবিউটগুলির শক্তি ব্যবহার করে, আপনি এমন ইন্টারেক্টিভ উপাদান তৈরি করতে পারেন যা পারফরম্যান্ট, রক্ষণাবেক্ষণযোগ্য এবং বিস্তৃত ব্যবহারকারীদের জন্য অ্যাক্সেসিবল। আপনি একটি সাধারণ প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ) পেজ বা একটি জটিল ওয়েব অ্যাপ্লিকেশন তৈরি করছেন কিনা, সিএসএস-এক্সক্লুসিভ অ্যাকর্ডিয়ন আপনাকে পরিষ্কার এবং আকর্ষণীয়ভাবে তথ্য উপস্থাপন করতে সাহায্য করতে পারে, যা বিশ্বব্যাপী দর্শকদের জন্য একটি ভালো সামগ্রিক ব্যবহারকারীর অভিজ্ঞতায় অবদান রাখে।
আরও শেখার জন্য রিসোর্স
- MDN Web Docs: https://developer.mozilla.org/en-US/docs/Web/CSS
- ARIA Authoring Practices Guide (APG): https://www.w3.org/WAI/ARIA/apg/
- WebAIM: https://webaim.org/