diff --git a/.gitignore b/.gitignore
index 1834d9d..2fc9084 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,5 +43,16 @@ next-env.d.ts
*.md
!README.md
+# hidden files (allow some, ignore others)
+.**
+!/.storybook
+!/.yarn
+!/yarnrc.yml
+!/.claude
+!/.vscode
+!/.gitattributes
+!/.gitignore
+!/biome.json
+
*storybook.log
storybook-static
diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx
new file mode 100644
index 0000000..d1ab09b
--- /dev/null
+++ b/.storybook/preview.tsx
@@ -0,0 +1,30 @@
+import React from 'react'
+import type { Preview } from '@storybook/nextjs-vite'
+import { fraunces, publicSans } from '../src/shared/lib'
+import '../app/globals.css'
+
+const preview: Preview = {
+ parameters: {
+ controls: {
+ matchers: {
+ color: /(background|color)$/i,
+ date: /Date$/i,
+ },
+ },
+ a11y: {
+ // 'todo' - show a11y violations in the test UI only
+ // 'error' - fail CI on a11y violations
+ // 'off' - skip a11y checks entirely
+ test: 'todo',
+ },
+ },
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+}
+
+export default preview
diff --git a/app/layout.tsx b/app/layout.tsx
index 6b624cd..00879ef 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,24 +1,7 @@
import type { Metadata } from 'next'
-import { Fraunces, Public_Sans } from 'next/font/google'
+import { fraunces, publicSans } from '$shared/lib'
import './globals.css'
-/**
- * Heading font — variable axes for brutalist variation settings
- */
-const fraunces = Fraunces({
- subsets: ['latin'],
- variable: '--font-fraunces',
- axes: ['opsz', 'SOFT', 'WONK'],
-})
-
-/**
- * Body font
- */
-const publicSans = Public_Sans({
- subsets: ['latin'],
- variable: '--font-public-sans',
-})
-
export const metadata: Metadata = {
title: 'Portfolio',
description: 'Portfolio',
diff --git a/src/shared/lib/fonts.ts b/src/shared/lib/fonts.ts
new file mode 100644
index 0000000..c73f10f
--- /dev/null
+++ b/src/shared/lib/fonts.ts
@@ -0,0 +1,18 @@
+import { Fraunces, Public_Sans } from 'next/font/google'
+
+/**
+ * Heading font — variable axes for brutalist variation settings
+ */
+export const fraunces = Fraunces({
+ subsets: ['latin'],
+ variable: '--font-fraunces',
+ axes: ['opsz', 'SOFT', 'WONK'],
+})
+
+/**
+ * Body font
+ */
+export const publicSans = Public_Sans({
+ subsets: ['latin'],
+ variable: '--font-public-sans',
+})
diff --git a/src/shared/lib/index.ts b/src/shared/lib/index.ts
index 4d7a761..59e9088 100644
--- a/src/shared/lib/index.ts
+++ b/src/shared/lib/index.ts
@@ -1,2 +1,3 @@
export { cn } from './cn'
export type { ClassValue } from 'clsx'
+export * from './fonts'
diff --git a/src/shared/styles/theme.css b/src/shared/styles/theme.css
index c78dcda..b3ce4ba 100644
--- a/src/shared/styles/theme.css
+++ b/src/shared/styles/theme.css
@@ -80,6 +80,9 @@
}
@theme inline {
+ --font-heading: var(--font-fraunces);
+ --font-body: var(--font-public-sans);
+
--color-ochre-clay: var(--ochre-clay);
--color-slate-indigo: var(--slate-indigo);
--color-burnt-oxide: var(--burnt-oxide);