From aa51074380f61406a50ff9e5a358a9bd607d5400 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Sun, 18 Jan 2026 19:45:25 +0000 Subject: [PATCH] Remove 123 simple TypeScript components now defined in JSON Deleted files: - 71 simple atoms (ActionIcon, Alert, AppLogo, Avatar, Badge, Chip, etc.) - 21 simple molecules (ActionBar, AppBranding, DataCard, etc.) - 8 simple organisms (EmptyCanvasState, PageHeader, SchemaEditorCanvas, etc.) - 23 simple UI components (accordion, alert, button, card, etc.) Changes: - Created cleanup-simple-components.ts script to automate deletion - Created update-index-exports.ts script to update index files - Updated index.ts in atoms/, molecules/, organisms/ to remove deleted exports - Installed npm dependencies Remaining TypeScript components (kept for complexity): - 46 atoms wrapping UI or with hooks - 20 molecules with complex logic - 6 organisms with state management - 11 UI components with advanced features Total: 317 components now have JSON definitions, 123 TypeScript files deleted (39% reduction) Co-Authored-By: Claude Sonnet 4.5 --- .claude/settings.local.json | 3 +- package-lock.json | 59 --- scripts/cleanup-simple-components.ts | 115 +++++ scripts/update-index-exports.ts | 76 ++++ src/components/atoms/ActionIcon.tsx | 22 - src/components/atoms/Alert.tsx | 51 --- src/components/atoms/AppLogo.tsx | 9 - src/components/atoms/Avatar.tsx | 37 -- src/components/atoms/AvatarGroup.tsx | 60 --- src/components/atoms/Breadcrumb.tsx | 53 --- src/components/atoms/ButtonGroup.tsx | 33 -- src/components/atoms/Checkbox.tsx | 60 --- src/components/atoms/Chip.tsx | 54 --- src/components/atoms/Code.tsx | 34 -- src/components/atoms/ColorSwatch.tsx | 46 -- src/components/atoms/Container.tsx | 24 - src/components/atoms/DataList.tsx | 55 --- src/components/atoms/Divider.tsx | 25 -- src/components/atoms/Dot.tsx | 53 --- src/components/atoms/Drawer.tsx | 80 ---- src/components/atoms/EmptyStateIcon.tsx | 17 - src/components/atoms/FileIcon.tsx | 19 - src/components/atoms/Flex.tsx | 83 ---- src/components/atoms/Grid.tsx | 34 -- src/components/atoms/Heading.tsx | 24 - src/components/atoms/HelperText.tsx | 22 - src/components/atoms/IconText.tsx | 36 -- src/components/atoms/IconWrapper.tsx | 32 -- src/components/atoms/InfoBox.tsx | 41 -- src/components/atoms/InfoPanel.tsx | 44 -- src/components/atoms/Input.tsx | 58 --- src/components/atoms/Kbd.tsx | 21 - src/components/atoms/KeyValue.tsx | 34 -- src/components/atoms/Label.tsx | 24 - src/components/atoms/Link.tsx | 40 -- src/components/atoms/List.tsx | 35 -- src/components/atoms/ListItem.tsx | 32 -- src/components/atoms/LiveIndicator.tsx | 49 -- src/components/atoms/LoadingSpinner.tsx | 20 - src/components/atoms/LoadingState.tsx | 31 -- src/components/atoms/MetricDisplay.tsx | 52 --- src/components/atoms/Modal.tsx | 64 --- src/components/atoms/Notification.tsx | 67 --- src/components/atoms/PageHeader.tsx | 24 - src/components/atoms/ProgressBar.tsx | 62 --- src/components/atoms/Pulse.tsx | 56 --- src/components/atoms/Radio.tsx | 69 --- src/components/atoms/Rating.tsx | 71 --- src/components/atoms/ResponsiveGrid.tsx | 57 --- src/components/atoms/ScrollArea.tsx | 35 -- src/components/atoms/SearchInput.tsx | 46 -- src/components/atoms/Section.tsx | 24 - src/components/atoms/Select.tsx | 69 --- src/components/atoms/Skeleton.tsx | 36 -- src/components/atoms/Slider.tsx | 65 --- src/components/atoms/Spacer.tsx | 31 -- src/components/atoms/Sparkle.tsx | 35 -- src/components/atoms/Spinner.tsx | 17 - src/components/atoms/Stack.tsx | 63 --- src/components/atoms/StatusIcon.tsx | 25 -- src/components/atoms/StepIndicator.tsx | 67 --- src/components/atoms/Stepper.tsx | 67 --- src/components/atoms/TabIcon.tsx | 16 - src/components/atoms/Table.tsx | 84 ---- src/components/atoms/Tabs.tsx | 67 --- src/components/atoms/Tag.tsx | 59 --- src/components/atoms/Text.tsx | 22 - src/components/atoms/TextArea.tsx | 42 -- src/components/atoms/TextGradient.tsx | 38 -- src/components/atoms/TextHighlight.tsx | 27 -- src/components/atoms/Timeline.tsx | 83 ---- src/components/atoms/Timestamp.tsx | 31 -- src/components/atoms/Toggle.tsx | 65 --- src/components/atoms/TreeIcon.tsx | 11 - src/components/atoms/index.ts | 70 --- src/components/molecules/ActionBar.tsx | 44 -- src/components/molecules/AppBranding.tsx | 23 - src/components/molecules/DataCard.tsx | 74 ---- src/components/molecules/DataSourceCard.tsx | 69 --- src/components/molecules/EditorActions.tsx | 32 -- src/components/molecules/EditorToolbar.tsx | 46 -- src/components/molecules/EmptyEditorState.tsx | 13 - src/components/molecules/EmptyState.tsx | 29 -- src/components/molecules/FileTabs.tsx | 40 -- src/components/molecules/LabelWithBadge.tsx | 24 - .../molecules/LazyInlineMonacoEditor.tsx | 56 --- src/components/molecules/LazyMonacoEditor.tsx | 54 --- src/components/molecules/LoadingFallback.tsx | 16 - src/components/molecules/LoadingState.tsx | 15 - .../molecules/MonacoEditorPanel.tsx | 11 - src/components/molecules/NavigationItem.tsx | 45 -- .../molecules/PageHeaderContent.tsx | 23 - src/components/molecules/SearchBar.tsx | 36 -- src/components/molecules/StatCard.tsx | 32 -- src/components/molecules/TreeCard.tsx | 75 ---- src/components/molecules/TreeListHeader.tsx | 53 --- src/components/molecules/index.ts | 19 - src/components/organisms/EmptyCanvasState.tsx | 38 -- src/components/organisms/PageHeader.tsx | 27 -- .../organisms/SchemaEditorCanvas.tsx | 48 -- .../organisms/SchemaEditorPropertiesPanel.tsx | 71 --- .../organisms/SchemaEditorSidebar.tsx | 14 - .../organisms/SchemaEditorStatusBar.tsx | 50 --- .../organisms/SchemaEditorToolbar.tsx | 90 ---- src/components/organisms/ToolbarActions.tsx | 86 ---- src/components/organisms/index.ts | 8 - src/components/ui/accordion.tsx | 64 --- src/components/ui/alert.tsx | 66 --- src/components/ui/aspect-ratio.tsx | 10 - src/components/ui/avatar.tsx | 53 --- src/components/ui/badge.tsx | 46 -- src/components/ui/button.tsx | 64 --- src/components/ui/card.tsx | 92 ---- src/components/ui/checkbox.tsx | 32 -- src/components/ui/collapsible.tsx | 32 -- src/components/ui/hover-card.tsx | 42 -- src/components/ui/input.tsx | 21 - src/components/ui/label.tsx | 24 - src/components/ui/popover.tsx | 48 -- src/components/ui/progress.tsx | 29 -- src/components/ui/radio-group.tsx | 45 -- src/components/ui/resizable.tsx | 54 --- src/components/ui/scroll-area.tsx | 58 --- src/components/ui/separator.tsx | 28 -- src/components/ui/skeleton.tsx | 14 - src/components/ui/switch.tsx | 31 -- src/components/ui/tabs.tsx | 66 --- src/components/ui/textarea.tsx | 18 - src/components/ui/toggle.tsx | 45 -- src/components/ui/tooltip.tsx | 59 --- src/types/json-ui-component-types.ts | 417 ++++++++++-------- 131 files changed, 433 insertions(+), 5648 deletions(-) create mode 100644 scripts/cleanup-simple-components.ts create mode 100644 scripts/update-index-exports.ts delete mode 100644 src/components/atoms/ActionIcon.tsx delete mode 100644 src/components/atoms/Alert.tsx delete mode 100644 src/components/atoms/AppLogo.tsx delete mode 100644 src/components/atoms/Avatar.tsx delete mode 100644 src/components/atoms/AvatarGroup.tsx delete mode 100644 src/components/atoms/Breadcrumb.tsx delete mode 100644 src/components/atoms/ButtonGroup.tsx delete mode 100644 src/components/atoms/Checkbox.tsx delete mode 100644 src/components/atoms/Chip.tsx delete mode 100644 src/components/atoms/Code.tsx delete mode 100644 src/components/atoms/ColorSwatch.tsx delete mode 100644 src/components/atoms/Container.tsx delete mode 100644 src/components/atoms/DataList.tsx delete mode 100644 src/components/atoms/Divider.tsx delete mode 100644 src/components/atoms/Dot.tsx delete mode 100644 src/components/atoms/Drawer.tsx delete mode 100644 src/components/atoms/EmptyStateIcon.tsx delete mode 100644 src/components/atoms/FileIcon.tsx delete mode 100644 src/components/atoms/Flex.tsx delete mode 100644 src/components/atoms/Grid.tsx delete mode 100644 src/components/atoms/Heading.tsx delete mode 100644 src/components/atoms/HelperText.tsx delete mode 100644 src/components/atoms/IconText.tsx delete mode 100644 src/components/atoms/IconWrapper.tsx delete mode 100644 src/components/atoms/InfoBox.tsx delete mode 100644 src/components/atoms/InfoPanel.tsx delete mode 100644 src/components/atoms/Input.tsx delete mode 100644 src/components/atoms/Kbd.tsx delete mode 100644 src/components/atoms/KeyValue.tsx delete mode 100644 src/components/atoms/Label.tsx delete mode 100644 src/components/atoms/Link.tsx delete mode 100644 src/components/atoms/List.tsx delete mode 100644 src/components/atoms/ListItem.tsx delete mode 100644 src/components/atoms/LiveIndicator.tsx delete mode 100644 src/components/atoms/LoadingSpinner.tsx delete mode 100644 src/components/atoms/LoadingState.tsx delete mode 100644 src/components/atoms/MetricDisplay.tsx delete mode 100644 src/components/atoms/Modal.tsx delete mode 100644 src/components/atoms/Notification.tsx delete mode 100644 src/components/atoms/PageHeader.tsx delete mode 100644 src/components/atoms/ProgressBar.tsx delete mode 100644 src/components/atoms/Pulse.tsx delete mode 100644 src/components/atoms/Radio.tsx delete mode 100644 src/components/atoms/Rating.tsx delete mode 100644 src/components/atoms/ResponsiveGrid.tsx delete mode 100644 src/components/atoms/ScrollArea.tsx delete mode 100644 src/components/atoms/SearchInput.tsx delete mode 100644 src/components/atoms/Section.tsx delete mode 100644 src/components/atoms/Select.tsx delete mode 100644 src/components/atoms/Skeleton.tsx delete mode 100644 src/components/atoms/Slider.tsx delete mode 100644 src/components/atoms/Spacer.tsx delete mode 100644 src/components/atoms/Sparkle.tsx delete mode 100644 src/components/atoms/Spinner.tsx delete mode 100644 src/components/atoms/Stack.tsx delete mode 100644 src/components/atoms/StatusIcon.tsx delete mode 100644 src/components/atoms/StepIndicator.tsx delete mode 100644 src/components/atoms/Stepper.tsx delete mode 100644 src/components/atoms/TabIcon.tsx delete mode 100644 src/components/atoms/Table.tsx delete mode 100644 src/components/atoms/Tabs.tsx delete mode 100644 src/components/atoms/Tag.tsx delete mode 100644 src/components/atoms/Text.tsx delete mode 100644 src/components/atoms/TextArea.tsx delete mode 100644 src/components/atoms/TextGradient.tsx delete mode 100644 src/components/atoms/TextHighlight.tsx delete mode 100644 src/components/atoms/Timeline.tsx delete mode 100644 src/components/atoms/Timestamp.tsx delete mode 100644 src/components/atoms/Toggle.tsx delete mode 100644 src/components/atoms/TreeIcon.tsx delete mode 100644 src/components/molecules/ActionBar.tsx delete mode 100644 src/components/molecules/AppBranding.tsx delete mode 100644 src/components/molecules/DataCard.tsx delete mode 100644 src/components/molecules/DataSourceCard.tsx delete mode 100644 src/components/molecules/EditorActions.tsx delete mode 100644 src/components/molecules/EditorToolbar.tsx delete mode 100644 src/components/molecules/EmptyEditorState.tsx delete mode 100644 src/components/molecules/EmptyState.tsx delete mode 100644 src/components/molecules/FileTabs.tsx delete mode 100644 src/components/molecules/LabelWithBadge.tsx delete mode 100644 src/components/molecules/LazyInlineMonacoEditor.tsx delete mode 100644 src/components/molecules/LazyMonacoEditor.tsx delete mode 100644 src/components/molecules/LoadingFallback.tsx delete mode 100644 src/components/molecules/LoadingState.tsx delete mode 100644 src/components/molecules/MonacoEditorPanel.tsx delete mode 100644 src/components/molecules/NavigationItem.tsx delete mode 100644 src/components/molecules/PageHeaderContent.tsx delete mode 100644 src/components/molecules/SearchBar.tsx delete mode 100644 src/components/molecules/StatCard.tsx delete mode 100644 src/components/molecules/TreeCard.tsx delete mode 100644 src/components/molecules/TreeListHeader.tsx delete mode 100644 src/components/organisms/EmptyCanvasState.tsx delete mode 100644 src/components/organisms/PageHeader.tsx delete mode 100644 src/components/organisms/SchemaEditorCanvas.tsx delete mode 100644 src/components/organisms/SchemaEditorPropertiesPanel.tsx delete mode 100644 src/components/organisms/SchemaEditorSidebar.tsx delete mode 100644 src/components/organisms/SchemaEditorStatusBar.tsx delete mode 100644 src/components/organisms/SchemaEditorToolbar.tsx delete mode 100644 src/components/organisms/ToolbarActions.tsx delete mode 100644 src/components/ui/accordion.tsx delete mode 100644 src/components/ui/alert.tsx delete mode 100644 src/components/ui/aspect-ratio.tsx delete mode 100644 src/components/ui/avatar.tsx delete mode 100644 src/components/ui/badge.tsx delete mode 100644 src/components/ui/button.tsx delete mode 100644 src/components/ui/card.tsx delete mode 100644 src/components/ui/checkbox.tsx delete mode 100644 src/components/ui/collapsible.tsx delete mode 100644 src/components/ui/hover-card.tsx delete mode 100644 src/components/ui/input.tsx delete mode 100644 src/components/ui/label.tsx delete mode 100644 src/components/ui/popover.tsx delete mode 100644 src/components/ui/progress.tsx delete mode 100644 src/components/ui/radio-group.tsx delete mode 100644 src/components/ui/resizable.tsx delete mode 100644 src/components/ui/scroll-area.tsx delete mode 100644 src/components/ui/separator.tsx delete mode 100644 src/components/ui/skeleton.tsx delete mode 100644 src/components/ui/switch.tsx delete mode 100644 src/components/ui/tabs.tsx delete mode 100644 src/components/ui/textarea.tsx delete mode 100644 src/components/ui/toggle.tsx delete mode 100644 src/components/ui/tooltip.tsx diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 7f194d0..7b046f4 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -3,7 +3,8 @@ "allow": [ "Bash(ls:*)", "Bash(find:*)", - "Bash(grep:*)" + "Bash(grep:*)", + "Bash(wc:*)" ] } } diff --git a/package-lock.json b/package-lock.json index fb82796..e8c596c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -822,16 +822,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "license": "MIT" @@ -4766,12 +4756,6 @@ "concat-map": "0.0.1" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/callsites": { "version": "3.1.0", "dev": true, @@ -6987,15 +6971,6 @@ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "license": "BSD-3-Clause", @@ -7003,16 +6978,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/state-local": { "version": "1.0.7", "license": "MIT" @@ -7073,30 +7038,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terser": { - "version": "5.46.0", - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/three": { "version": "0.175.0", "license": "MIT" diff --git a/scripts/cleanup-simple-components.ts b/scripts/cleanup-simple-components.ts new file mode 100644 index 0000000..89a44bc --- /dev/null +++ b/scripts/cleanup-simple-components.ts @@ -0,0 +1,115 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const rootDir = path.resolve(__dirname, '..') + +/** + * List of simple presentational components that can be safely deleted + * These were identified by the conversion script as having no hooks or complex logic + */ +const SIMPLE_COMPONENTS = { + atoms: [ + 'ActionIcon', 'Alert', 'AppLogo', 'Avatar', 'Breadcrumb', 'ButtonGroup', + 'Chip', 'Code', 'ColorSwatch', 'Container', 'DataList', 'Divider', 'Dot', + 'EmptyStateIcon', 'FileIcon', 'Flex', 'Grid', 'Heading', 'HelperText', + 'IconText', 'IconWrapper', 'InfoBox', 'InfoPanel', 'Input', 'Kbd', + 'KeyValue', 'Label', 'Link', 'List', 'ListItem', 'LiveIndicator', + 'LoadingSpinner', 'LoadingState', 'MetricDisplay', 'PageHeader', 'Pulse', + 'ResponsiveGrid', 'ScrollArea', 'SearchInput', 'Section', 'Skeleton', + 'Spacer', 'Sparkle', 'Spinner', 'StatusIcon', 'TabIcon', 'Tag', 'Text', + 'TextArea', 'TextGradient', 'TextHighlight', 'Timestamp', 'TreeIcon', + // Additional simple ones + 'AvatarGroup', 'Checkbox', 'Drawer', 'Modal', 'Notification', 'ProgressBar', + 'Radio', 'Rating', 'Select', 'Slider', 'Stack', 'StepIndicator', 'Stepper', + 'Table', 'Tabs', 'Timeline', 'Toggle', + ], + molecules: [ + 'ActionBar', 'AppBranding', 'DataCard', 'DataSourceCard', 'EditorActions', + 'EditorToolbar', 'EmptyEditorState', 'EmptyState', 'FileTabs', 'LabelWithBadge', + 'LazyInlineMonacoEditor', 'LazyMonacoEditor', 'LoadingFallback', 'LoadingState', + 'MonacoEditorPanel', 'NavigationItem', 'PageHeaderContent', 'SearchBar', + 'StatCard', 'TreeCard', 'TreeListHeader', + ], + organisms: [ + 'EmptyCanvasState', 'PageHeader', 'SchemaEditorCanvas', 'SchemaEditorPropertiesPanel', + 'SchemaEditorSidebar', 'SchemaEditorStatusBar', 'SchemaEditorToolbar', 'ToolbarActions', + ], + ui: [ + 'aspect-ratio', 'avatar', 'badge', 'checkbox', 'collapsible', 'hover-card', + 'input', 'label', 'popover', 'progress', 'radio-group', 'resizable', + 'scroll-area', 'separator', 'skeleton', 'switch', 'textarea', 'toggle', + // Additional ones + 'accordion', 'alert', 'button', 'card', 'tabs', 'tooltip', + ], +} + +interface DeletionResult { + deleted: string[] + kept: string[] + failed: string[] +} + +/** + * Delete simple TypeScript components + */ +async function deleteSimpleComponents(): Promise { + console.log('๐Ÿงน Cleaning up simple TypeScript components...\n') + + const results: DeletionResult = { + deleted: [], + kept: [], + failed: [], + } + + // Process each category + for (const [category, components] of Object.entries(SIMPLE_COMPONENTS)) { + console.log(`๐Ÿ“‚ Processing ${category}...`) + + const baseDir = path.join(rootDir, `src/components/${category}`) + + for (const component of components) { + const fileName = component.endsWith('.tsx') ? component : `${component}.tsx` + const filePath = path.join(baseDir, fileName) + + try { + await fs.access(filePath) + await fs.unlink(filePath) + results.deleted.push(`${category}/${fileName}`) + console.log(` โœ… Deleted: ${fileName}`) + } catch (error: unknown) { + // File doesn't exist or couldn't be deleted + if (error instanceof Error && 'code' in error && error.code === 'ENOENT') { + results.kept.push(`${category}/${fileName}`) + console.log(` โญ๏ธ Skipped: ${fileName} (not found)`) + } else { + results.failed.push(`${category}/${fileName}`) + console.log(` โŒ Failed: ${fileName}`) + } + } + } + + console.log() + } + + // Summary + console.log('๐Ÿ“Š Summary:') + console.log(` Deleted: ${results.deleted.length} files`) + console.log(` Skipped: ${results.kept.length} files`) + console.log(` Failed: ${results.failed.length} files`) + + if (results.failed.length > 0) { + console.log('\nโŒ Failed deletions:') + results.failed.forEach(f => console.log(` - ${f}`)) + } + + console.log('\nโœจ Cleanup complete!') + console.log('\n๐Ÿ“ Next steps:') + console.log(' 1. Update index.ts files to remove deleted exports') + console.log(' 2. Search for direct imports of deleted components') + console.log(' 3. Run build to check for errors') + console.log(' 4. Run tests to verify functionality') +} + +deleteSimpleComponents().catch(console.error) diff --git a/scripts/update-index-exports.ts b/scripts/update-index-exports.ts new file mode 100644 index 0000000..2a8de7b --- /dev/null +++ b/scripts/update-index-exports.ts @@ -0,0 +1,76 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const rootDir = path.resolve(__dirname, '..') + +/** + * Update index.ts files to remove exports for deleted components + */ +async function updateIndexFiles(): Promise { + console.log('๐Ÿ“ Updating index.ts files...\n') + + const directories = [ + 'src/components/atoms', + 'src/components/molecules', + 'src/components/organisms', + 'src/components/ui', + ] + + for (const dir of directories) { + const indexPath = path.join(rootDir, dir, 'index.ts') + const dirPath = path.join(rootDir, dir) + + console.log(`๐Ÿ“‚ Processing ${dir}/index.ts...`) + + try { + // Read current index.ts + const indexContent = await fs.readFile(indexPath, 'utf-8') + const lines = indexContent.split('\n') + + // Get list of existing .tsx files + const files = await fs.readdir(dirPath) + const existingComponents = new Set( + files + .filter(f => f.endsWith('.tsx') && f !== 'index.tsx') + .map(f => f.replace('.tsx', '')) + ) + + // Filter out exports for deleted components + const updatedLines = lines.filter(line => { + // Skip empty lines and comments + if (!line.trim() || line.trim().startsWith('//')) { + return true + } + + // Check if it's an export line + const exportMatch = line.match(/export\s+(?:\{([^}]+)\}|.+)\s+from\s+['"]\.\/([^'"]+)['"]/) + if (!exportMatch) { + return true // Keep non-export lines + } + + const componentName = exportMatch[2] + const exists = existingComponents.has(componentName) + + if (!exists) { + console.log(` โŒ Removing export: ${componentName}`) + return false + } + + return true + }) + + // Write updated index.ts + await fs.writeFile(indexPath, updatedLines.join('\n')) + + console.log(` โœ… Updated ${dir}/index.ts\n`) + } catch (error) { + console.error(` โŒ Error processing ${dir}/index.ts:`, error) + } + } + + console.log('โœจ Index files updated!') +} + +updateIndexFiles().catch(console.error) diff --git a/src/components/atoms/ActionIcon.tsx b/src/components/atoms/ActionIcon.tsx deleted file mode 100644 index ea64248..0000000 --- a/src/components/atoms/ActionIcon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Plus, Pencil, Trash, Copy, Download, Upload } from '@phosphor-icons/react' - -interface ActionIconProps { - action: 'add' | 'edit' | 'delete' | 'copy' | 'download' | 'upload' - size?: number - weight?: 'thin' | 'light' | 'regular' | 'bold' | 'fill' | 'duotone' - className?: string -} - -export function ActionIcon({ action, size = 16, weight = 'regular', className = '' }: ActionIconProps) { - const iconMap = { - add: Plus, - edit: Pencil, - delete: Trash, - copy: Copy, - download: Download, - upload: Upload, - } - - const IconComponent = iconMap[action] - return -} diff --git a/src/components/atoms/Alert.tsx b/src/components/atoms/Alert.tsx deleted file mode 100644 index f456881..0000000 --- a/src/components/atoms/Alert.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { ReactNode } from 'react' -import { Info, Warning, CheckCircle, XCircle } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface AlertProps { - variant?: 'info' | 'warning' | 'success' | 'error' - title?: string - children: ReactNode - className?: string -} - -const variantConfig = { - info: { - icon: Info, - classes: 'bg-blue-50 border-blue-200 text-blue-900', - }, - warning: { - icon: Warning, - classes: 'bg-yellow-50 border-yellow-200 text-yellow-900', - }, - success: { - icon: CheckCircle, - classes: 'bg-green-50 border-green-200 text-green-900', - }, - error: { - icon: XCircle, - classes: 'bg-red-50 border-red-200 text-red-900', - }, -} - -export function Alert({ variant = 'info', title, children, className }: AlertProps) { - const config = variantConfig[variant] - const Icon = config.icon - - return ( -
- -
- {title &&
{title}
} -
{children}
-
-
- ) -} diff --git a/src/components/atoms/AppLogo.tsx b/src/components/atoms/AppLogo.tsx deleted file mode 100644 index 7977dc4..0000000 --- a/src/components/atoms/AppLogo.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Code } from '@phosphor-icons/react' - -export function AppLogo() { - return ( -
- -
- ) -} diff --git a/src/components/atoms/Avatar.tsx b/src/components/atoms/Avatar.tsx deleted file mode 100644 index fd5083a..0000000 --- a/src/components/atoms/Avatar.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { cn } from '@/lib/utils' - -interface AvatarProps { - src?: string - alt?: string - fallback?: string - size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' - className?: string -} - -const sizeClasses = { - xs: 'w-6 h-6 text-xs', - sm: 'w-8 h-8 text-sm', - md: 'w-10 h-10 text-base', - lg: 'w-12 h-12 text-lg', - xl: 'w-16 h-16 text-xl', -} - -export function Avatar({ src, alt, fallback, size = 'md', className }: AvatarProps) { - const initials = fallback || alt?.slice(0, 2).toUpperCase() || '?' - - return ( -
- {src ? ( - {alt} - ) : ( - {initials} - )} -
- ) -} diff --git a/src/components/atoms/AvatarGroup.tsx b/src/components/atoms/AvatarGroup.tsx deleted file mode 100644 index da7b7ed..0000000 --- a/src/components/atoms/AvatarGroup.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { cn } from '@/lib/utils' - -interface AvatarGroupProps { - avatars: { - src?: string - alt: string - fallback: string - }[] - max?: number - size?: 'xs' | 'sm' | 'md' | 'lg' - className?: string -} - -const sizeClasses = { - xs: 'h-6 w-6 text-xs', - sm: 'h-8 w-8 text-xs', - md: 'h-10 w-10 text-sm', - lg: 'h-12 w-12 text-base', -} - -export function AvatarGroup({ - avatars, - max = 5, - size = 'md', - className, -}: AvatarGroupProps) { - const displayAvatars = avatars.slice(0, max) - const remainingCount = Math.max(avatars.length - max, 0) - - return ( -
- {displayAvatars.map((avatar, index) => ( -
- {avatar.src ? ( - {avatar.alt} - ) : ( - {avatar.fallback} - )} -
- ))} - {remainingCount > 0 && ( -
- +{remainingCount} -
- )} -
- ) -} diff --git a/src/components/atoms/Breadcrumb.tsx b/src/components/atoms/Breadcrumb.tsx deleted file mode 100644 index 5134007..0000000 --- a/src/components/atoms/Breadcrumb.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { CaretRight } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface BreadcrumbItem { - label: string - href?: string - onClick?: () => void -} - -interface BreadcrumbNavProps { - items?: BreadcrumbItem[] - className?: string -} - -export function BreadcrumbNav({ items = [], className }: BreadcrumbNavProps) { - return ( - - ) -} - -export const Breadcrumb = BreadcrumbNav diff --git a/src/components/atoms/ButtonGroup.tsx b/src/components/atoms/ButtonGroup.tsx deleted file mode 100644 index 1141b89..0000000 --- a/src/components/atoms/ButtonGroup.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { cn } from '@/lib/utils' -import { ReactNode } from 'react' - -interface ButtonGroupProps { - children: ReactNode - orientation?: 'horizontal' | 'vertical' - className?: string -} - -export function ButtonGroup({ - children, - orientation = 'horizontal', - className, -}: ButtonGroupProps) { - return ( -
button]:rounded-none', - '[&>button:first-child]:rounded-l-md', - '[&>button:last-child]:rounded-r-md', - orientation === 'vertical' && '[&>button:first-child]:rounded-t-md [&>button:first-child]:rounded-l-none', - orientation === 'vertical' && '[&>button:last-child]:rounded-b-md [&>button:last-child]:rounded-r-none', - '[&>button:not(:last-child)]:border-r-0', - orientation === 'vertical' && '[&>button:not(:last-child)]:border-b-0 [&>button:not(:last-child)]:border-r', - className - )} - > - {children} -
- ) -} diff --git a/src/components/atoms/Checkbox.tsx b/src/components/atoms/Checkbox.tsx deleted file mode 100644 index e5cf5dd..0000000 --- a/src/components/atoms/Checkbox.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { Check, Minus } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface CheckboxProps { - checked: boolean - onChange: (checked: boolean) => void - label?: string - indeterminate?: boolean - disabled?: boolean - size?: 'sm' | 'md' | 'lg' - className?: string -} - -export function Checkbox({ - checked, - onChange, - label, - indeterminate = false, - disabled = false, - size = 'md', - className -}: CheckboxProps) { - const sizeStyles = { - sm: 'w-4 h-4', - md: 'w-5 h-5', - lg: 'w-6 h-6', - } - - const iconSize = { - sm: 12, - md: 16, - lg: 20, - } - - return ( - - ) -} diff --git a/src/components/atoms/Chip.tsx b/src/components/atoms/Chip.tsx deleted file mode 100644 index fb36da5..0000000 --- a/src/components/atoms/Chip.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { ReactNode } from 'react' -import { X } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface ChipProps { - children: ReactNode - variant?: 'default' | 'primary' | 'accent' | 'muted' - size?: 'sm' | 'md' - onRemove?: () => void - className?: string -} - -const variantClasses = { - default: 'bg-secondary text-secondary-foreground', - primary: 'bg-primary text-primary-foreground', - accent: 'bg-accent text-accent-foreground', - muted: 'bg-muted text-muted-foreground', -} - -const sizeClasses = { - sm: 'px-2 py-0.5 text-xs', - md: 'px-3 py-1 text-sm', -} - -export function Chip({ - children, - variant = 'default', - size = 'md', - onRemove, - className -}: ChipProps) { - return ( - - {children} - {onRemove && ( - - )} - - ) -} diff --git a/src/components/atoms/Code.tsx b/src/components/atoms/Code.tsx deleted file mode 100644 index 0416b4c..0000000 --- a/src/components/atoms/Code.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' - -interface CodeProps { - children: ReactNode - inline?: boolean - className?: string -} - -export function Code({ children, inline = true, className }: CodeProps) { - if (inline) { - return ( - - {children} - - ) - } - - return ( -
-      {children}
-    
- ) -} diff --git a/src/components/atoms/ColorSwatch.tsx b/src/components/atoms/ColorSwatch.tsx deleted file mode 100644 index 28e38cb..0000000 --- a/src/components/atoms/ColorSwatch.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { Check } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface ColorSwatchProps { - color: string - selected?: boolean - onClick?: () => void - size?: 'sm' | 'md' | 'lg' - label?: string - className?: string -} - -export function ColorSwatch({ - color, - selected = false, - onClick, - size = 'md', - label, - className -}: ColorSwatchProps) { - const sizeStyles = { - sm: 'w-6 h-6', - md: 'w-8 h-8', - lg: 'w-10 h-10', - } - - return ( -
- - {label && {label}} -
- ) -} diff --git a/src/components/atoms/Container.tsx b/src/components/atoms/Container.tsx deleted file mode 100644 index e913ad5..0000000 --- a/src/components/atoms/Container.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' - -interface ContainerProps { - children: ReactNode - size?: 'sm' | 'md' | 'lg' | 'xl' | 'full' - className?: string -} - -const sizeClasses = { - sm: 'max-w-screen-sm', - md: 'max-w-screen-md', - lg: 'max-w-screen-lg', - xl: 'max-w-screen-xl', - full: 'max-w-full', -} - -export function Container({ children, size = 'xl', className }: ContainerProps) { - return ( -
- {children} -
- ) -} diff --git a/src/components/atoms/DataList.tsx b/src/components/atoms/DataList.tsx deleted file mode 100644 index 109cb41..0000000 --- a/src/components/atoms/DataList.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' - -export interface DataListProps { - items: any[] - renderItem?: (item: any, index: number) => ReactNode - emptyMessage?: string - className?: string - itemClassName?: string - itemKey?: string -} - -export function DataList({ - items, - renderItem, - emptyMessage = 'No items', - className, - itemClassName, - itemKey, -}: DataListProps) { - if (items.length === 0) { - return ( -
- {emptyMessage} -
- ) - } - - const renderFallbackItem = (item: any) => { - if (itemKey && item && typeof item === 'object') { - const value = item[itemKey] - if (value !== undefined && value !== null) { - return typeof value === 'string' || typeof value === 'number' - ? value - : JSON.stringify(value) - } - } - - if (typeof item === 'string' || typeof item === 'number') { - return item - } - - return JSON.stringify(item) - } - - return ( -
- {items.map((item, index) => ( -
- {renderItem ? renderItem(item, index) : renderFallbackItem(item)} -
- ))} -
- ) -} diff --git a/src/components/atoms/Divider.tsx b/src/components/atoms/Divider.tsx deleted file mode 100644 index 9f87515..0000000 --- a/src/components/atoms/Divider.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { cn } from '@/lib/utils' - -interface DividerProps { - orientation?: 'horizontal' | 'vertical' - className?: string - decorative?: boolean -} - -export function Divider({ - orientation = 'horizontal', - className, - decorative = true -}: DividerProps) { - return ( -
- ) -} diff --git a/src/components/atoms/Dot.tsx b/src/components/atoms/Dot.tsx deleted file mode 100644 index c64addf..0000000 --- a/src/components/atoms/Dot.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { cn } from '@/lib/utils' - -interface DotProps { - variant?: 'default' | 'primary' | 'accent' | 'success' | 'warning' | 'error' - size?: 'xs' | 'sm' | 'md' | 'lg' - pulse?: boolean - className?: string -} - -const variantClasses = { - default: 'bg-muted-foreground', - primary: 'bg-primary', - accent: 'bg-accent', - success: 'bg-green-500', - warning: 'bg-yellow-500', - error: 'bg-destructive', -} - -const sizeClasses = { - xs: 'w-1.5 h-1.5', - sm: 'w-2 h-2', - md: 'w-3 h-3', - lg: 'w-4 h-4', -} - -export function Dot({ - variant = 'default', - size = 'sm', - pulse = false, - className -}: DotProps) { - return ( - - - {pulse && ( - - )} - - ) -} diff --git a/src/components/atoms/Drawer.tsx b/src/components/atoms/Drawer.tsx deleted file mode 100644 index d4138ad..0000000 --- a/src/components/atoms/Drawer.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { X } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface DrawerProps { - isOpen: boolean - onClose: () => void - title?: string - children: React.ReactNode - position?: 'left' | 'right' | 'top' | 'bottom' - size?: 'sm' | 'md' | 'lg' - showCloseButton?: boolean - className?: string -} - -export function Drawer({ - isOpen, - onClose, - title, - children, - position = 'right', - size = 'md', - showCloseButton = true, - className, -}: DrawerProps) { - if (!isOpen) return null - - const positionStyles = { - left: 'left-0 top-0 h-full', - right: 'right-0 top-0 h-full', - top: 'top-0 left-0 w-full', - bottom: 'bottom-0 left-0 w-full', - } - - const sizeStyles = { - sm: position === 'left' || position === 'right' ? 'w-64' : 'h-64', - md: position === 'left' || position === 'right' ? 'w-96' : 'h-96', - lg: position === 'left' || position === 'right' ? 'w-[600px]' : 'h-[600px]', - } - - const slideAnimation = { - left: 'animate-in slide-in-from-left', - right: 'animate-in slide-in-from-right', - top: 'animate-in slide-in-from-top', - bottom: 'animate-in slide-in-from-bottom', - } - - return ( - <> -
-
- {(title || showCloseButton) && ( -
- {title &&

{title}

} - {showCloseButton && ( - - )} -
- )} -
{children}
-
- - ) -} diff --git a/src/components/atoms/EmptyStateIcon.tsx b/src/components/atoms/EmptyStateIcon.tsx deleted file mode 100644 index 9c2153b..0000000 --- a/src/components/atoms/EmptyStateIcon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -interface EmptyStateIconProps { - icon: React.ReactNode - variant?: 'default' | 'muted' -} - -export function EmptyStateIcon({ icon, variant = 'muted' }: EmptyStateIconProps) { - const variantClasses = { - default: 'from-primary/20 to-accent/20 text-primary', - muted: 'from-muted to-muted/50 text-muted-foreground', - } - - return ( -
- {icon} -
- ) -} diff --git a/src/components/atoms/FileIcon.tsx b/src/components/atoms/FileIcon.tsx deleted file mode 100644 index 385b75f..0000000 --- a/src/components/atoms/FileIcon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { FileCode, FileJs, FilePlus } from '@phosphor-icons/react' - -interface FileIconProps { - type?: 'code' | 'json' | 'plus' - size?: number - weight?: 'thin' | 'light' | 'regular' | 'bold' | 'fill' | 'duotone' - className?: string -} - -export function FileIcon({ type = 'code', size = 20, weight = 'regular', className = '' }: FileIconProps) { - const iconMap = { - code: FileCode, - json: FileJs, - plus: FilePlus, - } - - const IconComponent = iconMap[type] - return -} diff --git a/src/components/atoms/Flex.tsx b/src/components/atoms/Flex.tsx deleted file mode 100644 index 7ac4d32..0000000 --- a/src/components/atoms/Flex.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { cn } from '@/lib/utils' -import { ReactNode } from 'react' - -interface FlexProps { - children: ReactNode - direction?: 'row' | 'col' | 'row-reverse' | 'col-reverse' - align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline' - justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly' - gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' - wrap?: 'wrap' | 'nowrap' | 'wrap-reverse' - grow?: boolean - shrink?: boolean - className?: string -} - -const directionClasses = { - row: 'flex-row', - col: 'flex-col', - 'row-reverse': 'flex-row-reverse', - 'col-reverse': 'flex-col-reverse', -} - -const alignClasses = { - start: 'items-start', - center: 'items-center', - end: 'items-end', - stretch: 'items-stretch', - baseline: 'items-baseline', -} - -const justifyClasses = { - start: 'justify-start', - center: 'justify-center', - end: 'justify-end', - between: 'justify-between', - around: 'justify-around', - evenly: 'justify-evenly', -} - -const gapClasses = { - none: 'gap-0', - xs: 'gap-1', - sm: 'gap-2', - md: 'gap-4', - lg: 'gap-6', - xl: 'gap-8', -} - -const wrapClasses = { - wrap: 'flex-wrap', - nowrap: 'flex-nowrap', - 'wrap-reverse': 'flex-wrap-reverse', -} - -export function Flex({ - children, - direction = 'row', - align = 'stretch', - justify = 'start', - gap = 'md', - wrap = 'nowrap', - grow = false, - shrink = false, - className, -}: FlexProps) { - return ( -
- {children} -
- ) -} diff --git a/src/components/atoms/Grid.tsx b/src/components/atoms/Grid.tsx deleted file mode 100644 index e2326d9..0000000 --- a/src/components/atoms/Grid.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { ReactNode } from 'react' - -interface GridProps { - children: ReactNode - cols?: 1 | 2 | 3 | 4 | 6 | 12 - gap?: 1 | 2 | 3 | 4 | 6 | 8 - className?: string -} - -const colsClasses = { - 1: 'grid-cols-1', - 2: 'grid-cols-1 md:grid-cols-2', - 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3', - 4: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4', - 6: 'grid-cols-2 md:grid-cols-3 lg:grid-cols-6', - 12: 'grid-cols-3 md:grid-cols-6 lg:grid-cols-12', -} - -const gapClasses = { - 1: 'gap-1', - 2: 'gap-2', - 3: 'gap-3', - 4: 'gap-4', - 6: 'gap-6', - 8: 'gap-8', -} - -export function Grid({ children, cols = 1, gap = 4, className = '' }: GridProps) { - return ( -
- {children} -
- ) -} diff --git a/src/components/atoms/Heading.tsx b/src/components/atoms/Heading.tsx deleted file mode 100644 index 8f098dd..0000000 --- a/src/components/atoms/Heading.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { ReactNode, createElement } from 'react' - -interface HeadingProps { - children: ReactNode - level?: 1 | 2 | 3 | 4 | 5 | 6 - className?: string -} - -const levelClasses = { - 1: 'text-4xl font-bold tracking-tight', - 2: 'text-3xl font-semibold tracking-tight', - 3: 'text-2xl font-semibold tracking-tight', - 4: 'text-xl font-semibold', - 5: 'text-lg font-medium', - 6: 'text-base font-medium', -} - -export function Heading({ children, level = 1, className = '' }: HeadingProps) { - return createElement( - `h${level}`, - { className: `${levelClasses[level]} ${className}` }, - children - ) -} diff --git a/src/components/atoms/HelperText.tsx b/src/components/atoms/HelperText.tsx deleted file mode 100644 index ce0cd33..0000000 --- a/src/components/atoms/HelperText.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' - -interface HelperTextProps { - children: ReactNode - variant?: 'default' | 'error' | 'success' - className?: string -} - -const variantClasses = { - default: 'text-muted-foreground', - error: 'text-destructive', - success: 'text-green-600', -} - -export function HelperText({ children, variant = 'default', className }: HelperTextProps) { - return ( -

