Abmacode12 commited on
Commit
7caded9
·
verified ·
1 Parent(s): 7bc87e9

Colonne 1 (gauche) : menu + titre « Espace Codage »

Browse files

Colonne 2 (milieu) : vide + barre en bas avec :

à gauche : + et trombone

au centre : barre de recherche / saisie

à droite : micro + flèche envoyer

Colonne 3 (droite) : panneau “Aperçu” avec une barre d’outils + message “Échec du chargement de l’aperçu.”

Copie-colle tout ça dans un fichier : espace-codage.html puis ouvre-le dans ton navigateur.

<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Espace Codage</title>
<style>
:root{
--bg:#0b0f16;
--panel:#0f1521;
--panel2:#0c111b;
--line:rgba(255,255,255,.08);
--text:rgba(255,255,255,.92);
--muted:rgba(255,255,255,.65);
--muted2:rgba(255,255,255,.45);
--shadow: 0 18px 60px rgba(0,0,0,.45);
--r:16px;
--r2:14px;
--focus: rgba(93, 173, 255, .35);
}

*{box-sizing:border-box}
html,body{height:100%}
body{
margin:0;
background: radial-gradient(1200px 700px at 18% 10%, rgba(93,173,255,.12), transparent 55%),
radial-gradient(1200px 800px at 85% 20%, rgba(255,145,85,.08), transparent 60%),
var(--bg);
color:var(--text);
font: 14px/1.45 system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,Helvetica,Arial;
overflow:hidden;
}

/* Layout 3 colonnes */
.app{
height:100%;
display:grid;
grid-template-columns: 320px 1fr 520px;
gap:14px;
padding:14px;
}

.col{
background: linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.02));
border:1px solid var(--line);
border-radius: var(--r);
box-shadow: var(--shadow);
overflow:hidden;
min-width: 0;
}

/* Colonne gauche */
.sidebar{
display:flex;
flex-direction:column;
background: linear-gradient(180deg, rgba(255,255,255,.035), rgba(255,255,255,.015));
}

.sidebarTop{
padding:14px 14px 10px;
border-bottom:1px solid var(--line);
display:flex;
align-items:center;
gap:10px;
}

