@forumone/create-throughline 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/generator.d.ts +2 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +21 -4
- package/dist/generator.js.map +1 -1
- package/dist/templates/base/apps/web/package.json.template +2 -1
- package/dist/templates/base/apps/web/src/app/api/inngest/route.ts.template +2 -2
- package/dist/templates/base/apps/web/src/payload.config.ts.template +7 -5
- package/dist/templates/base/apps/web/tsconfig.json +2 -1
- package/dist/templates/base/gitignore +15 -0
- package/dist/templates/base/package.json.template +4 -1
- package/dist/templates/base/pnpm-workspace.yaml +1 -0
- package/dist/templates/base/turbo.json +11 -0
- package/dist/templates/with-reference-ds/design-system/.storybook/main.ts +21 -0
- package/dist/templates/with-reference-ds/design-system/.storybook/preview.ts +19 -0
- package/dist/templates/with-reference-ds/design-system/README.md +33 -0
- package/dist/templates/with-reference-ds/design-system/gitignore +5 -0
- package/dist/templates/with-reference-ds/design-system/package.json.template +62 -0
- package/dist/templates/with-reference-ds/design-system/scripts/build-manifest.ts +89 -0
- package/dist/templates/with-reference-ds/design-system/scripts/build-styles.ts +28 -0
- package/dist/templates/with-reference-ds/design-system/scripts/build-tokens-css.ts +43 -0
- package/dist/templates/with-reference-ds/design-system/scripts/validate.ts +58 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.contract.ts +128 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.module.css +83 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.stories.tsx +39 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.test.tsx +27 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.tsx +41 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.contract.ts +122 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.module.css +64 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.stories.tsx +45 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.test.tsx +37 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.tsx +39 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.contract.ts +78 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.module.css +34 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.stories.tsx +36 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.test.tsx +25 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.tsx +19 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.contract.ts +87 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.module.css +18 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.stories.tsx +35 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.test.tsx +20 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.tsx +17 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.contract.ts +104 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.module.css +66 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.stories.tsx +61 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.test.tsx +30 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.tsx +41 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.contract.ts +182 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.module.css +124 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.stories.tsx +58 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.test.tsx +49 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.tsx +67 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.contract.ts +94 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.module.css +49 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.stories.tsx +37 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.test.tsx +35 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.tsx +49 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/index.ts +7 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.contract.ts +107 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.module.css +72 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.stories.tsx +39 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.test.tsx +26 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.tsx +15 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.contract.ts +101 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.module.css +59 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.stories.tsx +44 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.test.tsx +37 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.tsx +40 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.contract.ts +108 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.module.css +36 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.stories.tsx +33 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.test.tsx +28 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.tsx +28 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.contract.ts +76 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.module.css +23 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.stories.tsx +25 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.test.tsx +17 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.tsx +19 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.contract.ts +103 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.module.css +88 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.stories.tsx +44 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.test.tsx +44 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.tsx +39 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/css-modules.d.ts +5 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Colors.stories.tsx +46 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Elevation.stories.tsx +37 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/LayoutContainers.stories.tsx +86 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Radii.stories.tsx +38 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Spacing.stories.tsx +33 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Typography.stories.tsx +55 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/_helpers.tsx +82 -0
- package/dist/templates/with-reference-ds/design-system/src/index.ts +14 -0
- package/dist/templates/with-reference-ds/design-system/src/styles/base.css +55 -0
- package/dist/templates/with-reference-ds/design-system/src/styles/reset.css +48 -0
- package/dist/templates/with-reference-ds/design-system/src/styles/tokens.css +116 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/colors.ts +54 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/index.ts +32 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/layout.ts +26 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/radii.ts +11 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/spacing.ts +26 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/typography.ts +32 -0
- package/dist/templates/with-reference-ds/design-system/tsconfig.json +24 -0
- package/dist/templates/with-reference-ds/design-system/vitest.config.ts +15 -0
- package/dist/templates/with-reference-ds/design-system/vitest.setup.ts +7 -0
- package/dist/templates/without-reference-ds/design-system/.storybook/main.ts +21 -0
- package/dist/templates/without-reference-ds/design-system/.storybook/preview.ts +16 -0
- package/dist/templates/without-reference-ds/design-system/README.md +20 -0
- package/dist/templates/without-reference-ds/design-system/gitignore +5 -0
- package/dist/templates/without-reference-ds/design-system/package.json.template +33 -0
- package/dist/templates/without-reference-ds/design-system/src/foundations/Welcome.stories.tsx +24 -0
- package/dist/templates/without-reference-ds/design-system/src/index.ts +9 -0
- package/dist/templates/without-reference-ds/design-system/tsconfig.json +11 -0
- package/package.json +3 -1
- package/dist/templates/with-reference-ds/packages/design-system/package.json.template +0 -18
- package/dist/templates/with-reference-ds/packages/design-system/src/index.ts +0 -6
- package/dist/templates/with-reference-ds/packages/design-system/src/manifest.ts +0 -6
- package/dist/templates/with-reference-ds/packages/design-system/tsconfig.json +0 -9
- package/dist/templates/without-reference-ds/packages/design-system/README.md +0 -19
- package/dist/templates/without-reference-ds/packages/design-system/package.json.template +0 -14
- package/dist/templates/without-reference-ds/packages/design-system/src/index.ts +0 -8
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { clsx } from 'clsx'
|
|
2
|
+
import styles from './Stats.module.css'
|
|
3
|
+
|
|
4
|
+
export interface StatItem {
|
|
5
|
+
value: string
|
|
6
|
+
label: string
|
|
7
|
+
description?: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface StatsProps {
|
|
11
|
+
eyebrow?: string
|
|
12
|
+
headline?: string
|
|
13
|
+
items: StatItem[]
|
|
14
|
+
className?: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function Stats({ eyebrow, headline, items, className }: StatsProps) {
|
|
18
|
+
return (
|
|
19
|
+
<section className={clsx(styles.stats, className)}>
|
|
20
|
+
<div className={styles.container}>
|
|
21
|
+
{eyebrow ? <p className={styles.eyebrow}>{eyebrow}</p> : null}
|
|
22
|
+
{headline ? <h2 className={styles.headline}>{headline}</h2> : null}
|
|
23
|
+
<dl className={clsx(styles.list, styles[`cols-${items.length}`])}>
|
|
24
|
+
{items.map((item) => (
|
|
25
|
+
<div key={`${item.value}-${item.label}`} className={styles.item}>
|
|
26
|
+
<dt className={styles.value}>{item.value}</dt>
|
|
27
|
+
<dd className={styles.label}>
|
|
28
|
+
<span className={styles.labelText}>{item.label}</span>
|
|
29
|
+
{item.description ? (
|
|
30
|
+
<span className={styles.description}>{item.description}</span>
|
|
31
|
+
) : null}
|
|
32
|
+
</dd>
|
|
33
|
+
</div>
|
|
34
|
+
))}
|
|
35
|
+
</dl>
|
|
36
|
+
</div>
|
|
37
|
+
</section>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
|
+
import { colors } from '../tokens'
|
|
3
|
+
import { FoundationPage } from './_helpers.tsx'
|
|
4
|
+
|
|
5
|
+
const meta: Meta = {
|
|
6
|
+
title: 'Foundations/Colors',
|
|
7
|
+
}
|
|
8
|
+
export default meta
|
|
9
|
+
|
|
10
|
+
function cssVar(name: string): string {
|
|
11
|
+
return `--${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase().replace(/\./g, '-')}`
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const groups = ['neutral', 'brand', 'text', 'bg', 'border', 'state']
|
|
15
|
+
|
|
16
|
+
export const Colors: StoryObj = {
|
|
17
|
+
render: () => (
|
|
18
|
+
<FoundationPage
|
|
19
|
+
title="Colors"
|
|
20
|
+
intro="The palette is grouped by role: neutral ramp, brand accents, text, background, border, and state. Components read these as CSS custom properties so a brand override re-themes everything without touching component code."
|
|
21
|
+
>
|
|
22
|
+
{groups.map((group) => {
|
|
23
|
+
const entries = Object.entries(colors).filter(([k]) => k.startsWith(`color.${group}.`))
|
|
24
|
+
if (entries.length === 0) return null
|
|
25
|
+
return (
|
|
26
|
+
<section key={group} style={{ marginBottom: '2rem' }}>
|
|
27
|
+
<h2 style={{ fontSize: 'var(--font-size-lg)', margin: '0 0 0.75rem', textTransform: 'capitalize' }}>
|
|
28
|
+
{group}
|
|
29
|
+
</h2>
|
|
30
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(9rem, 1fr))', gap: '0.75rem' }}>
|
|
31
|
+
{entries.map(([name, value]) => (
|
|
32
|
+
<div key={name} style={{ border: '1px solid var(--color-border-default)', borderRadius: 'var(--radius-md)', overflow: 'hidden' }}>
|
|
33
|
+
<div style={{ height: '3.5rem', background: value }} />
|
|
34
|
+
<div style={{ padding: '0.5rem' }}>
|
|
35
|
+
<div style={{ fontFamily: 'var(--font-family-mono)', fontSize: 'var(--font-size-xs)' }}>{cssVar(name)}</div>
|
|
36
|
+
<div style={{ fontSize: 'var(--font-size-xs)', color: 'var(--color-text-muted)' }}>{value}</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
))}
|
|
40
|
+
</div>
|
|
41
|
+
</section>
|
|
42
|
+
)
|
|
43
|
+
})}
|
|
44
|
+
</FoundationPage>
|
|
45
|
+
),
|
|
46
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
|
+
import { FoundationPage } from './_helpers.tsx'
|
|
3
|
+
|
|
4
|
+
const meta: Meta = {
|
|
5
|
+
title: 'Foundations/Elevation',
|
|
6
|
+
}
|
|
7
|
+
export default meta
|
|
8
|
+
|
|
9
|
+
export const Elevation: StoryObj = {
|
|
10
|
+
render: () => (
|
|
11
|
+
<FoundationPage
|
|
12
|
+
title="Elevation"
|
|
13
|
+
intro="The reference design system uses flat depth: elevation is expressed through 1px borders and surface-color shifts rather than drop shadows. Reserve real shadows for transient overlays (modals, popovers)."
|
|
14
|
+
>
|
|
15
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(12rem, 1fr))', gap: '1rem' }}>
|
|
16
|
+
<div style={{ padding: '1.5rem', background: 'var(--color-bg-primary)', border: '1px solid var(--color-border-default)', borderRadius: 'var(--radius-lg)' }}>
|
|
17
|
+
<strong>Surface</strong>
|
|
18
|
+
<p style={{ margin: '0.5rem 0 0', color: 'var(--color-text-secondary)', fontSize: 'var(--font-size-sm)' }}>
|
|
19
|
+
bg.primary + border.default
|
|
20
|
+
</p>
|
|
21
|
+
</div>
|
|
22
|
+
<div style={{ padding: '1.5rem', background: 'var(--color-bg-secondary)', border: '1px solid var(--color-border-strong)', borderRadius: 'var(--radius-lg)' }}>
|
|
23
|
+
<strong>Raised</strong>
|
|
24
|
+
<p style={{ margin: '0.5rem 0 0', color: 'var(--color-text-secondary)', fontSize: 'var(--font-size-sm)' }}>
|
|
25
|
+
bg.secondary + border.strong
|
|
26
|
+
</p>
|
|
27
|
+
</div>
|
|
28
|
+
<div style={{ padding: '1.5rem', background: 'var(--color-bg-primary)', border: '1px solid var(--color-border-default)', borderRadius: 'var(--radius-lg)', boxShadow: '0 8px 24px rgba(0,0,0,0.12)' }}>
|
|
29
|
+
<strong>Overlay</strong>
|
|
30
|
+
<p style={{ margin: '0.5rem 0 0', color: 'var(--color-text-secondary)', fontSize: 'var(--font-size-sm)' }}>
|
|
31
|
+
shadow — modals / popovers only
|
|
32
|
+
</p>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</FoundationPage>
|
|
36
|
+
),
|
|
37
|
+
}
|
package/dist/templates/with-reference-ds/design-system/src/foundations/LayoutContainers.stories.tsx
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
|
+
import { layout } from '../tokens'
|
|
3
|
+
import { FoundationPage, TokenTable } from './_helpers.tsx'
|
|
4
|
+
|
|
5
|
+
const meta: Meta = {
|
|
6
|
+
title: 'Foundations/Layout & Containers',
|
|
7
|
+
}
|
|
8
|
+
export default meta
|
|
9
|
+
|
|
10
|
+
/** Token name → CSS custom property (mirrors build-tokens-css). */
|
|
11
|
+
function cssVar(name: string): string {
|
|
12
|
+
return `--${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase().replace(/\./g, '-')}`
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const containers = Object.entries(layout).filter(([k]) => k.startsWith('layout.container.'))
|
|
16
|
+
const breakpoints = Object.entries(layout).filter(([k]) => k.startsWith('layout.breakpoint.'))
|
|
17
|
+
const gutter = layout['layout.gutter']
|
|
18
|
+
const margin = layout['layout.margin']
|
|
19
|
+
|
|
20
|
+
export const LayoutAndContainers: StoryObj = {
|
|
21
|
+
render: () => (
|
|
22
|
+
<FoundationPage
|
|
23
|
+
title="Layout & Containers"
|
|
24
|
+
intro="Page content constrains to one of a small set of max-widths. The gutter is the space between grid columns; the page margin is the breathing room between the container and the viewport edge. Breakpoints are min-width and progressively widen the layout."
|
|
25
|
+
>
|
|
26
|
+
<h2 style={{ fontSize: 'var(--font-size-xl)', margin: '0 0 1rem' }}>Container widths</h2>
|
|
27
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginBottom: '2.5rem' }}>
|
|
28
|
+
{containers.map(([name, value]) => (
|
|
29
|
+
<div key={name}>
|
|
30
|
+
<div
|
|
31
|
+
style={{
|
|
32
|
+
fontFamily: 'var(--font-family-mono)',
|
|
33
|
+
fontSize: 'var(--font-size-xs)',
|
|
34
|
+
color: 'var(--color-text-secondary)',
|
|
35
|
+
marginBottom: '0.25rem',
|
|
36
|
+
}}
|
|
37
|
+
>
|
|
38
|
+
{cssVar(name)} · {value}
|
|
39
|
+
</div>
|
|
40
|
+
<div
|
|
41
|
+
style={{
|
|
42
|
+
height: '2rem',
|
|
43
|
+
width: `min(100%, ${value})`,
|
|
44
|
+
background: 'var(--color-brand-primary)',
|
|
45
|
+
borderRadius: 'var(--radius-sm)',
|
|
46
|
+
}}
|
|
47
|
+
/>
|
|
48
|
+
</div>
|
|
49
|
+
))}
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<h2 style={{ fontSize: 'var(--font-size-xl)', margin: '0 0 1rem' }}>Gutter & page margin</h2>
|
|
53
|
+
<TokenTable
|
|
54
|
+
rows={[
|
|
55
|
+
{
|
|
56
|
+
name: cssVar('layout.gutter'),
|
|
57
|
+
value: gutter,
|
|
58
|
+
preview: <div style={{ height: '1rem', width: gutter, background: 'var(--color-brand-secondary)' }} />,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: cssVar('layout.margin'),
|
|
62
|
+
value: margin,
|
|
63
|
+
preview: <div style={{ height: '1rem', width: margin, background: 'var(--color-brand-secondary)' }} />,
|
|
64
|
+
},
|
|
65
|
+
]}
|
|
66
|
+
/>
|
|
67
|
+
|
|
68
|
+
<h2 style={{ fontSize: 'var(--font-size-xl)', margin: '2.5rem 0 1rem' }}>Breakpoints</h2>
|
|
69
|
+
<TokenTable
|
|
70
|
+
rows={breakpoints.map(([name, value]) => ({
|
|
71
|
+
name: cssVar(name),
|
|
72
|
+
value,
|
|
73
|
+
preview: (
|
|
74
|
+
<div
|
|
75
|
+
style={{
|
|
76
|
+
height: '0.5rem',
|
|
77
|
+
width: `min(100%, calc(${value} / 4))`,
|
|
78
|
+
background: 'var(--color-border-strong)',
|
|
79
|
+
}}
|
|
80
|
+
/>
|
|
81
|
+
),
|
|
82
|
+
}))}
|
|
83
|
+
/>
|
|
84
|
+
</FoundationPage>
|
|
85
|
+
),
|
|
86
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
|
+
import { radii } from '../tokens'
|
|
3
|
+
import { FoundationPage } from './_helpers.tsx'
|
|
4
|
+
|
|
5
|
+
const meta: Meta = {
|
|
6
|
+
title: 'Foundations/Radii',
|
|
7
|
+
}
|
|
8
|
+
export default meta
|
|
9
|
+
|
|
10
|
+
function cssVar(name: string): string {
|
|
11
|
+
return `--${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase().replace(/\./g, '-')}`
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const Radii: StoryObj = {
|
|
15
|
+
render: () => (
|
|
16
|
+
<FoundationPage
|
|
17
|
+
title="Radii"
|
|
18
|
+
intro="Corner radii available to components. A brand may collapse this to a binary set (sharp vs. pill); the tokens stay the same so components don't change."
|
|
19
|
+
>
|
|
20
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(10rem, 1fr))', gap: '1rem' }}>
|
|
21
|
+
{Object.entries(radii).map(([name, value]) => (
|
|
22
|
+
<div key={name}>
|
|
23
|
+
<div
|
|
24
|
+
style={{
|
|
25
|
+
height: '5rem',
|
|
26
|
+
background: 'var(--color-bg-tertiary)',
|
|
27
|
+
border: '1px solid var(--color-border-strong)',
|
|
28
|
+
borderRadius: value,
|
|
29
|
+
}}
|
|
30
|
+
/>
|
|
31
|
+
<div style={{ fontFamily: 'var(--font-family-mono)', fontSize: 'var(--font-size-xs)', marginTop: '0.5rem' }}>{cssVar(name)}</div>
|
|
32
|
+
<div style={{ fontSize: 'var(--font-size-xs)', color: 'var(--color-text-muted)' }}>{value}</div>
|
|
33
|
+
</div>
|
|
34
|
+
))}
|
|
35
|
+
</div>
|
|
36
|
+
</FoundationPage>
|
|
37
|
+
),
|
|
38
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
|
+
import { spacing } from '../tokens'
|
|
3
|
+
import { FoundationPage } from './_helpers.tsx'
|
|
4
|
+
|
|
5
|
+
const meta: Meta = {
|
|
6
|
+
title: 'Foundations/Spacing',
|
|
7
|
+
}
|
|
8
|
+
export default meta
|
|
9
|
+
|
|
10
|
+
function cssVar(name: string): string {
|
|
11
|
+
return `--${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase().replace(/\./g, '-')}`
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const Spacing: StoryObj = {
|
|
15
|
+
render: () => (
|
|
16
|
+
<FoundationPage
|
|
17
|
+
title="Spacing"
|
|
18
|
+
intro="A single spacing scale drives padding, margins, and gaps. Section and container spacing are semantic aliases on top of the numeric scale."
|
|
19
|
+
>
|
|
20
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>
|
|
21
|
+
{Object.entries(spacing).map(([name, value]) => (
|
|
22
|
+
<div key={name} style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>
|
|
23
|
+
<span style={{ fontFamily: 'var(--font-family-mono)', fontSize: 'var(--font-size-xs)', color: 'var(--color-text-muted)', width: '11rem', flexShrink: 0 }}>
|
|
24
|
+
{cssVar(name)}
|
|
25
|
+
</span>
|
|
26
|
+
<span style={{ fontSize: 'var(--font-size-xs)', color: 'var(--color-text-secondary)', width: '4rem', flexShrink: 0 }}>{value}</span>
|
|
27
|
+
<div style={{ height: '1rem', width: value, background: 'var(--color-brand-primary)', borderRadius: 'var(--radius-sm)' }} />
|
|
28
|
+
</div>
|
|
29
|
+
))}
|
|
30
|
+
</div>
|
|
31
|
+
</FoundationPage>
|
|
32
|
+
),
|
|
33
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
|
+
import { typography } from '../tokens'
|
|
3
|
+
import { FoundationPage, TokenTable } from './_helpers.tsx'
|
|
4
|
+
|
|
5
|
+
const meta: Meta = {
|
|
6
|
+
title: 'Foundations/Typography',
|
|
7
|
+
}
|
|
8
|
+
export default meta
|
|
9
|
+
|
|
10
|
+
function cssVar(name: string): string {
|
|
11
|
+
return `--${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase().replace(/\./g, '-')}`
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const sizes = Object.entries(typography).filter(([k]) => k.startsWith('font.size.'))
|
|
15
|
+
const families = Object.entries(typography).filter(([k]) => k.startsWith('font.family.'))
|
|
16
|
+
const weights = Object.entries(typography).filter(([k]) => k.startsWith('font.weight.'))
|
|
17
|
+
|
|
18
|
+
export const Typography: StoryObj = {
|
|
19
|
+
render: () => (
|
|
20
|
+
<FoundationPage
|
|
21
|
+
title="Typography"
|
|
22
|
+
intro="Type sizes form a single scale; hierarchy comes from size and weight, not from mixing typefaces. The font family is a token, so a brand swap (e.g. DM Sans) re-themes every component."
|
|
23
|
+
>
|
|
24
|
+
<h2 style={{ fontSize: 'var(--font-size-xl)', margin: '0 0 1rem' }}>Type scale</h2>
|
|
25
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem', marginBottom: '2.5rem' }}>
|
|
26
|
+
{sizes.map(([name, value]) => (
|
|
27
|
+
<div key={name} style={{ display: 'flex', alignItems: 'baseline', gap: '1rem' }}>
|
|
28
|
+
<span style={{ fontFamily: 'var(--font-family-mono)', fontSize: 'var(--font-size-xs)', color: 'var(--color-text-muted)', width: '8rem', flexShrink: 0 }}>
|
|
29
|
+
{cssVar(name)}
|
|
30
|
+
</span>
|
|
31
|
+
<span style={{ fontSize: value, lineHeight: 1.1 }}>The quick brown fox</span>
|
|
32
|
+
</div>
|
|
33
|
+
))}
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<h2 style={{ fontSize: 'var(--font-size-xl)', margin: '0 0 1rem' }}>Families</h2>
|
|
37
|
+
<TokenTable
|
|
38
|
+
rows={families.map(([name, value]) => ({
|
|
39
|
+
name: cssVar(name),
|
|
40
|
+
value,
|
|
41
|
+
preview: <span style={{ fontFamily: value }}>Aa Bb Cc 123</span>,
|
|
42
|
+
}))}
|
|
43
|
+
/>
|
|
44
|
+
|
|
45
|
+
<h2 style={{ fontSize: 'var(--font-size-xl)', margin: '2.5rem 0 1rem' }}>Weights</h2>
|
|
46
|
+
<TokenTable
|
|
47
|
+
rows={weights.map(([name, value]) => ({
|
|
48
|
+
name: cssVar(name),
|
|
49
|
+
value,
|
|
50
|
+
preview: <span style={{ fontWeight: value as number }}>The quick brown fox</span>,
|
|
51
|
+
}))}
|
|
52
|
+
/>
|
|
53
|
+
</FoundationPage>
|
|
54
|
+
),
|
|
55
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { CSSProperties, ReactNode } from 'react'
|
|
2
|
+
|
|
3
|
+
/** Shared layout chrome for every Foundations page. */
|
|
4
|
+
export function FoundationPage({
|
|
5
|
+
title,
|
|
6
|
+
intro,
|
|
7
|
+
children,
|
|
8
|
+
}: {
|
|
9
|
+
title: string
|
|
10
|
+
intro?: string
|
|
11
|
+
children: ReactNode
|
|
12
|
+
}) {
|
|
13
|
+
return (
|
|
14
|
+
<div
|
|
15
|
+
style={{
|
|
16
|
+
fontFamily: 'var(--font-family-sans)',
|
|
17
|
+
color: 'var(--color-text-primary)',
|
|
18
|
+
background: 'var(--color-bg-primary)',
|
|
19
|
+
padding: '2rem',
|
|
20
|
+
maxWidth: '64rem',
|
|
21
|
+
}}
|
|
22
|
+
>
|
|
23
|
+
<h1 style={{ fontSize: 'var(--font-size-4xl)', margin: '0 0 0.5rem', lineHeight: 1.15 }}>
|
|
24
|
+
{title}
|
|
25
|
+
</h1>
|
|
26
|
+
{intro ? (
|
|
27
|
+
<p
|
|
28
|
+
style={{
|
|
29
|
+
color: 'var(--color-text-secondary)',
|
|
30
|
+
margin: '0 0 2rem',
|
|
31
|
+
maxWidth: '42rem',
|
|
32
|
+
lineHeight: 'var(--line-height-relaxed)',
|
|
33
|
+
}}
|
|
34
|
+
>
|
|
35
|
+
{intro}
|
|
36
|
+
</p>
|
|
37
|
+
) : null}
|
|
38
|
+
{children}
|
|
39
|
+
</div>
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const cell: CSSProperties = {
|
|
44
|
+
textAlign: 'left',
|
|
45
|
+
padding: '0.5rem 0.75rem',
|
|
46
|
+
borderBottom: '1px solid var(--color-border-default)',
|
|
47
|
+
verticalAlign: 'middle',
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** A simple token reference table: name, resolved value, and a preview cell. */
|
|
51
|
+
export function TokenTable({
|
|
52
|
+
rows,
|
|
53
|
+
}: {
|
|
54
|
+
rows: Array<{ name: string; value: string; preview?: ReactNode }>
|
|
55
|
+
}) {
|
|
56
|
+
return (
|
|
57
|
+
<table
|
|
58
|
+
style={{
|
|
59
|
+
borderCollapse: 'collapse',
|
|
60
|
+
width: '100%',
|
|
61
|
+
fontSize: 'var(--font-size-sm)',
|
|
62
|
+
}}
|
|
63
|
+
>
|
|
64
|
+
<thead>
|
|
65
|
+
<tr>
|
|
66
|
+
<th style={{ ...cell, color: 'var(--color-text-muted)', fontWeight: 600 }}>Token</th>
|
|
67
|
+
<th style={{ ...cell, color: 'var(--color-text-muted)', fontWeight: 600 }}>Value</th>
|
|
68
|
+
<th style={{ ...cell, color: 'var(--color-text-muted)', fontWeight: 600 }}>Preview</th>
|
|
69
|
+
</tr>
|
|
70
|
+
</thead>
|
|
71
|
+
<tbody>
|
|
72
|
+
{rows.map((row) => (
|
|
73
|
+
<tr key={row.name}>
|
|
74
|
+
<td style={{ ...cell, fontFamily: 'var(--font-family-mono)' }}>{row.name}</td>
|
|
75
|
+
<td style={{ ...cell, color: 'var(--color-text-secondary)' }}>{row.value}</td>
|
|
76
|
+
<td style={cell}>{row.preview}</td>
|
|
77
|
+
</tr>
|
|
78
|
+
))}
|
|
79
|
+
</tbody>
|
|
80
|
+
</table>
|
|
81
|
+
)
|
|
82
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { Hero, type HeroProps, type HeroVariant, type HeroBackground } from './components/Hero/index.js'
|
|
2
|
+
export { SectionIntro, type SectionIntroProps, type SectionIntroAlignment } from './components/SectionIntro/index.js'
|
|
3
|
+
export { Prose, type ProseProps, type ProseSize } from './components/Prose/index.js'
|
|
4
|
+
export { MediaBlock, type MediaBlockProps, type MediaBlockAspect, type MediaBlockMedia } from './components/MediaBlock/index.js'
|
|
5
|
+
export { Card, type CardProps } from './components/Card/index.js'
|
|
6
|
+
export { CardGrid, type CardGridProps, type CardGridColumns } from './components/CardGrid/index.js'
|
|
7
|
+
export { CTASection, type CTASectionProps, type CTASectionBackground } from './components/CTASection/index.js'
|
|
8
|
+
export { Stats, type StatsProps, type StatItem } from './components/Stats/index.js'
|
|
9
|
+
export { FAQ, type FAQProps, type FAQItem } from './components/FAQ/index.js'
|
|
10
|
+
export { Quote, type QuoteProps, type QuoteSize } from './components/Quote/index.js'
|
|
11
|
+
export { Divider, type DividerProps, type DividerSpacing } from './components/Divider/index.js'
|
|
12
|
+
export { Spacer, type SpacerProps, type SpacerSize } from './components/Spacer/index.js'
|
|
13
|
+
|
|
14
|
+
export * as tokens from './tokens/index.js'
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/* Base element styles applied on top of reset.css + tokens.css. */
|
|
2
|
+
|
|
3
|
+
html {
|
|
4
|
+
font-family: var(--font-family-sans);
|
|
5
|
+
font-size: 16px;
|
|
6
|
+
line-height: var(--line-height-normal);
|
|
7
|
+
color: var(--color-text-primary);
|
|
8
|
+
background: var(--color-bg-primary);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
body {
|
|
12
|
+
font-size: var(--font-size-base);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
h1 {
|
|
16
|
+
font-size: var(--font-size-5xl);
|
|
17
|
+
font-weight: var(--font-weight-bold);
|
|
18
|
+
line-height: var(--line-height-tight);
|
|
19
|
+
letter-spacing: var(--letter-spacing-tight);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
h2 {
|
|
23
|
+
font-size: var(--font-size-3xl);
|
|
24
|
+
font-weight: var(--font-weight-semibold);
|
|
25
|
+
line-height: var(--line-height-snug);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
h3 {
|
|
29
|
+
font-size: var(--font-size-2xl);
|
|
30
|
+
font-weight: var(--font-weight-semibold);
|
|
31
|
+
line-height: var(--line-height-snug);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h4 {
|
|
35
|
+
font-size: var(--font-size-xl);
|
|
36
|
+
font-weight: var(--font-weight-semibold);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
a {
|
|
40
|
+
color: var(--color-brand-primary);
|
|
41
|
+
text-decoration: underline;
|
|
42
|
+
text-underline-offset: 0.15em;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
a:hover {
|
|
46
|
+
color: var(--color-brand-primary-hover);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
code {
|
|
50
|
+
font-family: var(--font-family-mono);
|
|
51
|
+
font-size: 0.9em;
|
|
52
|
+
background: var(--color-bg-tertiary);
|
|
53
|
+
padding: 0.125em 0.25em;
|
|
54
|
+
border-radius: var(--radius-sm);
|
|
55
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* Minimal reset — based on modern-normalize with a few opinionated extras. */
|
|
2
|
+
|
|
3
|
+
*,
|
|
4
|
+
*::before,
|
|
5
|
+
*::after {
|
|
6
|
+
box-sizing: border-box;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
html {
|
|
10
|
+
-webkit-text-size-adjust: 100%;
|
|
11
|
+
-moz-tab-size: 4;
|
|
12
|
+
tab-size: 4;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
body {
|
|
16
|
+
margin: 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
p,
|
|
20
|
+
h1,
|
|
21
|
+
h2,
|
|
22
|
+
h3,
|
|
23
|
+
h4,
|
|
24
|
+
h5,
|
|
25
|
+
h6 {
|
|
26
|
+
margin: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
button,
|
|
30
|
+
input,
|
|
31
|
+
select,
|
|
32
|
+
textarea {
|
|
33
|
+
font: inherit;
|
|
34
|
+
color: inherit;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
img,
|
|
38
|
+
svg,
|
|
39
|
+
video {
|
|
40
|
+
display: block;
|
|
41
|
+
max-width: 100%;
|
|
42
|
+
height: auto;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:focus-visible {
|
|
46
|
+
outline: 2px solid var(--color-brand-primary);
|
|
47
|
+
outline-offset: 2px;
|
|
48
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/* Auto-generated by scripts/build-tokens-css.ts. Do not edit by hand. */
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
/* Colors */
|
|
5
|
+
--color-neutral-0: #FFFFFF;
|
|
6
|
+
--color-neutral-50: #FAFAFA;
|
|
7
|
+
--color-neutral-100: #F4F4F5;
|
|
8
|
+
--color-neutral-200: #E4E4E7;
|
|
9
|
+
--color-neutral-300: #D4D4D8;
|
|
10
|
+
--color-neutral-400: #A1A1AA;
|
|
11
|
+
--color-neutral-500: #71717A;
|
|
12
|
+
--color-neutral-600: #52525B;
|
|
13
|
+
--color-neutral-700: #3F3F46;
|
|
14
|
+
--color-neutral-800: #27272A;
|
|
15
|
+
--color-neutral-900: #18181B;
|
|
16
|
+
--color-neutral-1000: #000000;
|
|
17
|
+
--color-brand-primary: #2563EB;
|
|
18
|
+
--color-brand-primary-hover: #1D4ED8;
|
|
19
|
+
--color-brand-secondary: #0891B2;
|
|
20
|
+
--color-text-primary: #18181B;
|
|
21
|
+
--color-text-secondary: #52525B;
|
|
22
|
+
--color-text-muted: #71717A;
|
|
23
|
+
--color-text-inverse: #FFFFFF;
|
|
24
|
+
--color-bg-primary: #FFFFFF;
|
|
25
|
+
--color-bg-secondary: #FAFAFA;
|
|
26
|
+
--color-bg-tertiary: #F4F4F5;
|
|
27
|
+
--color-bg-inverse: #18181B;
|
|
28
|
+
--color-border-default: #E4E4E7;
|
|
29
|
+
--color-border-strong: #D4D4D8;
|
|
30
|
+
--color-state-success: #16A34A;
|
|
31
|
+
--color-state-warning: #CA8A04;
|
|
32
|
+
--color-state-error: #DC2626;
|
|
33
|
+
--color-state-info: #2563EB;
|
|
34
|
+
|
|
35
|
+
/* Typography */
|
|
36
|
+
--font-family-sans: Inter, system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
|
37
|
+
--font-family-mono: ui-monospace, "SF Mono", Monaco, Consolas, monospace;
|
|
38
|
+
--font-size-xs: 0.75rem;
|
|
39
|
+
--font-size-sm: 0.875rem;
|
|
40
|
+
--font-size-base: 1rem;
|
|
41
|
+
--font-size-lg: 1.125rem;
|
|
42
|
+
--font-size-xl: 1.25rem;
|
|
43
|
+
--font-size-2xl: 1.5rem;
|
|
44
|
+
--font-size-3xl: 1.875rem;
|
|
45
|
+
--font-size-4xl: 2.25rem;
|
|
46
|
+
--font-size-5xl: 3rem;
|
|
47
|
+
--font-size-6xl: 3.75rem;
|
|
48
|
+
--font-weight-normal: 400;
|
|
49
|
+
--font-weight-medium: 500;
|
|
50
|
+
--font-weight-semibold: 600;
|
|
51
|
+
--font-weight-bold: 700;
|
|
52
|
+
--line-height-tight: 1.15;
|
|
53
|
+
--line-height-snug: 1.3;
|
|
54
|
+
--line-height-normal: 1.5;
|
|
55
|
+
--line-height-relaxed: 1.65;
|
|
56
|
+
--line-height-loose: 1.8;
|
|
57
|
+
--letter-spacing-tight: -0.025em;
|
|
58
|
+
--letter-spacing-normal: 0;
|
|
59
|
+
--letter-spacing-wide: 0.025em;
|
|
60
|
+
|
|
61
|
+
/* Spacing */
|
|
62
|
+
--spacing-0: 0;
|
|
63
|
+
--spacing-px: 1px;
|
|
64
|
+
--spacing-0-5: 0.125rem;
|
|
65
|
+
--spacing-1: 0.25rem;
|
|
66
|
+
--spacing-2: 0.5rem;
|
|
67
|
+
--spacing-3: 0.75rem;
|
|
68
|
+
--spacing-4: 1rem;
|
|
69
|
+
--spacing-5: 1.25rem;
|
|
70
|
+
--spacing-6: 1.5rem;
|
|
71
|
+
--spacing-8: 2rem;
|
|
72
|
+
--spacing-10: 2.5rem;
|
|
73
|
+
--spacing-12: 3rem;
|
|
74
|
+
--spacing-16: 4rem;
|
|
75
|
+
--spacing-20: 5rem;
|
|
76
|
+
--spacing-24: 6rem;
|
|
77
|
+
--spacing-32: 8rem;
|
|
78
|
+
--spacing-40: 10rem;
|
|
79
|
+
--spacing-48: 12rem;
|
|
80
|
+
--spacing-section: 5rem;
|
|
81
|
+
--spacing-container: 1.5rem;
|
|
82
|
+
|
|
83
|
+
/* Radii */
|
|
84
|
+
--radius-none: 0;
|
|
85
|
+
--radius-sm: 0.25rem;
|
|
86
|
+
--radius-md: 0.375rem;
|
|
87
|
+
--radius-lg: 0.5rem;
|
|
88
|
+
--radius-xl: 0.75rem;
|
|
89
|
+
--radius-2xl: 1rem;
|
|
90
|
+
--radius-full: 9999px;
|
|
91
|
+
|
|
92
|
+
/* Layout & Containers */
|
|
93
|
+
--layout-container-sm: 40rem;
|
|
94
|
+
--layout-container-md: 64rem;
|
|
95
|
+
--layout-container-lg: 80rem;
|
|
96
|
+
--layout-gutter: 1.5rem;
|
|
97
|
+
--layout-margin: 1rem;
|
|
98
|
+
--layout-breakpoint-sm: 40rem;
|
|
99
|
+
--layout-breakpoint-md: 48rem;
|
|
100
|
+
--layout-breakpoint-lg: 64rem;
|
|
101
|
+
--layout-breakpoint-xl: 80rem;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@media (prefers-color-scheme: dark) {
|
|
105
|
+
:root {
|
|
106
|
+
--color-text-primary: #FAFAFA;
|
|
107
|
+
--color-text-secondary: #A1A1AA;
|
|
108
|
+
--color-text-muted: #71717A;
|
|
109
|
+
--color-bg-primary: #18181B;
|
|
110
|
+
--color-bg-secondary: #27272A;
|
|
111
|
+
--color-bg-tertiary: #3F3F46;
|
|
112
|
+
--color-bg-inverse: #FAFAFA;
|
|
113
|
+
--color-border-default: #3F3F46;
|
|
114
|
+
--color-border-strong: #52525B;
|
|
115
|
+
}
|
|
116
|
+
}
|