In everything we do, our goal is simple: Building the best products possible for our customers. That’s why providing an inclusive user experience is a “need to have,” not a “nice to have.” By incorporating best practices for vision, hearing, and motor-impaired audiences, we can ensure the OpenGov Cloud is accessible to a wide range of users.
Our Accessibility Best Practices
Vision: Easy to Read
For people with color blindness or sensitivity to bright colors, OpenGov’s design ensures that the interface is bold, simple, and anchored on a color palette that meets contrast ratio guidelines in accordance with Web Content Accessibility Guidelines (WCAG) AA standards.
Vision: Easy to Read
For people with color blindness or sensitivity to bright colors, OpenGov’s design ensures that the interface is bold, simple, and anchored on a color palette that meets contrast ratio guidelines in accordance with Web Content Accessibility Guidelines (WCAG) AA standards.
Hearing: Easy to Absorb
We ensure design and content in the OpenGov Cloud are concise and translatable by a screen reader. Additionally, responsive sizing and clear headings ensure screen readers can accurately assist users with low vision. And we’re not done yet. We are currently building a library of captions and transcriptions for video content.
Hearing: Easy to Absorb
We ensure design and content in the OpenGov Cloud are concise and translatable by a screen reader. Additionally, responsive sizing and clear headings ensure screen readers can accurately assist users with low vision. And we’re not done yet. We are currently building a library of captions and transcriptions for video content.
Mobility: Easy to Access
Our engineers and product designers ensure users can navigate through the software with their keyboards, efficiently steering to the elements they’d like to select. The surface area of each interactive element is designed to be large enough to tap.
Mobility: Easy to Access
Our engineers and product designers ensure users can navigate through the software with their keyboards, efficiently steering to the elements they’d like to select. The surface area of each interactive element is designed to be large enough to tap.
Cognitive: Easy to Understand
Look familiar? We hope so! Design patterns are repeated so users can easily recognize similar workflows across applications. We partner with our local government customers to ensure that our online forms and webpages are simplified to reduce cognitive load.
Cognitive: Easy to Understand
Look familiar? We hope so! Design patterns are repeated so users can easily recognize similar workflows across applications. We partner with our local government customers to ensure that our online forms and webpages are simplified to reduce cognitive load.
Statement of Conformance
OpenGov is committed to making accessible products that comply with U.S. federal and state accessibility laws. We recognize it is not possible to satisfy all criteria for each type of content. To provide the highest level of access to people of varying abilities, we have implemented the following internal standards:
tag
* ppcUrlCookiePart1 and ppcUrlCookiePart2 must be called — see bottom of script
* Update ppcUrlCookiePart1 and ppcUrlCookiePart2 to match your querystring and form field names
*/
// Leave this as true to always use querystring values if they exist;
// if no querystring, will attempt to get cookie values
var ppcUseLatestValues = true;
// Function to get cookie value
function getCookie(param_name) {
var i, x, y, cookie = document.cookie.split(";");
for (i = 0; i < cookie.length; i++) {
x = cookie[i].substr(0, cookie[i].indexOf("="));
y = cookie[i].substr(cookie[i].indexOf("=") + 1);
x = x.replace(/^\s+|\s+$/g, "");
if (x == param_name) {
return unescape(y);
}
}
}
// Function to create cookie
function setCookie(param_name, value, exdays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value = escape(value) + ((exdays == null) ? "" : "; domain=opengov.com; path=/; expires=" + exdate.toUTCString());
document.cookie = param_name + "=" + c_value;
}
// Function to check if cookie exists and, if not, grab value from URL and store it
function checkCookie(param_name, param_url_name) {
var param_value = getCookie(param_name);
if ((param_value != null && param_value !== "" && param_value !== "undefined") && ppcUseLatestValues === false) {
// cookie exists and we don't want to overwrite
} else {
var pageURL = window.location.search.substring(1);
var URLVariables = pageURL.split('&');
for (var i = 0; i < URLVariables.length; i++) {
var parameterName = URLVariables[i].split('=');
if (parameterName[0] == param_url_name) {
param_value = parameterName[1].split("#")[0];
}
}
if (param_value && param_value !== "undefined") {
setCookie(param_name, param_value, 365);
}
}
}
// Store UTM & gclid cookies from querystring
function ppcUrlCookiePart1() {
var param_names = [
'utm_source;utm_source',
'utm_medium;utm_medium',
'utm_campaign;utm_campaign',
'utm_adgroup;utm_adgroup',
'utm_term;utm_term',
'utm_content;utm_content',
'gclid;gclid' // ✅ Corrected: looks for ?gclid= in URL
];
for (var i = 0; i < param_names.length; i++) {
var param_object = param_names[i].split(";");
checkCookie(param_object[0], param_object[1]);
}
}
// Grab cookie value for form injection
function mGetCookie(param_name) {
return getCookie(param_name);
}
// Fallback for non-Marketo forms (uses getElementsByName)
function mCheckCookie(param_name, param_field_name) {
var param_value = mGetCookie(param_name);
if (param_value != null && param_value !== "" && param_value !== "undefined") {
try {
var obj1 = document.getElementsByName(param_field_name);
obj1[0].value = param_value;
return true;
} catch (err) {
return false;
}
}
return false;
}
// Fallback injection for non-Marketo forms
function ppcUrlCookiePart2() {
var param_names = [
'utm_source;utm_source',
'utm_medium;utm_medium',
'utm_campaign;utm_campaign',
'utm_adgroup;utm_adgroup',
'utm_term;utm_term',
'utm_content;utm_content',
'gclid;Google Click ID'
];
for (var i = 0; i < param_names.length; i++) {
var param_object = param_names[i].split(";");
mCheckCookie(param_object[0], param_object[1]);
}
}
// Helper to get gclid from either cookie or _gcl_aw
function getGclid() {
var direct = getCookie('gclid');
if (direct) return direct;
var gclAw = getCookie('_gcl_aw');
if (!gclAw) return null;
var parts = gclAw.split('.');
return parts.length >= 4 ? parts[3] : null;
}
// 🔒 Always attempt to set cookies if params exist (even if not passed through nav)
ppcUrlCookiePart1();
// ✅ When Marketo form is ready, inject values into correct field names
try {
MktoForms2.whenReady(function (form) {
// Delay slightly in case cookies are still being set
setTimeout(function () {
const formValues = {
'utm_source__c': mGetCookie('utm_source'),
'utm_medium__c': mGetCookie('utm_medium'),
'utm_campaign__c': mGetCookie('utm_campaign'),
'utm_term__c': mGetCookie('utm_term'),
'utm_content__c': mGetCookie('utm_content'),
'Google_Click_ID__c': getGclid()
};
console.log('[Injecting values into Marketo form]', formValues);
form.setValues(formValues);
}, 250); // Delay just in case async scripts slow cookie creation
});
} catch (err) {
// If error on Marketo form, try regular fallback
ppcUrlCookiePart2();
}