@decido/ui 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +10 -0
- package/.turbo/turbo-build.log +13 -0
- package/.turbo/turbo-lint.log +54 -0
- package/dist/components/DebugPanel.d.ts +3 -0
- package/dist/components/DebugPanel.js +195 -0
- package/dist/components/DebugPanelManager.d.ts +3 -0
- package/dist/components/DebugPanelManager.js +20 -0
- package/dist/components/DecidoButton.d.ts +11 -0
- package/dist/components/DecidoButton.js +15 -0
- package/dist/components/LoginView.d.ts +6 -0
- package/dist/components/LoginView.js +36 -0
- package/dist/components/WelcomeView.d.ts +6 -0
- package/dist/components/WelcomeView.js +16 -0
- package/dist/components/base/BaseComponent.d.ts +12 -0
- package/dist/components/base/BaseComponent.js +43 -0
- package/dist/components/base/BaseComponentBacjup.d.ts +12 -0
- package/dist/components/base/BaseComponentBacjup.js +43 -0
- package/dist/components/base/BaseComponentLit.d.ts +9 -0
- package/dist/components/base/BaseComponentLit.js +30 -0
- package/dist/components/base/shared-styles.d.ts +4 -0
- package/dist/components/base/shared-styles.js +18 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.js +7 -0
- package/dist/components/landing/index.d.ts +11 -0
- package/dist/components/landing/index.js +11 -0
- package/dist/components/landing/landing-button.d.ts +9 -0
- package/dist/components/landing/landing-button.js +5 -0
- package/dist/components/landing/landing-card.d.ts +6 -0
- package/dist/components/landing/landing-card.js +5 -0
- package/dist/components/landing/landing-cta.d.ts +10 -0
- package/dist/components/landing/landing-cta.js +5 -0
- package/dist/components/landing/landing-feature-card.d.ts +35 -0
- package/dist/components/landing/landing-feature-card.js +35 -0
- package/dist/components/landing/landing-footer.d.ts +18 -0
- package/dist/components/landing/landing-footer.js +7 -0
- package/dist/components/landing/landing-header.d.ts +21 -0
- package/dist/components/landing/landing-header.js +7 -0
- package/dist/components/landing/landing-hero.d.ts +22 -0
- package/dist/components/landing/landing-hero.js +10 -0
- package/dist/components/landing/landing-page.d.ts +3 -0
- package/dist/components/landing/landing-page.js +34 -0
- package/dist/components/landing/landing-section.d.ts +14 -0
- package/dist/components/landing/landing-section.js +8 -0
- package/dist/components/landing/landing-testimonial-card.d.ts +11 -0
- package/dist/components/landing/landing-testimonial-card.js +9 -0
- package/dist/components/landing/landing-waitlist.d.ts +27 -0
- package/dist/components/landing/landing-waitlist.js +18 -0
- package/dist/components/theming/ColorPicker.d.ts +8 -0
- package/dist/components/theming/ColorPicker.js +19 -0
- package/dist/components/theming/ThemePanel.d.ts +5 -0
- package/dist/components/theming/ThemePanel.js +12 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +19 -0
- package/dist/utils/counter.d.ts +1 -0
- package/dist/utils/counter.js +9 -0
- package/eslint.config.js +11 -0
- package/package.json +47 -0
- package/src/components/DebugPanel.tsx +347 -0
- package/src/components/DebugPanelManager.tsx +40 -0
- package/src/components/DecidoButton.tsx +43 -0
- package/src/components/LoginView.tsx +85 -0
- package/src/components/WelcomeView.tsx +47 -0
- package/src/components/base/landing.css +477 -0
- package/src/components/base/shared-styles.ts +21 -0
- package/src/components/index.ts +7 -0
- package/src/components/landing/index.tsx +11 -0
- package/src/components/landing/landing-button.tsx +26 -0
- package/src/components/landing/landing-card.tsx +15 -0
- package/src/components/landing/landing-cta.tsx +42 -0
- package/src/components/landing/landing-feature-card.tsx +149 -0
- package/src/components/landing/landing-footer.tsx +66 -0
- package/src/components/landing/landing-header.tsx +55 -0
- package/src/components/landing/landing-hero.tsx +94 -0
- package/src/components/landing/landing-page.tsx +143 -0
- package/src/components/landing/landing-section.tsx +42 -0
- package/src/components/landing/landing-testimonial-card.tsx +50 -0
- package/src/components/landing/landing-waitlist.tsx +115 -0
- package/src/components/theming/ColorPicker.tsx +40 -0
- package/src/components/theming/ThemePanel.tsx +43 -0
- package/src/css/base.css +483 -0
- package/src/css/components.css +309 -0
- package/src/css/debug-panel.css +1368 -0
- package/src/css/layout.css +289 -0
- package/src/css/login-view.css +45 -0
- package/src/css/style.css +20 -0
- package/src/css/welcome-view.css +56 -0
- package/src/css/workbench.css +383 -0
- package/src/globals.d.ts +8 -0
- package/src/index.ts +24 -0
- package/src/utils/counter.d.ts.map +1 -0
- package/src/utils/counter.js +9 -0
- package/src/utils/counter.ts +9 -0
- package/src/vite-env.d.ts +1 -0
- package/tailwind.config.js +7 -0
- package/tsconfig.json +35 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import LandingCard from './landing-card'; // Assuming LandingCard is now a React component
|
|
3
|
+
|
|
4
|
+
interface FormData {
|
|
5
|
+
placeholder: string;
|
|
6
|
+
button_text: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface SuccessData {
|
|
10
|
+
title: string;
|
|
11
|
+
subtitle: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface TrustIndicator {
|
|
16
|
+
icon: string;
|
|
17
|
+
color: string;
|
|
18
|
+
text: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface LandingWaitlistProps {
|
|
22
|
+
data: {
|
|
23
|
+
title: string;
|
|
24
|
+
subtitle: string;
|
|
25
|
+
urgency: string;
|
|
26
|
+
form: FormData;
|
|
27
|
+
success: SuccessData;
|
|
28
|
+
trust_indicators: TrustIndicator[];
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const LandingWaitlist: React.FC<LandingWaitlistProps> = ({ data }) => {
|
|
33
|
+
const [email, setEmail] = useState('');
|
|
34
|
+
const [showSuccess, setShowSuccess] = useState(false);
|
|
35
|
+
|
|
36
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
// Here you would typically send the email to your backend
|
|
39
|
+
console.log('Submitting email:', email);
|
|
40
|
+
setShowSuccess(true);
|
|
41
|
+
setEmail(''); // Clear the input
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
if (!data) return null;
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<div id="waitlist-section" className="scroll-reveal max-w-2xl mx-auto mb-20" style={{ animationDelay: '0.8s' }}>
|
|
48
|
+
<LandingCard>
|
|
49
|
+
<div className="absolute inset-0 bg-linear-to-br from-purple-900/20 via-transparent to-cyan-900/20"></div>
|
|
50
|
+
<div className="relative z-10">
|
|
51
|
+
<div className="text-center mb-8">
|
|
52
|
+
<h3 className="text-3xl font-bold mb-4">
|
|
53
|
+
<span className="gradient-text">{data.title}</span>
|
|
54
|
+
</h3>
|
|
55
|
+
<p className="text-gray-300 text-lg">{data.subtitle}</p>
|
|
56
|
+
<div className="inline-flex items-center mt-4 bg-yellow-900/30 border border-yellow-500/30 rounded-full px-4 py-2 text-sm">
|
|
57
|
+
<i className="fas fa-fire text-yellow-400 mr-2"></i>
|
|
58
|
+
<span className="text-yellow-300" dangerouslySetInnerHTML={{ __html: data.urgency }}></span>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
{!showSuccess ? (
|
|
63
|
+
<form id="waitlistForm" className="form-premium space-y-6" onSubmit={handleSubmit}>
|
|
64
|
+
<div className="relative group">
|
|
65
|
+
<div className="absolute inset-y-0 left-0 pl-6 flex items-center pointer-events-none">
|
|
66
|
+
<i className="fas fa-envelope text-gray-400 group-focus-within:text-purple-400 transition-colors"></i>
|
|
67
|
+
</div>
|
|
68
|
+
<input
|
|
69
|
+
type="email"
|
|
70
|
+
id="email"
|
|
71
|
+
required
|
|
72
|
+
placeholder={data.form.placeholder}
|
|
73
|
+
value={email}
|
|
74
|
+
onChange={(e) => setEmail(e.target.value)}
|
|
75
|
+
className="w-full pl-14 pr-6 py-6 rounded-2xl text-white placeholder-gray-400 text-lg font-medium focus:outline-none"
|
|
76
|
+
/>
|
|
77
|
+
</div>
|
|
78
|
+
<button type="submit" className="btn-premium w-full text-white font-bold py-6 px-8 rounded-2xl text-lg relative overflow-hidden group">
|
|
79
|
+
<span className="relative z-10 flex items-center justify-center">
|
|
80
|
+
<i className="fas fa-rocket mr-3"></i>
|
|
81
|
+
{data.form.button_text}
|
|
82
|
+
<i className="fas fa-arrow-right ml-3 group-hover:translate-x-1 transition-transform"></i>
|
|
83
|
+
</span>
|
|
84
|
+
</button>
|
|
85
|
+
</form>
|
|
86
|
+
) : (
|
|
87
|
+
<div id="successMessage" className="mt-8">
|
|
88
|
+
<div className="bg-linear-to-r from-green-900/40 to-emerald-900/40 border-2 border-green-500/30 rounded-3xl p-8 text-center">
|
|
89
|
+
<div className="text-6xl mb-4">🎉</div>
|
|
90
|
+
<h4 className="text-2xl font-bold text-green-400 mb-3">{data.success.title}</h4>
|
|
91
|
+
<p className="text-green-300 mb-4 text-lg">{data.success.subtitle}</p>
|
|
92
|
+
<div className="bg-green-900/30 rounded-xl p-4">
|
|
93
|
+
<p className="text-sm text-green-300"><i className="fas fa-check-circle mr-2"></i>{data.success.message}</p>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
)}
|
|
98
|
+
|
|
99
|
+
<div className="mt-8 text-center">
|
|
100
|
+
<div className="flex flex-wrap items-center justify-center gap-6 text-sm text-gray-400">
|
|
101
|
+
{data.trust_indicators.map((indicator, index) => (
|
|
102
|
+
<div key={index} className="flex items-center">
|
|
103
|
+
<i className={`${indicator.icon} mr-2 ${indicator.color}`}></i>
|
|
104
|
+
<span>{indicator.text}</span>
|
|
105
|
+
</div>
|
|
106
|
+
))}
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</LandingCard>
|
|
111
|
+
</div>
|
|
112
|
+
);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export default LandingWaitlist;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import { useTheme } from '@decido/shell';
|
|
3
|
+
|
|
4
|
+
interface ColorPickerProps {
|
|
5
|
+
label: string;
|
|
6
|
+
tokenName: string;
|
|
7
|
+
value: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const ColorPicker: React.FC<ColorPickerProps> = ({ label, tokenName, value }) => {
|
|
11
|
+
const [color, setColor] = useState(value);
|
|
12
|
+
const { setToken } = useTheme();
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
setColor(value);
|
|
16
|
+
}, [value]);
|
|
17
|
+
|
|
18
|
+
const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
19
|
+
const newValue = e.target.value;
|
|
20
|
+
setColor(newValue);
|
|
21
|
+
// setToken expects the key name without the --ds- prefix, as defined in useTheme.ts
|
|
22
|
+
// @ts-ignore
|
|
23
|
+
setToken(tokenName, newValue);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div className="flex items-center justify-between">
|
|
28
|
+
<label htmlFor={`color-input-${tokenName}`}>{label}</label>
|
|
29
|
+
<input
|
|
30
|
+
id={`color-input-${tokenName}`}
|
|
31
|
+
type="color"
|
|
32
|
+
className="w-10 h-8 border-none bg-transparent cursor-pointer"
|
|
33
|
+
value={color}
|
|
34
|
+
onChange={handleInput}
|
|
35
|
+
/>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default ColorPicker;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTheme } from '@decido/shell';
|
|
3
|
+
import ColorPicker from './ColorPicker';
|
|
4
|
+
import DecidoButton from '../DecidoButton';
|
|
5
|
+
|
|
6
|
+
interface ThemePanelProps {
|
|
7
|
+
// Define props if any, for now, it takes none.
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const ThemePanel: React.FC<ThemePanelProps> = () => {
|
|
11
|
+
const { currentThemeId, getAllPresets, setTheme } = useTheme();
|
|
12
|
+
const presets = getAllPresets();
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<div className="p-6 glass-card rounded-2xl space-y-8">
|
|
16
|
+
<div>
|
|
17
|
+
<h3 className="font-bold text-lg mb-4">Temas Disponibles (Aura)</h3>
|
|
18
|
+
<div className="flex gap-4 flex-wrap">
|
|
19
|
+
{presets.map(preset => (
|
|
20
|
+
//@ts-ignore
|
|
21
|
+
<DecidoButton
|
|
22
|
+
key={preset.id}
|
|
23
|
+
onClick={() => setTheme(preset.id)}
|
|
24
|
+
className={`btn-secondary ${currentThemeId === preset.id ? 'ring-2 ring-primary' : ''}`}
|
|
25
|
+
>
|
|
26
|
+
{preset.name}
|
|
27
|
+
</DecidoButton>
|
|
28
|
+
))}
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<div>
|
|
32
|
+
<h3 className="font-bold text-lg mb-4">Personalización Manual</h3>
|
|
33
|
+
<div className="space-y-3">
|
|
34
|
+
<ColorPicker label="Superficie Primaria" tokenName="surface-primary" value="#0a0a0f" />
|
|
35
|
+
<ColorPicker label="Acento Principal" tokenName="accent-blue" value="#4a9eff" />
|
|
36
|
+
<ColorPicker label="Texto Principal" tokenName="text-primary" value="#e8e8f0" />
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export default ThemePanel;
|
package/src/css/base.css
ADDED
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
/* /css/base.css */
|
|
2
|
+
@import "@fortawesome/fontawesome-free/css/all.min.css";
|
|
3
|
+
@tailwind base;
|
|
4
|
+
|
|
5
|
+
/* Define las variables globales (tokens de diseño) para toda la aplicación.
|
|
6
|
+
Incluye la paleta de colores, tipografías y espaciados base.
|
|
7
|
+
*/
|
|
8
|
+
@layer base {
|
|
9
|
+
:root {
|
|
10
|
+
/* Paleta de Colores Principal */
|
|
11
|
+
--color-primary: 139 92 246; /* #8B5CF6 */
|
|
12
|
+
--color-secondary: 6 182 212; /* #06B6D4 */
|
|
13
|
+
--color-accent: 245 158 11; /* #F59E0B */
|
|
14
|
+
--color-success: 16 185 129; /* #10B981 */
|
|
15
|
+
--color-danger: 239 68 68; /* #EF4444 */
|
|
16
|
+
--color-info: 59 130 246; /* #3b82f6 */
|
|
17
|
+
--color-dark: 15 15 35; /* #0F0F23 */
|
|
18
|
+
--color-darker: 7 7 32; /* #070720 */
|
|
19
|
+
|
|
20
|
+
/* Paleta de Fondos */
|
|
21
|
+
--bg-dark: theme("colors.dark");
|
|
22
|
+
--bg-darker: theme("colors.darker");
|
|
23
|
+
--bg-surface: rgba(255, 255, 255, 0.05);
|
|
24
|
+
--bg-surface-hover: rgba(255, 255, 255, 0.1);
|
|
25
|
+
--bg-premium: rgba(15, 15, 35, 0.5);
|
|
26
|
+
|
|
27
|
+
/* Paleta de Texto */
|
|
28
|
+
--text-primary: #ffffff;
|
|
29
|
+
--text-secondary: #9ca3af; /* gray-400 */
|
|
30
|
+
--text-muted: #6b7280; /* gray-500 */
|
|
31
|
+
--text-accent: var(--accent);
|
|
32
|
+
|
|
33
|
+
/* Tipografía */
|
|
34
|
+
--font-family-sans: theme("fontFamily.inter");
|
|
35
|
+
--font-family-mono: theme("fontFamily.mono");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
body {
|
|
39
|
+
background-color: var(--bg-darker);
|
|
40
|
+
color: var(--text-primary);
|
|
41
|
+
font-family: var(--font-family-sans);
|
|
42
|
+
-webkit-font-smoothing: antialiased;
|
|
43
|
+
-moz-osx-font-smoothing: grayscale;
|
|
44
|
+
overflow: hidden; /* Cada panel gestiona su propio scroll */
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Estilos globales para la barra de scroll */
|
|
48
|
+
::-webkit-scrollbar {
|
|
49
|
+
width: 8px;
|
|
50
|
+
height: 8px;
|
|
51
|
+
}
|
|
52
|
+
::-webkit-scrollbar-track {
|
|
53
|
+
background: var(--bg-darker);
|
|
54
|
+
}
|
|
55
|
+
::-webkit-scrollbar-thumb {
|
|
56
|
+
background: linear-gradient(to bottom, var(--primary), var(--secondary));
|
|
57
|
+
border-radius: 4px;
|
|
58
|
+
}
|
|
59
|
+
::-webkit-scrollbar-thumb:hover {
|
|
60
|
+
background: linear-gradient(to bottom, #7c3aed, #0891b2);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/* TODO: Revisar estos estilos son de los temas */
|
|
64
|
+
|
|
65
|
+
:root {
|
|
66
|
+
/* Color tokens */
|
|
67
|
+
--color-primary: #0066cc;
|
|
68
|
+
--color-secondary: #666666;
|
|
69
|
+
--color-accent: #ff6b35;
|
|
70
|
+
--color-background: #ffffff;
|
|
71
|
+
--color-surface: #f8f9fa;
|
|
72
|
+
--color-text: #333333;
|
|
73
|
+
--color-text-secondary: #666666;
|
|
74
|
+
--color-border: #e1e5e9;
|
|
75
|
+
--color-success: #28a745;
|
|
76
|
+
--color-warning: #ffc107;
|
|
77
|
+
--color-error: #dc3545;
|
|
78
|
+
--color-info: #17a2b8;
|
|
79
|
+
|
|
80
|
+
/* Spacing tokens */
|
|
81
|
+
--spacing-xs: 0.25rem;
|
|
82
|
+
--spacing-sm: 0.5rem;
|
|
83
|
+
--spacing-md: 1rem;
|
|
84
|
+
--spacing-lg: 1.5rem;
|
|
85
|
+
--spacing-xl: 2rem;
|
|
86
|
+
|
|
87
|
+
/* Typography tokens */
|
|
88
|
+
--font-family: system-ui, -apple-system, sans-serif;
|
|
89
|
+
--font-size-xs: 0.75rem;
|
|
90
|
+
--font-size-sm: 0.875rem;
|
|
91
|
+
--font-size-md: 1rem;
|
|
92
|
+
--font-size-lg: 1.125rem;
|
|
93
|
+
--font-size-xl: 1.25rem;
|
|
94
|
+
|
|
95
|
+
/* Shadow tokens */
|
|
96
|
+
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
|
97
|
+
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
|
|
98
|
+
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Workbench layout CSS variables */
|
|
102
|
+
:root {
|
|
103
|
+
--panel-height: 250px;
|
|
104
|
+
--sidebar-width: 280px;
|
|
105
|
+
--sidebar-right-width: 350px;
|
|
106
|
+
--activity-bar-width: 48px;
|
|
107
|
+
--status-bar-height: 24px;
|
|
108
|
+
--top-bar-height: 35px;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Base workbench styles */
|
|
112
|
+
.workbench-container {
|
|
113
|
+
font-family: var(--font-family);
|
|
114
|
+
color: var(--color-text);
|
|
115
|
+
background-color: var(--color-background);
|
|
116
|
+
height: 100vh;
|
|
117
|
+
overflow: hidden;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.workbench-grid {
|
|
121
|
+
display: grid;
|
|
122
|
+
grid-template-columns: var(--activity-bar-width) var(--sidebar-width) 1fr var(--sidebar-right-width);
|
|
123
|
+
grid-template-rows: var(--top-bar-height) 1fr var(--panel-height) var(--status-bar-height);
|
|
124
|
+
grid-template-areas:
|
|
125
|
+
"top-bar top-bar top-bar top-bar"
|
|
126
|
+
"activity-bar sidebar main sidebar-right"
|
|
127
|
+
"activity-bar sidebar panel sidebar-right"
|
|
128
|
+
"status-bar status-bar status-bar status-bar";
|
|
129
|
+
height: 100vh;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.workbench-grid.sidebar-hidden {
|
|
133
|
+
grid-template-columns: var(--activity-bar-width) 0 1fr var(--sidebar-right-width);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.workbench-grid.sidebar-right-hidden {
|
|
137
|
+
grid-template-columns: var(--activity-bar-width) var(--sidebar-width) 1fr 0;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.workbench-grid.panel-hidden {
|
|
141
|
+
grid-template-rows: var(--top-bar-height) 1fr var(--status-bar-height);
|
|
142
|
+
grid-template-areas:
|
|
143
|
+
"top-bar top-bar top-bar top-bar"
|
|
144
|
+
"activity-bar sidebar main sidebar-right"
|
|
145
|
+
"status-bar status-bar status-bar status-bar";
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* Activity Bar */
|
|
149
|
+
.activity-bar {
|
|
150
|
+
grid-area: activity-bar;
|
|
151
|
+
background-color: var(--color-surface);
|
|
152
|
+
border-right: 1px solid var(--color-border);
|
|
153
|
+
display: flex;
|
|
154
|
+
flex-direction: column;
|
|
155
|
+
align-items: center;
|
|
156
|
+
padding: var(--spacing-sm);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.activity-bar-item {
|
|
160
|
+
width: 32px;
|
|
161
|
+
height: 32px;
|
|
162
|
+
margin-bottom: var(--spacing-sm);
|
|
163
|
+
background: transparent;
|
|
164
|
+
border: none;
|
|
165
|
+
border-radius: 4px;
|
|
166
|
+
display: flex;
|
|
167
|
+
align-items: center;
|
|
168
|
+
justify-content: center;
|
|
169
|
+
cursor: pointer;
|
|
170
|
+
color: var(--color-text-secondary);
|
|
171
|
+
transition: all 0.2s ease;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.activity-bar-item:hover {
|
|
175
|
+
background-color: var(--color-primary);
|
|
176
|
+
color: var(--color-background);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.activity-bar-item.active {
|
|
180
|
+
background-color: var(--color-primary);
|
|
181
|
+
color: var(--color-background);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* Sidebar */
|
|
185
|
+
.sidebar {
|
|
186
|
+
grid-area: sidebar;
|
|
187
|
+
background-color: var(--color-surface);
|
|
188
|
+
border-right: 1px solid var(--color-border);
|
|
189
|
+
overflow: hidden;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.sidebar.hidden {
|
|
193
|
+
display: none;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.sidebar-header {
|
|
197
|
+
padding: var(--spacing-md);
|
|
198
|
+
border-bottom: 1px solid var(--color-border);
|
|
199
|
+
display: flex;
|
|
200
|
+
justify-content: space-between;
|
|
201
|
+
align-items: center;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.sidebar-title {
|
|
205
|
+
font-size: var(--font-size-md);
|
|
206
|
+
font-weight: 600;
|
|
207
|
+
margin: 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.sidebar-content {
|
|
211
|
+
padding: var(--spacing-md);
|
|
212
|
+
height: calc(100% - 60px);
|
|
213
|
+
overflow-y: auto;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/* Main content area */
|
|
217
|
+
.main-content {
|
|
218
|
+
grid-area: main;
|
|
219
|
+
background-color: var(--color-background);
|
|
220
|
+
overflow: hidden;
|
|
221
|
+
display: flex;
|
|
222
|
+
flex-direction: column;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Editor panes */
|
|
226
|
+
.pane-container {
|
|
227
|
+
display: flex;
|
|
228
|
+
flex: 1;
|
|
229
|
+
overflow: hidden;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.editor-pane {
|
|
233
|
+
flex: 1;
|
|
234
|
+
display: flex;
|
|
235
|
+
flex-direction: column;
|
|
236
|
+
min-width: 200px;
|
|
237
|
+
border-right: 1px solid var(--color-border);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.editor-pane:last-child {
|
|
241
|
+
border-right: none;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.editor-pane.active {
|
|
245
|
+
border-top: 2px solid var(--color-primary);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.tab-bar {
|
|
249
|
+
display: flex;
|
|
250
|
+
background-color: var(--color-surface);
|
|
251
|
+
border-bottom: 1px solid var(--color-border);
|
|
252
|
+
min-height: 35px;
|
|
253
|
+
align-items: center;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.tab-item {
|
|
257
|
+
display: flex;
|
|
258
|
+
align-items: center;
|
|
259
|
+
padding: var(--spacing-sm) var(--spacing-md);
|
|
260
|
+
cursor: pointer;
|
|
261
|
+
border-right: 1px solid var(--color-border);
|
|
262
|
+
background-color: var(--color-surface);
|
|
263
|
+
color: var(--color-text-secondary);
|
|
264
|
+
transition: all 0.2s ease;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.tab-item:hover {
|
|
268
|
+
background-color: var(--color-background);
|
|
269
|
+
color: var(--color-text);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.tab-item.active {
|
|
273
|
+
background-color: var(--color-background);
|
|
274
|
+
color: var(--color-text);
|
|
275
|
+
border-bottom: 2px solid var(--color-primary);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.tab-title {
|
|
279
|
+
margin-left: var(--spacing-sm);
|
|
280
|
+
margin-right: var(--spacing-sm);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.close-tab-btn {
|
|
284
|
+
background: none;
|
|
285
|
+
border: none;
|
|
286
|
+
color: var(--color-text-secondary);
|
|
287
|
+
cursor: pointer;
|
|
288
|
+
padding: 2px;
|
|
289
|
+
border-radius: 2px;
|
|
290
|
+
transition: all 0.2s ease;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.close-tab-btn:hover {
|
|
294
|
+
background-color: var(--color-error);
|
|
295
|
+
color: var(--color-background);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.tab-content {
|
|
299
|
+
flex: 1;
|
|
300
|
+
overflow: hidden;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/* Panel */
|
|
304
|
+
.panel {
|
|
305
|
+
grid-area: panel;
|
|
306
|
+
background-color: var(--color-surface);
|
|
307
|
+
border-top: 1px solid var(--color-border);
|
|
308
|
+
border-right: 1px solid var(--color-border);
|
|
309
|
+
overflow: hidden;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.panel.hidden {
|
|
313
|
+
display: none;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.panel-header {
|
|
317
|
+
display: flex;
|
|
318
|
+
align-items: center;
|
|
319
|
+
height: 35px;
|
|
320
|
+
background-color: var(--color-surface);
|
|
321
|
+
border-bottom: 1px solid var(--color-border);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.panel-tabs {
|
|
325
|
+
display: flex;
|
|
326
|
+
flex: 1;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.panel-tab {
|
|
330
|
+
padding: var(--spacing-sm) var(--spacing-md);
|
|
331
|
+
background: none;
|
|
332
|
+
border: none;
|
|
333
|
+
cursor: pointer;
|
|
334
|
+
color: var(--color-text-secondary);
|
|
335
|
+
transition: all 0.2s ease;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.panel-tab:hover {
|
|
339
|
+
color: var(--color-text);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.panel-tab.active {
|
|
343
|
+
color: var(--color-text);
|
|
344
|
+
border-bottom: 2px solid var(--color-primary);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.panel-content {
|
|
348
|
+
height: calc(100% - 35px);
|
|
349
|
+
overflow-y: auto;
|
|
350
|
+
padding: var(--spacing-md);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/* Status Bar */
|
|
354
|
+
.status-bar {
|
|
355
|
+
grid-area: status-bar;
|
|
356
|
+
background-color: var(--color-primary);
|
|
357
|
+
color: var(--color-background);
|
|
358
|
+
display: flex;
|
|
359
|
+
align-items: center;
|
|
360
|
+
justify-content: space-between;
|
|
361
|
+
padding: 0 var(--spacing-md);
|
|
362
|
+
font-size: var(--font-size-sm);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.status-bar-left,
|
|
366
|
+
.status-bar-right {
|
|
367
|
+
display: flex;
|
|
368
|
+
align-items: center;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.status-bar-item {
|
|
372
|
+
margin-right: var(--spacing-md);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/* Top Bar */
|
|
376
|
+
.top-bar {
|
|
377
|
+
grid-area: top-bar;
|
|
378
|
+
background-color: var(--color-surface);
|
|
379
|
+
border-bottom: 1px solid var(--color-border);
|
|
380
|
+
display: flex;
|
|
381
|
+
align-items: center;
|
|
382
|
+
justify-content: space-between;
|
|
383
|
+
padding: 0 var(--spacing-md);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.top-bar-section {
|
|
387
|
+
display: flex;
|
|
388
|
+
align-items: center;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
.top-bar-button {
|
|
392
|
+
background: none;
|
|
393
|
+
border: none;
|
|
394
|
+
padding: var(--spacing-sm);
|
|
395
|
+
cursor: pointer;
|
|
396
|
+
color: var(--color-text-secondary);
|
|
397
|
+
border-radius: 4px;
|
|
398
|
+
transition: all 0.2s ease;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
.top-bar-button:hover {
|
|
402
|
+
background-color: var(--color-background);
|
|
403
|
+
color: var(--color-text);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/* Resizers */
|
|
407
|
+
.sidebar-resizer,
|
|
408
|
+
.h-resizer {
|
|
409
|
+
background-color: var(--color-border);
|
|
410
|
+
cursor: col-resize;
|
|
411
|
+
width: 1px;
|
|
412
|
+
transition: background-color 0.2s ease;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.sidebar-resizer:hover,
|
|
416
|
+
.h-resizer:hover {
|
|
417
|
+
background-color: var(--color-primary);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
.h-resizer {
|
|
421
|
+
cursor: row-resize;
|
|
422
|
+
height: 1px;
|
|
423
|
+
width: 100%;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/* Drag and Drop */
|
|
427
|
+
.dragging {
|
|
428
|
+
opacity: 0.5;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
.drop-overlay {
|
|
432
|
+
position: absolute;
|
|
433
|
+
top: 0;
|
|
434
|
+
left: 0;
|
|
435
|
+
right: 0;
|
|
436
|
+
bottom: 0;
|
|
437
|
+
background-color: rgba(0, 102, 204, 0.1);
|
|
438
|
+
border: 2px dashed var(--color-primary);
|
|
439
|
+
display: flex;
|
|
440
|
+
align-items: center;
|
|
441
|
+
justify-content: center;
|
|
442
|
+
font-weight: 600;
|
|
443
|
+
color: var(--color-primary);
|
|
444
|
+
z-index: 1000;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.drop-indicator {
|
|
448
|
+
position: absolute;
|
|
449
|
+
top: 0;
|
|
450
|
+
bottom: 0;
|
|
451
|
+
width: 2px;
|
|
452
|
+
background-color: var(--color-primary);
|
|
453
|
+
z-index: 1000;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/* Responsive design */
|
|
457
|
+
@media (max-width: 768px) {
|
|
458
|
+
.workbench-grid {
|
|
459
|
+
grid-template-columns: var(--activity-bar-width) 1fr;
|
|
460
|
+
grid-template-areas:
|
|
461
|
+
"top-bar top-bar"
|
|
462
|
+
"activity-bar main"
|
|
463
|
+
"activity-bar panel"
|
|
464
|
+
"status-bar status-bar";
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
.sidebar,
|
|
468
|
+
.sidebar-right {
|
|
469
|
+
position: fixed;
|
|
470
|
+
top: var(--top-bar-height);
|
|
471
|
+
bottom: var(--status-bar-height);
|
|
472
|
+
left: var(--activity-bar-width);
|
|
473
|
+
width: 300px;
|
|
474
|
+
z-index: 1000;
|
|
475
|
+
box-shadow: var(--shadow-lg);
|
|
476
|
+
transform: translateX(-100%);
|
|
477
|
+
transition: transform 0.3s ease;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.sidebar.visible {
|
|
481
|
+
transform: translateX(0);
|
|
482
|
+
}
|
|
483
|
+
}
|