Guides

    Bold 16px body copy is still normal text under WCAG

    Large-text contrast (3:1 AA) starts at 18pt regular or ~14pt bold; 16px bold still has to clear 4.5:1.

    Versely Team5 min read

    Large-text contrast (3:1 AA) starts at 18pt regular or ~14pt bold; 16px bold still has to clear 4.5:1.

    That sentence is the spec, not a design preference. Contrast Checker reports AA and AAA for normal text and for large text from the same pair of hex values. Teams fail the check by sending 16px bold — body copy, a lower third, a caption burn — into the large-text column because the type looks heavy. Weight does not move the class. Size does.

    What WCAG actually calls large text

    WCAG 2 large text is 18pt (24px) regular, or 14pt (approximately 18.67px) bold. Below that floor the stricter pair applies: 4.5:1 for AA, 7:1 for AAA. Large text is allowed 3:1 AA and 4.5:1 AAA. UI components and graphical objects need 3:1 against adjacent colours — a third line on the checker, not a substitute for the type test.

    The checker uses the official ratio (L1 + 0.05) / (L2 + 0.05) with WCAG 2 relative luminance. Linearisation uses the 0.04045 threshold and 2.4 gamma, not the older 0.03928 figure some libraries still ship. Enter a 3-digit or 6-digit hex for foreground and background. Swap the fields if you wired them backwards. The preview block on the page labels the trap in plain type: normal sample at 16px, large sample at 24px, and a bold 16px line that still sits in the normal column.

    16px is 12pt at the usual CSS mapping. Bold 16px is still 12pt. It is not 14pt bold. It is not 18pt regular. Calling it large because Inter ExtraBold looks loud on a laptop is how a pair that reads 3.4:1 “passes” in a review and fails AA on the published file.

    16px bold still has to clear 4.5:1

    A ratio between 3:1 and 4.5:1 is the dangerous band. It lights AA large on the checker and fails AA for normal text. If your overlay is 16px — or 16px and bold — you are in the fail. The badge does not care that the type is heavy. It cares that you have not reached 18pt regular or ~14pt bold.

    That is also why “it looks fine to me” is not evidence. WCAG contrast is a formula on relative luminance, not a perception test. Thin light-grey type on white often looks acceptable to a young eye in a bright room and still fails 4.5:1. The ratio is the spec. Your eye in this room is not.

    Do not:

    • Treat a 3:1 pass as a caption pass because the preset is bold.
    • Average the frame and check “the video.” Local contrast is the only contrast a glyph has.
    • Ask an image model to “make this more accessible.” You will get a new still and no ratio.

    Measure the pair you will actually paint: type hex against card hex, or type hex against the scrim, not against bokeh two frames later.

    Check the pair you will paint, not the frame

    Generated plates change every frame. A pair that passes on a charcoal lower-third still fails if you skip the scrim and sit type on a white product. Check the colours of the overlay, then preview the hold. Timed text overlays are a later burn; they inherit whatever contrast you locked, they do not invent it.

    The checker does not take a screenshot. Two hex fields. If you need a file transform, that is a different free tool. If you need pixels that do not exist, that is a generate and it bills in credits. Contrast arithmetic is not a catalog row.

    When the plate is already locked and the type still fails, the fix is a scrim, a stroke, or a calmer card — not a more expensive video model. Changing Kling for Flux does not move (L1 + 0.05) / (L2 + 0.05).

    Captions inherit the same threshold

    Caption styles are 45 presets (nine groups, five variants). Each preset has a real fontcolor, optional outline, optional background, and a position. None of those fields change WCAG’s size classes. A bold caption at 16px on the burn is still normal text. A 24px regular line can use the large-text thresholds. Outline and a solid bgcolor are how you create a pair worth checking: type against the card, not type against the footage.

    Pick the hex from the preset, or from the font catalog sample if you are choosing a face first, and run those two values through the checker before you export. If the preset is pale type on a busy plate with no fill, you already know the answer: it will fail 4.5:1 on a lot of frames even when it “pops” on your monitor.

    Weight is a style choice. Size is the WCAG class. 16px bold is still normal text. Clear 4.5:1, or make it actually large.

    FAQ

    Does bold 16px ever count as large text?

    No. Large text starts at 18pt (24px) regular or 14pt (~18.67px) bold. 16px is 12pt. Bold does not promote it. The checker’s own preview says so.

    If AA large passes, can I ship body copy?

    Only if the copy is actually large under the spec. A 3:1 pass is the large-text AA line. 16px body copy, bold or not, still needs 4.5:1 for AA.

    Should I check the video frame or the overlay colours?

    The overlay colours. WCAG contrast is two colours. A generated plate is not a colour. Check type against the card or scrim you will paint, then preview the burn.

    Do caption presets get a free pass because they are designed for social?

    No. Caption styles set font, colour, outline, fill, and position. They do not rewrite WCAG. If the burn is 16px, treat it as normal text and clear 4.5:1.