an

Ambulance study to trial lateral flow stroke test

About 200 patients will be recruited to for the two-year trial which uses lateral flow tests.




an

West Midlands postcodes top uninsured drivers list

Parts of Birmingham, Wolverhampton, Walsall and Solihull feature in an annual hotspot list.




an

Christmas is not cancelled, council boss says

Coventry is cutting the amount it spends on Christmas celebrations.




an

Reward of £1,000 for information on wanted man

Ryan Ward, 31, is wanted in connection with incidents of assault and criminal damage.




an

Attempted murder charge after man hurt in shooting

A man in his 20s remains in hospital with serious facial injuries after shots were fired at a park.




an

Three arrests after man assaulted in disorder

Police were called after a witness reported a man being assaulted in Rugby.




an

U-turns and LinkedIn rants plague fire chief search

The latest candidate for the post has withdrawn just days after the appointment was announced.




an

No surgery for Forsyth but injuries not clearing up for Canaries

Norwich midfielder Gabriel Forsyth will not need surgery on a knee injury but will be out for more than a month.




an

McLean given additional ban for abusive language

Norwich City captain Kenny McLean will miss an additional game following his recent sending off against Middlesbrough for bad language towards a match official.




an

Woman drives through crowd at two-minute silence

Witnesses report overhearing the driver say: "I'm more concerned about the living than the dead."




an

Para-standing tennis star celebrates winning year

The world champion Georgia Routledge says she only took up the sport last year.




an

Roblox introduces new safety features, Australia bans Under 16s from social media

Roblox is introducing new safety features for children under the age of 13, following criticism of how it protects younger users. The free online gaming platform, which has around 70 million […]

The post Roblox introduces new safety features, Australia bans Under 16s from social media appeared first on Tech Digest.




an

Interview: Andrew Grill, Author of Digitally Curious

Last week we attended the launch of Andrew Grill’s latest book, Digitally Curious, held in conjunction with SAP Concur at the firm’s London office. In the book, the futurist, speaker, […]

The post Interview: Andrew Grill, Author of Digitally Curious appeared first on Tech Digest.




an

How AI is Transforming User Experience (UX) 

Artificial Intelligence (AI) is changing how user experience design is handled across various industries by playing a vital role in developing tailored and seamless experiences for users. Starting from app […]

The post How AI is Transforming User Experience (UX)  appeared first on Tech Digest.




an

Office updates iOS, Android apps – Windows 10 apps coming soon

Since Microsoft first introduced Office for the iPad last March, it’s been downloaded some 40 million times, even with the restrictions of needing an Office 365 subscription to use it. Today, Microsoft announced that Office will soon be coming to …




an

The Microsoft Work and Play Bundle: good deal if you can get it

Microsoft just went live with what looks to be a pretty good deal it’s calling the “Microsoft Work and Play Bundle“, which includes one year subscriptions to Office 365 Home, Xbox Live Gold, Xbox Music Pass, and Skype …





an

The long, promising (and frustrating) history of Microsoft’s consumer file sync services

Live Drive, SDrive, Project M, Folders, FolderShare, Windows Live Sync, Live Mesh, SkyDrive, OneDrive. Yes, Microsoft has been at this file syncing game for a long time. The company bought FolderShare back in November of 2005, and has been …




an

LiveSide is retiring, thanks for all your support

