refactor: Update Section and PackageManager components for improved type safety and consistency

This commit includes the following changes:
- Refactored PackageManager to use a more type-safe approach
- Updated Section component to use semantic `<section>` tag
- Adjusted background prop types and default values
- Simplified type definitions
- Improved code readability and maintainability
This commit is contained in:
2025-02-23 00:42:07 -06:00
parent c200bff8d0
commit 6eefe763e3
3 changed files with 50 additions and 40 deletions
+15 -9
View File
@@ -3,24 +3,30 @@
import { useState } from 'react'; import { useState } from 'react';
import styles from './PackageManager.module.css'; import styles from './PackageManager.module.css';
const PACKAGE_MANAGERS = { const PACKAGE_MANAGERS = ['npm', 'yarn', 'pnpm', 'bun'] as const;
type PackageManager = typeof PACKAGE_MANAGERS[number];
export function PackageManager() {
const [activeTab, setActiveTab] = useState<PackageManager>('npm');
const getInstallCommand = (pm: PackageManager) => {
const commands = {
npm: 'npm install unicord', npm: 'npm install unicord',
yarn: 'yarn add unicord', yarn: 'yarn add unicord',
pnpm: 'pnpm add unicord', pnpm: 'pnpm add unicord',
bun: 'bun add unicord' bun: 'bun add unicord'
} as const; };
return commands[pm];
export function PackageManager() { };
const [activeTab, setActiveTab] = useState<keyof typeof PACKAGE_MANAGERS>('npm');
return ( return (
<div className={styles.container}> <div className={styles.container}>
<div className={styles.tabs}> <div className={styles.tabs}>
{Object.keys(PACKAGE_MANAGERS).map(pm => ( {PACKAGE_MANAGERS.map(pm => (
<button <button
key={pm} key={pm}
className={`${styles.tab} ${activeTab === pm ? styles.active : ''}`} className={`${styles.tab} ${activeTab === pm ? styles.active : ''}`}
onClick={() => setActiveTab(pm as keyof typeof PACKAGE_MANAGERS)} onClick={() => setActiveTab(pm)}
> >
{pm} {pm}
</button> </button>
@@ -28,11 +34,11 @@ export function PackageManager() {
</div> </div>
<div className={styles.commandWrapper}> <div className={styles.commandWrapper}>
<code className={styles.command}> <code className={styles.command}>
{PACKAGE_MANAGERS[activeTab]} {getInstallCommand(activeTab)}
</code> </code>
<button <button
className={styles.copyButton} className={styles.copyButton}
onClick={() => navigator.clipboard.writeText(PACKAGE_MANAGERS[activeTab])} onClick={() => navigator.clipboard.writeText(getInstallCommand(activeTab))}
> >
Copy Copy
</button> </button>
+7 -3
View File
@@ -1,19 +1,23 @@
.section { .section {
padding: var(--section-padding-desktop); padding: 6rem 12em;
min-height: 50vh; min-height: 50vh;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
position: relative; position: relative;
border-top: 1px solid var(--gray-alpha-200);
} }
.dark { .dark {
background: var(--gray-alpha-100); background: var(--gray-alpha-100);
border-top: 1px solid var(--gray-alpha-200);
}
.light {
border-top: 1px solid var(--gray-alpha-200);
} }
@media (max-width: 1200px) { @media (max-width: 1200px) {
.section { .section {
padding: var(--section-padding-mobile); padding: 4rem 2rem;
} }
} }
+4 -4
View File
@@ -2,14 +2,14 @@ import styles from './Section.module.css';
type SectionProps = { type SectionProps = {
children: React.ReactNode; children: React.ReactNode;
background?: 'default' | 'dark'; background?: 'light' | 'dark';
className?: string; className?: string;
}; };
export function Section({ children, background = 'default', className = '' }: SectionProps) { export function Section({ children, background = 'light', className = '' }: SectionProps) {
return ( return (
<div className={`${styles.section} ${styles[background]} ${className}`}> <section className={`${styles.section} ${styles[background]} ${className}`}>
{children} {children}
</div> </section>
); );
} }