ywana-core8 0.2.8 → 0.2.9

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.
@@ -10,10 +10,11 @@
10
10
  backdrop-filter: blur(8px);
11
11
  z-index: 10000; /* Always above all windows */
12
12
  display: flex;
13
- align-items: center;
14
- justify-content: center;
13
+ align-items: flex-end;
14
+ justify-content: flex-start;
15
15
  animation: fadeIn 0.2s ease-out;
16
16
  pointer-events: auto; /* Ensure menu is clickable */
17
+ padding: 0 0 0px 15px; /* Espacio para el taskbar y margen izquierdo */
17
18
  }
18
19
 
19
20
  @keyframes fadeIn {
@@ -27,12 +28,12 @@
27
28
 
28
29
  .application-menu {
29
30
  background: #ffffff;
30
- border-radius: 12px;
31
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
32
- width: 90%;
31
+ border-radius: 12px 12px 0 0;
32
+ box-shadow: 0 -10px 30px rgba(0, 0, 0, 0.3);
33
+ width: 30rem;
33
34
  max-width: 1000px;
34
- height: 90%; /* Use most of workspace height */
35
- max-height: 100%; /* Constrained by workspace container */
35
+ height: 80vh; /* Altura fija relativa al viewport */
36
+ max-height: calc(100% - 80px); /* Espacio para taskbar */
36
37
  display: grid;
37
38
  grid-template-rows: auto auto 1fr;
38
39
  grid-template-areas:
@@ -45,11 +46,11 @@
45
46
 
46
47
  @keyframes slideIn {
47
48
  from {
48
- transform: scale(0.9) translateY(20px);
49
+ transform: translateY(20px);
49
50
  opacity: 0;
50
51
  }
51
52
  to {
52
- transform: scale(1) translateY(0);
53
+ transform: translateY(0);
53
54
  opacity: 1;
54
55
  }
55
56
  }
@@ -59,10 +60,17 @@
59
60
  grid-area: header;
60
61
  display: flex;
61
62
  align-items: center;
62
- justify-content: space-between;
63
- padding: 20px 24px;
63
+ justify-content: flex-end;
64
+ padding: 8px 16px;
64
65
  border-bottom: 1px solid #e0e0e0;
65
66
  background: #f8f9fa;
67
+ min-height: 40px;
68
+ }
69
+
70
+ .application-menu__header-controls {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 6px;
66
74
  }
67
75
 
68
76
  .application-menu__header h2 {
@@ -72,15 +80,48 @@
72
80
  font-weight: 600;
73
81
  }
74
82
 
83
+ .application-menu__view-toggle {
84
+ background: none;
85
+ border: 1px solid #ddd;
86
+ font-size: 14px;
87
+ cursor: pointer;
88
+ color: #666;
89
+ padding: 6px 10px;
90
+ border-radius: 4px;
91
+ transition: all 0.2s ease;
92
+ min-width: 32px;
93
+ height: 32px;
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ }
98
+
99
+ .application-menu__view-toggle:hover {
100
+ background: #e9ecef;
101
+ color: #333;
102
+ border-color: #ccc;
103
+ }
104
+
105
+ .application-menu__view-toggle.active {
106
+ background: #1976d2;
107
+ color: white;
108
+ border-color: #1976d2;
109
+ }
110
+
75
111
  .application-menu__close {
76
112
  background: none;
77
113
  border: none;
78
- font-size: 24px;
114
+ font-size: 20px;
79
115
  color: #666;
80
116
  cursor: pointer;
81
- padding: 4px 8px;
117
+ padding: 6px 8px;
82
118
  border-radius: 4px;
83
119
  transition: all 0.2s ease;
120
+ min-width: 32px;
121
+ height: 32px;
122
+ display: flex;
123
+ align-items: center;
124
+ justify-content: center;
84
125
  }
85
126
 
86
127
  .application-menu__close:hover {
@@ -91,34 +132,123 @@
91
132
  /* Search */
92
133
  .application-menu__search {
93
134
  grid-area: search;
94
- padding: 16px 24px;
135
+ padding: 12px 20px;
95
136
  border-bottom: 1px solid #e0e0e0;
96
137
  }
97
138
 
98
139
  .application-menu__search-input {
99
140
  width: 100%;
100
- padding: 12px 16px;
101
- border: 2px solid #e0e0e0;
102
- border-radius: 8px;
103
- font-size: 16px;
141
+ padding: 10px 14px;
142
+ border: 1px solid #ddd;
143
+ border-radius: 6px;
144
+ font-size: 14px;
104
145
  outline: none;
105
146
  transition: border-color 0.2s ease;
106
147
  }
107
148
 
108
149
  .application-menu__search-input:focus {
109
150
  border-color: #1976d2;
151
+ box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
152
+ }
153
+
154
+ /* Condensed Mode */
155
+ .application-menu--condensed .application-menu__header {
156
+ padding: 6px 12px;
157
+ min-height: 32px;
158
+ }
159
+
160
+ .application-menu--condensed .application-menu__search {
161
+ padding: 8px 16px;
162
+ }
163
+
164
+ .application-menu--condensed .application-menu__search-input {
165
+ padding: 8px 12px;
166
+ font-size: 13px;
167
+ }
168
+
169
+ .application-menu--condensed .application-menu__content {
170
+ padding: 12px 16px;
171
+ }
172
+
173
+ .application-menu--condensed .application-menu__categories {
174
+ padding: 4px;
175
+ }
176
+
177
+ .application-menu--condensed .application-menu__category {
178
+ width: 36px;
179
+ height: 36px;
180
+ padding: 6px;
181
+ margin: 1px;
182
+ }
183
+
184
+ .application-menu--condensed .category-icon {
185
+ font-size: 16px;
186
+ }
187
+
188
+ .application-menu--condensed .application-menu__category-section {
189
+ margin-bottom: 20px;
190
+ }
191
+
192
+ .application-menu--condensed .category-title {
193
+ font-size: 14px;
194
+ margin-bottom: 8px;
195
+ }
196
+
197
+ .application-menu--condensed .application-menu__apps-grid {
198
+ gap: 8px;
199
+ grid-template-columns: repeat(auto-fill, minmax(75px, 1fr));
200
+ }
201
+
202
+ .application-menu--condensed .application-menu__app--grid {
203
+ padding: 8px 6px;
204
+ }
205
+
206
+ .application-menu--condensed .application-menu__app--grid .app-icon {
207
+ font-size: 28px;
208
+ margin-bottom: 4px;
209
+ }
210
+
211
+ .application-menu--condensed .application-menu__app--grid .app-name {
212
+ font-size: 11px;
213
+ }
214
+
215
+ .application-menu--condensed .application-menu__apps-list {
216
+ gap: 1px;
217
+ }
218
+
219
+ .application-menu--condensed .application-menu__app--list {
220
+ padding: 6px 12px;
221
+ gap: 10px;
222
+ }
223
+
224
+ .application-menu--condensed .application-menu__app--list .app-icon {
225
+ font-size: 22px;
226
+ min-width: 22px;
227
+ }
228
+
229
+ .application-menu--condensed .application-menu__app--list .app-name {
230
+ font-size: 12px;
231
+ margin-bottom: 1px;
232
+ }
233
+
234
+ .application-menu--condensed .application-menu__app--list .app-description {
235
+ font-size: 10px;
110
236
  }
111
237
 
112
238
  /* Main Grid Layout */
113
239
  .application-menu__main {
114
240
  grid-area: main;
115
241
  display: grid;
116
- grid-template-columns: 200px 1fr;
242
+ grid-template-columns: 60px 1fr;
117
243
  grid-template-areas: "sidebar content";
118
244
  height: 100%;
119
245
  overflow: hidden;
120
246
  }
121
247
 
248
+ .application-menu--condensed .application-menu__main {
249
+ grid-template-columns: 48px 1fr;
250
+ }
251
+
122
252
  /* Sidebar */
123
253
  .application-menu__sidebar {
124
254
  grid-area: sidebar;
@@ -132,7 +262,7 @@
132
262
  /* Categories */
133
263
  .application-menu__categories {
134
264
  flex: 1;
135
- padding: 16px 0;
265
+ padding: 8px;
136
266
  overflow-y: auto;
137
267
  scrollbar-width: thin;
138
268
  scrollbar-color: #ccc transparent;
@@ -158,18 +288,20 @@
158
288
  .application-menu__category {
159
289
  display: flex;
160
290
  align-items: center;
161
- gap: 12px;
162
- padding: 12px 20px;
163
- margin: 2px 8px;
291
+ justify-content: center;
292
+ padding: 8px;
293
+ margin: 2px;
164
294
  background: transparent;
165
295
  border: none;
166
- border-radius: 8px;
296
+ border-radius: 6px;
167
297
  cursor: pointer;
168
- font-size: 14px;
169
- text-align: left;
170
- transition: all 0.2s ease;
171
- color: #666;
172
- width: calc(100% - 16px);
298
+ font-size: 13px;
299
+ text-align: center;
300
+ transition: all 0.15s ease;
301
+ color: #555;
302
+ width: 44px;
303
+ height: 44px;
304
+ position: relative;
173
305
  }
174
306
 
175
307
  .application-menu__category:hover {
@@ -178,27 +310,25 @@
178
310
  }
179
311
 
180
312
  .application-menu__category.active {
181
- background: #1976d2;
182
- color: white;
313
+ background: #e3f2fd;
314
+ color: #1976d2;
315
+ font-weight: 500;
183
316
  }
184
317
 
185
318
  .category-icon {
186
- font-size: 18px;
187
- min-width: 18px;
319
+ font-size: 20px;
320
+ min-width: 20px;
188
321
  }
189
322
 
190
323
  .category-name {
191
- flex: 1;
192
- white-space: nowrap;
193
- overflow: hidden;
194
- text-overflow: ellipsis;
324
+ display: none;
195
325
  }
196
326
 
197
327
  /* Content */
198
328
  .application-menu__content {
199
329
  grid-area: content;
200
330
  overflow-y: auto;
201
- padding: 24px;
331
+ padding: 20px 24px;
202
332
  scrollbar-width: thin;
203
333
  scrollbar-color: #ccc transparent;
204
334
  }
@@ -223,9 +353,9 @@
223
353
 
224
354
  .application-menu__search-results h3,
225
355
  .category-title {
226
- margin: 0 0 16px 0;
356
+ margin: 0 0 12px 0;
227
357
  color: #333;
228
- font-size: 18px;
358
+ font-size: 15px;
229
359
  font-weight: 600;
230
360
  }
231
361
 
@@ -240,19 +370,126 @@
240
370
  /* Apps Grid */
241
371
  .application-menu__apps-grid {
242
372
  display: grid;
243
- grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
244
- gap: 16px;
373
+ grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
374
+ gap: 12px;
375
+ max-width: 100%;
376
+ }
377
+
378
+ .application-menu__app--grid {
379
+ display: flex;
380
+ flex-direction: column;
381
+ align-items: center;
382
+ padding: 12px 8px;
383
+ border-radius: 8px;
384
+ cursor: pointer;
385
+ transition: all 0.15s ease;
386
+ text-align: center;
387
+ background: #ffffff;
388
+ border: 1px solid transparent;
389
+ }
390
+
391
+ .application-menu__app--grid:hover {
392
+ background: #f8f9fa;
393
+ border-color: #e0e0e0;
394
+ transform: translateY(-1px);
395
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
396
+ }
397
+
398
+ .application-menu__app--grid .app-icon {
399
+ font-size: 36px;
400
+ margin-bottom: 6px;
401
+ line-height: 1;
402
+ }
403
+
404
+ .application-menu__app--grid .app-name {
405
+ font-size: 12px;
406
+ font-weight: 500;
407
+ color: #333;
408
+ line-height: 1.2;
409
+ word-break: break-word;
410
+ max-width: 100%;
411
+ }
412
+
413
+ /* Apps List */
414
+ .application-menu__apps-list {
415
+ display: flex;
416
+ flex-direction: column;
417
+ gap: 2px;
245
418
  max-width: 100%;
246
419
  }
247
420
 
421
+ .application-menu__app--list {
422
+ display: flex;
423
+ align-items: center;
424
+ padding: 10px 16px;
425
+ border-radius: 6px;
426
+ cursor: pointer;
427
+ transition: all 0.15s ease;
428
+ background: transparent;
429
+ border: none;
430
+ gap: 14px;
431
+ margin-bottom: 2px;
432
+ }
433
+
434
+ .application-menu__app--list:hover {
435
+ background: #f0f7ff;
436
+ color: #1976d2;
437
+ }
438
+
439
+ .application-menu__app--list .app-icon {
440
+ font-size: 28px;
441
+ min-width: 28px;
442
+ line-height: 1;
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: center;
446
+ }
447
+
448
+ .application-menu__app--list .app-info {
449
+ flex: 1;
450
+ text-align: left;
451
+ min-width: 0;
452
+ }
453
+
454
+ .application-menu__app--list .app-name {
455
+ font-size: 14px;
456
+ font-weight: 500;
457
+ color: #333;
458
+ line-height: 1.4;
459
+ margin-bottom: 3px;
460
+ white-space: nowrap;
461
+ overflow: hidden;
462
+ text-overflow: ellipsis;
463
+ }
464
+
465
+ .application-menu__app--list .app-description {
466
+ font-size: 12px;
467
+ color: #666;
468
+ line-height: 1.3;
469
+ opacity: 0.9;
470
+ white-space: nowrap;
471
+ overflow: hidden;
472
+ text-overflow: ellipsis;
473
+ }
474
+
475
+ .application-menu__app--list:hover .app-name {
476
+ color: #1976d2;
477
+ }
478
+
479
+ .application-menu__app--list:hover .app-description {
480
+ color: #1565c0;
481
+ opacity: 1;
482
+ }
483
+
484
+ /* Legacy support for old class names */
248
485
  .application-menu__app {
249
486
  display: flex;
250
487
  flex-direction: column;
251
488
  align-items: center;
252
- padding: 16px 12px;
253
- border-radius: 12px;
489
+ padding: 12px 8px;
490
+ border-radius: 8px;
254
491
  cursor: pointer;
255
- transition: all 0.2s ease;
492
+ transition: all 0.15s ease;
256
493
  text-align: center;
257
494
  background: #ffffff;
258
495
  border: 1px solid transparent;
@@ -261,22 +498,23 @@
261
498
  .application-menu__app:hover {
262
499
  background: #f8f9fa;
263
500
  border-color: #e0e0e0;
264
- transform: translateY(-2px);
265
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
501
+ transform: translateY(-1px);
502
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
266
503
  }
267
504
 
268
505
  .app-icon {
269
- font-size: 48px;
270
- margin-bottom: 8px;
506
+ font-size: 36px;
507
+ margin-bottom: 6px;
271
508
  line-height: 1;
272
509
  }
273
510
 
274
511
  .app-name {
275
- font-size: 14px;
512
+ font-size: 12px;
276
513
  font-weight: 500;
277
514
  color: #333;
278
515
  line-height: 1.2;
279
516
  word-break: break-word;
517
+ max-width: 100%;
280
518
  }
281
519
 
282
520
  /* No Results */
@@ -307,16 +545,17 @@
307
545
  }
308
546
 
309
547
  .application-menu__main {
310
- grid-template-columns: 160px 1fr;
548
+ grid-template-columns: 50px 1fr;
311
549
  }
312
550
 
313
551
  .application-menu__category {
314
- padding: 10px 16px;
552
+ padding: 8px;
315
553
  font-size: 13px;
554
+ height: 40px;
316
555
  }
317
556
 
318
557
  .category-icon {
319
- font-size: 16px;
558
+ font-size: 18px;
320
559
  }
321
560
 
322
561
  .application-menu__apps-grid {
@@ -13,6 +13,8 @@ export const ApplicationMenu = ({ isOpen, onClose }) => {
13
13
  const [selectedCategory, setSelectedCategory] = useState('all')
14
14
  const [apps, setApps] = useState([])
15
15
  const [categories, setCategories] = useState([])
16
+ const [viewMode, setViewMode] = useState('list') // 'grid' or 'list'
17
+ const [isCondensed, setIsCondensed] = useState(true) // 'normal' or 'condensed'
16
18
  const searchInputRef = useRef(null)
17
19
  const { createWindow } = useWindows()
18
20
 
@@ -109,17 +111,39 @@ export const ApplicationMenu = ({ isOpen, onClose }) => {
109
111
 
110
112
  return (
111
113
  <div className="application-menu-overlay" onClick={onClose}>
112
- <div className="application-menu" onClick={(e) => e.stopPropagation()}>
114
+ <div className={`application-menu ${isCondensed ? 'application-menu--condensed' : ''}`} onClick={(e) => e.stopPropagation()}>
113
115
  {/* Header */}
114
116
  <div className="application-menu__header">
115
- <h2>Applications</h2>
116
- <button
117
- className="application-menu__close"
118
- onClick={onClose}
119
- title="Close menu"
120
- >
121
- ×
122
- </button>
117
+ <div className="application-menu__header-controls">
118
+ <button
119
+ className={`application-menu__view-toggle ${isCondensed ? 'active' : ''}`}
120
+ onClick={() => setIsCondensed(!isCondensed)}
121
+ title={isCondensed ? "Normal view" : "Condensed view"}
122
+ >
123
+
124
+ </button>
125
+ <button
126
+ className={`application-menu__view-toggle ${viewMode === 'grid' ? 'active' : ''}`}
127
+ onClick={() => setViewMode('grid')}
128
+ title="Grid view"
129
+ >
130
+
131
+ </button>
132
+ <button
133
+ className={`application-menu__view-toggle ${viewMode === 'list' ? 'active' : ''}`}
134
+ onClick={() => setViewMode('list')}
135
+ title="List view"
136
+ >
137
+
138
+ </button>
139
+ <button
140
+ className="application-menu__close"
141
+ onClick={onClose}
142
+ title="Close menu"
143
+ >
144
+ ×
145
+ </button>
146
+ </div>
123
147
  </div>
124
148
 
125
149
  {/* Search */}
@@ -142,6 +166,7 @@ export const ApplicationMenu = ({ isOpen, onClose }) => {
142
166
  <button
143
167
  className={`application-menu__category ${selectedCategory === 'all' ? 'active' : ''}`}
144
168
  onClick={() => handleCategorySelect('all')}
169
+ title="All Apps"
145
170
  >
146
171
  <span className="category-icon">📱</span>
147
172
  <span className="category-name">All Apps</span>
@@ -151,6 +176,7 @@ export const ApplicationMenu = ({ isOpen, onClose }) => {
151
176
  key={category.id}
152
177
  className={`application-menu__category ${selectedCategory === category.id ? 'active' : ''}`}
153
178
  onClick={() => handleCategorySelect(category.id)}
179
+ title={category.name}
154
180
  >
155
181
  <span className="category-icon">{category.icon}</span>
156
182
  <span className="category-name">{category.name}</span>
@@ -164,16 +190,23 @@ export const ApplicationMenu = ({ isOpen, onClose }) => {
164
190
  {searchTerm && (
165
191
  <div className="application-menu__search-results">
166
192
  <h3>Search Results ({filteredApps.length})</h3>
167
- <div className="application-menu__apps-grid">
193
+ <div className={`application-menu__apps-${viewMode}`}>
168
194
  {filteredApps.map(app => (
169
195
  <div
170
196
  key={app.id}
171
- className="application-menu__app"
197
+ className={`application-menu__app--${viewMode}`}
172
198
  onClick={() => handleLaunchApp(app)}
173
199
  title={app.description}
174
200
  >
175
201
  <div className="app-icon">{app.icon}</div>
176
- <div className="app-name">{app.name}</div>
202
+ {viewMode === 'list' ? (
203
+ <div className="app-info">
204
+ <div className="app-name">{app.name}</div>
205
+ <div className="app-description">{app.description}</div>
206
+ </div>
207
+ ) : (
208
+ <div className="app-name">{app.name}</div>
209
+ )}
177
210
  </div>
178
211
  ))}
179
212
  </div>
@@ -185,16 +218,23 @@ export const ApplicationMenu = ({ isOpen, onClose }) => {
185
218
  {Object.entries(groupedApps).map(([categoryName, categoryApps]) => (
186
219
  <div key={categoryName} className="application-menu__category-section">
187
220
  <h3 className="category-title">{categoryName}</h3>
188
- <div className="application-menu__apps-grid">
221
+ <div className={`application-menu__apps-${viewMode}`}>
189
222
  {categoryApps.map(app => (
190
223
  <div
191
224
  key={app.id}
192
- className="application-menu__app"
225
+ className={`application-menu__app--${viewMode}`}
193
226
  onClick={() => handleLaunchApp(app)}
194
227
  title={app.description}
195
228
  >
196
229
  <div className="app-icon">{app.icon}</div>
197
- <div className="app-name">{app.name}</div>
230
+ {viewMode === 'list' ? (
231
+ <div className="app-info">
232
+ <div className="app-name">{app.name}</div>
233
+ <div className="app-description">{app.description}</div>
234
+ </div>
235
+ ) : (
236
+ <div className="app-name">{app.name}</div>
237
+ )}
198
238
  </div>
199
239
  ))}
200
240
  </div>