All good things must come to an end, and this blog is no exception. When Chris Overd, Matthew Weyer, and Harrison Hoffman founded LiveSide.net back in December of 2005 (LiveSide’s first post was on January 3rd, 2006, …




an

The 10 most important things to look for when choosing a music distributor

I’ve been researching the distributor space lately and watching with interest as more pop up and margins get squeezed. It’s got to a place now where you can actually distribute music for free. But what else should you be looking for other than a pipeline? I’ve spoken to a lot of artists and record labels...

Read More




an

Why haven’t Spotify released an offical pre-save tool?

Back in November 2016 Music Ally wrote an article about how Laura Marling fans could pre-save her new album on Spotify. This was the first ever pre-save. This functionality wasn’t (and still isn’t) an official Spotify tool, it was put together by David Emery (who now works at Apple Music) who was VP of global...

Read More




an

No I don’t want to “hop on a call”

If you’re in business of any kind then undoubtedly you will have had the “can we hop on a call” email at some point. It can come in the form of a well meaning friend making an introduction to you on behalf of someone else or it can come straight out of the blue from...

Read More




an

The importance of Spotify save rates and how to get on Discover Weekly

We all know that getting a song added to an editorial or algorithmic playlist on Spotify can help boost streams and lead to more fans discovering your music. It’s well documented that you need to submit your upcoming releases for editorial submission via either Spotify For Artists or Spotify Analytics. But how do you get...

Read More




an

Record labels are still ripping off artists…and getting away with it

A couple of weeks ago I received an email from an A&R person at a global dance music label. It was a pretty standard email along the lines of “hey we like your song, would you be interested in licensing it to us?” which I’ve received before and usually they amount to nothing. This often...

Read More




an

Trump blocked me on Twitter. But for democracy’s sake, we can’t ban him.

Twitter is one of the closest things we have today to a de facto "public space" on the internet.




an

Hello RSS Readers, can you hear me?

I’d like to ask you guys a quick favor. If you use an RSS reader to consume your online content and somehow you still find yourself subscribed to plasticbag.org after many years of abandonment and dereliction, I’d really appreciate it if you can let me know in the comments below if you see this post. […]




an

How to build an investor relations area for your website with HubSpot

“Investors, both individual and professional, want more than just the data that independent services can provide. They want the company’s own story and investment vision. What they don’t want is to wade through complex or irrelevant information.” Investor Relations on Corporate Websites, Nielsen Norman Group

Understand investor jobs-to-be-done

Primary users of investor relations areas on a website include, obviously, investors themselves but also analysts and financial journalists. There is an important secondary audience of potential customers and employees too. But the core audience is generally looking for:

  • Company background and overview
  • Press releases
  • Stock exchange filings
  • One-page financial overview
  • Annual reports
  • Quarterly reports
  • Historical financial information
  • Executive biographies
  • Share price information
  • Press and IR contact details
  • Corporate governance information

Of course, each company will go beyond statutory reporting to add content and user journeys specific to their needs. For example, if they are dealing with specific events in their company history, such as acquisitions, crises or if they are approaching an IPO.

Interestingly, according to NN/Group, some of the fancier functionality that you often see on an IR site, such as webcasts, slides and investment calculators, were less important to real users. “People research company financials are more interested in getting facts quickly than in the technology used to deliver them.”

Best practice examples

GE Aerospace does well with very clear navigation on a fast-loading site that is designed to get people to the information they are looking for quickly.

Microsoft’s IR site clearly surfaces stock price information with a tidy design and recent company news, but we are not fans of carousels as a user interface solution.

In contrast, Alphabet (Google’s parent company) has the leanest, text-only IR page, which, like GE’s, aims to get visitors to key information as quickly as possible. Notably, they offer HTML and PDF versions of key reports, and we think this is good practice. PDFs are not great for usability but have an important role in communicating statutory information in a compliant way, so it’s important to find a user-friendly, SEO-friendly parallel structure to sit alongside them.

Michelmersh combines Microsoft’s visual approach with direct access to the most important information.

Core and optional functionality

We use a tool called Octopus to collaborate with clients to design a website’s information architecture and the high-level structure of individual pages.

For investor relations areas, the following site map templates from NN/Group are good starting points for high, medium and low-priority content. But each client is different and so understanding client needs and their users’ needs is always a project in itself.

Don’t forget basic website usability

For more information about how Articulate tackles the website design and development process, including information architecture and user journeys, see How we build websites at Articulate. For the end results, take a look at our Portfolio.

We think all sites - and all visitors - deserve a well-designed, easy-to-use website that helps them find the information they want. In particular, this means that IR areas need to be:

  • Mobile-friendly. The widespread use of PDFs makes many IR sites difficult to use on mobile devices, representing an opportunity for forward-thinking companies to improve the user experience by offering HMTL options.
  • Searchability. IR information should be searchable alongside other site content, either with a domain-specific search box (i.e. just the IR section) or as part of an integrated site-wide search.
  • Accessibility is a basic requirement for a modern website, yet 97 percent of websites have fundamental accessibility issues. Designing for accessibility is good for every visitor. For example, our blog’s speed reading mode and audio player help people engage with our content whether they have specific needs or not. See our article about why accessibility is crucial for website design.
  • Loading speed. Google and GE prioritise loading speed and ‘time to find’ for visitors over fancy imagery and functionality. This is in line with NN/Group’s user study findings. Some clients prefer more fizz and ginger on their IR sites as part of their investor brand, but this should never come at the expense of loading speed. For more on improving Core Web Vitals (as Google calls them) see: Don't lose traffic because of Google’s Core Web Vitals.
  • SEO. Investors, journalists and advisors, like most of us, use Google to find information. IR areas should get the same SEO attention as the rest of the site. For more on our approach to SEO see: The ultimate SEO guide for B2B technology companies.
  • PDFs vs. web pages. IR pages are loaded with PDFs for annual reports, statutory filings, and other important documents. It may be the case that these files have to be in PDF format—we’re not lawyers, so we can’t say for certain—but we think it would be valuable, as with Google, not to also make them available as web pages, even if it is a high-level summary page with a link to the downloadable PDF. There are strong usability reasons to avoid PDF files if at all possible.
  • Carousels. We strongly recommend against Carousels. Buy us a pint, and we’ll bore for England about why.
  • Use of videos, webcasts and podcasts. IR pages often feature investor briefings and other content in video format. This should never be a substitute for clear, scannable, searchable text. Where possible, provide transcripts or summaries. Where possible, provide short (<4 minutes) highlight reels as well as longer content. Videos should have captions and chapter headings so that people can find what they need quickly. Never autoplay videos.

Examples of investor-specific functionality

Company overview

“Offer a brief company overview that highlights a few significant facts, along with a link to more detailed corporate information.” For example, Causeway’s website has this succinct summary right on its homepage as well as more detailed information in a ‘Why us’ section.

Biographies

“Provide information about the company’s high-level managers, including each person’s name and job title, a recent picture, and a link to a full biography,” advises The Nielsen Norman Group. For example, HealthHero has a really easy-to-use, highly visual, and on-brand biographies section on its About Us page.

Press information

Journalists don’t just need press information, they need relevant, high-resolution images, logos, PR contacts and company information.

Press releases

Your news page should look like high-end news site or blog with all the support infrastructure such as the ability to sign up for alerts, search for specific information, filter and sort the information, as on this example from TCN.

ESG reports. Your investor brand goes beyond statutory reporting. Increasingly, environmental, social and governance information influences investment decisions and build investor confidence. HPE does a great job of communicating its progress in this area, and, ahem, we think our own Impact Report is pretty good, too. (Related to this, see our guide to establishing a strong ESG tone of voice.)

Security, availability, access controls and approvals

  • Security and access control. IR areas often include market-sensitive information such as earnings announcements or new product introductions. For this reason (and others), it is important that any content management system (CMS) used for IR pages should have robust security and access controls, meaning that only authorised users can add or modify IR pages. We recommend HubSpot Content Hub which has granular user permissions, access control to specific assets (e.g. individual web pages) and (with an Enterprise tier) SSO integration and role-based permissions.
  • Content approvals. HubSpot also has the option to require approvals before website changes are published. This may be valuable to ensure that legally responsible people, e.g. directors, have a final review and approval of statutory updates to the site, even if they delegate the content creation to others.
  • Scheduling for publication. With time-sensitive and embargoed information, it is important to be able to set a specific publication time and date for content so that you can prepare the pages in advance but make sure they are published at the right time. With HubSpot, this is possible for pages and blog/new posts.

How Articulate can help

We design and code signature websites using our proprietary Nucleus technology, which are hosted on HubSpot Content Hub (CMS). See our website services page for more information.

Brochure websites are old-school. Instead, our team will build you a marketing engine that drives traffic, leads and customers, all while telling your brand story.

If you’d like an SEO, usability, or content review of your investor relations website or if you’d like us to help build a new one, please get in touch.




an

Avoiding the conversion cliff-edge: How SLAs support a successful lead handover

Service Level Agreements are the secret sauce for ensuring marketing and sales are singing from the same song sheet. Qualifying inbound leads is an exercise in cooperation between departments.




an

Why customers buy again: 3 winning tactics for upsell and cross-sell

Customers are some of your best leads. According to a 2022 HubSpot Blog survey of more than 500 sales professionals, more than 70 percent said that upsell and cross-sell drives up to 30 percent of their revenue.




an

The ultimate guide for using behavioural analytics and A/B testing to optimise website conversions

Content may be king, but data sits behind the throne and has the king’s ear. 

You want to be informed by data before you make changes to your marketing strategies. This is never truer than in the case of your website, which is a rich source of behavioural analytics and, therefore, a valuable insight into your audience’s interests.




an

Using personalisation and segmentation to support advanced marketing techniques

Advanced marketing techniques such as Account-based Marketing (ABM) and 1-1 marketing require a more individualised approach than traditional inbound marketing tactics. No longer can we paint with a broad brush, as marketers. We must find ways to speak directly with individuals, rather than an audience.




an

Want to write well? Open with a punch, close with a kick

There are two words that every writer needs to know if they're going to learn how to write well: lede and kicker. Most writers will be familiar with these, but in case the terms are new to you, let’s define them.




an

How to use networking and customer advocacy to build your brand community

Personalisation in marketing works because personal connections matter. That extends beyond your customers, too. Personal connections include the relationships you have with your suppliers, your stakeholders, your employees, industry peers… the list goes on.




an

Use of ch unit considered inappropriate (in certain circumstances)

Update: The title of this post was originally a knowing nod to the considered harmful cliché. I thought it might be amusing and get a bit of attention. However it was brought to my attention by a few people I respect that the title as written might be harmful in itself, so I changed it. However I believe that the subtle point I’m trying to make still stands:

When did we start using the ch unit to specify the maximum length for a line of text? Many places you look nowadays you'll see a variation on:

.prose {
  max-inline-size: 60ch;
}

Is it because of a direct reading of Bringhurst and people (like me) who’ve quoted him:

Anything from 45 to 75 characters is widely regarded as a satisfactory length of line for a single-column page set in a serifed text face in a text size. The 66-character line (counting both letters and spaces) is widely regarded as ideal. For multiple column work, a better average is 40 to 50 characters.

I get it: there’s all that talk of ’characters’. But that’s not what Bringhurst means literally. I’ll come back to that shortly.

Firstly let’s remind ourselves about the CSS ch unit. While ch sounds like it should equate to a number of characters or a character width, that’s not strictly the case. The ch unit specifically refers to the width of the zero ’0’ character within the selected font, or 0.5em if no ’0’ is present. So unless you have a line made up entirely of zeroes, or are using a monospaced font, a width of 66ch will probably not give you a line containing 66 characters. What’s more, the rendered width of that line will vary with the font design, sometimes significantly.

Two text blocks are set to 34 ch wide, but the use of a condensed font (top) and an expanded font (bottom) makes the rendered width narrower and wider respectively.

The important part of Bringhurst’s guideline is not the ’66-characters’ but the ’satisfactory length’. This is about readability, and readability is affected by the length of a line more so than the number of characters in it.

A consistent finding is that long line lengths on screen are least preferred or judged as least easy to read [my emphasis]

With that in mind, restricting your line length using rem would be a far more appropriate unit to use:

.prose {
  max-inline-size: 30rem;
}

This would give you a line length accessibly tied to text size, but independent of font design.

But is using ch harmful?

Bringhurst’s guideline includes this little caveat: a page set in a serifed text face in a text size. This enables him to equate the number of characters in a line with its length. So if you are using a fairly standard typeface for your text then you’ll probably be fine. However that ’standard typeface’ assumption is implicit anytime you use ch to set the width of a column of text. Using rem removes that assumption and gives you what you are probably really after – a consistent, predictable limit on line length.

It didn’t surprise me to find that Eric Meyer had written about this six years ago. I’ll leave you with an important observation from his post:

If you’re working with multiple typefaces, say one for headlines and another for body copy, be careful about setting ch measures and thinking they’ll be equivalent between the two fonts. The odds are very, very high they won’t be.

So is using ch harmful? At the risk of saying it depends, it might not be harmful, but it could be, and there is a far more reliable and appropriate unit to use by way of the rem when it comes to limiting line length in a column of text.

Read or add comments




an

Introducing TODS – a typographic and OpenType default stylesheet

Introducing TODS, an open source typography and opentype default stylesheet. One of the great things about going to conferences is the way it can spark an idea and kick start something. This project was initiated following a conversation with Roel Nieskens (of Wakamai Fondue fame) at CSS Day, where he demonstrated his Mildly Opinionated Prose Styles (MOPS).

The idea is to set sensible typographic defaults for use on prose (a column of text), making particular use of the font features provided by OpenType. The main principle is that it can be used as starting point for all projects, so doesn’t include design-specific aspects such as font choice, type scale or layout (including how you might like to set the line-length).

Within the styles is mildly opinionated best practice, which will help set suitable styles should you forget. This means you can also use the style sheet as a checklist, even if you don't want to implement it as-is.

TODS uses OpenType features extensively and variable font axes where available. It makes full use of the cascade to set sensible defaults high up, with overrides applied further down. It also contains some handy utility classes.

You can apply the TODS.css stylesheet in its entirety, as its full functionality relies on progressive enhancement within both browsers and fonts. Anything that is not supported will safely be ignored. The only possible exceptions to this are sub/superscripts and application of a grade axis in dark mode, as these are font-specific and could behave unexpectedly depending on the capability of the font.

In order to preview some of the TODS features, you can check out the preview page tods.html and toggle TODS.css on and off. (This needs more work as the text is a bit of a mish-mash of examples and instructions, and it's missing some of the utility classes and dark mode. But that’s what open source is for… feel free to fork, improve and add back into the repo.)

Walkthrough of the TODS.css stylesheet

You can download a latest version of the stylesheet from the TODS Github repo (meaning some of the code may have changed a bit).

Table of contents:

  1. Reset
  2. Web fonts
  3. Global defaults
  4. Block spacing
  5. Opentype utility classes
  6. Generic help classes
  7. Prose styling defaults
  8. Headings
  9. Superscripts and subscripts
  10. Tables and numbers
  11. Quotes
  12. Hyphenation
  13. Dark mode/inverted text

1. Reset

Based on Andy Bell’s more modern CSS reset. Only the typographic rules in his reset are used here. You might like to apply the other rules too.

html {
  -moz-text-size-adjust: none;
  -webkit-text-size-adjust: none;
  text-size-adjust: none;
}

Prevent font size inflation when rotating from portrait to landscape. The best explainer for this is by Kilian. He also explains why we still need those ugly prefixes too.

body, h1, h2, h3, h4, h5, h6, address, p, hr, pre, blockquote, ol, ul, li, dl, dt, dd, figure, figcaption, div, table, caption, form, fieldset {
  margin: 0;
}

Remove default margins in favour of better control in authored CSS.

input,
button,
textarea,
select {
  font-family: inherit;
  font-size: inherit;
}

Inherit fonts for inputs and buttons.

2. Web fonts

Use modern variable font syntax so that only supporting browsers get the variable font. Others will get generic fallbacks.

@font-face {
  font-family: 'Literata';
  src: url('/fonts/Literata-var.woff2') format('woff2') tech(variations),
       url('/fonts/Literata-var.woff2') format('woff2-variations');
  font-weight: 1 1000;
  font-stretch: 50% 200%;
  font-style: normal;
  font-display: fallback;
}

Include full possible weight range to avoid unintended synthesis of variable fonts with a weight axis. Same applies to stretch range for variable fonts with a width axis.

For main body fonts, use fallback for how the browser should behave while the webfont is loading. This gives the font an extremely small block period and a short swap period, providing the best chance for text to render.

@font-face {
  font-family: 'Literata';
  src: url('/fonts/Literata-Italic-var.woff2') format('woff2') tech(variations),
       url('/fonts/Literata-Italic-var.woff2') format('woff2-variations');
  font-weight: 1 1000;
  font-stretch: 50% 200%;
  font-style: italic;
  font-display: swap;
}

For italics use swap for an extremely small block period and an infinite swap period. This means italics can be synthesised and swapped in once loaded.

@font-face {
  font-family: 'Plex Sans';
  src: url('/fonts/Plex-Sans-var.woff2') format('woff2') tech(variations),
       url('/fonts/Plex-Sans-var.woff2') format('woff2-variations');
  font-weight: 1 1000;
  font-stretch: 50% 200%;
  font-style: normal;
  font-display: fallback;
  size-adjust:105%; /* make monospace fonts slightly bigger to match body text. Adjust to suit – you might need to make them smaller */
}

When monospace fonts are used inline with text fonts, they often need tweaking to appear balanced in terms of size. Use size-adjust to do this without affecting reported font size and associated units such as em.

3. Global defaults

Set some sensible defaults that can be used throughout the whole web page. Override these where you need to through the magic of the cascade.

body {
    line-height: 1.5;
    text-decoration-skip-ink: auto;
    font-optical-sizing: auto;
    font-variant-ligatures: common-ligatures no-discretionary-ligatures no-historical-ligatures contextual;
    font-kerning: normal;
}

Set a nice legible line height that gets inherited. The font- properties are set to default CSS and OpenType settings, however they are still worth setting specifically just in case.

button, input, label { 
  line-height: 1.1; 
}

Set shorter line heights on interactive elements. We’ll do the same for headings later on.

4. Block spacing

Reinstate block margins we removed in the reset section. We’re setting consistent spacing based on font size on primary elements within ‘flow’ contexts. The entire ‘prose’ area is a flow context, but so might other parts of the page. For more details on the ‘flow’ utility see Andy Bell’s favourite three lines of CSS.

.flow > * + * {
  margin-block-start: var(--flow-space, 1em);
}

Rule says that every direct sibling child element of .flow has margin-block-start added to it. The > combinator is added to prevent margins being added recursively.

.prose {
  --flow-space: 1.5em;
}

Set generous spacing between primary block elements (in this case it’s the same as the line height). You could also choose a value from a fluid spacing scale, if you are going down the fluid typography route (recommended, but your milage may vary). See Utopia.fyi for more details and a fluid type tool.

5. OpenType utility classes

.dlig { font-variant-ligatures: discretionary-ligatures; }
.hlig { font-variant-ligatures: historical-ligatures; }
.dlig.hlig { font-variant-ligatures: discretionary-ligatures historical-ligatures; } /* Apply both historic and discretionary */

.pnum { font-variant-numeric: proportional-nums; }
.tnum { font-variant-numeric: tabular-nums;    }
.lnum { font-variant-numeric: lining-nums; }
.onum { font-variant-numeric: oldstyle-nums; }
.zero { font-variant-numeric: slashed-zero;    }
.pnum.zero { font-variant-numeric: proportional-nums slashed-zero; } /* Apply slashed zeroes to proportional numerals */
.tnum.zero { font-variant-numeric: tabular-nums slashed-zero; }
.lnum.zero { font-variant-numeric: lining-nums slashed-zero; }
.onum.zero { font-variant-numeric: oldstyle-nums slashed-zero; }
.tnum.lnum.zero { font-variant-numeric: tabular-nums lining-nums slashed-zero; }
.frac { font-variant-numeric: diagonal-fractions; }
.afrc { font-variant-numeric: stacked-fractions; }
.ordn { font-variant-numeric: ordinal; }

.smcp { font-variant-caps: small-caps; }
.c2sc { font-variant-caps: unicase; }
.hist { font-variant-alternates: historical-forms; }

Helper utilities matching on/off Opentype layout features available through high level CSS properties.

@font-feature-values "Fancy Font Name" { /* match font-family webfont name */

    /* All features are font-specific. */
    @styleset { cursive: 1; swoopy: 7 16; }
    @character-variant { ampersand: 1; capital-q: 2; }
    @stylistic { two-story-g: 1; straight-y: 2; }
    @swash { swishy: 1; flowing: 2; wowzers: 3 }
    @ornaments { clover: 1; fleuron: 2; }
    @annotation { circled: 1; boxed: 2; }
}

Other Opentype features can have multiple glyphs, accessible via an index number defined in the font – these will be explained in documentation that came with your font. These vary between fonts, so you need to set up a new @font-font-features rule for each different font, ensuring the font name matches that of the font family. You then give each feature a custom name such as ‘swoopy’. Note that stylesets can be combined, which is why swoopy has a space-separated list of indices 7 16.

/* Stylesets */
.ss01 { font-variant-alternates: styleset(cursive); }
.ss02 { font-variant-alternates: styleset(swoopy); }

/* Character variants */
.cv01 { font-variant-alternates: character-variant(ampersand); }
.cv02 { font-variant-alternates: character-variant(capital-q); }

/* Stylistic alternates */
.salt1 { font-variant-alternates: stylistic(two-story-g); }
.salt2 { font-variant-alternates: stylistic(straight-y); }

/* Swashes */
.swsh1 { font-variant-alternates: swash(swishy); }
.swsh2 { font-variant-alternates: swash(flowing); }

/* Ornaments */
.ornm1 { font-variant-alternates: ornaments(clover); }
.ornm2 { font-variant-alternates: ornaments(fleuron); }

/* Alternative numerals */
.nalt1 { font-variant-alternates: annotation(circled); }
.nalt2 { font-variant-alternates: annotation(boxed); }

Handy utility classes showing how to access the font feature values you set up earlier using the font-variant-alternates property.

:root {
    --opentype-case: "case" off;
    --opentype-sinf: "sinf" off;
}

/* If class is applied, update custom property */
.case {
    --opentype-case: "case" on;
}

.sinf {
    --opentype-sinf: "sinf" on;
}

/* Apply current state of all custom properties, defaulting to off */
* { 
    font-feature-settings: var(--opentype-case, "case" off), var(--opentype-sinf, "sinf" off);
}

Set custom properties for OpenType features only available through low level font-feature-settings. We need this approach because font-feature-settings does not inherit in the same way as font-variant. See Roel’s write-up, including how to apply the same methodology to custom variable font axes.

6. Generic helper classes

Some utilities to help ensure best typographic practice.

.centered {
    text-align: center;
    text-wrap: balance;
}

When centring text you’ll almost always want the text to be ‘balanced’, meaning roughly the same number of characters on each line.

.uppercase {
    text-transform: uppercase;
    --opentype-case: "case" on;
}

When fully capitalising text, ensure punctuation designed to be used within caps is turned on where available, using the Opentype ‘case’ feature.

.smallcaps {
    font-variant-caps: all-small-caps;
    font-variant-numeric: oldstyle-nums;    
}

Transform both upper and lowercase letters to small caps, and use old style-numerals within runs of small caps so they match size-wise.

7. Prose styling defaults

Assign a .prose class to your running text, that is to say an entire piece of prose such as the full text of an article or blog post.

.prose {
    text-wrap: pretty;
    font-variant-numeric: oldstyle-nums proportional-nums;
    font-size-adjust: 0.507;
}

Firstly we get ourselves better widow/orphan control, aiming for blocks of text to not end with a line containing a word on its own. Also we use proportional old-style numerals in running text.

Also adjust the size of fallback fonts to match the webfont to maintain legibility with fallback fonts and reduce visible reflowing. The font-size-adjust number is the aspect ratio of the webfont, which you can calculate using this tool.

strong, b, th { 
    font-weight: bold;
    font-size-adjust: 0.514; 
}

Apply a different adjustment to elements which are typically emboldened by default, as bold weights often have a different aspect ratio – check for the different weights you may be using, including numeric semi-bolds (eg. 650). Headings are dealt with separately as the aspect ratio may be affected by optical sizing.

8. Headings

h1, h2, h3, h4 { 
    line-height: 1.1; 
    font-size-adjust: 0.514;
    font-variant-numeric: lining-nums; }

Set shorter line heights on your main headings. Set an aspect ratio for fallback fonts – check for different weights of headings. Use lining numerals in headings, especially when using Title Case.

h1 {
    font-variant-ligatures: discretionary-ligatures; 
    font-size-adjust: 0.521;
}

Turn on fancy ligatures for main headings. If the font has an optical sizing axis, you might need to adjust the aspect ratio accordingly.

h1.uppercase {
    font-variant-caps: titling-caps;
}

When setting a heading in all caps, use titling capitals which are specially designed for setting caps at larger sizes.

9. Superscripts and subscripts

Use proper super- and subscript characters. Apply to sub and sup elements as well as utility classes for when semantic sub/superscripts are not required.

@supports ( font-variant-position: sub ) {
    sub, .sub {
        vertical-align: baseline;
        font-size: 100%;
        line-height: inherit;
        font-variant-position: sub;
    }
}

@supports ( font-variant-position: super ) {
    sup, .sup {
        vertical-align: baseline;
        font-size: 100%;
        line-height: inherit;
        font-variant-position: super;
    }
}

If font-variant-position is not specified, browsers will synthesise sub/superscripts, so we need to manually turn off the synthesis. This is the only way to use a font’s proper sub/sup glyphs, however it’s only safe to use this if you know your font has glyphs for all the characters you are sub/superscripting. If the font lacks those characters (most only have sub/superscript numbers, not letters), then only Firefox (correctly) synthesises sup and sub – all other browsers will display normal characters in the regular way as we turned the synthesis off.

.chemical { 
    --opentype-sinf: "sinf" on;
}

For chemical formulae like H2O, use scientific inferiors instead of sub.

10. Tables and numbers

td, math, time[datetime*=":"] {
    font-variant-numeric: tabular-nums lining-nums slashed-zero;    
}

Make sure all numbers in tables are lining tabular numerals, adding slashed zeroes for clarity. This could usefully apply where a time is specifically marked up, as well as in mathematics.

11. Quotes

Use curly quotes and hang punctuation around blockquotes.

:lang(en) > * { quotes: '“' '”' '‘' '’' ; } /* “Generic English ‘style’” */
:lang(en-GB) > * { quotes: '‘' '’' '“' '”'; } /* ‘British “style”’ */
:lang(fr) > * { quotes: '«?0202F' '?0202F»' '“' '”'; } /* « French “style” » */

Set punctuation order for inline quotes. Quotes are language-specific, so set a lang attribute on your HTML element or send the language via a server header. Note the narrow non-breaking spaces encoded in the French example.

q::before { content: open-quote }
q::after  { content: close-quote }

Insert quotes before and after q element content.

.quoted, .quoted q {
    quotes: '“' '”' '‘' '’';
}

Punctuation order for blockquotes, using a utility class to surround with double-quotes.

.quoted p:first-of-type::before {
    content: open-quote;
}
.quoted p:last-of-type::after  {
    content: close-quote;
}

Append quotes to the first and last paragraphs in the blockquote.

.quoted p:first-of-type::before {
    margin-inline-start: -0.87ch; /* Adjust according to font */
}
.quoted p {
    hanging-punctuation: first last;
}
@supports(hanging-punctuation: first last) {
    .quoted p:first-of-type::before {
        margin-inline-start: 0;
    }
}

Hang the punctuation outside of the blockquote. Firstly manually hang punctuation with a negative margin, then remove the manual intervention and use hanging-punctuation if supported.

12. Hyphenation

Turn on hyphenation for prose. Language is required in order for the browser to use the correct hyphenation dictionary.

.prose {
    -webkit-hyphens: auto;
    -webkit-hyphenate-limit-before: 4;
    -webkit-hyphenate-limit-after: 3;
    -webkit-hyphenate-limit-lines: 2;

    hyphens: auto;
    hyphenate-limit-chars: 7 4 3;
    hyphenate-limit-lines: 2;    
    hyphenate-limit-zone: 8%;
    hyphenate-limit-last: always;
}

Include additional refinements to hyphenation. Respectively, these stop short words being hyphenated, prevent ladders of hyphens, and reduce overall hyphenation a bit. Safari uses legacy properties to achieve some of the same effects, hence the ugly prefixes and slightly different syntax.

.prose pre, .prose code, .prose var, .prose samp, .prose kbd,
.prose h1, .prose h2, .prose h3, .prose h4, .prose h5, .prose h6 {
    -webkit-hyphens: manual;
    hyphens: manual;
}

Turn hyphens off for monospace and headings.

13. Dark mode/inverted text

Reduce grade if available to prevent bloom of inverted type.

:root {
  --vf-grad: 0;
}

@media (prefers-color-scheme: dark) {
  :root {
    --vf-grad: -50;
  }
}

* {
  font-variation-settings: "GRAD" var(--vf-grad, 0);
}

Not all fonts have a grade (GRAD) axis, and the grade number is font-specific. We’re using the customer property method because font-variation-settings provides low-level control meaning each subsequent use of the property completely overrides prior use – the values are not inherited or combined, unlike with font-variant for example.

There are probably better ways of doing some of these things, and the preview page is rather lacking at the moment. Please let me know on Github, or better still fork it, edit and resubmit.

Read or add comments




an

The problem with superscripts and subscripts

When marking up a web page featuring text that requires superscripts or subscripts, we should use the semantically meaningful <sup> and <sub> elements. Examples include footnote references(1) and simple maths 1210=C12.

When browsers come across <sup> and <sub> elements, their user agent stylesheet usually applies rules like this:

sub { 
  vertical-align: sub;
  font-size: smaller;
  line-height: normal;
}

This makes the text smaller and shifts the baseline up or down. There’s two downsides to this. The first is that the baseline shift usually causes anomalous line spacing, that is to say lines are pushed up or down to make space for the sub- or superscript. Secondly the sub/superscripted characters look slightly off – effectively their font weight has been reduced compared with the surrounding text.

Many OpenType fonts ship with properly designed sub- and superscripts. These are specifically designed for the purpose – the glyphs are already small (no change in font size required), retain a comparable weight and have a different shape compared with regular characters, as befits a thoughtfully shrunk down glyph. Even if these characters are available in the current font, browsers will ignore them and continue to synthesise using CSS properties. There are sensible reasons for this, as we shall see.

It is very easy to get browsers to swap in the OpenType glyphs instead – just use the font-variant-position property. For browsers which support it (all modern ones) you can override the user agent stylesheet and implement font-variant-position as follows:

@supports ( font-variant-position: sub ) {
  sub {
    vertical-align: baseline;
    font-size: 100%;
    line-height: inherit;
    font-variant-position: sub;
  }
}

But there’s a potential problem. What happens if the characters in the text you need to superscript are not all available as OpenType alternates in the current font? According to the CSS Fonts Module Level 4 specification, browsers should synthesise the whole superscript, even if some characters are available as proper superscripts:

Because of the semantic nature of subscripts and superscripts, when the value [of font-variant-position] is either sub or super for a given contiguous run of text, if a variant glyph is not available for all the characters in the run, simulated glyphs should be synthesised for all characters using reduced forms of the glyphs that would be used without this feature applied.

Phew. Job done. You’d have thought. Unfortunately at the time of writing only Firefox supports this behaviour; WebKit and Chromium do not. If the webfont has loaded, the font you are currently reading contains the following superscript alternates: 0123456789(). That is to say no letters or other characters except the numbers 0–9 and a pair of parentheses. Now let’s consider the following markup:

2a<sup>2</sup> a<sup>2a</sup> a<sup>(2)</sup>
a<sup>(2a)</sup> a<sup>[2]</sup>

The superscripts vary, in that some of them contain characters which are all available, and others contain a mixture. The text should render like this:

Screenshot from Firefox 129b/Mac

This is how it renders in the browser you are currently using:

2a2 a2a a(2) a(2a) a[2]
As currently rendered in your browser

The chances are that none of the ‘a’s or square brackets are superscripted at all. I’ve filed this as a bug in Chromium and Webkit. I’ve also asked that font-variant-position be removed from Baseline until these bugs are fixed, as support is evidently incomplete, but also because that lack of support is harmful to the visual semantics, in other words it could change the intention and meaning of the text.

Finally I’ve proposed that full support for font-variant-position is included in Interop 2025. If you want to see this happen give my proposal some love.

Read or add comments




an

Bristol Rovers fans unite to tackle racism in stands

Bristol Rovers boss Matt Taylor says it will be a moment of "togetherness" as fans plan support for players who have suffered racist abuse.




an

Earthy earns maiden England U21 call-up

Bristol City midfielder George Earthy called up to the England Under-21 squad for the first time after a series of withdrawals due to either injury or transitions into the senior squad.




an

‘He said goodbye’ Clevedon woman’s husband in Spain flood

Lara Gilmour describes the moment her husband was trapped in Valencia flooding.




an

Festival worker to become Antarctic postmaster

George Clarke will staff the most southerly post office in the world, living among a penguin colony.




an

Woman, 70, wins triathlon world championship title

Judy Orme won the 2024 World Triathlon Championships in her 70-74 age group category in Spain.




an

Young chess stars hoping to be next grandmasters

There are three chess grandmasters in south west who remain at the top of their game




an

Thurrock plans to sue other councils over finances

The council claims it was given bad advice over solar investments that left it with a £1.5bn debt.




an

Inquiries continue after discovery of human remains

Forensic work is ongoing and police say they are not aware of any suspicious circumstances.




an

Ariana Grande Spotted with Ex, Big Sean

When Ariana Grande wrote “could get it again” next to Big Sean’s picture in her “Thank U, Next” video, she might not have been joking. The two were spotted hanging out yesterday, and maybe they were recording new music, maybe she was bouncing back to that dick, or maybe both. While ex-fiance Pete Davidson has […]

The post Ariana Grande Spotted with Ex, Big Sean appeared first on HecklerSpray.




an

Pete Davidson and Kate Beckinsale are a Legit Thing

While Ariana Grande is maybe fucking Big Sean again, Pete Davidson continues his ascension to legend status by locking down babe of all babes, Kate Beckinsale. It’s one thing to be seen flirting at a Golden Globes after-party or leaving a club at all hours hand-in-hand, it’s a whole other thing to be spotted laying […]

The post Pete Davidson and Kate Beckinsale are a Legit Thing appeared first on HecklerSpray.




an

Blake Lively is Pregnant Again

Damn, look who’s back? After what seemed like a 10 year hiatus, ya girl is back! Yep, that’s right. I’m writing a shitty celebrity gossip blog, and Blake Lively is pregnant again! Some things never change. It seems like every time I turn around Ryan Reynolds has knocked Blake Lively up again. I’m pretty sure […]

The post Blake Lively is Pregnant Again appeared first on HecklerSpray.




an

London's 2024 Christmas Markets And Festive Fairs

Gifts, decorations and festive food.




an

In Pictures: The Lucky Few Who Live In The Barbican

A peek behind the famous concrete walls.