.brandDot{
width:10px;height:10px;border-radius:50%;
background: radial-gradient(circle at 30% 30%, #7fd3ff, #3a78ff);
box-shadow:0 0 0 4px rgba(58,120,255,.14);
}

.brandTitle{
font-weight:700;
letter-spacing:.2px;
font-size:14px;
}

.sidebarSearch{
padding:12px 14px;
display:flex;
gap:10px;
align-items:center;
border-bottom:1px solid var(--line);
background: rgba(0,0,0,.12);
}

.sIcon{
width:34px;height:34px;border-radius:12px;
display:grid;place-items:center;
background: rgba(255,255,255,.04);
border:1px solid var(--line);
color:var(--muted);
user-select:none;
}

.sInput{
flex:1;
display:flex;align-items:center;
background: rgba(255,255,255,.03);
border:1px solid var(--line);
border-radius:12px;
padding:9px 10px;
color:var(--muted);
gap:8px;
}
.sInput input{
width:100%;
border:0; outline:0;
background:transparent;
color:var(--text);
font: inherit;
}
.sInput input::placeholder{color:var(--muted2)}

.nav{
padding:10px 10px 14px;
overflow:auto;
}
.navSection{
padding:10px 8px 6px;
color:var(--muted2);
font-size:12px;
text-transform:uppercase;
letter-spacing:.12em;
}
.navItem{
display:flex;
align-items:center;
gap:10px;
padding:10px 10px;
border-radius:12px;
cursor:pointer;
color:var(--muted);
border:1px solid transparent;
user-select:none;
}
.navItem:hover{
background: rgba(255,255,255,.04);
border-color: rgba(255,255,255,.06);
color:var(--text);
}
.navItem.active{
background: rgba(93,173,255,.10);
border-color: rgba(93,173,255,.18);
color:var(--text);
}
.navItem .ico{
width:30px;height:30px;border-radius:12px;
display:grid;place-items:center;
background: rgba(255,255,255,.04);
border:1px solid var(--line);
color:var(--muted);
flex:0 0 auto;
}
.navItem .label{
flex:1;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}

.sidebarFooter{
margin-top:auto;
padding:12px 14px;
border-top:1px solid var(--line);
background: rgba(0,0,0,.10);
display:flex;
justify-content:space-between;
align-items:center;
gap:10px;
}
.tinyBtn{
display:flex;align-items:center;gap:8px;
background: rgba(255,255,255,.04);
border:1px solid var(--line);
padding:9px 10px;
border-radius:12px;
color:var(--muted);
cursor:pointer;
user-select:none;
}
.tinyBtn:hover{color:var(--text); background: rgba(255,255,255,.055);}
.tinyBtn span{font-size:12px;color:var(--muted2)}

/* Colonne milieu (vide + barre en bas) */
.center{
display:flex;
flex-direction:column;
background: linear-gradient(180deg, rgba(0,0,0,.12), rgba(0,0,0,.06));
}

.centerTop{
padding:12px 14px;
border-bottom:1px solid var(--line);
display:flex;
align-items:center;
gap:10px;
background: rgba(0,0,0,.10);
}
.pill{
padding:7px 10px;
border-radius:999px;
border:1px solid var(--line);
background: rgba(255,255,255,.03);
color:var(--muted);
font-size:12px;
}

.centerBody{
flex:1;
position:relative;
overflow:auto;
}

.emptyHint{
position:absolute;
inset:0;
display:grid;
place-items:center;
color:var(--muted2);
padding:24px;
text-align:center;
}

.composerWrap{
padding:12px 12px 14px;
border-top:1px solid var(--line);
background: rgba(0,0,0,.18);
}

.composer{
display:flex;
align-items:center;
gap:10px;
padding:10px;
border-radius: 16px;
border:1px solid var(--line);
background: rgba(255,255,255,.03);
}

.iconBtn{
width:40px;height:40px;border-radius:14px;
display:grid;place-items:center;
background: rgba(255,255,255,.04);
border:1px solid var(--line);
color:var(--muted);
cursor:pointer;
user-select:none;
flex:0 0 auto;
}
.iconBtn:hover{color:var(--text); background: rgba(255,255,255,.06)}
.iconBtn:active{transform: translateY(1px)}

.composerInput{
flex:1;
display:flex;
align-items:center;
gap:10px;
padding:0 8px;
min-width: 0;
}
.composerInput input{
width:100%;
border:0; outline:0;
background:transparent;
color:var(--text);
font: 14px/1.4 inherit;
padding: 8px 0;
min-width:0;
}
.composerInput input::placeholder{color:var(--muted2)}
.composerInput input:focus{
filter: drop-shadow(0 0 0 var(--focus));
}

.sendBtn{
width:44px;height:44px;border-radius:16px;
display:grid;place-items:center;
border:1px solid rgba(93,173,255,.35);
background: radial-gradient(circle at 30% 30%, rgba(127,211,255,.28), rgba(58,120,255,.22));
color:var(--text);
cursor:pointer;
user-select:none;
flex:0 0 auto;
}
.sendBtn:disabled{
opacity:.45;
cursor:not-allowed;
filter: grayscale(30%);
}

/* Colonne droite (aperçu) */
.preview{
display:flex;
flex-direction:column;
background: linear-gradient(180deg, rgba(255,255,255,.03), rgba(255,255,255,.015));
}

.previewTop{
padding:12px 14px;
border-bottom:1px solid var(--line);
display:flex;
align-items:center;
justify-content:space-between;
gap:10px;
background: rgba(0,0,0,.10);
}
.previewTopLeft{
display:flex;align-items:center;gap:10px;
min-width:0;
}
.previewTitle{
font-weight:700;
}
.toolRow{
display:flex;align-items:center;gap:8px;
flex-wrap:wrap;
justify-content:flex-end;
}
.tool{
height:34px;
padding:0 10px;
border-radius:12px;
border:1px solid var(--line);
background: rgba(255,255,255,.03);
color:var(--muted);
display:flex;align-items:center;gap:8px;
cursor:pointer;
user-select:none;
}
.tool:hover{color:var(--text); background: rgba(255,255,255,.055)}
.tool .k{color:var(--muted2); font-size:12px}

.previewBody{
flex:1;
display:flex;
flex-direction:column;
background: rgba(0,0,0,.10);
}

.previewCanvas{
flex:1;
display:grid;
place-items:center;
padding:22px;
}

.previewCard{
width:min(420px, 92%);
border-radius: 18px;
border:1px solid var(--line);
background: rgba(255,255,255,.03);
padding:18px;
text-align:center;
color:var(--muted);
}
.ghost{
height:140px;
border-radius:16px;
border:1px dashed rgba(255,255,255,.14);
background:
linear-gradient(90deg, rgba(255,255,255,.04), rgba(255,255,255,.02), rgba(255,255,255,.04));
opacity:.9;
margin:0 auto 14px;
max-width: 340px;
}
.failTitle{
font-weight:700;
color:var(--text);
margin-bottom:6px;
}
.failMsg{color:var(--muted)}
.previewBottom{
padding:12px 14px;
border-top:1px solid var(--line);
display:flex;
justify-content:space-between;
align-items:center;
gap:10px;
background: rgba(0,0,0,.14);
}

/* Responsive */
@media (max-width: 1200px){
.app{grid-template-columns: 300px 1fr 460px;}
}
@media (max-width: 980px){
body{overflow:auto}
.app{
height:auto;
grid-template-columns: 1fr;
}
.col{min-height: 360px;}
}
</style>
</head>

<body>
<div class="app">

<!-- Colonne 1 : Espace Codage -->
<aside class="col sidebar">
<div class="sidebarTop">
<div class

Files changed (5) hide show
  1. README.md +8 -5
  2. components/navbar.js +129 -0
  3. index.html +145 -19
  4. script.js +65 -0
  5. style.css +443 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Codepulse Coding Space Hub
3
- emoji: 📈
4
- colorFrom: indigo
5
- colorTo: gray
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: CodePulse - Coding Space Hub 🚀
3
+ colorFrom: red
4
+ colorTo: green
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
components/navbar.js ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomNavbar extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ :host {
7
+ display: block;
8
+ background: var(--bg-panel-dark);
9
+ border-radius: var(--radius);
10
+ padding: 16px;
11
+ border: 1px solid var(--border);
12
+ box-shadow: var(--shadow);
13
+ }
14
+
15
+ .navbar-header {
16
+ display: flex;
17
+ align-items: center;
18
+ gap: 12px;
19
+ padding: 8px 0 16px;
20
+ border-bottom: 1px solid var(--border);
21
+ margin-bottom: 16px;
22
+ }
23
+
24
+ .brand-dot {
25
+ width: 12px;
26
+ height: 12px;
27
+ border-radius: 50%;
28
+ background: linear-gradient(135deg, #3B82F6, #10B981);
29
+ box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15);
30
+ }
31
+
32
+ .brand-title {
33
+ font-weight: 600;
34
+ font-size: 16px;
35
+ color: var(--text-light);
36
+ }
37
+
38
+ .nav-section {
39
+ color: var(--text-muted);
40
+ font-size: 12px;
41
+ text-transform: uppercase;
42
+ letter-spacing: 0.1em;
43
+ padding: 12px 8px 4px;
44
+ }
45
+
46
+ .nav-item {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 12px;
50
+ padding: 10px 12px;
51
+ border-radius: var(--radius-sm);
52
+ cursor: pointer;
53
+ margin-bottom: 4px;
54
+ border: 1px solid transparent;
55
+ }
56
+
57
+ .nav-item:hover {
58
+ background: rgba(255, 255, 255, 0.05);
59
+ border-color: var(--border-light);
60
+ }
61
+
62
+ .nav-item.active {
63
+ background: rgba(59, 130, 246, 0.15);
64
+ border-color: rgba(59, 130, 246, 0.3);
65
+ }
66
+
67
+ .nav-icon {
68
+ width: 32px;
69
+ height: 32px;
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ background: rgba(255, 255, 255, 0.05);
74
+ border-radius: var(--radius-sm);
75
+ border: 1px solid var(--border);
76
+ color: var(--text-muted);
77
+ }
78
+
79
+ .nav-label {
80
+ flex: 1;
81
+ white-space: nowrap;
82
+ overflow: hidden;
83
+ text-overflow: ellipsis;
84
+ color: var(--text-light);
85
+ }
86
+ </style>
87
+
88
+ <div class="navbar-header">
89
+ <div class="brand-dot"></div>
90
+ <div class="brand-title">Espace Codage</div>
91
+ </div>
92
+
93
+ <div class="nav-section">Projets</div>
94
+ <div class="nav-item active">
95
+ <div class="nav-icon">
96
+ <i data-feather="code"></i>
97
+ </div>
98
+ <div class="nav-label">Espace Codage - Projet 1</div>
99
+ </div>
100
+ <div class="nav-item">
101
+ <div class="nav-icon">
102
+ <i data-feather="code"></i>
103
+ </div>
104
+ <div class="nav-label">Espace Codage - Projet 2</div>
105
+ </div>
106
+
107
+ <div class="nav-section">Raccourcis</div>
108
+ <div class="nav-item">
109
+ <div class="nav-icon">
110
+ <i data-feather="book"></i>
111
+ </div>
112
+ <div class="nav-label">Bibliothèque</div>
113
+ </div>
114
+ <div class="nav-item">
115
+ <div class="nav-icon">
116
+ <i data-feather="settings"></i>
117
+ </div>
118
+ <div class="nav-label">Paramètres</div>
119
+ </div>
120
+ `;
121
+
122
+ // Replace feather icons
123
+ if (typeof feather !== 'undefined') {
124
+ feather.replace();
125
+ }
126
+ }
127
+ }
128
+
129
+ customElements.define('custom-navbar', CustomNavbar);
index.html CHANGED
@@ -1,19 +1,145 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Espace Codage</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ <script src="script.js"></script>
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script src="https://unpkg.com/feather-icons"></script>
12
+ </head>
13
+ <body class="bg-gray-900 text-gray-100">
14
+ <div class="app-container">
15
+ <!-- Left Column - Menu -->
16
+ <aside class="sidebar">
17
+ <div class="sidebar-header">
18
+ <div class="brand-dot"></div>
19
+ <h1 class="brand-title">Espace Codage</h1>
20
+ </div>
21
+
22
+ <div class="search-container">
23
+ <div class="search-icon">
24
+ <i data-feather="edit"></i>
25
+ </div>
26
+ <div class="search-input">
27
+ <i data-feather="search"></i>
28
+ <input type="text" placeholder="Rechercher..." autocomplete="off">
29
+ </div>
30
+ </div>
31
+
32
+ <nav class="navigation">
33
+ <div class="nav-section">Projets</div>
34
+ <div class="nav-item active">
35
+ <div class="nav-icon">
36
+ <i data-feather="code"></i>
37
+ </div>
38
+ <div class="nav-label">Espace Codage - Projet 1</div>
39
+ </div>
40
+ <div class="nav-item">
41
+ <div class="nav-icon">
42
+ <i data-feather="code"></i>
43
+ </div>
44
+ <div class="nav-label">Espace Codage - Projet 2</div>
45
+ </div>
46
+
47
+ <div class="nav-section">Raccourcis</div>
48
+ <div class="nav-item">
49
+ <div class="nav-icon">
50
+ <i data-feather="book"></i>
51
+ </div>
52
+ <div class="nav-label">Bibliothèque</div>
53
+ </div>
54
+ <div class="nav-item">
55
+ <div class="nav-icon">
56
+ <i data-feather="settings"></i>
57
+ </div>
58
+ <div class="nav-label">Paramètres</div>
59
+ </div>
60
+ </nav>
61
+
62
+ <div class="sidebar-footer">
63
+ <button class="action-btn">
64
+ <i data-feather="share-2"></i>
65
+ <span>Partager</span>
66
+ <small>inviter</small>
67
+ </button>
68
+ <button class="action-btn">
69
+ <i data-feather="user"></i>
70
+ <small>profil</small>
71
+ </button>
72
+ </div>
73
+ </aside>
74
+
75
+ <!-- Middle Column - Empty with Input Bar -->
76
+ <main class="main-content">
77
+ <div class="content-header">
78
+ <span class="tag">Aperçu</span>
79
+ <span class="tag">Projet</span>
80
+ <span class="tag">/</span>
81
+ </div>
82
+
83
+ <div class="empty-state">
84
+ <h3>Zone centrale vide</h3>
85
+ <p>La barre de recherche / saisie reste en bas, comme demandé.</p>
86
+ </div>
87
+
88
+ <div class="input-bar">
89
+ <button class="input-btn" title="Ajouter">
90
+ <i data-feather="plus"></i>
91
+ </button>
92
+ <button class="input-btn" title="Joindre un fichier">
93
+ <i data-feather="paperclip"></i>
94
+ </button>
95
+
96
+ <div class="text-input">
97
+ <input type="text" placeholder="Rechercher / écrire...">
98
+ </div>
99
+
100
+ <button class="input-btn" title="Micro">
101
+ <i data-feather="mic"></i>
102
+ </button>
103
+ <button class="send-btn" title="Envoyer" disabled>
104
+ <i data-feather="send"></i>
105
+ </button>
106
+ </div>
107
+ </main>
108
+
109
+ <!-- Right Column - Preview -->
110
+ <section class="preview-panel">
111
+ <div class="preview-header">
112
+ <h2>Aperçu</h2>
113
+ <div class="toolbar">
114
+ <button class="tool-btn"><i data-feather="chevron-left"></i></button>
115
+ <button class="tool-btn"><i data-feather="chevron-right"></i></button>
116
+ <button class="tool-btn"><i data-feather="refresh-cw"></i></button>
117
+ <button class="tool-btn"><i data-feather="maximize"></i></button>
118
+ <button class="tool-btn edit">
119
+ <i data-feather="edit"></i>
120
+ <span>Modifier</span>
121
+ </button>
122
+ </div>
123
+ </div>
124
+
125
+ <div class="preview-content">
126
+ <div class="preview-error">
127
+ <div class="error-icon">
128
+ <i data-feather="alert-circle"></i>
129
+ </div>
130
+ <h3>Échec du chargement de l'aperçu.</h3>
131
+ <p>Vérifie l'URL / le serveur local, puis rafraîchis.</p>
132
+ </div>
133
+ </div>
134
+
135
+ <div class="preview-footer">
136
+ <span>Statut : <strong>Hors ligne</strong></span>
137
+ <span>Mode : <strong>Preview</strong></span>
138
+ </div>
139
+ </section>
140
+ </div>
141
+
142
+ <script>feather.replace();</script>
143
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
144
+ </body>
145
+ </html>
script.js ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ document.addEventListener('DOMContentLoaded', function() {
2
+ // Search functionality for sidebar
3
+ const searchInput = document.querySelector('.search-input input');
4
+ const navItems = document.querySelectorAll('.nav-item');
5
+
6
+ searchInput.addEventListener('input', function() {
7
+ const searchTerm = this.value.toLowerCase();
8
+
9
+ navItems.forEach(item => {
10
+ const label = item.querySelector('.nav-label').textContent.toLowerCase();
11
+ if (label.includes(searchTerm)) {
12
+ item.style.display = 'flex';
13
+ } else {
14
+ item.style.display = 'none';
15
+ }
16
+ });
17
+ });
18
+
19
+ // Active state for nav items
20
+ navItems.forEach(item => {
21
+ item.addEventListener('click', function() {
22
+ navItems.forEach(i => i.classList.remove('active'));
23
+ this.classList.add('active');
24
+ });
25
+ });
26
+
27
+ // Input bar functionality
28
+ const messageInput = document.querySelector('.text-input input');
29
+ const sendBtn = document.querySelector('.send-btn');
30
+
31
+ function updateSendButton() {
32
+ sendBtn.disabled = messageInput.value.trim() === '';
33
+ }
34
+
35
+ messageInput.addEventListener('input', updateSendButton);
36
+
37
+ messageInput.addEventListener('keydown', function(e) {
38
+ if (e.key === 'Enter' && !sendBtn.disabled) {
39
+ e.preventDefault();
40
+ // Here you would handle sending the message
41
+ console.log('Message sent:', this.value);
42
+ this.value = '';
43
+ updateSendButton();
44
+ }
45
+ });
46
+
47
+ sendBtn.addEventListener('click', function() {
48
+ if (!this.disabled) {
49
+ // Here you would handle sending the message
50
+ console.log('Message sent:', messageInput.value);
51
+ messageInput.value = '';
52
+ updateSendButton();
53
+ }
54
+ });
55
+
56
+ // Microphone button placeholder
57
+ const micBtn = document.querySelector('.input-btn:nth-child(3)');
58
+ micBtn.addEventListener('click', function() {
59
+ alert('Microphone functionality would be implemented here');
60
+ });
61
+
62
+ // Initialize
63
+ updateSendButton();
64
+ feather.replace();
65
+ });
style.css CHANGED
@@ -1,28 +1,453 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
 
 
 
 
 
 
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
 
 
 
 
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Base Styles */
2
+ :root {
3
+ --primary: #3B82F6;
4
+ --primary-hover: #2563EB;
5
+ --secondary: #10B981;
6
+ --secondary-hover: #059669;
7
+ --bg-dark: #0F172A;
8
+ --bg-darker: #0B1120;
9
+ --bg-panel: #1E293B;
10
+ --bg-panel-dark: #1E293B;
11
+ --text-light: #F8FAFC;
12
+ --text-muted: #94A3B8;
13
+ --text-disabled: #64748B;
14
+ --border: #334155;
15
+ --border-light: #475569;
16
+ --radius: 12px;
17
+ --radius-sm: 8px;
18
+ --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
19
+ }
20
+
21
  body {
22
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
23
+ line-height: 1.5;
24
+ overflow: hidden;
25
+ }
26
+
27
+ /* Layout */
28
+ .app-container {
29
+ display: grid;
30
+ grid-template-columns: 300px 1fr 400px;
31
+ height: 100vh;
32
+ gap: 16px;
33
+ padding: 16px;
34
+ background: var(--bg-darker);
35
+ }
36
+
37
+ /* Sidebar Styles */
38
+ .sidebar {
39
+ background: var(--bg-panel-dark);
40
+ border-radius: var(--radius);
41
+ padding: 16px;
42
+ display: flex;
43
+ flex-direction: column;
44
+ border: 1px solid var(--border);
45
+ box-shadow: var(--shadow);
46
+ }
47
+
48
+ .sidebar-header {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 12px;
52
+ padding: 8px 0 16px;
53
+ border-bottom: 1px solid var(--border);
54
+ margin-bottom: 16px;
55
+ }
56
+
57
+ .brand-dot {
58
+ width: 12px;
59
+ height: 12px;
60
+ border-radius: 50%;
61
+ background: linear-gradient(135deg, #3B82F6, #10B981);
62
+ box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15);
63
+ }
64
+
65
+ .brand-title {
66
+ font-weight: 600;
67
+ font-size: 16px;
68
+ }
69
+
70
+ .search-container {
71
+ display: flex;
72
+ gap: 12px;
73
+ margin-bottom: 16px;
74
+ background: rgba(0, 0, 0, 0.2);
75
+ padding: 12px;
76
+ border-radius: var(--radius-sm);
77
+ border: 1px solid var(--border);
78
+ }
79
+
80
+ .search-icon {
81
+ width: 36px;
82
+ height: 36px;
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ background: rgba(255, 255, 255, 0.05);
87
+ border-radius: var(--radius-sm);
88
+ border: 1px solid var(--border);
89
+ color: var(--text-muted);
90
+ }
91
+
92
+ .search-input {
93
+ flex: 1;
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 8px;
97
+ background: rgba(255, 255, 255, 0.04);
98
+ border: 1px solid var(--border);
99
+ border-radius: var(--radius-sm);
100
+ padding: 0 12px;
101
+ color: var(--text-muted);
102
+ }
103
+
104
+ .search-input input {
105
+ width: 100%;
106
+ background: transparent;
107
+ border: none;
108
+ outline: none;
109
+ color: var(--text-light);
110
+ padding: 8px 0;
111
+ }
112
+
113
+ .search-input input::placeholder {
114
+ color: var(--text-muted);
115
+ }
116
+
117
+ .navigation {
118
+ flex: 1;
119
+ overflow-y: auto;
120
+ margin-bottom: 16px;
121
+ }
122
+
123
+ .nav-section {
124
+ color: var(--text-muted);
125
+ font-size: 12px;
126
+ text-transform: uppercase;
127
+ letter-spacing: 0.1em;
128
+ padding: 12px 8px 4px;
129
+ }
130
+
131
+ .nav-item {
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 12px;
135
+ padding: 10px 12px;
136
+ border-radius: var(--radius-sm);
137
+ cursor: pointer;
138
+ margin-bottom: 4px;
139
+ border: 1px solid transparent;
140
+ }
141
+
142
+ .nav-item:hover {
143
+ background: rgba(255, 255, 255, 0.05);
144
+ border-color: var(--border-light);
145
+ }
146
+
147
+ .nav-item.active {
148
+ background: rgba(59, 130, 246, 0.15);
149
+ border-color: rgba(59, 130, 246, 0.3);
150
+ }
151
+
152
+ .nav-icon {
153
+ width: 32px;
154
+ height: 32px;
155
+ display: flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ background: rgba(255, 255, 255, 0.05);
159
+ border-radius: var(--radius-sm);
160
+ border: 1px solid var(--border);
161
+ color: var(--text-muted);
162
+ }
163
+
164
+ .nav-label {
165
+ flex: 1;
166
+ white-space: nowrap;
167
+ overflow: hidden;
168
+ text-overflow: ellipsis;
169
+ }
170
+
171
+ .sidebar-footer {
172
+ display: flex;
173
+ justify-content: space-between;
174
+ gap: 8px;
175
+ padding-top: 16px;
176
+ border-top: 1px solid var(--border);
177
+ margin-top: auto;
178
+ }
179
+
180
+ .action-btn {
181
+ display: flex;
182
+ align-items: center;
183
+ gap: 8px;
184
+ background: rgba(255, 255, 255, 0.05);
185
+ border: 1px solid var(--border);
186
+ padding: 8px 12px;
187
+ border-radius: var(--radius-sm);
188
+ color: var(--text-muted);
189
+ font-size: 14px;
190
+ cursor: pointer;
191
+ }
192
+
193
+ .action-btn:hover {
194
+ background: rgba(255, 255, 255, 0.08);
195
+ }
196
+
197
+ .action-btn small {
198
+ font-size: 12px;
199
+ color: var(--text-disabled);
200
+ }
201
+
202
+ /* Main Content Styles */
203
+ .main-content {
204
+ background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.1));
205
+ border-radius: var(--radius);
206
+ border: 1px solid var(--border);
207
+ box-shadow: var(--shadow);
208
+ display: flex;
209
+ flex-direction: column;
210
+ position: relative;
211
+ }
212
+
213
+ .content-header {
214
+ display: flex;
215
+ gap: 8px;
216
+ padding: 12px 16px;
217
+ border-bottom: 1px solid var(--border);
218
+ background: rgba(0, 0, 0, 0.2);
219
+ }
220
+
221
+ .tag {
222
+ padding: 6px 10px;
223
+ border-radius: 999px;
224
+ background: rgba(255, 255, 255, 0.05);
225
+ border: 1px solid var(--border);
226
+ color: var(--text-muted);
227
+ font-size: 12px;
228
  }
229
 
230
+ .empty-state {
231
+ position: absolute;
232
+ top: 0;
233
+ left: 0;
234
+ right: 0;
235
+ bottom: 0;
236
+ display: flex;
237
+ flex-direction: column;
238
+ align-items: center;
239
+ justify-content: center;
240
+ text-align: center;
241
+ color: var(--text-muted);
242
+ padding: 24px;
243
  }
244
 
245
+ .empty-state h3 {
246
+ color: var(--text-light);
247
+ font-weight: 600;
248
+ margin-bottom: 8px;
 
249
  }
250
 
251
+ .input-bar {
252
+ margin-top: auto;
253
+ padding: 12px;
254
+ background: rgba(0, 0, 0, 0.25);
255
+ border-top: 1px solid var(--border);
 
256
  }
257
 
258
+ .input-bar {
259
+ display: flex;
260
+ align-items: center;
261
+ gap: 8px;
262
+ padding: 12px;
263
+ border-radius: var(--radius);
264
+ background: rgba(255, 255, 255, 0.05);
265
+ border: 1px solid var(--border);
266
  }
267
+
268
+ .input-btn {
269
+ width: 42px;
270
+ height: 42px;
271
+ display: flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ background: rgba(255, 255, 255, 0.05);
275
+ border-radius: var(--radius-sm);
276
+ border: 1px solid var(--border);
277
+ color: var(--text-muted);
278
+ cursor: pointer;
279
+ }
280
+
281
+ .input-btn:hover {
282
+ background: rgba(255, 255, 255, 0.08);
283
+ color: var(--text-light);
284
+ }
285
+
286
+ .text-input {
287
+ flex: 1;
288
+ }
289
+
290
+ .text-input input {
291
+ width: 100%;
292
+ background: transparent;
293
+ border: none;
294
+ outline: none;
295
+ color: var(--text-light);
296
+ padding: 10px 0;
297
+ }
298
+
299
+ .text-input input::placeholder {
300
+ color: var(--text-muted);
301
+ }
302
+
303
+ .send-btn {
304
+ width: 42px;
305
+ height: 42px;
306
+ display: flex;
307
+ align-items: center;
308
+ justify-content: center;
309
+ background: var(--primary);
310
+ border-radius: var(--radius-sm);
311
+ border: none;
312
+ color: white;
313
+ cursor: pointer;
314
+ }
315
+
316
+ .send-btn:disabled {
317
+ opacity: 0.5;
318
+ cursor: not-allowed;
319
+ }
320
+
321
+ .send-btn:hover:not(:disabled) {
322
+ background: var(--primary-hover);
323
+ }
324
+
325
+ /* Preview Panel Styles */
326
+ .preview-panel {
327
+ background: var(--bg-panel-dark);
328
+ border-radius: var(--radius);
329
+ border: 1px solid var(--border);
330
+ box-shadow: var(--shadow);
331
+ display: flex;
332
+ flex-direction: column;
333
+ }
334
+
335
+ .preview-header {
336
+ display: flex;
337
+ justify-content: space-between;
338
+ align-items: center;
339
+ padding: 12px 16px;
340
+ border-bottom: 1px solid var(--border);
341
+ background: rgba(0, 0, 0, 0.2);
342
+ }
343
+
344
+ .preview-header h2 {
345
+ font-size: 16px;
346
+ font-weight: 600;
347
+ }
348
+
349
+ .toolbar {
350
+ display: flex;
351
+ gap: 8px;
352
+ }
353
+
354
+ .tool-btn {
355
+ width: 36px;
356
+ height: 36px;
357
+ display: flex;
358
+ align-items: center;
359
+ justify-content: center;
360
+ background: rgba(255, 255, 255, 0.05);
361
+ border-radius: var(--radius-sm);
362
+ border: 1px solid var(--border);
363
+ color: var(--text-muted);
364
+ cursor: pointer;
365
+ }
366
+
367
+ .tool-btn:hover {
368
+ background: rgba(255, 255, 255, 0.08);
369
+ color: var(--text-light);
370
+ }
371
+
372
+ .tool-btn.edit {
373
+ width: auto;
374
+ padding: 0 12px;
375
+ gap: 6px;
376
+ }
377
+
378
+ .preview-content {
379
+ flex: 1;
380
+ display: flex;
381
+ align-items: center;
382
+ justify-content: center;
383
+ background: rgba(0, 0, 0, 0.25);
384
+ }
385
+
386
+ .preview-error {
387
+ text-align: center;
388
+ max-width: 360px;
389
+ padding: 24px;
390
+ }
391
+
392
+ .error-icon {
393
+ width: 80px;
394
+ height: 80px;
395
+ margin: 0 auto 16px;
396
+ display: flex;
397
+ align-items: center;
398
+ justify-content: center;
399
+ border-radius: 50%;
400
+ background: rgba(239, 68, 68, 0.15);
401
+ color: #EF4444;
402
+ }
403
+
404
+ .preview-error h3 {
405
+ font-weight: 600;
406
+ margin-bottom: 8px;
407
+ }
408
+
409
+ .preview-error p {
410
+ color: var(--text-muted);
411
+ }
412
+
413
+ .preview-footer {
414
+ display: flex;
415
+ justify-content: space-between;
416
+ padding: 12px 16px;
417
+ border-top: 1px solid var(--border);
418
+ background: rgba(0, 0, 0, 0.35);
419
+ font-size: 13px;
420
+ color: var(--text-muted);
421
+ }
422
+
423
+ .preview-footer strong {
424
+ color: var(--text-light);
425
+ }
426
+
427
+ /* Responsive Design */
428
+ @media (max-width: 1200px) {
429
+ .app-container {
430
+ grid-template-columns: 280px 1fr 360px;
431
+ }
432
+ }
433
+
434
+ @media (max-width: 992px) {
435
+ body {
436
+ overflow: auto;
437
+ }
438
+
439
+ .app-container {
440
+ grid-template-columns: 1fr;
441
+ height: auto;
442
+ }
443
+
444
+ .sidebar, .preview-panel {
445
+ min-height: 400px;
446
+ }
447
+ }
448
+
449
+ /* Feather Icons Size */
450
+ .feather {
451
+ width: 16px;
452
+ height: 16px;
453
+ }