diff --git a/app/components/@settings/core/AvatarDropdown.tsx b/app/components/@settings/core/AvatarDropdown.tsx index b9a3b76b..10d1f76f 100644 --- a/app/components/@settings/core/AvatarDropdown.tsx +++ b/app/components/@settings/core/AvatarDropdown.tsx @@ -5,6 +5,12 @@ import { classNames } from '~/utils/classNames'; import { profileStore } from '~/lib/stores/profile'; import type { TabType, Profile } from './types'; +const BetaLabel = () => ( + + BETA + +); + interface AvatarDropdownProps { onSelectTab: (tab: TabType) => void; } @@ -15,55 +21,52 @@ export const AvatarDropdown = ({ onSelectTab }: AvatarDropdownProps) => { return ( - -
- {profile?.avatar ? ( -
- {profile?.username -
-
- ) : ( -
- )} -
+ + {profile?.avatar ? ( +
+ {profile?.username +
+ ) : ( +
+
+
+ )} + {/* Add subtle circular highlight effect */} +
@@ -86,7 +89,7 @@ export const AvatarDropdown = ({ onSelectTab }: AvatarDropdownProps) => { 'border-b border-gray-200/50 dark:border-gray-800/50', )} > -
+
{profile?.avatar ? ( { decoding="sync" /> ) : ( -
-
+
+ ?
)}
@@ -121,7 +124,7 @@ export const AvatarDropdown = ({ onSelectTab }: AvatarDropdownProps) => { )} onClick={() => onSelectTab('profile')} > -
+
Edit Profile @@ -137,7 +140,7 @@ export const AvatarDropdown = ({ onSelectTab }: AvatarDropdownProps) => { )} onClick={() => onSelectTab('settings')} > -
+
Settings @@ -155,8 +158,9 @@ export const AvatarDropdown = ({ onSelectTab }: AvatarDropdownProps) => { )} onClick={() => onSelectTab('task-manager')} > -
+
Task Manager + { )} onClick={() => onSelectTab('service-status')} > -
+
Service Status + diff --git a/app/components/@settings/core/ControlPanel.tsx b/app/components/@settings/core/ControlPanel.tsx index 3c067e1a..3ccc3be0 100644 --- a/app/components/@settings/core/ControlPanel.tsx +++ b/app/components/@settings/core/ControlPanel.tsx @@ -82,6 +82,15 @@ const TAB_DESCRIPTIONS: Record = { 'tab-management': 'Configure visible tabs and their order', }; +// Beta status for experimental features +const BETA_TABS = new Set(['task-manager', 'service-status']); + +const BetaLabel = () => ( +
+ BETA +
+); + const AnimatedSwitch = ({ checked, onCheckedChange, id, label }: AnimatedSwitchProps) => { return (
@@ -108,11 +117,12 @@ const AnimatedSwitch = ({ checked, onCheckedChange, id, label }: AnimatedSwitchP 'group-hover:shadow-md group-active:shadow-sm', 'group-hover:scale-95 group-active:scale-90', )} - layout + initial={false} transition={{ type: 'spring', stiffness: 500, damping: 30, + duration: 0.2, }} animate={{ x: checked ? '1.25rem' : '0rem', @@ -414,29 +424,13 @@ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => { {/* Header */}
- {activeTab || showTabManagement ? ( + {(activeTab || showTabManagement) && ( - ) : ( - -
-
-
- )} {showTabManagement ? 'Tab Management' : activeTab ? TAB_LABELS[activeTab] : 'Control Panel'} @@ -462,7 +456,7 @@ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => { {/* Close Button */} @@ -513,8 +507,10 @@ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => { statusMessage={getStatusMessage(tab.id)} description={TAB_DESCRIPTIONS[tab.id]} isLoading={loadingTab === tab.id} - className="h-full" - /> + className="h-full relative" + > + {BETA_TABS.has(tab.id) && } + ))} diff --git a/app/components/@settings/shared/components/TabTile.tsx b/app/components/@settings/shared/components/TabTile.tsx index be91c4f7..ea409d69 100644 --- a/app/components/@settings/shared/components/TabTile.tsx +++ b/app/components/@settings/shared/components/TabTile.tsx @@ -13,9 +13,10 @@ interface TabTileProps { description?: string; isLoading?: boolean; className?: string; + children?: React.ReactNode; } -export const TabTile = ({ +export const TabTile: React.FC = ({ tab, onClick, isActive, @@ -24,6 +25,7 @@ export const TabTile = ({ description, isLoading, className, + children, }: TabTileProps) => { return ( @@ -100,62 +102,33 @@ export const TabTile = ({
- {/* Status Indicator */} + {/* Update Indicator with Tooltip */} {hasUpdate && ( - + <> +
+ + + {statusMessage} + + + + )} - {/* Loading Overlay */} - {isLoading && ( - - - - )} + {/* Children (e.g. Beta Label) */} + {children} - - - {statusMessage || TAB_LABELS[tab.id]} - - - ); diff --git a/app/components/@settings/tabs/features/FeaturesTab.tsx b/app/components/@settings/tabs/features/FeaturesTab.tsx index 9aa838c4..20fbd10e 100644 --- a/app/components/@settings/tabs/features/FeaturesTab.tsx +++ b/app/components/@settings/tabs/features/FeaturesTab.tsx @@ -121,19 +121,13 @@ export default function FeaturesTab() { // Enable features by default on first load React.useEffect(() => { - // Only enable if they haven't been explicitly set before - if (isLatestBranch === undefined) { - enableLatestBranch(true); - } - - if (contextOptimizationEnabled === undefined) { - enableContextOptimization(true); - } - - if (autoSelectTemplate === undefined) { - setAutoSelectTemplate(true); - } + // Force enable these features by default + enableLatestBranch(true); + enableContextOptimization(true); + setAutoSelectTemplate(true); + setPromptId('optimized'); + // Only enable event logs if not explicitly set before if (eventLogs === undefined) { setEventLogs(true); }