ywana-core8 0.2.8 → 0.2.10

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