diff --git a/client/src/tokens/colors.stories.tsx b/client/src/tokens/colors.stories.tsx
index e0e76b91d7..dc4462ac8c 100644
--- a/client/src/tokens/colors.stories.tsx
+++ b/client/src/tokens/colors.stories.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import colors, { Hues, Shade } from './colors';
const description = `
-Wagtail’s color palette is structured as design tokens, available as CSS classes.
+Wagtail’s typographic styles are made available as separate design tokens, but in most scenarios it’s better to use one of the predefined text styles.
`;
interface PaletteProps {
@@ -57,13 +57,21 @@ const Palette = ({ color, hues }: PaletteProps) => (
);
-/**
- * Displays all icons within our sprite.
- */
-const ColorPalette = () => (
+export default {
+ title: 'Foundation / Colors',
+ parameters: {
+ docs: {
+ extractComponentDescription: () => description,
+ },
+ },
+};
+
+export const ColorPalette = () => (
<>
@@ -73,21 +81,3 @@ const ColorPalette = () => (
))}
>
);
-
-export default {
- title: 'Foundation / Colors',
- parameters: {
- docs: {
- extractComponentDescription: () => description,
- },
- },
- // argTypes: {
- // color: {
- // description: 'Only intended for demo purposes',
- // },
- // },
-};
-
-export const AllColors = (args) =>
;
-
-AllColors.args = {};
diff --git a/client/src/tokens/typeScale.js b/client/src/tokens/typeScale.js
deleted file mode 100644
index 6437370d1c..0000000000
--- a/client/src/tokens/typeScale.js
+++ /dev/null
@@ -1,70 +0,0 @@
-// eslint-disable-next-line @typescript-eslint/no-var-requires
-const plugin = require('tailwindcss/plugin');
-
-// TypeScale plugin:
-// This plugin generates component classes using tailwind's configuration for each object inside of the typeScale const.
-// If the tailwind config is using a prefix such as 'w-' this will be included in the compiled css class eg. .w-h1
-module.exports = plugin(({ addComponents, theme }) => {
- const headingBaseStyles = {
- fontWeight: theme('fontWeight.bold'),
- color: theme('colors.primary.DEFAULT'),
- lineHeight: theme('lineHeight.tight'),
- };
-
- const typeScale = {
- '.h1': {
- fontSize: theme('fontSize.30'),
- fontWeight: theme('fontWeight.extrabold'),
- color: theme('colors.primary.DEFAULT'),
- lineHeight: theme('lineHeight.tight'),
- },
- '.h2': {
- fontSize: theme('fontSize.24'),
- ...headingBaseStyles,
- },
- '.h3': {
- fontSize: theme('fontSize.22'),
- ...headingBaseStyles,
- },
- '.h4': {
- fontSize: theme('fontSize.18'),
- ...headingBaseStyles,
- },
- '.label-1': {
- fontSize: theme('fontSize.16'),
- fontWeight: theme('fontWeight.bold'),
- color: theme('colors.primary.DEFAULT'),
- lineHeight: theme('lineHeight.tight'),
- },
- '.label-2': {
- fontSize: theme('fontSize.15'),
- fontWeight: theme('fontWeight.semibold'),
- color: theme('colors.primary.DEFAULT'),
- lineHeight: theme('lineHeight.tight'),
- },
- '.label-3': {
- fontSize: theme('fontSize.14'),
- fontWeight: theme('fontWeight.medium'),
- color: theme('colors.primary.DEFAULT'),
- lineHeight: theme('lineHeight.tight'),
- },
- '.body-text': {
- fontSize: theme('fontSize.16'),
- fontWeight: theme('fontWeight.normal'),
- lineHeight: theme('lineHeight.normal'),
- },
- '.body-text-large': {
- fontSize: theme('fontSize.18'),
- fontWeight: theme('fontWeight.normal'),
- lineHeight: theme('lineHeight.normal'),
- },
- '.help-text': {
- fontSize: theme('fontSize.14'),
- fontWeight: theme('fontWeight.normal'),
- color: theme('colors.grey.400'),
- lineHeight: theme('lineHeight.tight'),
- },
- };
-
- addComponents(typeScale);
-});
diff --git a/client/src/tokens/typography.js b/client/src/tokens/typography.js
index 566416c858..c02afbcde9 100644
--- a/client/src/tokens/typography.js
+++ b/client/src/tokens/typography.js
@@ -86,6 +86,71 @@ const lineHeight = {
normal: '1.5',
};
+const headingBaseStyles = {
+ fontWeight: 'fontWeight.bold',
+ color: 'colors.primary.DEFAULT',
+ lineHeight: 'lineHeight.tight',
+};
+
+/**
+ * Wagtail’s type scale styles, written with Tailwind theme function values,
+ * but in vanilla JS so the type scale can be reused outside of Tailwind.
+ */
+const typeScale = {
+ 'w-h1': {
+ fontSize: 'fontSize.30',
+ fontWeight: 'fontWeight.extrabold',
+ color: 'colors.primary.DEFAULT',
+ lineHeight: 'lineHeight.tight',
+ },
+ 'w-h2': {
+ fontSize: 'fontSize.24',
+ ...headingBaseStyles,
+ },
+ 'w-h3': {
+ fontSize: 'fontSize.22',
+ ...headingBaseStyles,
+ },
+ 'w-h4': {
+ fontSize: 'fontSize.18',
+ ...headingBaseStyles,
+ },
+ 'w-label-1': {
+ fontSize: 'fontSize.16',
+ fontWeight: 'fontWeight.bold',
+ color: 'colors.primary.DEFAULT',
+ lineHeight: 'lineHeight.tight',
+ },
+ 'w-label-2': {
+ fontSize: 'fontSize.15',
+ fontWeight: 'fontWeight.semibold',
+ color: 'colors.primary.DEFAULT',
+ lineHeight: 'lineHeight.tight',
+ },
+ 'w-label-3': {
+ fontSize: 'fontSize.14',
+ fontWeight: 'fontWeight.medium',
+ color: 'colors.primary.DEFAULT',
+ lineHeight: 'lineHeight.tight',
+ },
+ 'w-body-text': {
+ fontSize: 'fontSize.16',
+ fontWeight: 'fontWeight.normal',
+ lineHeight: 'lineHeight.normal',
+ },
+ 'w-body-text-large': {
+ fontSize: 'fontSize.18',
+ fontWeight: 'fontWeight.normal',
+ lineHeight: 'lineHeight.normal',
+ },
+ 'w-help-text': {
+ fontSize: 'fontSize.14',
+ fontWeight: 'fontWeight.normal',
+ color: 'colors.grey.400',
+ lineHeight: 'lineHeight.tight',
+ },
+};
+
module.exports = {
systemUIFontStack,
monoFontStack,
@@ -94,4 +159,5 @@ module.exports = {
fontWeight,
letterSpacing,
lineHeight,
+ typeScale,
};
diff --git a/client/src/tokens/typography.stories.tsx b/client/src/tokens/typography.stories.tsx
new file mode 100644
index 0000000000..0f347cccab
--- /dev/null
+++ b/client/src/tokens/typography.stories.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import { fontFamily, typeScale } from './typography';
+
+const description = `
+Wagtail’s color palette is structured as design tokens, available as CSS classes.
+`;
+
+export default {
+ title: 'Foundation / Typography',
+ parameters: {
+ docs: {
+ extractComponentDescription: () => description,
+ },
+ },
+};
+
+export const FontFamilies = () => (
+
+
Wagtail’s brand font is a system font stack:
+
{fontFamily.sans.join(', ')}
+
+);
+
+export const TypeScale = () => (
+
+ All text styles
+
+
+ Style |
+ Class |
+
+
+
+ {Object.keys(typeScale).map((textStyle) => (
+
+
+
+ {textStyle.replace('w-', '')}
+
+ |
+
+ {`.${textStyle}`}
+ |
+
+ ))}
+
+
+);
diff --git a/client/tailwind.config.js b/client/tailwind.config.js
index c0847c7437..e96739e04c 100644
--- a/client/tailwind.config.js
+++ b/client/tailwind.config.js
@@ -10,6 +10,7 @@ const {
fontWeight,
letterSpacing,
lineHeight,
+ typeScale,
} = require('./src/tokens/typography');
const { breakpoints } = require('./src/tokens/breakpoints');
const {
@@ -22,7 +23,6 @@ const { spacing } = require('./src/tokens/spacing');
/**
* Plugins
*/
-const typeScale = require('./src/tokens/typeScale');
const scrollbarThin = require('./src/plugins/scrollbarThin');
/**
@@ -91,6 +91,20 @@ module.exports = {
plugin(({ addVariant }) => {
addVariant('forced-colors', '@media (forced-colors: active)');
}),
+ /**
+ * TypeScale plugin.
+ * This plugin generates component classes using tailwind's configuration for each object inside of the typeScale const.
+ * If the tailwind config is using a prefix such as 'w-' this will be included in the compiled css class eg. .w-h1
+ */
+ plugin(({ addComponents, theme }) => {
+ const scale = {};
+ Object.entries(typeScale).forEach(([name, styles]) => {
+ scale[`.${name.replace('w-', '')}`] = Object.fromEntries(
+ Object.entries(styles).map(([key, value]) => [key, theme(value)]),
+ );
+ });
+ addComponents(scale);
+ }),
],
corePlugins: {
...vanillaRTL.disabledCorePlugins,
diff --git a/tailwind.config.js b/tailwind.config.js
index ce93c9d105..45473dedaf 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -8,7 +8,7 @@ module.exports = {
content: [
'./wagtail/**/*.{py,html,ts,tsx}',
'./wagtail/**/static_src/**/*.js',
- './client/**/*.{js,ts,tsx}',
+ './client/**/*.{js,ts,tsx,mdx}',
'./docs/**/*.{md,rst}',
],
corePlugins: {