Added a bunch of stuff for SEO mostly (some other little stuff but most of it is half done at this point)

This commit is contained in:
Alan Bridgeman 2025-07-12 15:29:48 -05:00
parent ab8af728b4
commit 1711658993
15 changed files with 501 additions and 73 deletions

View file

@ -1,6 +1,6 @@
{
"name": "ba-website",
"version": "1.0.27",
"version": "1.0.28",
"description": "The Bridgeman Accessible main website",
"main": "server.js",
"scripts": {

View file

@ -0,0 +1,65 @@
<h1>Our Team</h1>
<p>
Our team is made up of experienced professionals who are passionate about digital accessibility.
Here are a few of our key team members:
</p>
<ul>
<%
people.forEach(
(person) => {
%>
<li>
<div class="side-by-side">
<div class="side-by-side-item" style="padding: 1rem">
<%
if (typeof(person.image) !== 'undefined') {
%>
<img src="img/<%= person.image %>" alt="A photo of <%= person.fname %> <%= person.lname %>">
<%
}
else {
%>
<i class="fa-solid fa-user fa-3x"></i>
<%
}
%>
</div>
<div class="side-by-side-item">
<h3><%= person.fname %> <%= person.lname %></h3>
<p><%= person.position %></p>
<%
if (typeof(person.bio) !== 'undefined') {
%>
<p><%= person.bio %></p>
<%
}
%>
<%
if (typeof(person.website) !== 'undefined') {
%>
<a href="<%= person.website %>"><i class="fa-solid fa-globe"></i> Website</a>
<%
}
%>
<%
if (typeof(person.email) !== 'undefined') {
%>
<a href="mailto:<%= person.email %>"><i class="fa-solid fa-envelope"></i> Email</a>
<%
}
%>
<%
if (typeof(person.phone) !== 'undefined') {
%>
<a href="tel:<%= person.phone %>"><i class="fa-solid fa-phone"></i> Call</a>
<%
}
%>
</div>
</div>
</li>
<%
}
);
%>
</ul>

View file

@ -0,0 +1,118 @@
%#
principles.ejs
This template should be included within a main base layout.
It requires FontAwesome Pro to be loaded in the main <head>.
%>
<header class="hero-section">
<div class="hero-content">
<h1 class="fade-in">Built on Principle: Our Technology & Values</h1>
<p class="fade-in" style="animation-delay: 0.2s;">
At Bridgeman Accessible, our commitment to digital inclusion runs deeper than the products you see. For years, we have been meticulously building a digital foundation based on a simple, powerful idea: the best way to serve our community is to build with principle, integrity, and unparalleled expertise.
</p>
</div>
</header>
<section class="page-section experts-section fade-in-section">
<div class="section-container">
<div class="experts-grid">
<div class="experts-text">
<h2>Designed by Experts, For Everyone</h2>
<p>
Our work is a direct reflection of who we are. We are proud that our entire technology team is composed of people with disabilities.
This is not a footnote; it is our <strong>greatest strategic advantage</strong>.
</p>
<p>
Our lived experiences give us an intuitive and profound understanding of accessibility that cannot be learned from a manual.
We build with an unwavering commitment to quality and real-world usability because we are the community we serve.
The result is a platform that is not just compliant, but <strong>authentically and fundamentally accessible</strong> in its very DNA.
</p>
</div>
<div class="experts-image-container"></div>
</div>
</div>
</section>
<section class="page-section key-section fade-in-section">
<div class="section-container">
<div class="section-header">
<h2>A Single, Secure Digital Key</h2>
<p>We believe your digital experience should be seamless and secure. Thats why weve invested heavily in creating a unified account platform that serves as your single key to our entire digital world.</p>
</div>
<div class="key-grid">
<div class="key-item">
<i class="fa-sharp fa-solid fa-key-skeleton fa-3x"></i>
<h3>Simplicity & Convenience</h3>
<p>With one secure login, you can access every tool and service we offer. No more juggling multiple passwords or accounts.</p>
</div>
<div class="key-item">
<i class="fa-sharp fa-solid fa-shield-halved fa-3x"></i>
<h3>Uncompromising Security</h3>
<p>Your trust is our priority. We use the latest industry-standard security protocols to protect your information and ensure your data is safe.</p>
</div>
</div>
</div>
</section>
<section class="page-section sovereignty-section fade-in-section">
<div class="section-container">
<div class="section-header">
<h2>A Foundation of Digital Sovereignty</h2>
<p>We consciously choose a different path from big tech. To guarantee the highest level of security and privacy, we own and operate our own core infrastructure right here in Canada, on our own hardware.</p>
</div>
<div class="sovereignty-grid">
<div class="sovereignty-image-container"></div>
<div class="sovereignty-text">
<ul>
<li>
<i class="fa-sharp fa-solid fa-server"></i>
<div>
<h4>You Control Your Data</h4>
<p>By self-hosting, we offer our clients true data sovereignty. Your data stays here, under the protection of Canadian privacy laws.</p>
</div>
</li>
<li>
<i class="fa-sharp fa-solid fa-lock-keyhole"></i>
<div>
<h4>Enhanced Security</h4>
<p>We have complete control over our technology stack, reducing external dependencies and strengthening our security posture.</p>
</div>
</li>
<li>
<i class="fa-sharp fa-solid fa-hand-holding-heart"></i>
<div>
<h4>Value-Driven Choices</h4>
<p>This approach reflects our commitment to our community and country over pure profit, ensuring our technology aligns with our values.</p>
</div>
</li>
</ul>
</div>
</div>
</div>
</section>
<section class="page-section result-section fade-in-section">
<div class="section-container">
<div class="section-header">
<h2>Excellence You Can Rely On</h2>
<p>Our commitment to building on principle delivers tangible benefits for our clients and community.</p>
</div>
<ul class="result-list">
<li>
<i class="fa-sharp fa-solid fa-circle-check"></i>
<span>Rock-Solid Reliability</span>
</li>
<li>
<i class="fa-sharp fa-solid fa-circle-check"></i>
<span>Agility and Innovation</span>
</li>
<li>
<i class="fa-sharp fa-solid fa-circle-check"></i>
<span>Authentic Partnership</span>
</li>
</ul>
<div class="cta-container">
<a href="/contact" class="cta-button">Partner With Us</a>
</div>
</div>
</section>

View file

@ -49,67 +49,67 @@
</ul>
</section>
<section class="about-team">
<h2>Our Team</h2>
<p>Our team is made up of experienced professionals who are passionate about digital accessibility. Here are a few of our key team members:</p>
<ul>
<%
people.forEach(
(person) => {
%>
<li>
<div class="side-by-side">
<div class="side-by-side-item" style="padding: 1rem">
<%
if (typeof(person.image) !== 'undefined') {
%>
<img src="img/<%= person.image %>" alt="A photo of <%= person.fname %> <%= person.lname %>">
<%
}
else {
%>
<i class="fa-solid fa-user fa-3x"></i>
<%
}
%>
</div>
<div class="side-by-side-item">
<h3><%= person.fname %> <%= person.lname %></h3>
<p><%= person.position %></p>
<%
if (typeof(person.bio) !== 'undefined') {
%>
<p><%= person.bio %></p>
<%
}
%>
<%
if (typeof(person.website) !== 'undefined') {
%>
<a href="<%= person.website %>"><i class="fa-solid fa-globe"></i> Website</a>
<%
}
%>
<%
if (typeof(person.email) !== 'undefined') {
%>
<a href="mailto:<%= person.email %>"><i class="fa-solid fa-envelope"></i> Email</a>
<%
}
%>
<%
if (typeof(person.phone) !== 'undefined') {
%>
<a href="tel:<%= person.phone %>"><i class="fa-solid fa-phone"></i> Call</a>
<%
}
%>
</div>
</div>
</li>
<%
}
);
%>
</ul>
</section>
<%# <section class="about-team"> %>
<%# <h2>Our Team</h2> %>
<%# <p>Our team is made up of experienced professionals who are passionate about digital accessibility. Here are a few of our key team members:</p> %>
<%# <ul> %>
<%# < %>
<%# people.forEach( %>
<%# (person) => { %>
<%# > %>
<%# <li> %>
<%# <div class="side-by-side"> %>
<%# <div class="side-by-side-item" style="padding: 1rem"> %>
<%# < %>
<%# if (typeof(person.image) !== 'undefined') { %>
<%# > %>
<%# <img src="img/<= person.image >" alt="A photo of <= person.fname > <= person.lname >"> %>
<%# < %>
<%# } %>
<%# else { %>
<%# > %>
<%# <i class="fa-solid fa-user fa-3x"></i> %>
<%# < %>
<%# } %>
<%# > %>
<%# </div> %>
<%# <div class="side-by-side-item"> %>
<%# <h3><= person.fname > <= person.lname ></h3> %>
<%# <p><= person.position ></p> %>
<%# < %>
<%# if (typeof(person.bio) !== 'undefined') { %>
<%# > %>
<%# <p><= person.bio ></p> %>
<%# < %>
<%# } %>
<%# > %>
<%# < %>
<%# if (typeof(person.website) !== 'undefined') { %>
<%# > %>
<%# <a href="<= person.website >"><i class="fa-solid fa-globe"></i> Website</a> %>
<%# < %>
<%# } %>
<%# > %>
<%# < %>
<%# if (typeof(person.email) !== 'undefined') { %>
<%# > %>
<%# <a href="mailto:<= person.email >"><i class="fa-solid fa-envelope"></i> Email</a> %>
<%# < %>
<%# } %>
<%# > %>
<%# < %>
<%# if (typeof(person.phone) !== 'undefined') { %>
<%# > %>
<%# <a href="tel:<= person.phone >"><i class="fa-solid fa-phone"></i> Call</a> %>
<%# < %>
<%# } %>
<%# > %>
<%# </div> %>
<%# </div> %>
<%# </li> %>
<%# < %>
<%# } %>
<%# ); %>
<%# > %>
<%# </ul> %>
<%# </section> %>

View file

@ -2,8 +2,8 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="description" content="Bridgeman Accessible Website">
<meta name="keywords" content="digital accessibility, accessible events, accessible websites, accessible documents, Bridgeman Accessible">
<meta name="description" content="<% if(typeof description !== 'undefined') { %><%= description %><% } else { %>Bridgeman Accessible Website<% } %>">
<meta name="keywords" content="<% if(typeof keywords !== 'undefined') { %><%= keywords %><% } else { %>digital accessibility, accessible events, accessible websites, accessible documents, Bridgeman Accessible<% } %>">
<meta name="author" content="Bridgeman Accessible">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= title %> - Bridgeman Accessible</title>

View file

@ -20,11 +20,30 @@
<% } else { %>
<li><a href="products" class="nav-link"><i class="fas fa-laptop-binary"></i> Products</a></li>
<% } %>
<% if (title === 'About') { %>
<li><a href="about" class="nav-link active"><i class="fas fa-info-circle"></i > About Us</a></li>
<% if (title === 'Search Terms') { %>
<li><a href="seo" class="nav-link active"><i class="fas fa-search"></i> Search Terms</a></li>
<% } else { %>
<li><a href="about" class="nav-link"><i class="fas fa-info-circle"></i> About Us</a></li>
<li><a href="seo" class="nav-link"><i class="fas fa-search"></i> Search Terms</a></li>
<% } %>
<li class="dropdown">
<% if (title === 'About') { %>
<a href="about" class="nav-link active"><i class="fas fa-info-circle"></i> About Us</a>
<% } else { %>
<a href="about" class="nav-link"><i class="fas fa-info-circle"></i> About Us</a>
<% } %>
<%# <ul class="dropdown-menu"> %>
<%# < if (title === 'Our Team') { > %>
<%# <li><a href="about/our-team" class="dropdown-link active">Our Team</a></li> %>
<%# < } else { > %>
<%# <li><a href="about/our-team" class="dropdown-link">Our Team</a></li> %>
<%# < } > %>
<%# < if (title === 'Principals') { > %>
<%# <li><a href="about/principals" class="dropdown-link active">Our Principals</a></li> %>
<%# < } else { > %>
<%# <li><a href="about/principals" class="dropdown-link">Our Principals</a></li> %>
<%# < } > %>
<%# </ul> %>
</li>
<% if (title === 'Contact') { %>
<li><a href="contact" class="nav-link active"><i class="fas fa-address-book"></i> Contact Us</a></li>
<% } else { %>

View file

@ -0,0 +1,21 @@
<h1>Accessible Resources Winnipeg</h1>
<p>
At Bridgeman Accessible, we understand that people living with disabilities face unique challenges.
And one of our fundamental goals is to help create and support a more inclusive digital experience for everyone.
</p>
<p>
To that extent, we are based in Winnipeg and are, to the extent possible, willing and open to working with mostly businesses (but some individuals in very specific circumstances) to create and maintain their digital accessibility.
Including helping them find relevant accessibility related resources that exist in the community.
</p>
<p>
As examples, we can help with:
</p>
<ul>
<li>Finding and recommending local resources for accommodation services (ex. sign language interpretation, CART/captioning, etc...)</li>
<li>Connecting with organizations that provide assistive technology</li>
<li>Identifying community groups focused on disability advocacy</li>
</ul>
<p>
Our team is dedicated to fostering an inclusive environment where all individuals can thrive.
If you or someone you know is looking for resources please don't hesitate to <a href="/contact">reach out</a>.
</p>

View file

@ -0,0 +1,22 @@
<h1>Disabled Accommodations Winnipeg</h1>
<p>
At Bridgeman Accessible, we understand that people living with disabilities face unique challenges.
And one of our fundamental goals is to help create and support a more inclusive digital experience for everyone.
</p>
<p>
To that extent, we are based in Winnipeg and are, to the extent possible, willing and open to working with businesses to create and maintain their digital accessibility.
Including helping them put in place and be comfortable with digital accessibility accommodations.
</p>
<p>
As examples, we can help with:
</p>
<ul>
<li>Conducting digital accessibility audits</li>
<li>Providing training on digital accessibility best practices</li>
<li>Assisting with the implementation of accessible design principles</li>
<li>Offering ongoing support and consultation on digital accessibility matters</li>
</ul>
<p>
Our team is dedicated to fostering an inclusive environment where all individuals can thrive.
If you or someone you know requires assistance, please don&apos;t hesitate to <a href="/contact">reach out</a>.
</p>

View file

@ -0,0 +1,42 @@
<h1>Search (SEO) Terms</h1>
<p>
We&apos;ll be completely honest in saying this and the other pages in this section exist purely to help us boost our Advertising (and particularly Google Ads) and Search Engine Optimization (SEO) rankings.
</p>
<p>Here are some of the key terms and phrases we use for advertising on search engines (keep in mind we limit our area based on financial constraints etc...):</p>
<ul>
<li>
<a href="/seo/disabled-accommodations-winnipeg">Disabled Accommodations Winnipeg</a>
</li>
<li>
<a href="/seo/translator-services-winnipeg">Translator Services Winnipeg</a>
</li>
<li>
<a href="/seo/sign-language-translators-winnipeg">Sign Language Translators Winnipeg</a>
</li>
<li>
<a href="/seo/accessible-resources-winnipeg">Accessible Resources Winnipeg</a>
</li>
<li>
<a href="/seo/assistive-tech-winnipeg">Assistive Tech Winnipeg</a>
</li>
</ul>
<p>Additional relevant terms include:</p>
<ul>
<li>Digital Accessibility</li>
<li>Web Accessibility</li>
<li>Inclusive Design</li>
<li>Accessibility Digital Standards</li>
<li>WCAG Compliance</li>
<li>Accessible Web Development</li>
<li>Assistive Technology (sometimes abbreviated a11y)</li>
<li>User Experience (UX)</li>
<li>Digital Inclusion</li>
<li>Accessibility Audits</li>
</ul>
<p>
We think these terms can help us connect with individuals and organizations seeking to improve their digital accessibility practices.
Which is what we&apos;re all about.
</p>
<p>
If you have any questions or suggestions regarding these terms, please feel free to <a href="/contact">contact us</a>.
</p>

View file

@ -0,0 +1,17 @@
<h2>Translator Services Winnipeg</h2>
<p>
Upfront, we <strong>DO NOT</strong> provide direct translation services of any kind.
We do work with translators (specifically sign language translators of different kinds) throughout our work to ensure our content is accessible to all.
And we endeavor to make these interactions as easy as possible using digital tools and resources.
</p>
<p>
But, again, we <strong>DO NOT</strong> provide direct translation services of any kind.
</p>
<p>
To be transparent, we go back-and-forth on whether this is something we should include as a search term.
We do not want to mislead anyone into thinking we provide these services.
But we also recognize that people may search for this more than &quot;niche&quot; things like &quot;digital accessibility support&quot; or similar.
</p>
<p>
If you as a potential customer have any questions or an opinion on this search phrase please feel free to <a href="/contact">contact us</a> and let us know.
</p>

View file

@ -0,0 +1,17 @@
<h2>Translator Services Winnipeg</h2>
<p>
Upfront, we <strong>DO NOT</strong> provide direct translation services of any kind.
We do work with translators (specifically sign language translators of different kinds) throughout our work to ensure our content is accessible to all.
And we endeavor to make these interactions as easy as possible using digital tools and resources.
</p>
<p>
But, again, we <strong>DO NOT</strong> provide direct translation services of any kind.
</p>
<p>
To be transparent, we go back-and-forth on whether this is something we should include as a search term.
We do not want to mislead anyone into thinking we provide these services.
But we also recognize that people may search for this more than &quot;niche&quot; things like &quot;digital accessibility support&quot; or similar.
</p>
<p>
If you as a potential customer have any questions or an opinion on this search phrase please feel free to <a href="/contact">contact us</a> and let us know.
</p>

View file

@ -12,9 +12,17 @@ export class AboutController extends BaseController {
* @param req The request object.
* @param res The response object.
*/
@Page('About', 'about.ejs')
@Page('About Us', 'about.ejs')
@GET('/about')
private about(req: Request, res: Response) {
private aboutPage(req: Request, res: Response) {}
@Page('Our Principals', 'about/principals.ejs')
@GET('/about/principals')
private principalsPage(req: Request, res: Response) {}
@Page('Our Team', 'about/our-team.ejs')
@GET('/about/our-team')
private ourTeamPage(req: Request, res: Response) {
return {
people: [
{
@ -37,7 +45,7 @@ export class AboutController extends BaseController {
{
fname: 'Mohamed',
lname: 'Behi',
position: 'Vice President (Training & Education)',
position: 'Education & Training Consultant',
bio: '' +
'Mohamed is a passionate advocate for disability rights and accessibility. He has been involved in the disability community for many years, working with various organizations to promote inclusion and accessibility. ',
email: 'mohamed@bridgemanaccessible.com',

View file

@ -0,0 +1,72 @@
import { Request, Response } from 'express';
import { Controller, GET, Page, BaseController } from '@BridgemanAccessible/ba-web-framework';
@Controller()
export class SEOController extends BaseController {
@Page('Search Terms', 'seo/index.ejs')
@GET('/seo')
private seoIndex(req: Request, res: Response) {
return {
keywords: ['Bridgeman Accessible', 'SEO', 'Winnipeg', 'disabled accommodations winnipeg', 'translator services winnipeg', 'sign language translators winnipeg', 'accessible resources winnipeg', 'assistive tech winnipeg'].join(', '),
description: 'Bridgeman Accessible SEO terms and pages for better search engine visibility.'
}
}
@Page('Disabled Accommodations Winnipeg', 'seo/disabled-accommodations-winnipeg.ejs')
@GET('/seo/disabled-accommodations-winnipeg')
private disabledAccommodationsWinnipegPage(req: Request, res: Response) {
return {
keywords: ['Bridgeman Accessible', 'SEO', 'Winnipeg', 'disabled accommodations winnipeg'].join(', '),
description: 'Disabled accommodations in Winnipeg are essential for ensuring accessibility and inclusivity. Bridgeman Accessible provides insights and resources on this topic.'
}
}
@Page('Translator Services Winnipeg', 'seo/translator-services-winnipeg.ejs')
@GET('/seo/translator-services-winnipeg')
private translatorServicesWinnipegPage(req: Request, res: Response) {
return {
keywords: ['Bridgeman Accessible', 'SEO', 'Winnipeg', 'translator services winnipeg'].join(', '),
description: 'Translator services in Winnipeg are essential for bridging communication gaps. Bridgeman Accessible provides information on available translation services.'
}
}
@Page('Sign Language Translators Winnipeg', 'seo/sign-language-translators-winnipeg.ejs')
@GET('/seo/sign-language-translators-winnipeg')
private signLanguageTranslatorsWinnipegPage(req: Request, res: Response) {
return {
keywords: ['Bridgeman Accessible', 'SEO', 'Winnipeg', 'sign language translators winnipeg'].join(', '),
description: 'Sign language translators in Winnipeg play a vital role in communication accessibility. Bridgeman Accessible provides information on what sign language translation services it provides.'
}
}
@Page('Accessible Resources Winnipeg', 'seo/accessible-resources-winnipeg.ejs')
@GET('/seo/accessible-resources-winnipeg')
private accessibleResourcesWinnipegPage(req: Request, res: Response) {
return {
keywords: ['Bridgeman Accessible', 'SEO', 'Winnipeg', 'accessible resources winnipeg'].join(', '),
description: 'Accessible resources in Winnipeg are essential for promoting inclusivity. Bridgeman Accessible offers a range of resources to support accessibility initiatives.'
}
}
@Page('Assistive Tech Winnipeg', 'seo/assistive-tech-winnipeg.ejs')
@GET('/seo/assistive-tech-winnipeg')
private assistiveTechWinnipegPage(req: Request, res: Response) {
return {
keywords: ['Bridgeman Accessible', 'SEO', 'Winnipeg', 'assistive tech winnipeg'].join(', '),
description: 'Assistive technology in Winnipeg is crucial for enhancing accessibility. Bridgeman Accessible provides information and resources on assistive tech solutions.'
}
}
@GET('/site-map.xml')
private siteMap(req: Request, res: Response) {
res.type('xml');
res.sendFile('src/static/xml/sitemap.xml', { root: __dirname + '/../..' });
}
@GET('/robots.txt')
private robotsTxt(req: Request, res: Response) {
res.type('text/plain');
res.sendFile('src/static/robots.txt', { root: __dirname + '/../..' });
}
}

0
src/static/robots.txt Normal file
View file

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<sitemap>
<url>
<loc>https://bridgemanaccessible.ca/</loc>
<lastmod>2025-07-12</lastmod>
</url>
<url>
<loc>https://bridgemanaccessible.ca/services</loc>
<lastmod>2025-07-12</lastmod>
</url>
<url>
<loc>https://bridgemanaccessible.ca/products</loc>
<lastmod>2025-07-12</lastmod>
</url>
<url>
<loc>https://bridgemanaccessible.ca/seo</loc>
<lastmod>2025-07-12</lastmod>
</url>
<url>
<loc>https://bridgemanaccessible.ca/about</loc>
<lastmod>2025-07-12</lastmod>
</url>
<url>
<loc>https://bridgemanaccessible.ca/contact</loc>
<lastmod>2025-07-12</lastmod>
</url>
</sitemap>