diff --git a/.claude/settings.json b/.claude/settings.json
index e077ca4..6283c0f 100644
--- a/.claude/settings.json
+++ b/.claude/settings.json
@@ -1,6 +1,6 @@
{
"enabledPlugins": {
- "frontend-design@claude-code-plugins": false,
+ "frontend-design@claude-code-plugins": true,
"feature-dev@claude-code-plugins": false
}
}
diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 3ab194d..92efa85 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -31,7 +31,8 @@
"Bash(node_modules/.bin/eslint:*)",
"Bash(node --input-type=module:*)",
"Bash(python3:*)",
- "Bash(ls:*)"
+ "Bash(ls:*)",
+ "WebFetch(domain:axilaccountants.co.uk)"
]
}
}
diff --git a/Assets/CV.jpeg b/Assets/CV.jpeg
new file mode 100644
index 0000000..feb4cc6
Binary files /dev/null and b/Assets/CV.jpeg differ
diff --git a/Assets/payroll-1.jpeg b/Assets/payroll-1.jpeg
new file mode 100644
index 0000000..f79d2fb
Binary files /dev/null and b/Assets/payroll-1.jpeg differ
diff --git a/Assets/quickbooks.jpeg b/Assets/quickbooks.jpeg
new file mode 100644
index 0000000..4d4ee8a
Binary files /dev/null and b/Assets/quickbooks.jpeg differ
diff --git a/Assets/tax.jpeg b/Assets/tax.jpeg
new file mode 100644
index 0000000..590a1ed
Binary files /dev/null and b/Assets/tax.jpeg differ
diff --git a/Assets/xero.jpeg b/Assets/xero.jpeg
new file mode 100644
index 0000000..b189d15
Binary files /dev/null and b/Assets/xero.jpeg differ
diff --git a/public/courses/cv.jpeg b/public/courses/cv.jpeg
new file mode 100644
index 0000000..feb4cc6
Binary files /dev/null and b/public/courses/cv.jpeg differ
diff --git a/public/courses/payroll.jpeg b/public/courses/payroll.jpeg
new file mode 100644
index 0000000..f79d2fb
Binary files /dev/null and b/public/courses/payroll.jpeg differ
diff --git a/public/courses/quickbooks.jpeg b/public/courses/quickbooks.jpeg
new file mode 100644
index 0000000..4d4ee8a
Binary files /dev/null and b/public/courses/quickbooks.jpeg differ
diff --git a/public/courses/tax.jpeg b/public/courses/tax.jpeg
new file mode 100644
index 0000000..590a1ed
Binary files /dev/null and b/public/courses/tax.jpeg differ
diff --git a/public/courses/xero.jpeg b/public/courses/xero.jpeg
new file mode 100644
index 0000000..b189d15
Binary files /dev/null and b/public/courses/xero.jpeg differ
diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx
index 43e29ea..687a6f4 100644
--- a/src/app/contact/page.tsx
+++ b/src/app/contact/page.tsx
@@ -13,8 +13,8 @@ export const metadata: Metadata = {
const CONTACT_DETAILS = [
{
label: 'Email',
- value: 'hello@axilaccountants.co.uk',
- href: 'mailto:hello@axilaccountants.co.uk',
+ value: 'info@axilaccountants.co.uk',
+ href: 'mailto:info@axilaccountants.co.uk',
icon: (
-
+
Book a Free Consultation
- Book a Free Consultation
+
+ Book a Free Consultation
+
diff --git a/src/components/ui/BeamButton.tsx b/src/components/ui/BeamButton.tsx
index c89e825..8fdb074 100644
--- a/src/components/ui/BeamButton.tsx
+++ b/src/components/ui/BeamButton.tsx
@@ -1,6 +1,7 @@
'use client';
import { useEffect, useId, useRef, useState } from 'react';
+import Link from 'next/link';
import { motion } from 'framer-motion';
import { ArrowRightIcon } from './icons';
import { Spinner } from './Spinner';
@@ -14,6 +15,7 @@ interface BeamButtonProps extends React.ButtonHTMLAttributes
loading?: boolean;
trailingArrow?: boolean;
leadingIcon?: React.ReactNode;
+ href?: string;
}
const HEIGHTS: Record = { sm: 36, md: 44, lg: 56 };
@@ -46,6 +48,7 @@ export function BeamButton({
leadingIcon,
className = '',
disabled,
+ href,
...props
}: BeamButtonProps) {
const uid = useId().replace(/:/g, '');
@@ -67,70 +70,65 @@ export function BeamButton({
const { bg, text, border } = VARIANTS[variant];
const arrowSize = size === 'sm' ? 14 : size === 'lg' ? 20 : 16;
- return (
-
- {/* Beam border */}
-
+ const classes = [
+ 'rounded-pill relative inline-flex cursor-pointer items-center justify-center font-medium',
+ 'transition-all duration-200 select-none',
+ 'active:scale-[0.98]',
+ 'focus-visible:ring-emerald/50 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',
+ 'disabled:cursor-not-allowed disabled:opacity-50 disabled:active:scale-100',
+ bg,
+ text,
+ PADDINGS[size],
+ GAPS[size],
+ className,
+ ].join(' ');
- {/* Content */}
+ const beamSvg = (
+
+ );
+
+ const content = (
+ <>
+ {beamSvg}
{loading ? : (leadingIcon ?? null)}
{children}
{!loading && trailingArrow && (
@@ -139,6 +137,26 @@ export function BeamButton({
className="shrink-0 transition-transform duration-200 group-hover:translate-x-0.5"
/>
)}
+ >
+ );
+
+ if (href) {
+ return (
+
+ {content}
+
+ );
+ }
+
+ return (
+
+ {content}
);
}
diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx
index 3651b37..5622d44 100644
--- a/src/components/ui/Button.tsx
+++ b/src/components/ui/Button.tsx
@@ -1,6 +1,7 @@
'use client';
import { forwardRef } from 'react';
+import Link from 'next/link';
import { Spinner } from './Spinner';
import { ArrowRightIcon } from './icons';
@@ -13,6 +14,7 @@ interface ButtonProps extends React.ButtonHTMLAttributes {
loading?: boolean;
trailingArrow?: boolean;
leadingIcon?: React.ReactNode;
+ href?: string;
}
const variants: Record = {
@@ -42,28 +44,26 @@ export const Button = forwardRef(
children,
className = '',
disabled,
+ href,
...props
},
ref,
) => {
const arrowSize = size === 'sm' ? 14 : size === 'lg' ? 20 : 16;
- return (
-
+ const classes = [
+ 'inline-flex cursor-pointer items-center justify-center font-medium',
+ 'transition-all duration-200',
+ 'focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',
+ 'active:scale-[0.98]',
+ 'disabled:cursor-not-allowed disabled:opacity-50 disabled:active:scale-100',
+ variants[variant],
+ sizes[size],
+ className,
+ ].join(' ');
+
+ const content = (
+ <>
{loading ? (
) : leadingIcon ? (
@@ -76,6 +76,20 @@ export const Button = forwardRef(
className="shrink-0 transition-transform duration-200 group-hover:translate-x-0.5"
/>
)}
+ >
+ );
+
+ if (href) {
+ return (
+
+ {content}
+
+ );
+ }
+
+ return (
+
+ {content}
);
},