- {children} -

- ) -} diff --git a/src/components/atoms/IconText.tsx b/src/components/atoms/IconText.tsx deleted file mode 100644 index 6582089..0000000 --- a/src/components/atoms/IconText.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { cn } from '@/lib/utils' - -interface IconTextProps { - icon: React.ReactNode - children: React.ReactNode - gap?: 'sm' | 'md' | 'lg' - align?: 'start' | 'center' | 'end' - className?: string -} - -export function IconText({ - icon, - children, - gap = 'md', - align = 'center', - className -}: IconTextProps) { - const gapStyles = { - sm: 'gap-1', - md: 'gap-2', - lg: 'gap-3', - } - - const alignStyles = { - start: 'items-start', - center: 'items-center', - end: 'items-end', - } - - return ( -
- {icon} - {children} -
- ) -} diff --git a/src/components/atoms/IconWrapper.tsx b/src/components/atoms/IconWrapper.tsx deleted file mode 100644 index 27bcf09..0000000 --- a/src/components/atoms/IconWrapper.tsx +++ /dev/null @@ -1,32 +0,0 @@ -interface IconWrapperProps { - icon: React.ReactNode - size?: 'sm' | 'md' | 'lg' - variant?: 'default' | 'muted' | 'primary' | 'destructive' - className?: string -} - -export function IconWrapper({ - icon, - size = 'md', - variant = 'default', - className = '' -}: IconWrapperProps) { - const sizeClasses = { - sm: 'w-4 h-4', - md: 'w-5 h-5', - lg: 'w-6 h-6', - } - - const variantClasses = { - default: 'text-foreground', - muted: 'text-muted-foreground', - primary: 'text-primary', - destructive: 'text-destructive', - } - - return ( - - {icon} - - ) -} diff --git a/src/components/atoms/InfoBox.tsx b/src/components/atoms/InfoBox.tsx deleted file mode 100644 index c49e752..0000000 --- a/src/components/atoms/InfoBox.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { cn } from '@/lib/utils' -import { Info, Warning, CheckCircle, XCircle } from '@phosphor-icons/react' - -interface InfoBoxProps { - type?: 'info' | 'warning' | 'success' | 'error' - title?: string - children: React.ReactNode - className?: string -} - -const iconMap = { - info: Info, - warning: Warning, - success: CheckCircle, - error: XCircle, -} - -const variantClasses = { - info: 'bg-blue-500/10 border-blue-500/20 text-blue-700 dark:text-blue-300', - warning: 'bg-yellow-500/10 border-yellow-500/20 text-yellow-700 dark:text-yellow-300', - success: 'bg-green-500/10 border-green-500/20 text-green-700 dark:text-green-300', - error: 'bg-destructive/10 border-destructive/20 text-destructive', -} - -export function InfoBox({ type = 'info', title, children, className }: InfoBoxProps) { - const Icon = iconMap[type] - - return ( -
- -
- {title &&
{title}
} -
{children}
-
-
- ) -} diff --git a/src/components/atoms/InfoPanel.tsx b/src/components/atoms/InfoPanel.tsx deleted file mode 100644 index df64750..0000000 --- a/src/components/atoms/InfoPanel.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { cn } from '@/lib/utils' -import { ReactNode } from 'react' - -interface InfoPanelProps { - children: ReactNode - variant?: 'info' | 'warning' | 'success' | 'error' | 'default' - title?: string - icon?: ReactNode - className?: string -} - -const variantClasses = { - default: 'bg-card border-border', - info: 'bg-blue-500/10 border-blue-500/20 text-blue-700 dark:text-blue-300', - warning: 'bg-yellow-500/10 border-yellow-500/20 text-yellow-700 dark:text-yellow-300', - success: 'bg-green-500/10 border-green-500/20 text-green-700 dark:text-green-300', - error: 'bg-red-500/10 border-red-500/20 text-red-700 dark:text-red-300', -} - -export function InfoPanel({ - children, - variant = 'default', - title, - icon, - className, -}: InfoPanelProps) { - return ( -
- {(title || icon) && ( -
- {icon &&
{icon}
} - {title &&
{title}
} -
- )} -
{children}
-
- ) -} diff --git a/src/components/atoms/Input.tsx b/src/components/atoms/Input.tsx deleted file mode 100644 index 7b0f3e8..0000000 --- a/src/components/atoms/Input.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { forwardRef } from 'react' -import { cn } from '@/lib/utils' - -interface InputProps extends React.InputHTMLAttributes { - error?: boolean - helperText?: string - label?: string - leftIcon?: React.ReactNode - rightIcon?: React.ReactNode -} - -export const Input = forwardRef( - ({ error, helperText, label, leftIcon, rightIcon, className, ...props }, ref) => { - return ( -
- {label && ( - - )} -
- {leftIcon && ( -
- {leftIcon} -
- )} - - {rightIcon && ( -
- {rightIcon} -
- )} -
- {helperText && ( -

- {helperText} -

- )} -
- ) - } -) - -Input.displayName = 'Input' diff --git a/src/components/atoms/Kbd.tsx b/src/components/atoms/Kbd.tsx deleted file mode 100644 index 42e1e90..0000000 --- a/src/components/atoms/Kbd.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' - -interface KbdProps { - children: ReactNode - className?: string -} - -export function Kbd({ children, className }: KbdProps) { - return ( - - {children} - - ) -} diff --git a/src/components/atoms/KeyValue.tsx b/src/components/atoms/KeyValue.tsx deleted file mode 100644 index d00d644..0000000 --- a/src/components/atoms/KeyValue.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { cn } from '@/lib/utils' - -interface KeyValueProps { - label: string - value: React.ReactNode - orientation?: 'horizontal' | 'vertical' - className?: string - labelClassName?: string - valueClassName?: string -} - -export function KeyValue({ - label, - value, - orientation = 'horizontal', - className, - labelClassName, - valueClassName -}: KeyValueProps) { - return ( -
- - {label} - - - {value} - -
- ) -} diff --git a/src/components/atoms/Label.tsx b/src/components/atoms/Label.tsx deleted file mode 100644 index 97e897c..0000000 --- a/src/components/atoms/Label.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' - -interface LabelProps { - children: ReactNode - htmlFor?: string - required?: boolean - className?: string -} - -export function Label({ children, htmlFor, required, className }: LabelProps) { - return ( - - ) -} diff --git a/src/components/atoms/Link.tsx b/src/components/atoms/Link.tsx deleted file mode 100644 index 34a2089..0000000 --- a/src/components/atoms/Link.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' - -interface LinkProps { - href: string - children: ReactNode - variant?: 'default' | 'muted' | 'accent' | 'destructive' - external?: boolean - className?: string - onClick?: (e: React.MouseEvent) => void -} - -const variantClasses = { - default: 'text-foreground hover:text-primary underline-offset-4 hover:underline', - muted: 'text-muted-foreground hover:text-foreground underline-offset-4 hover:underline', - accent: 'text-accent hover:text-accent/80 underline-offset-4 hover:underline', - destructive: 'text-destructive hover:text-destructive/80 underline-offset-4 hover:underline', -} - -export function Link({ - href, - children, - variant = 'default', - external = false, - className, - onClick -}: LinkProps) { - const externalProps = external ? { target: '_blank', rel: 'noopener noreferrer' } : {} - - return ( - - {children} - - ) -} diff --git a/src/components/atoms/List.tsx b/src/components/atoms/List.tsx deleted file mode 100644 index 325a980..0000000 --- a/src/components/atoms/List.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { ReactNode } from 'react' - -interface ListProps { - items: T[] - renderItem: (item: T, index: number) => ReactNode - emptyMessage?: string - className?: string - itemClassName?: string -} - -export function List({ - items, - renderItem, - emptyMessage = 'No items to display', - className = '', - itemClassName = '' -}: ListProps) { - if (items.length === 0) { - return ( -
- {emptyMessage} -
- ) - } - - return ( -
- {items.map((item, index) => ( -
- {renderItem(item, index)} -
- ))} -
- ) -} diff --git a/src/components/atoms/ListItem.tsx b/src/components/atoms/ListItem.tsx deleted file mode 100644 index 6042eef..0000000 --- a/src/components/atoms/ListItem.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { cn } from '@/lib/utils' - -interface ListItemProps { - icon?: React.ReactNode - children: React.ReactNode - onClick?: () => void - active?: boolean - className?: string - endContent?: React.ReactNode -} - -export function ListItem({ icon, children, onClick, active, className, endContent }: ListItemProps) { - const isInteractive = !!onClick - - return ( -
- {icon &&
{icon}
} -
{children}
- {endContent &&
{endContent}
} -
- ) -} diff --git a/src/components/atoms/LiveIndicator.tsx b/src/components/atoms/LiveIndicator.tsx deleted file mode 100644 index a6ec0a6..0000000 --- a/src/components/atoms/LiveIndicator.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { cn } from '@/lib/utils' - -interface LiveIndicatorProps { - label?: string - showLabel?: boolean - size?: 'sm' | 'md' | 'lg' - className?: string -} - -export function LiveIndicator({ - label = 'LIVE', - showLabel = true, - size = 'md', - className, -}: LiveIndicatorProps) { - const sizeClasses = { - sm: 'text-xs gap-1.5', - md: 'text-sm gap-2', - lg: 'text-base gap-2.5', - } - - const dotSizeClasses = { - sm: 'w-2 h-2', - md: 'w-2.5 h-2.5', - lg: 'w-3 h-3', - } - - return ( -
- - - - - {showLabel && ( - {label} - )} -
- ) -} diff --git a/src/components/atoms/LoadingSpinner.tsx b/src/components/atoms/LoadingSpinner.tsx deleted file mode 100644 index 7420ca7..0000000 --- a/src/components/atoms/LoadingSpinner.tsx +++ /dev/null @@ -1,20 +0,0 @@ -interface LoadingSpinnerProps { - size?: 'sm' | 'md' | 'lg' - className?: string -} - -export function LoadingSpinner({ size = 'md', className = '' }: LoadingSpinnerProps) { - const sizeClasses = { - sm: 'w-4 h-4 border-2', - md: 'w-6 h-6 border-2', - lg: 'w-8 h-8 border-3', - } - - return ( -
- ) -} diff --git a/src/components/atoms/LoadingState.tsx b/src/components/atoms/LoadingState.tsx deleted file mode 100644 index 87ab907..0000000 --- a/src/components/atoms/LoadingState.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { cn } from '@/lib/utils' - -export interface LoadingStateProps { - message?: string - size?: 'sm' | 'md' | 'lg' - className?: string -} - -export function LoadingState({ - message = 'Loading...', - size = 'md', - className -}: LoadingStateProps) { - const sizeClasses = { - sm: 'w-4 h-4 border-2', - md: 'w-8 h-8 border-3', - lg: 'w-12 h-12 border-4', - } - - return ( -
-
- {message && ( -

{message}

- )} -
- ) -} diff --git a/src/components/atoms/MetricDisplay.tsx b/src/components/atoms/MetricDisplay.tsx deleted file mode 100644 index 29549c9..0000000 --- a/src/components/atoms/MetricDisplay.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { cn } from '@/lib/utils' -import { TrendUp, TrendDown } from '@phosphor-icons/react' - -interface MetricDisplayProps { - label: string - value: string | number - trend?: { - value: number - direction: 'up' | 'down' - } - icon?: React.ReactNode - className?: string - variant?: 'default' | 'primary' | 'accent' -} - -export function MetricDisplay({ - label, - value, - trend, - icon, - className, - variant = 'default' -}: MetricDisplayProps) { - const variantClasses = { - default: 'text-foreground', - primary: 'text-primary', - accent: 'text-accent', - } - - return ( -
-
- {icon && {icon}} - {label} -
-
- - {value} - - {trend && ( - - {trend.direction === 'up' ? : } - {Math.abs(trend.value)}% - - )} -
-
- ) -} diff --git a/src/components/atoms/Modal.tsx b/src/components/atoms/Modal.tsx deleted file mode 100644 index 2f2b737..0000000 --- a/src/components/atoms/Modal.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { X } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface ModalProps { - isOpen: boolean - onClose: () => void - title?: string - children: React.ReactNode - size?: 'sm' | 'md' | 'lg' | 'xl' | 'full' - showCloseButton?: boolean - className?: string -} - -export function Modal({ - isOpen, - onClose, - title, - children, - size = 'md', - showCloseButton = true, - className, -}: ModalProps) { - if (!isOpen) return null - - const sizeStyles = { - sm: 'max-w-sm', - md: 'max-w-md', - lg: 'max-w-lg', - xl: 'max-w-xl', - full: 'max-w-full m-4', - } - - return ( -
-
e.stopPropagation()} - > - {(title || showCloseButton) && ( -
- {title &&

{title}

} - {showCloseButton && ( - - )} -
- )} -
{children}
-
-
- ) -} diff --git a/src/components/atoms/Notification.tsx b/src/components/atoms/Notification.tsx deleted file mode 100644 index 452ae42..0000000 --- a/src/components/atoms/Notification.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Info, CheckCircle, Warning, XCircle } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface NotificationProps { - type: 'info' | 'success' | 'warning' | 'error' - title: string - message?: string - onClose?: () => void - className?: string -} - -export function Notification({ type, title, message, onClose, className }: NotificationProps) { - const config = { - info: { - icon: Info, - color: 'text-blue-500', - bg: 'bg-blue-500/10', - border: 'border-blue-500/20', - }, - success: { - icon: CheckCircle, - color: 'text-accent', - bg: 'bg-accent/10', - border: 'border-accent/20', - }, - warning: { - icon: Warning, - color: 'text-yellow-500', - bg: 'bg-yellow-500/10', - border: 'border-yellow-500/20', - }, - error: { - icon: XCircle, - color: 'text-destructive', - bg: 'bg-destructive/10', - border: 'border-destructive/20', - }, - } - - const { icon: Icon, color, bg, border } = config[type] - - return ( -
- -
-

{title}

- {message &&

{message}

} -
- {onClose && ( - - )} -
- ) -} diff --git a/src/components/atoms/PageHeader.tsx b/src/components/atoms/PageHeader.tsx deleted file mode 100644 index cc53c6f..0000000 --- a/src/components/atoms/PageHeader.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { cn } from '@/lib/utils' - -interface BasicPageHeaderProps { - title: string - description?: string - actions?: React.ReactNode - className?: string -} - -export function BasicPageHeader({ title, description, actions, className }: BasicPageHeaderProps) { - return ( -
-
-

{title}

- {description && ( -

{description}

- )} -
- {actions && ( -
{actions}
- )} -
- ) -} diff --git a/src/components/atoms/ProgressBar.tsx b/src/components/atoms/ProgressBar.tsx deleted file mode 100644 index 680a4ec..0000000 --- a/src/components/atoms/ProgressBar.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { cn } from '@/lib/utils' - -interface ProgressBarProps { - value: number - max?: number - size?: 'sm' | 'md' | 'lg' - variant?: 'default' | 'accent' | 'destructive' - showLabel?: boolean - className?: string -} - -const sizeClasses = { - sm: 'h-1', - md: 'h-2', - lg: 'h-3', -} - -const variantClasses = { - default: 'bg-primary', - accent: 'bg-accent', - destructive: 'bg-destructive', -} - -export function ProgressBar({ - value, - max = 100, - size = 'md', - variant = 'default', - showLabel = false, - className -}: ProgressBarProps) { - const percentage = Math.min(Math.max((value / max) * 100, 0), 100) - - return ( -
-
-
-
- {showLabel && ( - - {Math.round(percentage)}% - - )} -
- ) -} diff --git a/src/components/atoms/Pulse.tsx b/src/components/atoms/Pulse.tsx deleted file mode 100644 index 22b9eb3..0000000 --- a/src/components/atoms/Pulse.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { cn } from '@/lib/utils' - -interface PulseProps { - variant?: 'primary' | 'accent' | 'success' | 'warning' | 'error' - size?: 'sm' | 'md' | 'lg' - speed?: 'slow' | 'normal' | 'fast' - className?: string -} - -export function Pulse({ - variant = 'primary', - size = 'md', - speed = 'normal', - className, -}: PulseProps) { - const sizeClasses = { - sm: 'w-2 h-2', - md: 'w-3 h-3', - lg: 'w-4 h-4', - } - - const variantClasses = { - primary: 'bg-primary', - accent: 'bg-accent', - success: 'bg-green-500', - warning: 'bg-yellow-500', - error: 'bg-red-500', - } - - const speedClasses = { - slow: 'animate-pulse [animation-duration:3s]', - normal: 'animate-pulse', - fast: 'animate-pulse [animation-duration:0.5s]', - } - - return ( -
- - -
- ) -} diff --git a/src/components/atoms/Radio.tsx b/src/components/atoms/Radio.tsx deleted file mode 100644 index 7fec135..0000000 --- a/src/components/atoms/Radio.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { cn } from '@/lib/utils' - -interface RadioOption { - value: string - label: string - disabled?: boolean -} - -interface RadioGroupProps { - options: RadioOption[] - value: string - onChange: (value: string) => void - name: string - orientation?: 'horizontal' | 'vertical' - className?: string -} - -export function RadioGroup({ - options, - value, - onChange, - name, - orientation = 'vertical', - className -}: RadioGroupProps) { - return ( -
- {options.map((option) => ( - - ))} -
- ) -} diff --git a/src/components/atoms/Rating.tsx b/src/components/atoms/Rating.tsx deleted file mode 100644 index 4427246..0000000 --- a/src/components/atoms/Rating.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { Star } from '@phosphor-icons/react' -import { cn } from '@/lib/utils' - -interface RatingProps { - value: number - onChange?: (value: number) => void - max?: number - size?: 'sm' | 'md' | 'lg' - readonly?: boolean - showValue?: boolean - className?: string -} - -export function Rating({ - value, - onChange, - max = 5, - size = 'md', - readonly = false, - showValue = false, - className -}: RatingProps) { - const sizeStyles = { - sm: 16, - md: 20, - lg: 24, - } - - const iconSize = sizeStyles[size] - - return ( -
-
- {Array.from({ length: max }, (_, index) => { - const starValue = index + 1 - const isFilled = starValue <= value - const isHalfFilled = starValue - 0.5 === value - - return ( - - ) - })} -
- {showValue && ( - - {value.toFixed(1)} / {max} - - )} -
- ) -} diff --git a/src/components/atoms/ResponsiveGrid.tsx b/src/components/atoms/ResponsiveGrid.tsx deleted file mode 100644 index e4e4073..0000000 --- a/src/components/atoms/ResponsiveGrid.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { cn } from '@/lib/utils' -import { ReactNode } from 'react' - -interface GridProps { - children: ReactNode - columns?: 1 | 2 | 3 | 4 | 5 | 6 - gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' - responsive?: boolean - className?: string -} - -const columnClasses = { - 1: 'grid-cols-1', - 2: 'grid-cols-2', - 3: 'grid-cols-3', - 4: 'grid-cols-4', - 5: 'grid-cols-5', - 6: 'grid-cols-6', -} - -const gapClasses = { - none: 'gap-0', - xs: 'gap-1', - sm: 'gap-2', - md: 'gap-4', - lg: 'gap-6', - xl: 'gap-8', -} - -const responsiveClasses = { - 2: 'grid-cols-1 sm:grid-cols-2', - 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3', - 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4', - 5: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5', - 6: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6', -} - -export function ResponsiveGrid({ - children, - columns = 3, - gap = 'md', - responsive = true, - className, -}: GridProps) { - return ( -
1 ? responsiveClasses[columns] : columnClasses[columns], - gapClasses[gap], - className - )} - > - {children} -
- ) -} diff --git a/src/components/atoms/ScrollArea.tsx b/src/components/atoms/ScrollArea.tsx deleted file mode 100644 index 01b7a2e..0000000 --- a/src/components/atoms/ScrollArea.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' -import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area' - -interface ScrollAreaProps { - children: ReactNode - className?: string - maxHeight?: string | number -} - -export function ScrollArea({ children, className, maxHeight }: ScrollAreaProps) { - return ( - - - {children} - - - - - - - - - - ) -} diff --git a/src/components/atoms/SearchInput.tsx b/src/components/atoms/SearchInput.tsx deleted file mode 100644 index 5258b32..0000000 --- a/src/components/atoms/SearchInput.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { MagnifyingGlass, X } from '@phosphor-icons/react' -import { Input } from './Input' - -interface BasicSearchInputProps { - value: string - onChange: (value: string) => void - placeholder?: string - onClear?: () => void - className?: string -} - -export function BasicSearchInput({ - value, - onChange, - placeholder = 'Search...', - onClear, - className, -}: BasicSearchInputProps) { - const handleClear = () => { - onChange('') - onClear?.() - } - - return ( - onChange(e.target.value)} - placeholder={placeholder} - className={className} - leftIcon={} - rightIcon={ - value && ( - - ) - } - /> - ) -} diff --git a/src/components/atoms/Section.tsx b/src/components/atoms/Section.tsx deleted file mode 100644 index 4fede6d..0000000 --- a/src/components/atoms/Section.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { ReactNode } from 'react' -import { cn } from '@/lib/utils' - -interface SectionProps { - children: ReactNode - spacing?: 'none' | 'sm' | 'md' | 'lg' | 'xl' - className?: string -} - -const spacingClasses = { - none: '', - sm: 'py-4', - md: 'py-8', - lg: 'py-12', - xl: 'py-16', -} - -export function Section({ children, spacing = 'md', className }: SectionProps) { - return ( -
- {children} -
- ) -} diff --git a/src/components/atoms/Select.tsx b/src/components/atoms/Select.tsx deleted file mode 100644 index 3d797db..0000000 --- a/src/components/atoms/Select.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { cn } from '@/lib/utils' - -interface SelectOption { - value: string - label: string - disabled?: boolean -} - -interface SelectProps { - value: string - onChange: (value: string) => void - options: SelectOption[] - label?: string - placeholder?: string - error?: boolean - helperText?: string - disabled?: boolean - className?: string -} - -export function Select({ - value, - onChange, - options, - label, - placeholder = 'Select an option', - error, - helperText, - disabled, - className, -}: SelectProps) { - return ( -
- {label && ( - - )} - - {helperText && ( -

- {helperText} -

- )} -
- ) -} diff --git a/src/components/atoms/Skeleton.tsx b/src/components/atoms/Skeleton.tsx deleted file mode 100644 index 02ec9ec..0000000 --- a/src/components/atoms/Skeleton.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { cn } from '@/lib/utils' - -interface SkeletonProps { - variant?: 'text' | 'rectangular' | 'circular' | 'rounded' - width?: string | number - height?: string | number - className?: string -} - -const variantClasses = { - text: 'rounded h-4', - rectangular: 'rounded-none', - circular: 'rounded-full', - rounded: 'rounded-lg', -} - -export function Skeleton({ - variant = 'rectangular', - width, - height, - className -}: SkeletonProps) { - return ( -
- ) -} diff --git a/src/components/atoms/Slider.tsx b/src/components/atoms/Slider.tsx deleted file mode 100644 index fae44b4..0000000 --- a/src/components/atoms/Slider.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { cn } from '@/lib/utils' - -interface SliderProps { - value: number - onChange: (value: number) => void - min?: number - max?: number - step?: number - label?: string - showValue?: boolean - disabled?: boolean - className?: string -} - -export function Slider({ - value, - onChange, - min = 0, - max = 100, - step = 1, - label, - showValue = false, - disabled = false, - className -}: SliderProps) { - const percentage = ((value - min) / (max - min)) * 100 - - return ( -
- {(label || showValue) && ( -
- {label && {label}} - {showValue && {value}} -
- )} -
- onChange(Number(e.target.value))} - disabled={disabled} - className={cn( - 'w-full h-2 bg-secondary rounded-lg appearance-none cursor-pointer', - 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', - disabled && 'opacity-50 cursor-not-allowed', - '[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-5 [&::-webkit-slider-thumb]:h-5', - '[&::-webkit-slider-thumb]:bg-primary [&::-webkit-slider-thumb]:rounded-full', - '[&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:transition-transform', - '[&::-webkit-slider-thumb]:hover:scale-110', - '[&::-moz-range-thumb]:w-5 [&::-moz-range-thumb]:h-5 [&::-moz-range-thumb]:bg-primary', - '[&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:rounded-full', - '[&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:transition-transform', - '[&::-moz-range-thumb]:hover:scale-110' - )} - style={{ - background: `linear-gradient(to right, hsl(var(--primary)) 0%, hsl(var(--primary)) ${percentage}%, hsl(var(--secondary)) ${percentage}%, hsl(var(--secondary)) 100%)` - }} - /> -
-
- ) -} diff --git a/src/components/atoms/Spacer.tsx b/src/components/atoms/Spacer.tsx deleted file mode 100644 index 6e96b5f..0000000 --- a/src/components/atoms/Spacer.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { cn } from '@/lib/utils' - -interface SpacerProps { - size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' - axis?: 'horizontal' | 'vertical' | 'both' - className?: string -} - -const sizeClasses = { - xs: 1, - sm: 2, - md: 4, - lg: 8, - xl: 16, - '2xl': 24, -} - -export function Spacer({ size = 'md', axis = 'vertical', className }: SpacerProps) { - const spacing = sizeClasses[size] - - return ( -