Accessibility Audit Report

https://cedarsalt.pages.dev/ · Standard: WCAG 2.1 AA · 6 page(s) · 51 findings
Reviewed and signed by Trupti Patel, Certified Professional in Web Accessibility (CPWA). Verdict: Approve with edits made. Reviewed 2026-07-23. Verify this certification: https://www.credly.com/badges/c1a8ab7e-7be0-45f9-94c6-af4ae960fe2d/
10critical
17serious
23moderate
4minor
PageCriticalSeriousModerateMinor Human review
https://cedarsalt.pages.dev/ 4 6 5 1 0
https://cedarsalt.pages.dev/menu.html 1 0 5 2 0
https://cedarsalt.pages.dev/about.html 0 0 3 0 0
https://cedarsalt.pages.dev/gallery.html 0 0 3 1 0
https://cedarsalt.pages.dev/reservations.html 5 8 1 0 0
https://cedarsalt.pages.dev/contact.html 0 3 6 0 0

https://cedarsalt.pages.dev/

Rendered full-page screenshot of https://cedarsalt.pages.dev/, the visual evidence the findings below refer to
Cedar & Salt | Neighborhood restaurant
4critical
6serious
5moderate
1minor
criticalLink with empty accessible name · WCAG 2.4.4 · ai-judgment
/
Link pointing to href '/' has an empty accessible_name and empty text, aria_label, and title_attr, so its purpose cannot be determined by assistive technology.
Fix: Provide a descriptive accessible name for this link, for example visible text or an aria-label such as 'Cedar & Salt home'.
Also present on 5 other audited page(s): https://cedarsalt.pages.dev/menu.html, https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/gallery.html, https://cedarsalt.pages.dev/reservations.html, https://cedarsalt.pages.dev/contact.html
criticalLink with empty accessible name · WCAG 2.4.4 · ai-judgment
https://instagram.com
Link pointing to 'https://instagram.com' has an empty accessible_name and no text, aria_label, or title_attr, so its purpose is not conveyed.
Fix: Add an accessible name such as an aria-label 'Instagram' or visible text; if it uses an icon image, give that image meaningful alt text.
Also present on 5 other audited page(s): https://cedarsalt.pages.dev/menu.html, https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/gallery.html, https://cedarsalt.pages.dev/reservations.html, https://cedarsalt.pages.dev/contact.html
criticalLink with empty accessible name · WCAG 2.4.4 · ai-judgment
https://facebook.com
Link pointing to 'https://facebook.com' has an empty accessible_name and no text, aria_label, or title_attr, so its purpose is not conveyed.
Fix: Add an accessible name such as an aria-label 'Facebook' or visible text; if it uses an icon image, give that image meaningful alt text.
Also present on 5 other audited page(s): https://cedarsalt.pages.dev/menu.html, https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/gallery.html, https://cedarsalt.pages.dev/reservations.html, https://cedarsalt.pages.dev/contact.html
criticalClickable div for 'Book a table' cannot receive keyboard focus · WCAG 2.1.1 · ai-judgment
<div class="btn" onclick="location.href='reservations.html'">Book a table</div>
The probe lists this element as a mouse_only_candidate: a div with an onclick handler that navigates to reservations.html but has no tabindex and is not keyboard focusable, so keyboard users cannot activate the reservation action.
Fix: Replace the clickable div with a native <a href="reservations.html"> or <button>, or add tabindex="0", role="button", and a keydown handler for Enter and Space so it is reachable and operable by keyboard.
seriousElements must meet minimum color contrast ratio thresholds · WCAG 1.4.3 · axe-core
<div> <strong style="color:#23291f">Cedar &amp; Salt</strong><br> 18 Harborwalk, Port Elm, ME 04011<br> (207) 555-0148 </div>
Fix any of the following: Element has insufficient color contrast of 3.24 (foreground color: #8f8a7e, background color: #fbf8f2, font size: 10.8pt (14.4px), font weight: normal). Expected contrast ratio of 4.5:1
Fix: Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds See https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI
Also present on 5 other audited page(s): https://cedarsalt.pages.dev/menu.html, https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/gallery.html, https://cedarsalt.pages.dev/reservations.html, https://cedarsalt.pages.dev/contact.html
Reviewer note: Measured contrast ratio is 3.2:1
seriousElements must meet minimum color contrast ratio thresholds · WCAG 1.4.3 · axe-core
<div class="wrap demo-note">Cedar &amp; Salt is a fictional restaurant, created as a demonstration website.</div>
Fix any of the following: Element has insufficient color contrast of 2.51 (foreground color: #a49e90, background color: #fbf8f2, font size: 9.6pt (12.8px), font weight: normal). Expected contrast ratio of 4.5:1
Fix: Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds See https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI
Also present on 5 other audited page(s): https://cedarsalt.pages.dev/menu.html, https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/gallery.html, https://cedarsalt.pages.dev/reservations.html, https://cedarsalt.pages.dev/contact.html
Reviewer note: Measured contrast ratio is 2.5:1
seriousText contrast below the WCAG AA minimum · WCAG 1.4.3 · contrast-measure
<p class="eyebrow">Seasonal · Coastal · Wood-fired</p>
Measured against the rendered page, the text colour #c9cfba on its background #647053 gives a contrast ratio of 3.29:1, below the WCAG 2.1 AA minimum of 4.5:1 for normal text (font size 13px). axe-core left this unmeasured because the background is not a single solid colour.
Fix: Raise the contrast to at least 4.5:1 by using a darker background behind the text or a darker text colour; the current ratio is 3.29:1.
Reviewer note: Measured contrast ratio is 3.3:1
seriousText contrast below the WCAG AA minimum · WCAG 1.4.3 · contrast-measure
<p>Cedar &amp; Salt is a neighborhood restaurant on the harbor, cooking what the boats and farms bring in that morning.</p>
Measured against the rendered page, the text colour #dfe3d4 on its background #5d694d gives a contrast ratio of 4.47:1, below the WCAG 2.1 AA minimum of 4.5:1 for normal text (font size 18px). axe-core left this unmeasured because the background is not a single solid colour.
Fix: Raise the contrast to at least 4.5:1 by using a darker background behind the text or a darker text colour; the current ratio is 4.47:1.
Reviewer note: Measured contrast ratio is 4.474:1.
moderateDish image alt is a meaningless filenameseverity lowered from serious to moderate in review · WCAG 1.1.1 · ai-judgment
IMG_4821.svg
The image src 'img/dish-1.svg' has alt="IMG_4821.svg", a camera filename that conveys no information about the dish depicted.
Fix: Replace the filename with alt text describing the dish shown, or set alt="" if the image is purely decorative alongside descriptive text.
Also present on 1 other audited page(s): https://cedarsalt.pages.dev/gallery.html
Reviewer note: Decorative placeholder image, so no information is lost; the only impact is a meaningless filename read aloud as noise, which is moderate not serious. Fix: set alt empty.
moderateDish image alt is a meaningless filenameseverity lowered from serious to moderate in review · WCAG 1.1.1 · ai-judgment
IMG_4822.svg
The image src 'img/dish-2.svg' has alt="IMG_4822.svg", a camera filename that conveys no information about the dish depicted.
Fix: Replace the filename with alt text describing the dish shown, or set alt="" if the image is purely decorative alongside descriptive text.
Also present on 1 other audited page(s): https://cedarsalt.pages.dev/gallery.html
Reviewer note: Decorative placeholder image, so no information is lost; the only impact is a meaningless filename read aloud as noise, which is moderate not serious. Fix: set alt empty.
moderateRoom image alt is a meaningless filenameseverity lowered from serious to moderate in review · WCAG 1.1.1 · ai-judgment
IMG_4823.svg
The image src 'img/room.svg' has alt="IMG_4823.svg", a camera filename that conveys no information about the room or scene depicted.
Fix: Replace the filename with alt text describing the room or scene, or set alt="" if the image is purely decorative alongside descriptive text.
Also present on 1 other audited page(s): https://cedarsalt.pages.dev/gallery.html
Reviewer note: Decorative placeholder image, so no information is lost; the only impact is a meaningless filename read aloud as noise, which is moderate not serious. Fix: set alt empty.
seriousIdentical 'Read more' links point to different destinations · WCAG 2.4.4 · ai-judgment
Read more
Two 'Read more' links point to 'menu.html' and one 'Read more' link points to 'contact.html'. The accessible name 'Read more' does not distinguish these destinations and identical names point to different targets.
Fix: Give each link a unique, descriptive accessible name that conveys its destination, for example 'Read more about our menu' and 'Read more on the contact page', using visible text or aria-label.
seriousNo visible focus indicator on any keyboard tab stop (site-wide outline suppression) · WCAG 2.4.7 · ai-judgment
Menu
All 28 tab stops have both empty outline and empty box_shadow fields, indicating a site-wide outline:none pattern with no focus indicator from either property.
Fix: Provide a visible focus indicator for all focusable elements, for example a :focus-visible outline of at least 2px with sufficient contrast, and never remove it with outline:none unless an equally visible alternative is supplied.
Also present on 5 other audited page(s): https://cedarsalt.pages.dev/menu.html, https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/gallery.html, https://cedarsalt.pages.dev/reservations.html, https://cedarsalt.pages.dev/contact.html
moderateNo skip link to bypass repeated navigation · WCAG 2.4.1 · dom-integrity
The page has a navigation region repeated across the site but no skip link: no in-page link to the main content sits at the top of the tab order. The page exposes a main landmark, which is a recognised bypass technique, but a skip link is the mechanism keyboard and screen reader users reach for first, and without it they are still taken through the whole navigation.
Fix: Add a skip link as the first focusable element, visible on focus and pointing to the main content, for example <a href="#main">Skip to main content</a> with a matching id="main" on the main region.
moderateLogo image has empty alt text · WCAG 1.1.1 · ai-judgment
https://cedarsalt.pages.dev/img/logo.svg
The image src 'img/logo.svg' has alt="" and is not aria-hidden. A site logo typically conveys the brand name and often functions as the home link, so empty alt likely omits meaningful information.
Fix: Add descriptive alt text conveying the brand name, for example alt="Cedar & Salt". If the logo is inside a link to the home page, ensure the accessible name communicates the destination.
Also present on 5 other audited page(s): https://cedarsalt.pages.dev/menu.html, https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/gallery.html, https://cedarsalt.pages.dev/reservations.html, https://cedarsalt.pages.dev/contact.html

https://cedarsalt.pages.dev/menu.html

Rendered full-page screenshot of https://cedarsalt.pages.dev/menu.html, the visual evidence the findings below refer to
Menu | Cedar & Salt
1critical
0serious
5moderate
2minor
moderateNo skip link to bypass repeated navigationalso covers WCAG Site wide issue. (merged duplicate) · WCAG 2.4.1 · dom-integrity
The page has a navigation region repeated across the site but no skip link: no in-page link to the main content sits at the top of the tab order. The page exposes a main landmark, which is a recognised bypass technique, but a skip link is the mechanism keyboard and screen reader users reach for first, and without it they are still taken through the whole navigation.
Fix: Add a skip link as the first focusable element, visible on focus and pointing to the main content, for example <a href="#main">Skip to main content</a> with a matching id="main" on the main region.
criticalMenu icon alt text is the filename/meaningless label 'menu'severity raised from moderate to critical in review · WCAG 1.1.1 · ai-judgment
menu
The image src 'img/menu.svg' has alt="menu", which appears to duplicate the filename rather than describe function. If this is a hamburger navigation toggle, the alt should describe the control's purpose; if purely decorative alongside a text label, it should be empty.
Fix: If the icon is an interactive navigation toggle, provide a functional accessible name such as alt="Open navigation menu". If it accompanies a visible 'Menu' text label, set alt="" to avoid redundancy.
Reviewer note: The entire menu, all items, descriptions and prices, exists only as an image of text with alt "menu", so screen reader users get no access to essential content, which makes this critical.
moderateVisual pseudo-heading 'DINNER' not marked as a heading · WCAG 1.3.1 · ai-judgment
DINNER
The text 'DINNER' is displayed large, centered, and set apart above the menu sections but does not appear in the headings JSON, which only lists the h1 'Menu'. It visually functions as a section heading.
Fix: Mark 'DINNER' as a proper heading element (for example h2) so its structural role is conveyed to assistive technology.
moderateVisual pseudo-heading 'Small Plates' not marked as a heading · WCAG 1.3.1 · ai-judgment
Small Plates
The text 'Small Plates' is styled as a distinct, colored subheading introducing a group of menu items but is not present in the headings JSON.
Fix: Use a heading element (for example h3) for 'Small Plates' to expose the menu section structure programmatically.
moderateVisual pseudo-heading 'Mains' not marked as a heading · WCAG 1.3.1 · ai-judgment
Mains
The text 'Mains' is styled as a distinct, colored subheading introducing a group of menu items but is not present in the headings JSON.
Fix: Use a heading element (for example h3) for 'Mains' to expose the menu section structure programmatically.
moderateVisual pseudo-heading 'Dessert' not marked as a heading · WCAG 1.3.1 · ai-judgment
Dessert
The text 'Dessert' is styled as a distinct, colored subheading introducing a group of menu items but is not present in the headings JSON.
Fix: Use a heading element (for example h3) for 'Dessert' to expose the menu section structure programmatically.
minorInline SVG icon possibly informative but marked decorativealso covers WCAG The accessible name belongs on the wrapping brand link, which is already captured as the empty accessible name finding. WCAG 2.4.4. With a name on the link the empty alt on the image is correct, so no separate image finding is needed. (merged duplicate) · WCAG 1.1.1 · ai-judgment
data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Crect x='2' y='2' width='18' height='18' rx='5' fill='none' stroke='%23b5502e' stroke-width='2'/%3E%3Ccircle cx='11' cy='11' r='4' fill='none' stroke='%23b5502e' stroke-width='2'/%3E%3C/svg%3E
This data-URI SVG (a camera-like icon: rounded rectangle with circle) has alt="" and aria_hidden=false. If it functions as a link to a social/photo destination it carries meaning; if purely decorative accompanying visible text it is acceptable. Uncertain because surrounding context is not provided.
Fix: Confirm whether this icon is a standalone link or button; if so, give it an accessible name describing its destination or action (e.g. alt="Instagram"). If it is adjacent to a visible text label, keep it decorative.
Also present on 2 other audited page(s): https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/contact.html
minorInline SVG icon possibly informative but marked decorativealso covers WCAG The accessible name belongs on the wrapping brand link, which is already captured as the empty accessible name finding. WCAG 2.4.4. With a name on the link the empty alt on the image is correct, so no separate image finding is needed. (merged duplicate) · WCAG 1.1.1 · ai-judgment
data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Cpath d='M13 6h3V2h-3a4 4 0 0 0-4 4v2H6v4h3v8h4v-8h3l1-4h-4V6a1 1 0 0 1 1-1Z' fill='%23b5502e'/%3E%3C/svg%3E
This data-URI SVG appears to be a Facebook 'f' glyph and has alt="" with aria_hidden=false. If it serves as a social media link, it is informative and needs an accessible name. Uncertain because surrounding context is not provided.
Fix: If this icon is a link to Facebook, provide an accessible name such as alt="Facebook" or an aria-label on the link. If a visible text label already names it, keep it decorative.
Also present on 2 other audited page(s): https://cedarsalt.pages.dev/about.html, https://cedarsalt.pages.dev/contact.html

https://cedarsalt.pages.dev/about.html

Rendered full-page screenshot of https://cedarsalt.pages.dev/about.html, the visual evidence the findings below refer to
Our Story | Cedar & Salt
0critical
0serious
3moderate
0minor
moderateNo skip link to bypass repeated navigation · WCAG 2.4.1 · dom-integrity
The page has a navigation region repeated across the site but no skip link: no in-page link to the main content sits at the top of the tab order. The page exposes a main landmark, which is a recognised bypass technique, but a skip link is the mechanism keyboard and screen reader users reach for first, and without it they are still taken through the whole navigation.
Fix: Add a skip link as the first focusable element, visible on focus and pointing to the main content, for example <a href="#main">Skip to main content</a> with a matching id="main" on the main region.
Reviewer note: Site wide issue.
moderateMeaningless alt text 'photo' on room image · WCAG 1.1.1 · ai-judgment
photo
The image room.svg has alt="photo", which is a generic placeholder that describes the file type rather than the content of the image. Screen reader users learn nothing about what the room looks like.
Fix: Replace alt="photo" with a description of the image content (for example alt="Guest room with a made bed and window overlooking the garden"), or set alt="" if the image is purely decorative.
Reviewer note: Decorative placeholder image, so no information is lost; the only impact is a meaningless filename read aloud as noise, which is moderate not serious. Fix: set alt empty.
moderateVisual pseudo-heading not marked up as a heading · WCAG 1.3.1 · ai-judgment
The people
The text 'The people' is styled bold and set apart like the adjacent 'How we started' and 'The room' headings, but it does not appear in the real headings JSON, which lists only 'Our Story', 'How we started', and 'The room'.
Fix: Mark up 'The people' as an h3 element to match the other section headings, so its heading role is exposed to assistive technology.

https://cedarsalt.pages.dev/gallery.html

Rendered full-page screenshot of https://cedarsalt.pages.dev/gallery.html, the visual evidence the findings below refer to
Gallery | Cedar & Salt
0critical
0serious
3moderate
1minor
moderateNo skip link to bypass repeated navigation · WCAG 2.4.1 · dom-integrity
The page has a navigation region repeated across the site but no skip link: no in-page link to the main content sits at the top of the tab order. The page exposes a main landmark, which is a recognised bypass technique, but a skip link is the mechanism keyboard and screen reader users reach for first, and without it they are still taken through the whole navigation.
Fix: Add a skip link as the first focusable element, visible on focus and pointing to the main content, for example <a href="#main">Skip to main content</a> with a matching id="main" on the main region.
Reviewer note: Site wide issue.
moderateVague, non-descriptive alt text on gallery image · WCAG 1.1.1 · ai-judgment
food
The image img/dish-1.svg has alt="food", which is generic and does not describe the specific dish. This is a gallery context where the specific content is informative.
Fix: Replace with alt text describing the specific dish, e.g. its name or key ingredients. Note img/dish-1.svg appears twice with different alt ("IMG_4821.svg" and "food"); ensure consistent, meaningful descriptions.
Reviewer note: Decorative placeholder image, so no information is lost; the only impact is a meaningless filename read aloud as noise, which is moderate not serious. Fix: set alt empty.
moderateVague, non-descriptive alt text on gallery image · WCAG 1.1.1 · ai-judgment
https://cedarsalt.pages.dev/img/dish-3.svg
The image img/dish-3.svg has alt="food", which is generic and does not describe the specific dish. This same source also appears with alt="IMG_4823.svg", showing inconsistent labeling of the same image.
Fix: Replace with alt text describing the specific dish shown, and use a consistent description for the same source image.
Reviewer note: Decorative placeholder image, so no information is lost; the only impact is a meaningless filename read aloud as noise, which is moderate not serious. Fix: set alt empty.
minorRoom image has empty alt and may be informative · WCAG 1.1.1 · ai-judgment
https://cedarsalt.pages.dev/img/room.svg
The image img/room.svg has alt="" and is not aria-hidden. In a gallery context an interior/room photo is likely informative content rather than decoration, so an empty alt may hide meaningful content.
Fix: If the room photo conveys information about the venue, add descriptive alt text, e.g. "Dining room interior at Cedar & Salt". If it is purely decorative, leaving alt empty is fine but confirm this.
Reviewer note: Decorative placeholder image, so no information is lost; the only impact is a meaningless filename read aloud as noise, which is moderate not serious. Fix: set alt empty.

https://cedarsalt.pages.dev/reservations.html

Rendered full-page screenshot of https://cedarsalt.pages.dev/reservations.html, the visual evidence the findings below refer to
Reservations | Cedar & Salt
5critical
8serious
1moderate
0minor
criticalForm elements must have labels · WCAG 4.1.2 · axe-core
<input type="date" name="date" style="">
Fix any of the following: Element does not have an implicit (wrapped) <label> Element does not have an explicit <label> aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute Element has no placeholder attribute Element's default semantics were not overridden with role="none" or role="presentation"
Fix: Ensure every form element has a label See https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI
criticalSelect element must have an accessible name · WCAG 4.1.2 · axe-core
<select name="time" onchange="this.form.submit()"> <option value="">Time</option> <option>5:00 pm</option> <option>6:30 pm</option> <option>8:00 pm</option> </select>
Fix any of the following: Element does not have an implicit (wrapped) <label> Element does not have an explicit <label> aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute Element's default semantics were not overridden with role="none" or role="presentation"
Fix: Ensure select element has an accessible name See https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI
criticalSelect element must have an accessible name · WCAG 4.1.2 · axe-core
<select name="party"> <option value="">Party size</option> <option>2</option><option>3</option><option>4</option> <option>5</option><option>6</option> </select>
Fix any of the following: Element does not have an implicit (wrapped) <label> Element does not have an explicit <label> aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute Element's default semantics were not overridden with role="none" or role="presentation"
Fix: Ensure select element has an accessible name See https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI
criticalDate input has no accessible name · WCAG 3.3.2 · ai-judgment
input type=date has empty accessible_name, label, aria_label, placeholder, and id; the control's purpose (reservation date) is not conveyed to assistive technology.
Fix: Add a <label for> matching the input id (e.g. 'Reservation date') or an aria-label describing the field.
criticalSelect control has no accessible name · WCAG 3.3.2 · ai-judgment
select-one
First select has empty accessible_name, label, aria_label, and id; screen reader users cannot determine what this dropdown selects (likely time or party size).
Fix: Add a <label for> matching the select id or an aria-label describing the choice being made.
seriousRequired fields indicated by colour alone · WCAG 1.4.1 · dom-integrity
The form conveys which fields are required using colour only: the page states 'Fields marked in red are required.', and no field carries a non-colour cue such as an asterisk or the word 'required' in its label. A user who cannot perceive the colour cannot tell which fields are required.
Fix: Add a non-colour cue to each required field in addition to any colour, for example an asterisk with a key or the word 'required' in the label, and set the required or aria-required attribute.
seriousRequired fields are not enforced, so their errors are never identified · WCAG 3.3.1 · dom-integrity
The page states 'Fields marked in red are required.', but the form sets no required or aria-required attribute on any field, validates as complete while empty, and has no error-message region or field error association. Submitting with the required fields blank raises no error that identifies which field is missing or what is wrong.
Fix: Set required (or aria-required) on the fields that must be filled. On an invalid submit, show a text error that names the field and the problem, associate it with the field through aria-describedby, and expose it in an aria-live or role=alert region so it is announced.
seriousText input relies on placeholder as its only label · WCAG 3.3.2 · ai-judgment
Full name
input type=text has no label, no aria-label, and empty id; accessible_name 'Full name' is derived solely from the placeholder, which disappears on input and is not a programmatic label.
Fix: Add a persistent visible <label for> associated with this input via matching id, or an aria-label, in addition to the placeholder.
seriousEmail input relies on placeholder as its only label · WCAG 3.3.2 · ai-judgment
Email
input type=email has empty label and aria_label; accessible_name 'Email' comes only from the placeholder.
Fix: Provide a proper <label for> tied to the input's id, or an aria-label, so the name persists after typing.
Also present on 1 other audited page(s): https://cedarsalt.pages.dev/contact.html
seriousPhone input relies on placeholder as its only label · WCAG 3.3.2 · ai-judgment
Phone
input type=tel has empty label and aria_label; accessible_name 'Phone' is derived only from the placeholder.
Fix: Add a persistent visible label associated by id/for, or an aria-label.
seriousTextarea relies on placeholder as its only label · WCAG 3.3.2 · ai-judgment
Anything we should know? Allergies, a celebration, a preferred table.
textarea has empty label and aria_label; accessible_name is the placeholder text, which disappears on input and is not a programmatic label.
Fix: Add a persistent visible <label for> tied to the textarea id, or an aria-label such as 'Additional notes'.
seriousSelect element auto-submits form on change · WCAG 3.2.2 · ai-judgment
Time 5:00 pm 6:30 pm 8:00 pm
The Time select has an onchange handler that submits the form: <select name="time" onchange="this.form.submit()">. Selecting an option triggers form submission, an unexpected context change. Keyboard users navigating options with arrow keys may submit before choosing their intended value.
Fix: Remove the onchange="this.form.submit()" handler and require the user to activate the Request table button explicitly to submit. If auto-submit is intended, use a dedicated submit control or warn the user in advance of the behavior.
moderateNo skip link to bypass repeated navigation · WCAG 2.4.1 · dom-integrity
The page has a navigation region repeated across the site but no skip link: no in-page link to the main content sits at the top of the tab order. The page exposes a main landmark, which is a recognised bypass technique, but a skip link is the mechanism keyboard and screen reader users reach for first, and without it they are still taken through the whole navigation.
Fix: Add a skip link as the first focusable element, visible on focus and pointing to the main content, for example <a href="#main">Skip to main content</a> with a matching id="main" on the main region.
Reviewer note: Site wide issue.

Human review resolutions

seriousstatus-message-4.1.3 · WCAG 4.1.3
A data-collecting form submits in place (its action is empty or a fragment, so it does not navigate to a confirmation page) and the page has no aria-live, role=status or role=alert region. Confirm on the live site whether the submission outcome (success or an error summary) is announced to a screen reader without moving focus; if it is not, this fails 4.1.3 Status Messages.
Reviewer verdict: confirmed violation. After submitting the reservation form, no success or status message is presented, so users cannot tell whether the request was sent. Confirm whether the form submits at all, since a silent failure is also a functional defect. Fix: Present a confirmation message in a live region (role status) after submission.

https://cedarsalt.pages.dev/contact.html

Rendered full-page screenshot of https://cedarsalt.pages.dev/contact.html, the visual evidence the findings below refer to
Contact | Cedar & Salt
0critical
3serious
6moderate
0minor
seriousText input uses placeholder as its only label · WCAG 3.3.2 · ai-judgment
Name
The text input has label empty, aria_label empty, and placeholder 'Name'; its accessible_name 'Name' is derived solely from the placeholder. Placeholder text disappears on input and is not a reliable label.
Fix: Add a persistent visible <label> associated with the input via for/id (or an aria-label) so the field has a programmatic label independent of the placeholder.
seriousTextarea uses placeholder as its only label · WCAG 3.3.2 · ai-judgment
How can we help?
The textarea has label empty, aria_label empty, and placeholder 'How can we help?'; its accessible_name derives only from the placeholder, which vanishes on input.
Fix: Add a persistent <label> associated with the textarea via for/id (or aria-label) so the label does not rely on the placeholder.
moderateNo skip link to bypass repeated navigation · WCAG 2.4.1 · dom-integrity
The page has a navigation region repeated across the site but no skip link: no in-page link to the main content sits at the top of the tab order. The page exposes a main landmark, which is a recognised bypass technique, but a skip link is the mechanism keyboard and screen reader users reach for first, and without it they are still taken through the whole navigation.
Fix: Add a skip link as the first focusable element, visible on focus and pointing to the main content, for example <a href="#main">Skip to main content</a> with a matching id="main" on the main region.
Reviewer note: Site wide issue
moderateMap image alt text is meaningless · WCAG 1.1.1 · ai-judgment
map
The image at img/map.svg has alt="map", which merely names the image type rather than conveying its information. A map on a contact page typically shows a business location; alt="map" tells a screen reader user nothing about where the location is.
Fix: Replace alt="map" with the location information the map conveys, e.g. alt="Map showing Cedar & Salt at [street address, city]". Alternatively provide the address as adjacent text and mark the map decorative with alt="".
Reviewer note: Decorative placeholder image, so no information is lost; the only impact is a meaningless filename read aloud as noise, which is moderate not serious. Fix: set alt empty.
moderateHours data table lacks header cells · WCAG 1.3.2 · ai-judgment
Tuesday to Thursday 5:00 pm to 9:00 pm Friday and Saturday 5:00 pm to 10:00 pm Sunday 4:00 pm to 9:00 pm Monday Closed
A 4x2 table of days and opening hours has no th cells and no role=presentation. This is data (day/hours pairs), so it needs header cells rather than presentation markup.
Fix: If this is a data table, mark up the day and hours columns with <th scope='col'> or associate row headers so screen reader users can understand the relationship; do not mark it presentation.
moderateVisual pseudo-heading not marked up as heading · WCAG 1.3.1 · ai-judgment
Visit
The text 'Visit' is styled bold and set apart as a section label above the address, but it does not appear in the real headings JSON (only h1 'Contact' and h2 'Send a message' exist).
Fix: Mark 'Visit' up as a real heading element (e.g. h3) or otherwise associate the label with its content programmatically.
moderateVisual pseudo-heading not marked up as heading · WCAG 1.3.1 · ai-judgment
Hours
The text 'Hours' is styled bold and set apart as a section label above the schedule, but it is not present in the real headings JSON.
Fix: Mark 'Hours' up as a real heading element (e.g. h3) to reflect its visual role in the document structure.
moderateVisual pseudo-heading not marked up as heading · WCAG 1.3.1 · ai-judgment
Call
The text 'Call' is styled bold and set apart as a section label above the phone number, but it is not present in the real headings JSON.
Fix: Mark 'Call' up as a real heading element (e.g. h3) to reflect its visual role in the document structure.

Human review resolutions

seriousstatus-message-4.1.3 · WCAG 4.1.3
A data-collecting form submits in place (its action is empty or a fragment, so it does not navigate to a confirmation page) and the page has no aria-live, role=status or role=alert region. Confirm on the live site whether the submission outcome (success or an error summary) is announced to a screen reader without moving focus; if it is not, this fails 4.1.3 Status Messages.
Reviewer verdict: confirmed violation. After submitting the contact form, no success or status message is presented, so users cannot tell whether the request was sent. Confirm whether the form submits at all, since a silent failure is also a functional defect. Fix: Present a confirmation message in a live region (role status) after submission.

Findings added by reviewer

minorInconsistent identification of the Contact link · WCAG WCAG 3.2.4 · https://cedarsalt.pages.dev/
The same Contact destination is labeled "Contact", "Contact Page", and "Contact Page" across pages.
Fix: Use one consistent link label for the Contact destination site wide.
Methodology. This audit combines automated testing (axe-core 4.10, covering the machine-testable subset of WCAG) with AI-assisted evaluation of judgment criteria (text alternatives quality, link purpose, structure and labeling). Automated checks that could not be conclusively decided are listed under "Flagged for human review". All findings and review items were validated by Trupti Patel (CPWA): false-positive check, sampled assistive technology testing, and sign-off. Findings repeated by a shared page template are reported once with the affected pages listed. This report provides an actionable remediation roadmap against WCAG 2.1 AA. It is not legal advice and no audit can guarantee immunity from accessibility claims.