Skip to main content
Glama
design-system.ts63.1 kB
export interface DesignSystemComponent { name: string; description: string; category: string; props: ComponentProp[]; examples: ComponentExample[]; importPath: string; dependencies?: string[]; } export interface ComponentProp { name: string; type: string; required: boolean; defaultValue?: any; description: string; } export interface ComponentExample { name: string; code: string; description: string; } export class DesignSystemService { private reactComponents: DesignSystemComponent[] = []; private vueComponents: DesignSystemComponent[] = []; constructor() { this.initializeComponents(); } /** * 디자인 시스템(React, Vue) 컴포넌트 메타데이터 제공 필요. * 1. 메타데이터 구조 정의 * 2. 패키지에 manifest 추가. * 3. 디자인 시스템 패키지에서 export 된 컴포넌트 목록을 초기화. */ private initializeComponents(): void { this.reactComponents = [ { name: 'Accordion', description: 'Accordion component for collapsible content sections', category: 'Layout', importPath: '@dealicious/design-system-react/src/components/ssm-accordion', props: [ { name: 'title', type: 'string', required: true, description: 'Accordion title', }, { name: 'defaultExpanded', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the accordion is expanded by default', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the accordion is disabled', }, ], examples: [ { name: 'Basic Accordion', code: '<Accordion title="Section Title">Content here</Accordion>', description: 'Basic accordion usage', }, ], }, { name: 'ArrowPagination', description: 'Arrow-based pagination component', category: 'Navigation', importPath: '@dealicious/design-system-react/src/components/ssm-arrow-pagination', props: [ { name: 'currentPage', type: 'number', required: true, description: 'Current page number', }, { name: 'totalPages', type: 'number', required: true, description: 'Total number of pages', }, { name: 'onPageChange', type: '(page: number) => void', required: true, description: 'Page change handler', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether pagination is disabled', }, ], examples: [ { name: 'Basic Arrow Pagination', code: '<ArrowPagination currentPage={1} totalPages={10} onPageChange={handlePageChange} />', description: 'Basic arrow pagination', }, ], }, { name: 'Badge', description: 'Badge component for status indicators', category: 'Data Display', importPath: '@dealicious/design-system-react/src/components/ssm-badge', props: [ { name: 'variant', type: "'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'", required: false, defaultValue: "'primary'", description: 'Badge variant style', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Badge size', }, ], examples: [ { name: 'Basic Badge', code: '<Badge>New</Badge>', description: 'Basic badge usage', }, { name: 'Success Badge', code: '<Badge variant="success">Completed</Badge>', description: 'Success variant badge', }, ], }, { name: 'Button', description: 'Primary button component with multiple variants', category: 'Actions', importPath: '@dealicious/design-system-react/src/components/ssm-button', props: [ { name: 'variant', type: "'primary' | 'secondary' | 'tertiary' | 'danger'", required: false, defaultValue: "'primary'", description: 'Button variant style', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Button size', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the button is disabled', }, { name: 'loading', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the button is in loading state', }, { name: 'onClick', type: '() => void', required: false, description: 'Click handler function', }, ], examples: [ { name: 'Basic Button', code: '<Button>Click me</Button>', description: 'Basic button usage', }, { name: 'Primary Button', code: '<Button variant="primary">Primary</Button>', description: 'Primary variant button', }, { name: 'Loading Button', code: '<Button loading>Loading...</Button>', description: 'Button in loading state', }, ], }, { name: 'Check', description: 'Checkbox component for form inputs', category: 'Forms', importPath: '@dealicious/design-system-react/src/components/ssm-check', props: [ { name: 'checked', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the checkbox is checked', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the checkbox is disabled', }, { name: 'label', type: 'string', required: false, description: 'Checkbox label text', }, { name: 'onChange', type: '(checked: boolean) => void', required: false, description: 'Change handler function', }, ], examples: [ { name: 'Basic Checkbox', code: '<Check label="Accept terms" />', description: 'Basic checkbox usage', }, { name: 'Checked Checkbox', code: '<Check checked label="Selected" />', description: 'Pre-checked checkbox', }, ], }, { name: 'Chip', description: 'Chip component for tags and labels', category: 'Data Display', importPath: '@dealicious/design-system-react/src/components/ssm-chip', props: [ { name: 'variant', type: "'default' | 'outlined' | 'filled'", required: false, defaultValue: "'default'", description: 'Chip variant style', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Chip size', }, { name: 'onDelete', type: '() => void', required: false, description: 'Delete handler function', }, ], examples: [ { name: 'Basic Chip', code: '<Chip>Tag</Chip>', description: 'Basic chip usage', }, { name: 'Deletable Chip', code: '<Chip onDelete={handleDelete}>Deletable</Chip>', description: 'Chip with delete action', }, ], }, { name: 'Dropdown', description: 'Dropdown select component', category: 'Forms', importPath: '@dealicious/design-system-react/src/components/ssm-dropdown', props: [ { name: 'options', type: 'Array<{ value: string; label: string }>', required: true, description: 'Dropdown options', }, { name: 'value', type: 'string', required: false, description: 'Selected value', }, { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the dropdown is disabled', }, { name: 'onChange', type: '(value: string) => void', required: false, description: 'Change handler function', }, ], examples: [ { name: 'Basic Dropdown', code: '<Dropdown options={options} placeholder="Select..." />', description: 'Basic dropdown usage', }, ], }, { name: 'Error', description: 'Error message display component', category: 'Feedback', importPath: '@dealicious/design-system-react/src/components/ssm-error', props: [ { name: 'message', type: 'string', required: true, description: 'Error message to display', }, { name: 'dismissible', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the error can be dismissed', }, ], examples: [ { name: 'Basic Error', code: '<Error message="Something went wrong" />', description: 'Basic error display', }, ], }, { name: 'HelperText', description: 'Helper text component for form fields', category: 'Forms', importPath: '@dealicious/design-system-react/src/components/ssm-helper-text', props: [ { name: 'text', type: 'string', required: true, description: 'Helper text content', }, { name: 'variant', type: "'default' | 'error' | 'success'", required: false, defaultValue: "'default'", description: 'Helper text variant', }, ], examples: [ { name: 'Basic Helper Text', code: '<HelperText text="Enter your email address" />', description: 'Basic helper text', }, ], }, { name: 'Icon', description: 'Icon component for displaying icons', category: 'Media', importPath: '@dealicious/design-system-react/src/components/ssm-icon', props: [ { name: 'name', type: 'string', required: true, description: 'Icon name', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Icon size', }, { name: 'color', type: 'string', required: false, description: 'Icon color', }, ], examples: [ { name: 'Basic Icon', code: '<Icon name="home" />', description: 'Basic icon usage', }, ], }, { name: 'Input', description: 'Text input component with validation support', category: 'Forms', importPath: '@dealicious/design-system-react/src/components/ssm-input', props: [ { name: 'type', type: "'text' | 'email' | 'password' | 'number'", required: false, defaultValue: "'text'", description: 'Input type', }, { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text', }, { name: 'value', type: 'string', required: false, description: 'Input value', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the input is disabled', }, { name: 'error', type: 'string', required: false, description: 'Error message to display', }, { name: 'onChange', type: '(value: string) => void', required: false, description: 'Change handler function', }, ], examples: [ { name: 'Basic Input', code: '<Input placeholder="Enter text" />', description: 'Basic input field', }, { name: 'Input with Error', code: '<Input error="This field is required" />', description: 'Input with error state', }, ], }, { name: 'LabeledText', description: 'Text component with label', category: 'Data Display', importPath: '@dealicious/design-system-react/src/components/ssm-labeled-text', props: [ { name: 'label', type: 'string', required: true, description: 'Label text', }, { name: 'value', type: 'string', required: true, description: 'Text value', }, ], examples: [ { name: 'Basic Labeled Text', code: '<LabeledText label="Name" value="John Doe" />', description: 'Basic labeled text', }, ], }, { name: 'LayerAlert', description: 'Alert layer component for notifications', category: 'Overlays', importPath: '@dealicious/design-system-react/src/components/ssm-layer-alert', props: [ { name: 'isOpen', type: 'boolean', required: true, description: 'Whether the alert is open', }, { name: 'onClose', type: '() => void', required: true, description: 'Close handler function', }, { name: 'title', type: 'string', required: true, description: 'Alert title', }, { name: 'message', type: 'string', required: true, description: 'Alert message', }, { name: 'variant', type: "'info' | 'warning' | 'error' | 'success'", required: false, defaultValue: "'info'", description: 'Alert variant', }, ], examples: [ { name: 'Basic Alert', code: '<LayerAlert isOpen={isOpen} onClose={handleClose} title="Alert" message="Message" />', description: 'Basic alert layer', }, ], }, { name: 'LayerPopup', description: 'Popup layer component for modals', category: 'Overlays', importPath: '@dealicious/design-system-react/src/components/ssm-layer-popup', props: [ { name: 'isOpen', type: 'boolean', required: true, description: 'Whether the popup is open', }, { name: 'onClose', type: '() => void', required: true, description: 'Close handler function', }, { name: 'title', type: 'string', required: false, description: 'Popup title', }, { name: 'size', type: "'small' | 'medium' | 'large' | 'fullscreen'", required: false, defaultValue: "'medium'", description: 'Popup size', }, ], examples: [ { name: 'Basic Popup', code: '<LayerPopup isOpen={isOpen} onClose={handleClose} title="Popup">Content</LayerPopup>', description: 'Basic popup layer', }, ], }, { name: 'LoadingSpinner', description: 'Loading spinner component', category: 'Feedback', importPath: '@dealicious/design-system-react/src/components/ssm-loading-spinner', props: [ { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Spinner size', }, { name: 'color', type: 'string', required: false, description: 'Spinner color', }, ], examples: [ { name: 'Basic Spinner', code: '<LoadingSpinner />', description: 'Basic loading spinner', }, ], }, { name: 'Notice', description: 'Notice component for announcements', category: 'Feedback', importPath: '@dealicious/design-system-react/src/components/ssm-notice', props: [ { name: 'message', type: 'string', required: true, description: 'Notice message', }, { name: 'variant', type: "'info' | 'warning' | 'error' | 'success'", required: false, defaultValue: "'info'", description: 'Notice variant', }, { name: 'dismissible', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the notice can be dismissed', }, ], examples: [ { name: 'Basic Notice', code: '<Notice message="Important announcement" />', description: 'Basic notice', }, ], }, { name: 'Pagination', description: 'Pagination component for page navigation', category: 'Navigation', importPath: '@dealicious/design-system-react/src/components/ssm-pagination', props: [ { name: 'currentPage', type: 'number', required: true, description: 'Current page number', }, { name: 'totalPages', type: 'number', required: true, description: 'Total number of pages', }, { name: 'onPageChange', type: '(page: number) => void', required: true, description: 'Page change handler', }, ], examples: [ { name: 'Basic Pagination', code: '<Pagination currentPage={1} totalPages={10} onPageChange={handlePageChange} />', description: 'Basic pagination', }, ], }, { name: 'Radio', description: 'Radio button component', category: 'Forms', importPath: '@dealicious/design-system-react/src/components/ssm-radio', props: [ { name: 'value', type: 'string', required: true, description: 'Radio value', }, { name: 'checked', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the radio is checked', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the radio is disabled', }, { name: 'label', type: 'string', required: false, description: 'Radio label text', }, { name: 'onChange', type: '(value: string) => void', required: false, description: 'Change handler function', }, ], examples: [ { name: 'Basic Radio', code: '<Radio value="option1" label="Option 1" />', description: 'Basic radio button', }, ], }, { name: 'Switch', description: 'Switch toggle component', category: 'Forms', importPath: '@dealicious/design-system-react/src/components/ssm-switch', props: [ { name: 'checked', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the switch is checked', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the switch is disabled', }, { name: 'label', type: 'string', required: false, description: 'Switch label text', }, { name: 'onChange', type: '(checked: boolean) => void', required: false, description: 'Change handler function', }, ], examples: [ { name: 'Basic Switch', code: '<Switch label="Enable notifications" />', description: 'Basic switch usage', }, ], }, { name: 'Tab', description: 'Tab component for tabbed interfaces', category: 'Navigation', importPath: '@dealicious/design-system-react/src/components/ssm-tab', props: [ { name: 'tabs', type: 'Array<{ id: string; label: string }>', required: true, description: 'Tab items', }, { name: 'activeTab', type: 'string', required: true, description: 'Active tab ID', }, { name: 'onTabChange', type: '(tabId: string) => void', required: true, description: 'Tab change handler', }, ], examples: [ { name: 'Basic Tabs', code: '<Tab tabs={tabs} activeTab="tab1" onTabChange={handleTabChange} />', description: 'Basic tab component', }, ], }, { name: 'Tag', description: 'Tag component for labels and categories', category: 'Data Display', importPath: '@dealicious/design-system-react/src/components/ssm-tag', props: [ { name: 'variant', type: "'default' | 'primary' | 'success' | 'error' | 'warning'", required: false, defaultValue: "'default'", description: 'Tag variant style', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Tag size', }, ], examples: [ { name: 'Basic Tag', code: '<Tag>Label</Tag>', description: 'Basic tag usage', }, ], }, { name: 'TextField', description: 'Text field component with label', category: 'Forms', importPath: '@dealicious/design-system-react/src/components/ssm-text-field', props: [ { name: 'label', type: 'string', required: true, description: 'Field label', }, { name: 'value', type: 'string', required: false, description: 'Field value', }, { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text', }, { name: 'error', type: 'string', required: false, description: 'Error message', }, { name: 'helperText', type: 'string', required: false, description: 'Helper text', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the field is disabled', }, { name: 'onChange', type: '(value: string) => void', required: false, description: 'Change handler function', }, ], examples: [ { name: 'Basic Text Field', code: '<TextField label="Name" placeholder="Enter name" />', description: 'Basic text field', }, ], }, { name: 'TextLink', description: 'Text link component', category: 'Actions', importPath: '@dealicious/design-system-react/src/components/ssm-text-link', props: [ { name: 'href', type: 'string', required: true, description: 'Link URL', }, { name: 'target', type: "'_self' | '_blank' | '_parent' | '_top'", required: false, defaultValue: "'_self'", description: 'Link target', }, { name: 'variant', type: "'default' | 'primary' | 'secondary'", required: false, defaultValue: "'default'", description: 'Link variant style', }, ], examples: [ { name: 'Basic Text Link', code: '<TextLink href="/about">About</TextLink>', description: 'Basic text link', }, ], }, { name: 'Text', description: 'Text component for typography', category: 'Data Display', importPath: '@dealicious/design-system-react/src/components/ssm-text', props: [ { name: 'variant', type: "'body' | 'heading' | 'caption' | 'overline'", required: false, defaultValue: "'body'", description: 'Text variant', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Text size', }, { name: 'color', type: 'string', required: false, description: 'Text color', }, ], examples: [ { name: 'Basic Text', code: '<Text>Hello World</Text>', description: 'Basic text component', }, { name: 'Heading Text', code: '<Text variant="heading" size="large">Title</Text>', description: 'Heading text', }, ], }, { name: 'Toast', description: 'Toast notification component', category: 'Feedback', importPath: '@dealicious/design-system-react/src/components/ssm-toast', props: [ { name: 'message', type: 'string', required: true, description: 'Toast message', }, { name: 'variant', type: "'success' | 'error' | 'warning' | 'info'", required: false, defaultValue: "'info'", description: 'Toast variant', }, { name: 'duration', type: 'number', required: false, defaultValue: '3000', description: 'Toast duration in milliseconds', }, ], examples: [ { name: 'Basic Toast', code: '<Toast message="Operation completed" variant="success" />', description: 'Basic toast notification', }, ], }, { name: 'Tooltip', description: 'Tooltip component for hover information', category: 'Feedback', importPath: '@dealicious/design-system-react/src/components/ssm-tooltip', props: [ { name: 'content', type: 'string', required: true, description: 'Tooltip content', }, { name: 'placement', type: "'top' | 'bottom' | 'left' | 'right'", required: false, defaultValue: "'top'", description: 'Tooltip placement', }, ], examples: [ { name: 'Basic Tooltip', code: '<Tooltip content="Help text"><Button>Hover me</Button></Tooltip>', description: 'Basic tooltip usage', }, ], }, { name: 'EnvBadge', description: 'Environment badge component', category: 'Data Display', importPath: '@dealicious/design-system-react/src/components/env-badge', props: [ { name: 'environment', type: "'development' | 'staging' | 'production'", required: true, description: 'Environment type', }, ], examples: [ { name: 'Basic Env Badge', code: '<EnvBadge environment="development" />', description: 'Basic environment badge', }, ], }, ]; this.vueComponents = [ { name: 'SsmAccordion', description: 'Accordion component for collapsible content sections', category: 'Layout', importPath: '@dealicious/design-system/src/components/ssm-accordion', props: [ { name: 'title', type: 'string', required: true, description: 'Accordion title', }, { name: 'defaultExpanded', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the accordion is expanded by default', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the accordion is disabled', }, ], examples: [ { name: 'Basic Accordion', code: '<SsmAccordion title="Section Title">Content here</SsmAccordion>', description: 'Basic accordion usage', }, ], }, { name: 'SsmArrowPagination', description: 'Arrow-based pagination component', category: 'Navigation', importPath: '@dealicious/design-system/src/components/ssm-arrow-pagination', props: [ { name: 'currentPage', type: 'number', required: true, description: 'Current page number', }, { name: 'totalPages', type: 'number', required: true, description: 'Total number of pages', }, { name: 'onPageChange', type: '(page: number) => void', required: true, description: 'Page change handler', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether pagination is disabled', }, ], examples: [ { name: 'Basic Arrow Pagination', code: '<SsmArrowPagination :current-page="1" :total-pages="10" @page-change="handlePageChange" />', description: 'Basic arrow pagination', }, ], }, { name: 'SsmBadge', description: 'Badge component for status indicators', category: 'Data Display', importPath: '@dealicious/design-system/src/components/ssm-badge', props: [ { name: 'variant', type: "'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'", required: false, defaultValue: "'primary'", description: 'Badge variant style', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Badge size', }, ], examples: [ { name: 'Basic Badge', code: '<SsmBadge>New</SsmBadge>', description: 'Basic badge usage', }, { name: 'Success Badge', code: '<SsmBadge variant="success">Completed</SsmBadge>', description: 'Success variant badge', }, ], }, { name: 'SsmButton', description: 'Primary button component with multiple variants', category: 'Actions', importPath: '@dealicious/design-system/src/components/ssm-button', props: [ { name: 'variant', type: "'primary' | 'secondary' | 'tertiary' | 'danger'", required: false, defaultValue: "'primary'", description: 'Button variant style', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Button size', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the button is disabled', }, { name: 'loading', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the button is in loading state', }, ], examples: [ { name: 'Basic Button', code: '<SsmButton>Click me</SsmButton>', description: 'Basic button usage', }, { name: 'Primary Button', code: '<SsmButton variant="primary">Primary</SsmButton>', description: 'Primary variant button', }, ], }, { name: 'SsmCheck', description: 'Checkbox component for form inputs', category: 'Forms', importPath: '@dealicious/design-system/src/components/ssm-check', props: [ { name: 'modelValue', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the checkbox is checked (v-model)', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the checkbox is disabled', }, { name: 'label', type: 'string', required: false, description: 'Checkbox label text', }, ], examples: [ { name: 'Basic Checkbox', code: '<SsmCheck label="Accept terms" v-model="checked" />', description: 'Basic checkbox usage', }, ], }, { name: 'SsmChip', description: 'Chip component for tags and labels', category: 'Data Display', importPath: '@dealicious/design-system/src/components/ssm-chip', props: [ { name: 'variant', type: "'default' | 'outlined' | 'filled'", required: false, defaultValue: "'default'", description: 'Chip variant style', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Chip size', }, ], examples: [ { name: 'Basic Chip', code: '<SsmChip>Tag</SsmChip>', description: 'Basic chip usage', }, ], }, { name: 'SsmDropdown', description: 'Dropdown select component', category: 'Forms', importPath: '@dealicious/design-system/src/components/ssm-dropdown', props: [ { name: 'options', type: 'Array<{ value: string; label: string }>', required: true, description: 'Dropdown options', }, { name: 'modelValue', type: 'string', required: false, description: 'Selected value (v-model)', }, { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the dropdown is disabled', }, ], examples: [ { name: 'Basic Dropdown', code: '<SsmDropdown :options="options" placeholder="Select..." v-model="selected" />', description: 'Basic dropdown usage', }, ], }, { name: 'SsmError', description: 'Error message display component', category: 'Feedback', importPath: '@dealicious/design-system/src/components/ssm-error', props: [ { name: 'message', type: 'string', required: true, description: 'Error message to display', }, { name: 'dismissible', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the error can be dismissed', }, ], examples: [ { name: 'Basic Error', code: '<SsmError message="Something went wrong" />', description: 'Basic error display', }, ], }, { name: 'SsmHelperText', description: 'Helper text component for form fields', category: 'Forms', importPath: '@dealicious/design-system/src/components/ssm-helper-text', props: [ { name: 'text', type: 'string', required: true, description: 'Helper text content', }, { name: 'variant', type: "'default' | 'error' | 'success'", required: false, defaultValue: "'default'", description: 'Helper text variant', }, ], examples: [ { name: 'Basic Helper Text', code: '<SsmHelperText text="Enter your email address" />', description: 'Basic helper text', }, ], }, { name: 'SsmIcon', description: 'Icon component for displaying icons', category: 'Media', importPath: '@dealicious/design-system/src/components/ssm-icon', props: [ { name: 'name', type: 'string', required: true, description: 'Icon name', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Icon size', }, { name: 'color', type: 'string', required: false, description: 'Icon color', }, ], examples: [ { name: 'Basic Icon', code: '<SsmIcon name="home" />', description: 'Basic icon usage', }, ], }, { name: 'SsmImage', description: 'Image component with loading and error handling', category: 'Media', importPath: '@dealicious/design-system/src/components/ssm-image', props: [ { name: 'src', type: 'string', required: true, description: 'Image source URL', }, { name: 'alt', type: 'string', required: false, description: 'Image alt text', }, { name: 'width', type: 'string | number', required: false, description: 'Image width', }, { name: 'height', type: 'string | number', required: false, description: 'Image height', }, ], examples: [ { name: 'Basic Image', code: '<SsmImage src="/image.jpg" alt="Description" />', description: 'Basic image usage', }, ], }, { name: 'SsmInput', description: 'Text input component with validation support', category: 'Forms', importPath: '@dealicious/design-system/src/components/ssm-input', props: [ { name: 'type', type: "'text' | 'email' | 'password' | 'number'", required: false, defaultValue: "'text'", description: 'Input type', }, { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text', }, { name: 'modelValue', type: 'string', required: false, description: 'Input value (v-model)', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the input is disabled', }, { name: 'error', type: 'string', required: false, description: 'Error message to display', }, ], examples: [ { name: 'Basic Input', code: '<SsmInput placeholder="Enter text" v-model="value" />', description: 'Basic input field with v-model', }, { name: 'Input with Error', code: '<SsmInput error="This field is required" />', description: 'Input with error state', }, ], }, { name: 'SsmLabeledText', description: 'Text component with label', category: 'Data Display', importPath: '@dealicious/design-system/src/components/ssm-labeled-text', props: [ { name: 'label', type: 'string', required: true, description: 'Label text', }, { name: 'value', type: 'string', required: true, description: 'Text value', }, ], examples: [ { name: 'Basic Labeled Text', code: '<SsmLabeledText label="Name" value="John Doe" />', description: 'Basic labeled text', }, ], }, { name: 'SsmLayerAlert', description: 'Alert layer component for notifications', category: 'Overlays', importPath: '@dealicious/design-system/src/components/ssm-layer-alert', props: [ { name: 'isOpen', type: 'boolean', required: true, description: 'Whether the alert is open', }, { name: 'title', type: 'string', required: true, description: 'Alert title', }, { name: 'message', type: 'string', required: true, description: 'Alert message', }, { name: 'variant', type: "'info' | 'warning' | 'error' | 'success'", required: false, defaultValue: "'info'", description: 'Alert variant', }, ], examples: [ { name: 'Basic Alert', code: '<SsmLayerAlert :is-open="isOpen" title="Alert" message="Message" @close="handleClose" />', description: 'Basic alert layer', }, ], }, { name: 'SsmLayerModal', description: 'Modal layer component for dialogs', category: 'Overlays', importPath: '@dealicious/design-system/src/components/ssm-layer-modal', props: [ { name: 'isOpen', type: 'boolean', required: true, description: 'Whether the modal is open', }, { name: 'title', type: 'string', required: false, description: 'Modal title', }, { name: 'size', type: "'small' | 'medium' | 'large' | 'fullscreen'", required: false, defaultValue: "'medium'", description: 'Modal size', }, ], examples: [ { name: 'Basic Modal', code: '<SsmLayerModal :is-open="isOpen" title="Modal Title" @close="handleClose">Content</SsmLayerModal>', description: 'Basic modal layer', }, ], }, { name: 'SsmLoadingSpinner', description: 'Loading spinner component', category: 'Feedback', importPath: '@dealicious/design-system/src/components/ssm-loading-spinner', props: [ { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Spinner size', }, { name: 'color', type: 'string', required: false, description: 'Spinner color', }, ], examples: [ { name: 'Basic Spinner', code: '<SsmLoadingSpinner />', description: 'Basic loading spinner', }, ], }, { name: 'SsmNotice', description: 'Notice component for announcements', category: 'Feedback', importPath: '@dealicious/design-system/src/components/ssm-notice', props: [ { name: 'message', type: 'string', required: true, description: 'Notice message', }, { name: 'variant', type: "'info' | 'warning' | 'error' | 'success'", required: false, defaultValue: "'info'", description: 'Notice variant', }, { name: 'dismissible', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the notice can be dismissed', }, ], examples: [ { name: 'Basic Notice', code: '<SsmNotice message="Important announcement" />', description: 'Basic notice', }, ], }, { name: 'SsmPagination', description: 'Pagination component for page navigation', category: 'Navigation', importPath: '@dealicious/design-system/src/components/ssm-pagination', props: [ { name: 'currentPage', type: 'number', required: true, description: 'Current page number', }, { name: 'totalPages', type: 'number', required: true, description: 'Total number of pages', }, ], examples: [ { name: 'Basic Pagination', code: '<SsmPagination :current-page="1" :total-pages="10" @page-change="handlePageChange" />', description: 'Basic pagination', }, ], }, { name: 'SsmRadioGroup', description: 'Radio button group component', category: 'Forms', importPath: '@dealicious/design-system/src/components/ssm-radio-group', props: [ { name: 'options', type: 'Array<{ value: string; label: string }>', required: true, description: 'Radio options', }, { name: 'modelValue', type: 'string', required: false, description: 'Selected value (v-model)', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the radio group is disabled', }, ], examples: [ { name: 'Basic Radio Group', code: '<SsmRadioGroup :options="options" v-model="selected" />', description: 'Basic radio group', }, ], }, { name: 'SsmSwitch', description: 'Switch toggle component', category: 'Forms', importPath: '@dealicious/design-system/src/components/ssm-switch', props: [ { name: 'modelValue', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the switch is checked (v-model)', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the switch is disabled', }, { name: 'label', type: 'string', required: false, description: 'Switch label text', }, ], examples: [ { name: 'Basic Switch', code: '<SsmSwitch label="Enable notifications" v-model="enabled" />', description: 'Basic switch usage', }, ], }, { name: 'SsmTab', description: 'Tab component for tabbed interfaces', category: 'Navigation', importPath: '@dealicious/design-system/src/components/ssm-tab', props: [ { name: 'tabs', type: 'Array<{ id: string; label: string }>', required: true, description: 'Tab items', }, { name: 'activeTab', type: 'string', required: true, description: 'Active tab ID', }, ], examples: [ { name: 'Basic Tabs', code: '<SsmTab :tabs="tabs" :active-tab="activeTab" @tab-change="handleTabChange" />', description: 'Basic tab component', }, ], }, { name: 'SsmTag', description: 'Tag component for labels and categories', category: 'Data Display', importPath: '@dealicious/design-system/src/components/ssm-tag', props: [ { name: 'variant', type: "'default' | 'primary' | 'success' | 'error' | 'warning'", required: false, defaultValue: "'default'", description: 'Tag variant style', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Tag size', }, ], examples: [ { name: 'Basic Tag', code: '<SsmTag>Label</SsmTag>', description: 'Basic tag usage', }, ], }, { name: 'SsmText', description: 'Text component for typography', category: 'Data Display', importPath: '@dealicious/design-system/src/components/ssm-text', props: [ { name: 'variant', type: "'body' | 'heading' | 'caption' | 'overline'", required: false, defaultValue: "'body'", description: 'Text variant', }, { name: 'size', type: "'small' | 'medium' | 'large'", required: false, defaultValue: "'medium'", description: 'Text size', }, { name: 'color', type: 'string', required: false, description: 'Text color', }, ], examples: [ { name: 'Basic Text', code: '<SsmText>Hello World</SsmText>', description: 'Basic text component', }, { name: 'Heading Text', code: '<SsmText variant="heading" size="large">Title</SsmText>', description: 'Heading text', }, ], }, { name: 'SsmTextField', description: 'Text field component with label', category: 'Forms', importPath: '@dealicious/design-system/src/components/ssm-text-field', props: [ { name: 'label', type: 'string', required: true, description: 'Field label', }, { name: 'modelValue', type: 'string', required: false, description: 'Field value (v-model)', }, { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text', }, { name: 'error', type: 'string', required: false, description: 'Error message', }, { name: 'helperText', type: 'string', required: false, description: 'Helper text', }, { name: 'disabled', type: 'boolean', required: false, defaultValue: 'false', description: 'Whether the field is disabled', }, ], examples: [ { name: 'Basic Text Field', code: '<SsmTextField label="Name" placeholder="Enter name" v-model="name" />', description: 'Basic text field', }, ], }, { name: 'SsmTextLink', description: 'Text link component', category: 'Actions', importPath: '@dealicious/design-system/src/components/ssm-text-link', props: [ { name: 'href', type: 'string', required: true, description: 'Link URL', }, { name: 'target', type: "'_self' | '_blank' | '_parent' | '_top'", required: false, defaultValue: "'_self'", description: 'Link target', }, { name: 'variant', type: "'default' | 'primary' | 'secondary'", required: false, defaultValue: "'default'", description: 'Link variant style', }, ], examples: [ { name: 'Basic Text Link', code: '<SsmTextLink href="/about">About</SsmTextLink>', description: 'Basic text link', }, ], }, { name: 'SsmToast', description: 'Toast notification component', category: 'Feedback', importPath: '@dealicious/design-system/src/components/ssm-toast', props: [ { name: 'message', type: 'string', required: true, description: 'Toast message', }, { name: 'variant', type: "'success' | 'error' | 'warning' | 'info'", required: false, defaultValue: "'info'", description: 'Toast variant', }, { name: 'duration', type: 'number', required: false, defaultValue: '3000', description: 'Toast duration in milliseconds', }, ], examples: [ { name: 'Basic Toast', code: '<SsmToast message="Operation completed" variant="success" />', description: 'Basic toast notification', }, ], }, { name: 'SsmTooltip', description: 'Tooltip component for hover information', category: 'Feedback', importPath: '@dealicious/design-system/src/components/ssm-tooltip', props: [ { name: 'content', type: 'string', required: true, description: 'Tooltip content', }, { name: 'placement', type: "'top' | 'bottom' | 'left' | 'right'", required: false, defaultValue: "'top'", description: 'Tooltip placement', }, ], examples: [ { name: 'Basic Tooltip', code: '<SsmTooltip content="Help text"><SsmButton>Hover me</SsmButton></SsmTooltip>', description: 'Basic tooltip usage', }, ], }, { name: 'EnvBadge', description: 'Environment badge component', category: 'Data Display', importPath: '@dealicious/design-system/src/components/env-badge', props: [ { name: 'environment', type: "'development' | 'staging' | 'production'", required: true, description: 'Environment type', }, ], examples: [ { name: 'Basic Env Badge', code: '<EnvBadge environment="development" />', description: 'Basic environment badge', }, ], }, ]; } /** * 프레임워크(React 또는 Vue)에 대해 사용 가능한 구성 요소 가져오기 */ async getAvailableComponents(framework: 'react' | 'vue'): Promise<DesignSystemComponent[]> { return framework === 'react' ? this.reactComponents : this.vueComponents; } /** * Figma 컴포넌트(FigmaNode)에 가장 잘 맞는 컴포넌트(DesignSystemComponent) 찾기 */ findBestMatch(figmaComponentName: string, framework: 'react' | 'vue'): DesignSystemComponent | null { const components = framework === 'react' ? this.reactComponents : this.vueComponents; // 정규화: ssm- 접두사 제거, 하이픈 제거, 소문자 변환 const normalizeName = (name: string): string => { return name .toLowerCase() .replace(/^ssm-/, '') // ssm- 접두사 제거 .replace(/^ssm/, '') // ssm 접두사 제거 .replace(/-/g, '') // 하이픈 제거 .trim(); }; const normalizedFigmaName = normalizeName(figmaComponentName); // Direct name match (정규화된 이름으로 비교) const directMatch = components.find(comp => { const normalizedCompName = normalizeName(comp.name); return normalizedCompName === normalizedFigmaName; }); if (directMatch) return directMatch; // 패턴 기반 유사 매칭 const lowerName = normalizedFigmaName; for (const component of components) { const componentName = normalizeName(component.name); // Figma 이름에 컴포넌트 이름이 포함되어 있는지 확인 if (lowerName.includes(componentName) || componentName.includes(lowerName)) { return component; } // 일반적인 변형 확인 const variations = [ componentName + 's', // 복수형 componentName.replace('button', 'btn'), componentName.replace('input', 'field'), componentName.replace('card', 'panel'), componentName.replace('modal', 'popup'), componentName.replace('modal', 'dialog'), componentName.replace('textfield', 'textfield'), componentName.replace('textfield', 'input'), componentName.replace('radiogroup', 'radio'), componentName.replace('layerpopup', 'popup'), componentName.replace('layerpopup', 'modal'), componentName.replace('layeralert', 'alert'), ]; for (const variation of variations) { if (lowerName.includes(variation) || variation.includes(lowerName)) { return component; } } } return null; } /** * 이름으로 컴포넌트 가져오기 */ getComponent(name: string, framework: 'react' | 'vue'): DesignSystemComponent | null { const components = framework === 'react' ? this.reactComponents : this.vueComponents; return components.find(comp => comp.name === name) || null; } /** * 카테고리로 컴포넌트 가져오기 */ getComponentsByCategory(category: string, framework: 'react' | 'vue'): DesignSystemComponent[] { const components = framework === 'react' ? this.reactComponents : this.vueComponents; return components.filter(comp => comp.category === category); } /** * 모든 가능한 카테고리 가져오기 */ getCategories(framework: 'react' | 'vue'): string[] { const components = framework === 'react' ? this.reactComponents : this.vueComponents; const categories = new Set(components.map(comp => comp.category)); return Array.from(categories); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Opti-kjh/palatte'

If you have feedback or need assistance with the MCP directory API, please join our Discord server