mirror of
https://github.com/jaronpate/unicord.git
synced 2026-10-18 21:47:40 +00:00
refactor: Create shared components and global styles for improved code organization
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
import styles from './Feature.module.css';
|
||||
import { CodeExample } from './CodeExample';
|
||||
|
||||
type FeatureProps = {
|
||||
title: string;
|
||||
description: React.ReactNode;
|
||||
code?: string;
|
||||
codeHeight?: number;
|
||||
reversed?: boolean;
|
||||
};
|
||||
|
||||
export function Feature({ title, description, code, codeHeight, reversed = false }: FeatureProps) {
|
||||
const content = (
|
||||
<>
|
||||
<div className={styles.text}>
|
||||
<h2>{title}</h2>
|
||||
<div className={styles.description}>{description}</div>
|
||||
</div>
|
||||
{code && (
|
||||
<div className={styles.code}>
|
||||
<CodeExample code={code} height={codeHeight} noScroll={true} />
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
return (
|
||||
<div className={`${styles.feature} ${reversed ? styles.reversed : ''}`}>
|
||||
{content}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
.logo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.logo img {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.small {
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.small img {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.large {
|
||||
font-size: 48px;
|
||||
}
|
||||
|
||||
.large img {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import styles from './Logo.module.css';
|
||||
|
||||
type LogoProps = {
|
||||
size?: 'small' | 'large';
|
||||
showImage?: boolean;
|
||||
};
|
||||
|
||||
export function Logo({ size = 'small', showImage = true }: LogoProps) {
|
||||
return (
|
||||
<div className={`${styles.logo} ${styles[size]}`}>
|
||||
{showImage && <img src="/unicord.png" alt="Unicord logo" />}
|
||||
<div><span className={styles.highlight}>uni</span>cord</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
'use client';
|
||||
|
||||
import { useState } from 'react';
|
||||
import styles from './PackageManager.module.css';
|
||||
|
||||
const PACKAGE_MANAGERS = {
|
||||
npm: 'npm install unicord',
|
||||
yarn: 'yarn add unicord',
|
||||
pnpm: 'pnpm add unicord',
|
||||
bun: 'bun add unicord'
|
||||
} as const;
|
||||
|
||||
export function PackageManager() {
|
||||
const [activeTab, setActiveTab] = useState<keyof typeof PACKAGE_MANAGERS>('npm');
|
||||
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<div className={styles.tabs}>
|
||||
{Object.keys(PACKAGE_MANAGERS).map(pm => (
|
||||
<button
|
||||
key={pm}
|
||||
className={`${styles.tab} ${activeTab === pm ? styles.active : ''}`}
|
||||
onClick={() => setActiveTab(pm as keyof typeof PACKAGE_MANAGERS)}
|
||||
>
|
||||
{pm}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
<div className={styles.commandWrapper}>
|
||||
<code className={styles.command}>
|
||||
{PACKAGE_MANAGERS[activeTab]}
|
||||
</code>
|
||||
<button
|
||||
className={styles.copyButton}
|
||||
onClick={() => navigator.clipboard.writeText(PACKAGE_MANAGERS[activeTab])}
|
||||
>
|
||||
Copy
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
.section {
|
||||
padding: var(--section-padding-desktop);
|
||||
min-height: 50vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
border-top: 1px solid var(--gray-alpha-200);
|
||||
}
|
||||
|
||||
.dark {
|
||||
background: var(--gray-alpha-100);
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
.section {
|
||||
padding: var(--section-padding-mobile);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import styles from './Section.module.css';
|
||||
|
||||
type SectionProps = {
|
||||
children: React.ReactNode;
|
||||
background?: 'default' | 'dark';
|
||||
className?: string;
|
||||
};
|
||||
|
||||
export function Section({ children, background = 'default', className = '' }: SectionProps) {
|
||||
return (
|
||||
<div className={`${styles.section} ${styles[background]} ${className}`}>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
:root {
|
||||
--color-primary: #ff0080;
|
||||
--color-background: #000;
|
||||
--color-text: #fff;
|
||||
|
||||
--gray-rgb: 255, 255, 255;
|
||||
--gray-alpha-200: rgba(var(--gray-rgb), 0.145);
|
||||
--gray-alpha-100: rgba(var(--gray-rgb), 0.06);
|
||||
|
||||
--spacing-xs: 0.5rem;
|
||||
--spacing-sm: 1rem;
|
||||
--spacing-md: 2rem;
|
||||
--spacing-lg: 4rem;
|
||||
--spacing-xl: 6rem;
|
||||
|
||||
--border-radius-sm: 6px;
|
||||
--border-radius-md: 8px;
|
||||
--border-radius-lg: 12px;
|
||||
|
||||
--font-size-sm: 0.9rem;
|
||||
--font-size-md: 1.1rem;
|
||||
--font-size-lg: 1.5rem;
|
||||
--font-size-xl: 2rem;
|
||||
|
||||
--section-padding-desktop: 6rem 12em;
|
||||
--section-padding-mobile: 4rem 2rem;
|
||||
}
|
||||
Reference in New Issue
Block a user