Overview
HTML and CSS are treated as the trivial part of a project, which is exactly why so many sites are slow, inaccessible or subtly broken on real devices. This layer decides how quickly the first screen paints, whether a screen reader can navigate the page, whether the layout survives a 320px phone and a 1440px laptop, and whether Google can understand the content at all.
We write markup by hand. Every element is chosen, and generated div-soup does not reach production.
Semantic structure
Correct elements carry meaning that browsers, assistive technology and search engines all use. A <button> is focusable and keyboard-operable for free; a <div onclick> is not, and every workaround for that is a bug waiting to happen.
- Landmark elements —
header,nav,main,article,aside,footer— so keyboard and screen reader users can jump between regions. - One
h1per page and a heading order that does not skip levels, because heading navigation is how many screen reader users read a page. - Real form elements with associated
<label>s, correcttypeattributes so phones show the right keyboard, andautocompletevalues so browsers can fill fields. - Schema.org structured data in JSON-LD, giving search engines an explicit description of the page rather than a guess.
Accessibility
We build to WCAG 2.2 AA. Beyond being the right thing to do and increasingly a legal requirement, accessible markup is better markup — it is more semantic, more robust and easier to maintain.
- Keyboard operability for every interactive element, with a visible focus indicator that we do not remove.
- Colour contrast checked against AA thresholds at design time, not patched afterwards.
- Meaningful
alttext, and emptyalton decorative images so screen readers skip them. - ARIA used only where native HTML cannot express the pattern — incorrect ARIA is worse than none.
- Respect for
prefers-reduced-motion, because animation causes genuine discomfort for some users. - Testing with a real screen reader and keyboard, not only an automated scanner. Automated tools catch roughly a third of real issues.
Modern CSS
CSS has changed enormously, and using it properly removes a great deal of JavaScript that used to be necessary.
- Grid for two-dimensional layout, Flexbox for one — used for what each is actually good at.
- Custom properties for design tokens, so colour, spacing and typography live in one place and theming is a variable change rather than a find-and-replace.
- Container queries, so a component responds to the space it is given instead of to the viewport. This is what finally makes components genuinely reusable.
- Fluid typography with
clamp(), replacing stacks of breakpoint overrides. :has(), logical properties and modern colour functions where browser support allows, with sensible fallbacks where it does not.- Layered, predictable specificity so the stylesheet does not degenerate into
!important.
Performance
The front end is where Core Web Vitals are won or lost.
- LCP: the hero image or heading preloaded and correctly sized, with no render-blocking resource in front of it.
- CLS: explicit width and height on images and embeds, space reserved for anything that loads late, and fonts that do not reflow the page when they swap.
- INP: lean event handlers and no long tasks blocking the main thread on interaction.
- Critical CSS inlined, the rest deferred; unused CSS removed rather than shipped.
- Modern image formats with responsive
srcsetandsizes, so a phone never downloads a 2400px image.
Responsive and cross-browser
We build mobile-first and test on real devices, not just a resized desktop window. That covers current Chrome, Firefox, Safari and Edge, iOS and Android, and the awkward middle sizes — tablets in landscape, small laptops — where layouts most often fail. Touch targets are sized for fingers, and we check that a layout still works at 200% browser zoom.
How we work
- Review the design for accessibility and responsive behaviour before any markup is written — contrast, focus states and how each component reflows.
- Build a component library so spacing, typography and colour stay consistent across the site.
- Validate markup, run automated accessibility checks, then test manually with keyboard and screen reader.
- Measure Core Web Vitals on a throttled mobile connection and fix what the numbers show.
What you get
- Hand-written semantic markup that search engines and assistive technology can both read.
- A WCAG 2.2 AA accessibility pass with the results documented.
- Core Web Vitals within Google's thresholds on mobile.
- A documented component library that keeps future pages consistent.
Accessibility is not a feature you add at the end. It is a property of markup that was written correctly in the first place.
