11import type { UIKey } from '../../locales' ;
2- import {
3- Terminal , Settings , Shield , GitBranch , FolderSymlink ,
4- Variable , Globe , RefreshCw , Sparkles , Server , Lock ,
5- } from 'lucide-react' ;
62import styles from './Features.module.scss' ;
73
84const featureKeys = [
9- { key : 'multiCli' , icon : Terminal } ,
10- { key : 'multiConfig' , icon : Settings } ,
11- { key : 'daemon' , icon : Server } ,
12- { key : 'failover' , icon : Shield } ,
13- { key : 'routing' , icon : GitBranch } ,
14- { key : 'binding' , icon : FolderSymlink } ,
15- { key : 'envVars' , icon : Variable } ,
16- { key : 'webUi' , icon : Globe } ,
17- { key : 'webSecurity' , icon : Lock } ,
18- { key : 'configSync' , icon : RefreshCw } ,
5+ 'multiCli' , 'multiConfig' , 'daemon' , 'failover' , 'routing' ,
6+ 'binding' , 'envVars' , 'webUi' , 'webSecurity' , 'configSync' ,
197] ;
208
21- const featureDefaults : Record < string , { title : string ; desc : string } > = {
22- multiCli : { title : 'Multi-CLI Support' , desc : 'Support for Claude Code, Codex, and OpenCode with per-project configuration' } ,
23- multiConfig : { title : 'Config Management' , desc : 'Manage all API provider configs in a unified JSON file' } ,
24- daemon : { title : 'Unified Daemon' , desc : 'Single zend process hosts both the proxy server and the Web UI' } ,
25- failover : { title : 'Proxy Failover' , desc : 'Built-in HTTP proxy with automatic failover when primary provider is unavailable' } ,
26- routing : { title : 'Scenario Routing' , desc : 'Intelligent routing based on request characteristics (thinking, image, etc.)' } ,
27- binding : { title : 'Project Bindings' , desc : 'Bind directories to specific profiles and CLIs for automatic project-level configuration' } ,
28- envVars : { title : 'Environment Variables' , desc : 'Configure per-CLI environment variables at the provider level' } ,
29- webUi : { title : 'Web Interface' , desc : 'Browser-based visual management with password-protected access' } ,
30- webSecurity : { title : 'Web Security' , desc : 'Auto-generated password, session-based auth, RSA encryption for token transport' } ,
31- configSync : { title : 'Config Sync' , desc : 'Sync providers, profiles, and settings across devices with AES-256-GCM encryption' } ,
32- } ;
33-
349export function Features ( { t} : { readonly t : ( key : UIKey ) => string } ) {
3510 return (
3611 < section className = { styles . section } >
@@ -39,9 +14,9 @@ export function Features({t}: {readonly t: (key: UIKey) => string}) {
3914 { t ( 'features.title' ) }
4015 </ h2 >
4116 < div className = { styles . grid } >
42- { featureKeys . map ( ( { key, icon : Icon } ) => (
17+ { featureKeys . map ( ( key , index ) => (
4318 < div key = { key } className = { styles . card } >
44- < div className = { styles . iconBox } > < Icon size = { 20 } /> </ div >
19+ < span className = { styles . number } > { String ( index + 1 ) . padStart ( 2 , '0' ) } </ span >
4520 < h3 className = { styles . cardTitle } >
4621 { t ( `features.${ key } .title` as UIKey ) }
4722 </ h3 >
@@ -51,12 +26,8 @@ export function Features({t}: {readonly t: (key: UIKey) => string}) {
5126 </ div >
5227 ) ) }
5328 < div className = { styles . comingSoon } >
54- < div >
55- < div className = { styles . comingSoonIcon } > < Sparkles size = { 20 } /> </ div >
56- < p className = { styles . comingSoonText } >
57- { t ( 'features.comingSoon' ) }
58- </ p >
59- </ div >
29+ < span className = { styles . number } > ··</ span >
30+ < p className = { styles . comingSoonText } > { t ( 'features.comingSoon' ) } </ p >
6031 </ div >
6132 </ div >
6233 </ div >
0 commit comments