@kennofizet/apphub-frontend 0.1.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.
Files changed (90) hide show
  1. package/README.md +84 -0
  2. package/package.json +31 -0
  3. package/src/api/coreApi.js +25 -0
  4. package/src/api/index.js +80 -0
  5. package/src/composables/createZoneContext.js +156 -0
  6. package/src/composables/useAppHubHostApi.js +24 -0
  7. package/src/composables/useAppHubZoneContext.js +11 -0
  8. package/src/composables/useDevOriginToggle.js +40 -0
  9. package/src/i18n/index.js +16 -0
  10. package/src/i18n/resolveLang.js +6 -0
  11. package/src/i18n/resolveTheme.js +30 -0
  12. package/src/i18n/translations/en.js +303 -0
  13. package/src/i18n/translations/vi.js +302 -0
  14. package/src/index.js +427 -0
  15. package/src/moduleStore.js +10 -0
  16. package/src/modules/app-store/components/AppHubAppStoreApp.vue +210 -0
  17. package/src/modules/app-store/components/AppHubAppStoreCard.vue +88 -0
  18. package/src/modules/app-store/components/AppHubAppStoreSettingsPanel.vue +266 -0
  19. package/src/modules/app-store/components/AppHubAppVersionHistory.vue +77 -0
  20. package/src/modules/app-store/components/AppHubDevReviewPanel.vue +206 -0
  21. package/src/modules/app-store/components/AppHubDraftStoreApp.vue +184 -0
  22. package/src/modules/app-store/components/AppHubDraftStoreCard.vue +116 -0
  23. package/src/modules/app-store/composables/useAppStore.js +206 -0
  24. package/src/modules/app-store/composables/useCatalogInfiniteScroll.js +47 -0
  25. package/src/modules/app-store/constants/catalogModes.js +2 -0
  26. package/src/modules/app-store/data/defaultCatalog.js +19 -0
  27. package/src/modules/app-store/index.js +9 -0
  28. package/src/modules/app-store/utils/normalizeCatalogApp.js +37 -0
  29. package/src/modules/desktop/components/AppHubDesktop.vue +1510 -0
  30. package/src/modules/desktop/components/AppHubDesktopDevOriginBar.vue +57 -0
  31. package/src/modules/desktop/components/AppHubDesktopDropLayer.vue +15 -0
  32. package/src/modules/desktop/components/AppHubDesktopDropTarget.vue +32 -0
  33. package/src/modules/desktop/components/AppHubDesktopIconContextMenu.vue +74 -0
  34. package/src/modules/desktop/components/AppHubDesktopIconFolder.vue +60 -0
  35. package/src/modules/desktop/components/AppHubDesktopIconGroup.vue +58 -0
  36. package/src/modules/desktop/components/AppHubDesktopIconInfoDialog.vue +33 -0
  37. package/src/modules/desktop/components/AppHubDesktopIconRenameDialog.vue +62 -0
  38. package/src/modules/desktop/components/AppHubDesktopSettings.vue +28 -0
  39. package/src/modules/desktop/components/AppHubDropInstallBadge.vue +65 -0
  40. package/src/modules/desktop/components/AppHubDuplicateAppDialog.vue +38 -0
  41. package/src/modules/desktop/components/AppHubGuideApp.vue +278 -0
  42. package/src/modules/desktop/components/AppHubOriginBlockScreen.vue +105 -0
  43. package/src/modules/desktop/components/AppHubOriginLoadingScreen.vue +23 -0
  44. package/src/modules/desktop/components/AppHubPlaceholderApp.vue +14 -0
  45. package/src/modules/desktop/components/AppHubSettingsApp.vue +319 -0
  46. package/src/modules/desktop/components/AppHubStartButton.vue +24 -0
  47. package/src/modules/desktop/components/AppHubStartMenu.vue +182 -0
  48. package/src/modules/desktop/components/AppHubTaskbarPins.vue +23 -0
  49. package/src/modules/desktop/components/settings/AppHubSettingsKeyboardPanel.vue +82 -0
  50. package/src/modules/desktop/components/settings/AppHubSettingsScreenPanel.vue +41 -0
  51. package/src/modules/desktop/components/settings/AppHubSettingsStartMenuPanel.vue +95 -0
  52. package/src/modules/desktop/composables/simulateInstallProgress.js +15 -0
  53. package/src/modules/desktop/composables/useDesktopDropInstall.js +272 -0
  54. package/src/modules/desktop/composables/useDesktopHubSettings.js +51 -0
  55. package/src/modules/desktop/composables/useDesktopIconDrag.js +207 -0
  56. package/src/modules/desktop/composables/useDesktopShell.js +335 -0
  57. package/src/modules/desktop/data/builtinApps.js +77 -0
  58. package/src/modules/desktop/index.js +12 -0
  59. package/src/modules/desktop/styles/desktop.css +3104 -0
  60. package/src/modules/desktop/styles/theme.css +616 -0
  61. package/src/modules/desktop/utils/desktopGrid.js +43 -0
  62. package/src/modules/desktop/utils/desktopIconGroups.js +103 -0
  63. package/src/modules/desktop/utils/desktopSession.js +40 -0
  64. package/src/modules/desktop/utils/desktopSettings.js +37 -0
  65. package/src/modules/desktop/utils/dropPackageParser.js +140 -0
  66. package/src/modules/desktop/utils/duplicateAppUtils.js +28 -0
  67. package/src/modules/desktop/utils/hubKeyboardSettings.js +63 -0
  68. package/src/modules/desktop/utils/recentApps.js +148 -0
  69. package/src/modules/desktop/utils/startMenuFavorites.js +100 -0
  70. package/src/modules/desktop/utils/startMenuPins.js +90 -0
  71. package/src/modules/notifications/components/AppHubDesktopNotifications.vue +54 -0
  72. package/src/modules/notifications/composables/createDesktopNotifications.js +86 -0
  73. package/src/modules/notifications/index.js +9 -0
  74. package/src/modules/notifications/styles/notifications.css +118 -0
  75. package/src/modules/notifications/utils/parseApiError.js +29 -0
  76. package/src/modules/runner/components/AppHubRunner.vue +292 -0
  77. package/src/modules/runner/index.js +1 -0
  78. package/src/modules/window-manager/components/AppHubWindowFrame.vue +224 -0
  79. package/src/modules/window-manager/composables/useWindowManager.js +652 -0
  80. package/src/modules/window-manager/index.js +7 -0
  81. package/src/modules/window-manager/utils/sessionLayout.js +28 -0
  82. package/src/modules/window-manager/utils/windowLayout.js +236 -0
  83. package/src/modules/window-manager/utils/windowSnap.js +146 -0
  84. package/src/utils/bootstrapCache.js +47 -0
  85. package/src/utils/devOriginSettings.js +22 -0
  86. package/src/utils/launchUrl.js +111 -0
  87. package/src/utils/originSafety.js +267 -0
  88. package/src/utils/safeStorage.js +191 -0
  89. package/src/utils/semver.js +30 -0
  90. package/src/utils/zoneContext.js +38 -0
@@ -0,0 +1,3104 @@
1
+ .apphub-desktop {
2
+ position: relative;
3
+ width: 100%;
4
+ height: 100%;
5
+ min-height: 100%;
6
+ overflow: hidden;
7
+ font-family: 'Segoe UI', system-ui, sans-serif;
8
+ user-select: none;
9
+ }
10
+
11
+ .apphub-desktop__wallpaper {
12
+ position: absolute;
13
+ inset: 0;
14
+ background:
15
+ radial-gradient(ellipse 80% 60% at 20% 10%, #3a7bd5 0%, transparent 55%),
16
+ radial-gradient(ellipse 70% 50% at 90% 80%, #6b4bb4 0%, transparent 50%),
17
+ linear-gradient(160deg, #0c1929 0%, #1a3a5c 45%, #2d1f4e 100%);
18
+ transition: filter 0.25s ease;
19
+ }
20
+
21
+ .apphub-desktop__wallpaper--drop {
22
+ filter: brightness(1.08) saturate(1.15);
23
+ }
24
+
25
+ .apphub-desktop__icons-layer {
26
+ position: absolute;
27
+ inset: 0;
28
+ bottom: 48px;
29
+ z-index: 4;
30
+ pointer-events: none;
31
+ }
32
+
33
+ .apphub-desktop__icons-layer .apphub-desktop__icon,
34
+ .apphub-desktop__icons-layer .apphub-drop-badge,
35
+ .apphub-desktop__icons-layer .apphub-icon-menu,
36
+ .apphub-desktop__icons-layer .apphub-icon-folder,
37
+ .apphub-desktop__icons-layer .apphub-desktop__drop-target {
38
+ pointer-events: auto;
39
+ }
40
+
41
+ .apphub-desktop__icons-layer--drop-target {
42
+ pointer-events: auto;
43
+ }
44
+
45
+ .apphub-desktop__icons-layer--drop-target .apphub-desktop__icons {
46
+ pointer-events: none;
47
+ }
48
+
49
+ .apphub-desktop__icons {
50
+ position: relative;
51
+ z-index: 2;
52
+ display: flex;
53
+ flex-direction: column;
54
+ flex-wrap: wrap;
55
+ align-content: flex-start;
56
+ gap: 8px;
57
+ padding: 16px;
58
+ max-height: 100%;
59
+ }
60
+
61
+ .apphub-desktop__icon--placed {
62
+ position: absolute;
63
+ margin: 0;
64
+ cursor: default;
65
+ }
66
+
67
+ .apphub-desktop__icon--placed.apphub-desktop__icon--dragging {
68
+ z-index: 8;
69
+ cursor: grabbing;
70
+ opacity: 0.92;
71
+ background: rgba(255, 255, 255, 0.12);
72
+ border-color: rgba(96, 165, 250, 0.45);
73
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
74
+ }
75
+
76
+ .apphub-desktop__icon--placed.apphub-desktop__icon--holding {
77
+ z-index: 7;
78
+ transform: scale(1.06);
79
+ background: rgba(255, 255, 255, 0.1);
80
+ border-color: rgba(96, 165, 250, 0.35);
81
+ transition: transform 0.15s ease;
82
+ }
83
+
84
+ .apphub-desktop__icon--drop-target {
85
+ z-index: 6;
86
+ background: rgba(96, 165, 250, 0.15);
87
+ border-color: rgba(96, 165, 250, 0.5);
88
+ box-shadow: 0 0 0 2px rgba(96, 165, 250, 0.35);
89
+ }
90
+
91
+ .apphub-desktop__icon--placed.apphub-desktop__icon {
92
+ animation: apphub-icon-pop 0.45s cubic-bezier(0.34, 1.4, 0.64, 1);
93
+ }
94
+
95
+ .apphub-desktop__workarea {
96
+ position: absolute;
97
+ top: 0;
98
+ left: 0;
99
+ right: 0;
100
+ bottom: 48px;
101
+ z-index: 5;
102
+ overflow: hidden;
103
+ pointer-events: none;
104
+ }
105
+
106
+ .apphub-desktop__icon {
107
+ display: flex;
108
+ flex-direction: column;
109
+ align-items: center;
110
+ width: 88px;
111
+ padding: 8px 4px;
112
+ border: 1px solid transparent;
113
+ border-radius: 6px;
114
+ background: transparent;
115
+ color: inherit;
116
+ cursor: default;
117
+ }
118
+
119
+ .apphub-desktop__icon:hover {
120
+ background: rgba(255, 255, 255, 0.08);
121
+ border-color: rgba(255, 255, 255, 0.12);
122
+ }
123
+
124
+ .apphub-desktop__icon-img-wrap {
125
+ position: relative;
126
+ display: inline-flex;
127
+ }
128
+
129
+ .apphub-desktop__icon-img {
130
+ font-size: 2rem;
131
+ line-height: 1;
132
+ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.35));
133
+ }
134
+
135
+ .apphub-desktop__icon-flag {
136
+ position: absolute;
137
+ right: -6px;
138
+ bottom: -2px;
139
+ max-width: 52px;
140
+ padding: 1px 5px;
141
+ border-radius: 999px;
142
+ font-size: 0.55rem;
143
+ font-weight: 700;
144
+ text-transform: uppercase;
145
+ letter-spacing: 0.02em;
146
+ color: #fcd34d;
147
+ background: rgba(15, 23, 42, 0.92);
148
+ border: 1px solid rgba(251, 191, 36, 0.55);
149
+ white-space: nowrap;
150
+ overflow: hidden;
151
+ text-overflow: ellipsis;
152
+ }
153
+
154
+ .apphub-desktop__icon-label {
155
+ margin-top: 6px;
156
+ font-size: 0.75rem;
157
+ text-align: center;
158
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
159
+ line-height: 1.2;
160
+ width: 100%;
161
+ max-width: 84px;
162
+ white-space: nowrap;
163
+ overflow: hidden;
164
+ text-overflow: ellipsis;
165
+ }
166
+
167
+ .apphub-desktop__taskbar {
168
+ position: absolute;
169
+ z-index: 30;
170
+ left: 0;
171
+ right: 0;
172
+ bottom: 0;
173
+ height: 48px;
174
+ display: flex;
175
+ align-items: stretch;
176
+ gap: 0;
177
+ padding: 0;
178
+ border-top: 1px solid var(--ah-border);
179
+ backdrop-filter: blur(20px) saturate(1.2);
180
+ pointer-events: auto;
181
+ overflow: hidden;
182
+ }
183
+
184
+ /* Windows-style Start button */
185
+ .apphub-start-btn {
186
+ flex: 0 0 48px;
187
+ width: 48px;
188
+ height: 48px;
189
+ display: flex;
190
+ align-items: center;
191
+ justify-content: center;
192
+ border: none;
193
+ border-radius: 0;
194
+ background: transparent;
195
+ color: #fff;
196
+ cursor: pointer;
197
+ pointer-events: auto;
198
+ position: relative;
199
+ z-index: 31;
200
+ transition: background 0.12s ease;
201
+ }
202
+
203
+ .apphub-start-btn:hover,
204
+ .apphub-start-btn--active {
205
+ background: rgba(255, 255, 255, 0.08);
206
+ }
207
+
208
+ .apphub-start-btn__logo {
209
+ width: 18px;
210
+ height: 18px;
211
+ }
212
+
213
+ /* Windows 10 Start menu */
214
+ .apphub-start {
215
+ position: absolute;
216
+ top: 0;
217
+ left: 0;
218
+ right: 0;
219
+ bottom: 48px;
220
+ z-index: 28;
221
+ pointer-events: auto;
222
+ }
223
+
224
+ .apphub-start__panel {
225
+ position: absolute;
226
+ left: 0;
227
+ bottom: 0;
228
+ display: flex;
229
+ width: min(720px, calc(100% - 12px));
230
+ height: min(600px, calc(100% - 8px));
231
+ margin: 0 0 0 6px;
232
+ border: 1px solid rgba(255, 255, 255, 0.1);
233
+ border-bottom: none;
234
+ border-radius: 8px 8px 0 0;
235
+ overflow: hidden;
236
+ background: rgba(32, 32, 32, 0.97);
237
+ backdrop-filter: blur(24px) saturate(1.4);
238
+ box-shadow:
239
+ 0 -4px 32px rgba(0, 0, 0, 0.45),
240
+ 0 0 0 1px rgba(255, 255, 255, 0.04) inset;
241
+ animation: apphub-start-in 0.22s cubic-bezier(0.16, 1, 0.3, 1);
242
+ }
243
+
244
+ .apphub-start__left {
245
+ flex: 0 0 280px;
246
+ min-height: 0;
247
+ display: flex;
248
+ flex-direction: column;
249
+ background: rgba(25, 25, 25, 0.55);
250
+ border-right: 1px solid rgba(255, 255, 255, 0.07);
251
+ }
252
+
253
+ .apphub-start__lists {
254
+ flex: 1;
255
+ min-height: 0;
256
+ overflow-y: auto;
257
+ scrollbar-width: thin;
258
+ scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
259
+ }
260
+
261
+ .apphub-start__lists::-webkit-scrollbar {
262
+ width: 6px;
263
+ }
264
+
265
+ .apphub-start__lists::-webkit-scrollbar-thumb {
266
+ background: rgba(255, 255, 255, 0.18);
267
+ border-radius: 3px;
268
+ }
269
+
270
+ .apphub-start__right {
271
+ flex: 1;
272
+ min-width: 0;
273
+ display: flex;
274
+ flex-direction: column;
275
+ padding: 16px 18px 18px;
276
+ background: rgba(37, 37, 37, 0.45);
277
+ overflow-y: auto;
278
+ }
279
+
280
+ .apphub-start__search-wrap {
281
+ position: relative;
282
+ margin: 14px 14px 10px;
283
+ }
284
+
285
+ .apphub-start__search-icon {
286
+ position: absolute;
287
+ left: 11px;
288
+ top: 50%;
289
+ transform: translateY(-50%);
290
+ width: 16px;
291
+ height: 16px;
292
+ color: rgba(255, 255, 255, 0.5);
293
+ pointer-events: none;
294
+ }
295
+
296
+ .apphub-start__search {
297
+ width: 100%;
298
+ box-sizing: border-box;
299
+ height: 36px;
300
+ padding: 0 14px 0 36px;
301
+ border: 1px solid rgba(255, 255, 255, 0.1);
302
+ border-radius: 4px;
303
+ background: rgba(255, 255, 255, 0.07);
304
+ color: #fff;
305
+ font-size: 0.84rem;
306
+ outline: none;
307
+ transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
308
+ }
309
+
310
+ .apphub-start__search:focus {
311
+ border-color: rgba(96, 165, 250, 0.55);
312
+ background: rgba(255, 255, 255, 0.1);
313
+ box-shadow: 0 0 0 2px rgba(96, 165, 250, 0.15);
314
+ }
315
+
316
+ .apphub-start__search::placeholder {
317
+ color: rgba(255, 255, 255, 0.4);
318
+ }
319
+
320
+ .apphub-start__section-label {
321
+ margin: 0 16px 8px;
322
+ font-size: 0.7rem;
323
+ font-weight: 600;
324
+ letter-spacing: 0.06em;
325
+ text-transform: uppercase;
326
+ color: rgba(255, 255, 255, 0.38);
327
+ }
328
+
329
+ .apphub-start__section-label--spaced {
330
+ margin-top: 14px;
331
+ }
332
+
333
+ .apphub-start__list {
334
+ flex: 0 0 auto;
335
+ list-style: none;
336
+ margin: 0;
337
+ padding: 0 8px 4px;
338
+ }
339
+
340
+ .apphub-start__list-item {
341
+ display: flex;
342
+ align-items: center;
343
+ gap: 12px;
344
+ width: 100%;
345
+ padding: 6px 10px;
346
+ min-height: 40px;
347
+ border: none;
348
+ border-radius: 4px;
349
+ background: transparent;
350
+ color: #f3f4f6;
351
+ font-size: 0.875rem;
352
+ text-align: left;
353
+ cursor: pointer;
354
+ transition: background 0.15s ease;
355
+ }
356
+
357
+ .apphub-start__list-item:hover {
358
+ background: rgba(255, 255, 255, 0.08);
359
+ }
360
+
361
+ .apphub-start__list-icon-wrap {
362
+ flex: 0 0 32px;
363
+ width: 32px;
364
+ height: 32px;
365
+ display: flex;
366
+ align-items: center;
367
+ justify-content: center;
368
+ border-radius: 6px;
369
+ background: rgba(255, 255, 255, 0.08);
370
+ border: 1px solid rgba(255, 255, 255, 0.06);
371
+ }
372
+
373
+ .apphub-start__list-icon {
374
+ font-size: 1.05rem;
375
+ line-height: 1;
376
+ }
377
+
378
+ .apphub-start__list-name {
379
+ flex: 1;
380
+ white-space: nowrap;
381
+ overflow: hidden;
382
+ text-overflow: ellipsis;
383
+ }
384
+
385
+ .apphub-start__empty {
386
+ padding: 20px 16px;
387
+ font-size: 0.84rem;
388
+ color: rgba(255, 255, 255, 0.42);
389
+ text-align: center;
390
+ }
391
+
392
+ .apphub-start__empty--right {
393
+ flex: 1;
394
+ display: flex;
395
+ align-items: center;
396
+ justify-content: center;
397
+ }
398
+
399
+ .apphub-start__footer {
400
+ padding: 10px 10px 12px;
401
+ border-top: 1px solid rgba(255, 255, 255, 0.07);
402
+ }
403
+
404
+ .apphub-start__footer .apphub-desktop-settings {
405
+ margin-top: 0;
406
+ padding-top: 0;
407
+ border-top: none;
408
+ }
409
+
410
+ .apphub-start__footer .apphub-desktop-settings__row {
411
+ padding: 8px 10px;
412
+ border-radius: 4px;
413
+ transition: background 0.15s ease;
414
+ }
415
+
416
+ .apphub-start__footer .apphub-desktop-settings__row:hover {
417
+ background: rgba(255, 255, 255, 0.06);
418
+ }
419
+
420
+ .apphub-start__hero {
421
+ display: flex;
422
+ align-items: center;
423
+ gap: 14px;
424
+ width: 100%;
425
+ margin-bottom: 18px;
426
+ padding: 14px 16px;
427
+ border: 1px solid rgba(96, 165, 250, 0.25);
428
+ border-radius: 6px;
429
+ background: linear-gradient(135deg, rgba(0, 120, 215, 0.22) 0%, rgba(0, 90, 158, 0.12) 100%);
430
+ color: #fff;
431
+ text-align: left;
432
+ cursor: pointer;
433
+ transition: background 0.18s ease, border-color 0.18s ease, transform 0.18s ease;
434
+ }
435
+
436
+ .apphub-start__hero:hover {
437
+ background: linear-gradient(135deg, rgba(0, 120, 215, 0.32) 0%, rgba(0, 90, 158, 0.2) 100%);
438
+ border-color: rgba(96, 165, 250, 0.45);
439
+ transform: translateY(-1px);
440
+ }
441
+
442
+ .apphub-start__hero-icon {
443
+ flex: 0 0 44px;
444
+ width: 44px;
445
+ height: 44px;
446
+ display: flex;
447
+ align-items: center;
448
+ justify-content: center;
449
+ font-size: 1.6rem;
450
+ border-radius: 8px;
451
+ background: rgba(255, 255, 255, 0.12);
452
+ }
453
+
454
+ .apphub-start__hero-body {
455
+ flex: 1;
456
+ min-width: 0;
457
+ display: flex;
458
+ flex-direction: column;
459
+ gap: 3px;
460
+ }
461
+
462
+ .apphub-start__hero-title {
463
+ font-size: 0.95rem;
464
+ font-weight: 600;
465
+ line-height: 1.2;
466
+ }
467
+
468
+ .apphub-start__hero-hint {
469
+ font-size: 0.78rem;
470
+ color: rgba(255, 255, 255, 0.62);
471
+ white-space: nowrap;
472
+ overflow: hidden;
473
+ text-overflow: ellipsis;
474
+ }
475
+
476
+ .apphub-start__hero-arrow {
477
+ flex: 0 0 auto;
478
+ font-size: 1.4rem;
479
+ line-height: 1;
480
+ color: rgba(255, 255, 255, 0.45);
481
+ transition: transform 0.15s ease, color 0.15s ease;
482
+ }
483
+
484
+ .apphub-start__hero:hover .apphub-start__hero-arrow {
485
+ color: rgba(255, 255, 255, 0.85);
486
+ transform: translateX(2px);
487
+ }
488
+
489
+ .apphub-start__grid {
490
+ display: grid;
491
+ grid-template-columns: repeat(3, 1fr);
492
+ gap: 10px;
493
+ }
494
+
495
+ .apphub-start__app-tile {
496
+ display: flex;
497
+ flex-direction: column;
498
+ align-items: center;
499
+ justify-content: center;
500
+ gap: 8px;
501
+ min-height: 96px;
502
+ padding: 12px 8px;
503
+ border: 1px solid rgba(255, 255, 255, 0.08);
504
+ border-radius: 6px;
505
+ background: rgba(255, 255, 255, 0.05);
506
+ color: #f1f5f9;
507
+ text-align: center;
508
+ cursor: pointer;
509
+ transition:
510
+ background 0.18s ease,
511
+ border-color 0.18s ease,
512
+ transform 0.18s ease,
513
+ box-shadow 0.18s ease;
514
+ }
515
+
516
+ .apphub-start__app-tile:hover {
517
+ background: rgba(255, 255, 255, 0.1);
518
+ border-color: rgba(255, 255, 255, 0.16);
519
+ transform: translateY(-2px);
520
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.25);
521
+ }
522
+
523
+ .apphub-start__app-tile:active {
524
+ transform: translateY(0);
525
+ }
526
+
527
+ .apphub-start__app-tile-icon {
528
+ width: 40px;
529
+ height: 40px;
530
+ display: flex;
531
+ align-items: center;
532
+ justify-content: center;
533
+ font-size: 1.5rem;
534
+ line-height: 1;
535
+ border-radius: 8px;
536
+ background: rgba(255, 255, 255, 0.08);
537
+ }
538
+
539
+ .apphub-start__app-tile-name {
540
+ width: 100%;
541
+ font-size: 0.72rem;
542
+ font-weight: 500;
543
+ line-height: 1.25;
544
+ max-height: 2.5em;
545
+ overflow: hidden;
546
+ display: -webkit-box;
547
+ -webkit-line-clamp: 2;
548
+ -webkit-box-orient: vertical;
549
+ word-break: break-word;
550
+ }
551
+
552
+ @media (max-width: 560px) {
553
+ .apphub-start__panel {
554
+ flex-direction: column;
555
+ width: calc(100% - 8px);
556
+ height: min(520px, calc(100% - 8px));
557
+ }
558
+
559
+ .apphub-start__left {
560
+ flex: 0 0 auto;
561
+ max-height: 45%;
562
+ border-right: none;
563
+ border-bottom: 1px solid rgba(255, 255, 255, 0.07);
564
+ }
565
+
566
+ .apphub-start__grid {
567
+ grid-template-columns: repeat(2, 1fr);
568
+ }
569
+ }
570
+
571
+ .apphub-desktop__tasks {
572
+ flex: 1;
573
+ min-width: 0;
574
+ display: flex;
575
+ gap: 0;
576
+ overflow-x: auto;
577
+ overflow-y: hidden;
578
+ padding: 0 4px;
579
+ scrollbar-width: none;
580
+ -ms-overflow-style: none;
581
+ }
582
+
583
+ .apphub-desktop__tasks::-webkit-scrollbar {
584
+ display: none;
585
+ }
586
+
587
+ .apphub-taskbar-pins {
588
+ flex: 0 1 auto;
589
+ display: flex;
590
+ align-items: center;
591
+ gap: 2px;
592
+ max-width: min(240px, 28vw);
593
+ padding: 0 4px;
594
+ border-left: 1px solid rgba(255, 255, 255, 0.06);
595
+ overflow: hidden;
596
+ }
597
+
598
+ .apphub-taskbar-pins__btn {
599
+ flex: 0 0 auto;
600
+ width: 40px;
601
+ height: 40px;
602
+ border: none;
603
+ border-radius: 6px;
604
+ background: transparent;
605
+ color: #f1f5f9;
606
+ cursor: pointer;
607
+ display: flex;
608
+ align-items: center;
609
+ justify-content: center;
610
+ transition: background 0.12s ease;
611
+ }
612
+
613
+ .apphub-taskbar-pins__btn:hover {
614
+ background: rgba(255, 255, 255, 0.08);
615
+ }
616
+
617
+ .apphub-taskbar-pins__icon {
618
+ font-size: 1.2rem;
619
+ line-height: 1;
620
+ }
621
+
622
+ .apphub-desktop__task {
623
+ max-width: 200px;
624
+ min-width: 48px;
625
+ padding: 0 12px;
626
+ height: 48px;
627
+ border: none;
628
+ border-radius: 0;
629
+ background: transparent;
630
+ color: #f1f5f9;
631
+ font-size: 0.78rem;
632
+ white-space: nowrap;
633
+ overflow: hidden;
634
+ text-overflow: ellipsis;
635
+ cursor: pointer;
636
+ position: relative;
637
+ transition: background 0.12s ease;
638
+ }
639
+
640
+ .apphub-desktop__task:hover {
641
+ background: rgba(255, 255, 255, 0.06);
642
+ }
643
+
644
+ .apphub-desktop__task.active {
645
+ background: rgba(255, 255, 255, 0.04);
646
+ }
647
+
648
+ .apphub-desktop__task.active::after {
649
+ content: '';
650
+ position: absolute;
651
+ left: 8px;
652
+ right: 8px;
653
+ bottom: 0;
654
+ height: 3px;
655
+ background: #60a5fa;
656
+ border-radius: 2px 2px 0 0;
657
+ }
658
+
659
+ .apphub-desktop__task.minimized {
660
+ opacity: 0.72;
661
+ }
662
+
663
+ .apphub-desktop__taskbar-draft-store {
664
+ flex: 0 0 auto;
665
+ align-self: center;
666
+ display: inline-flex;
667
+ align-items: center;
668
+ gap: 7px;
669
+ height: 32px;
670
+ margin: 6px 8px 0 4px;
671
+ padding: 0 12px 0 10px;
672
+ border: 1px solid rgba(251, 191, 36, 0.45);
673
+ border-radius: 999px;
674
+ background: linear-gradient(180deg, rgba(251, 191, 36, 0.18) 0%, rgba(251, 191, 36, 0.08) 100%);
675
+ color: #fde68a;
676
+ cursor: pointer;
677
+ font-size: 0.7rem;
678
+ font-weight: 600;
679
+ letter-spacing: 0.02em;
680
+ transition: background 0.15s ease, border-color 0.15s ease, transform 0.1s ease;
681
+ }
682
+
683
+ .apphub-desktop__taskbar-draft-store:hover {
684
+ background: linear-gradient(180deg, rgba(251, 191, 36, 0.28) 0%, rgba(251, 191, 36, 0.14) 100%);
685
+ border-color: rgba(251, 191, 36, 0.65);
686
+ }
687
+
688
+ .apphub-desktop__taskbar-draft-store:active {
689
+ transform: scale(0.98);
690
+ }
691
+
692
+ .apphub-desktop__taskbar-draft-store-icon {
693
+ font-size: 1.05rem;
694
+ line-height: 1;
695
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));
696
+ }
697
+
698
+ .apphub-desktop__taskbar-draft-store-label {
699
+ max-width: 96px;
700
+ overflow: hidden;
701
+ text-overflow: ellipsis;
702
+ white-space: nowrap;
703
+ }
704
+
705
+ .apphub-desktop__clock {
706
+ flex: 0 0 auto;
707
+ display: flex;
708
+ align-items: center;
709
+ font-size: 0.75rem;
710
+ color: #e2e8f0;
711
+ padding: 0 14px;
712
+ height: 48px;
713
+ border-left: 1px solid rgba(255, 255, 255, 0.06);
714
+ }
715
+
716
+ @keyframes apphub-start-in {
717
+ from {
718
+ opacity: 0;
719
+ transform: translateY(16px) scale(0.98);
720
+ }
721
+ to {
722
+ opacity: 1;
723
+ transform: translateY(0) scale(1);
724
+ }
725
+ }
726
+
727
+ /* Window frame — positioned inside .apphub-desktop__workarea */
728
+ .apphub-win {
729
+ position: absolute;
730
+ pointer-events: auto;
731
+ display: flex;
732
+ flex-direction: column;
733
+ border-radius: 8px 8px 0 0;
734
+ overflow: hidden;
735
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.45);
736
+ border: 1px solid rgba(255, 255, 255, 0.15);
737
+ }
738
+
739
+ .apphub-win--active {
740
+ border-color: rgba(96, 165, 250, 0.6);
741
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(96, 165, 250, 0.35);
742
+ }
743
+
744
+ .apphub-win--fullscreen {
745
+ border-radius: 0;
746
+ box-shadow: none;
747
+ max-width: 100%;
748
+ max-height: 100%;
749
+ }
750
+
751
+ .apphub-win--fullscreen.apphub-win--active {
752
+ box-shadow: inset 0 0 0 1px rgba(96, 165, 250, 0.35);
753
+ }
754
+
755
+ .apphub-win__titlebar {
756
+ display: flex;
757
+ align-items: center;
758
+ gap: 8px;
759
+ height: 36px;
760
+ padding: 0 8px 0 10px;
761
+ background: linear-gradient(180deg, #2d3f5c 0%, #1e2d45 100%);
762
+ cursor: move;
763
+ }
764
+
765
+
766
+ .apphub-win__title {
767
+ flex: 1;
768
+ font-size: 0.8rem;
769
+ font-weight: 600;
770
+ }
771
+
772
+ .apphub-win__controls {
773
+ display: flex;
774
+ gap: 4px;
775
+ }
776
+
777
+ .apphub-win__btn {
778
+ width: 36px;
779
+ height: 28px;
780
+ border: none;
781
+ border-radius: 4px;
782
+ background: transparent;
783
+ color: #fff;
784
+ font-size: 1rem;
785
+ cursor: pointer;
786
+ }
787
+
788
+ .apphub-win__btn:hover {
789
+ background: rgba(255, 255, 255, 0.12);
790
+ }
791
+
792
+ .apphub-win__btn--close:hover {
793
+ background: #e81123;
794
+ }
795
+
796
+ .apphub-win__body {
797
+ flex: 1;
798
+ min-height: 0;
799
+ overflow: hidden;
800
+ display: flex;
801
+ flex-direction: column;
802
+ background: #1e293b;
803
+ }
804
+
805
+ .apphub-win__body > * {
806
+ flex: 1;
807
+ min-height: 0;
808
+ min-width: 0;
809
+ }
810
+
811
+ .apphub-win--resizable .apphub-win__resize {
812
+ position: absolute;
813
+ z-index: 3;
814
+ }
815
+
816
+ .apphub-win__resize--n,
817
+ .apphub-win__resize--s {
818
+ left: 10px;
819
+ right: 10px;
820
+ height: 6px;
821
+ }
822
+
823
+ .apphub-win__resize--e,
824
+ .apphub-win__resize--w {
825
+ top: 10px;
826
+ bottom: 10px;
827
+ width: 6px;
828
+ }
829
+
830
+ .apphub-win__resize--n {
831
+ top: 0;
832
+ cursor: n-resize;
833
+ }
834
+
835
+ .apphub-win__resize--s {
836
+ bottom: 0;
837
+ cursor: s-resize;
838
+ }
839
+
840
+ .apphub-win__resize--e {
841
+ right: 0;
842
+ cursor: e-resize;
843
+ }
844
+
845
+ .apphub-win__resize--w {
846
+ left: 0;
847
+ cursor: w-resize;
848
+ }
849
+
850
+ .apphub-win__resize--ne,
851
+ .apphub-win__resize--nw,
852
+ .apphub-win__resize--se,
853
+ .apphub-win__resize--sw {
854
+ width: 10px;
855
+ height: 10px;
856
+ }
857
+
858
+ .apphub-win__resize--ne {
859
+ top: 0;
860
+ right: 0;
861
+ cursor: ne-resize;
862
+ }
863
+
864
+ .apphub-win__resize--nw {
865
+ top: 0;
866
+ left: 0;
867
+ cursor: nw-resize;
868
+ }
869
+
870
+ .apphub-win__resize--se {
871
+ right: 0;
872
+ bottom: 0;
873
+ cursor: se-resize;
874
+ }
875
+
876
+ .apphub-win__resize--sw {
877
+ left: 0;
878
+ bottom: 0;
879
+ cursor: sw-resize;
880
+ }
881
+
882
+ /* App Store */
883
+ .apphub-store {
884
+ display: flex;
885
+ flex-direction: column;
886
+ height: 100%;
887
+ min-height: 0;
888
+ color: #e2e8f0;
889
+ background: #1e293b;
890
+ }
891
+
892
+ .apphub-store__header {
893
+ flex: 0 0 auto;
894
+ display: flex;
895
+ align-items: center;
896
+ gap: 12px;
897
+ padding: 12px 16px;
898
+ border-bottom: 1px solid #334155;
899
+ }
900
+
901
+ .apphub-store__title {
902
+ margin: 0;
903
+ font-size: 1.1rem;
904
+ font-weight: 600;
905
+ flex: 1;
906
+ min-width: 0;
907
+ white-space: nowrap;
908
+ overflow: hidden;
909
+ text-overflow: ellipsis;
910
+ }
911
+
912
+ .apphub-store__toolbar {
913
+ display: flex;
914
+ align-items: center;
915
+ flex-shrink: 0;
916
+ }
917
+
918
+ .apphub-store__settings-btn {
919
+ width: 32px;
920
+ height: 32px;
921
+ display: flex;
922
+ align-items: center;
923
+ justify-content: center;
924
+ border: none;
925
+ border-radius: 4px;
926
+ background: transparent;
927
+ color: #94a3b8;
928
+ cursor: pointer;
929
+ transition: background 0.12s ease, color 0.12s ease;
930
+ }
931
+
932
+ .apphub-store__settings-btn:hover {
933
+ background: rgba(255, 255, 255, 0.08);
934
+ color: #e2e8f0;
935
+ }
936
+
937
+ .apphub-store__settings-btn--active {
938
+ background: rgba(59, 130, 246, 0.2);
939
+ color: #93c5fd;
940
+ }
941
+
942
+ .apphub-store__settings-icon {
943
+ width: 18px;
944
+ height: 18px;
945
+ }
946
+
947
+ .apphub-store__content {
948
+ flex: 1;
949
+ min-height: 0;
950
+ overflow: auto;
951
+ }
952
+
953
+ .apphub-store__panel {
954
+ padding: 16px;
955
+ height: 100%;
956
+ box-sizing: border-box;
957
+ }
958
+
959
+ .apphub-store__panel--scroll {
960
+ overflow: auto;
961
+ }
962
+
963
+ .apphub-draft-store__body--scroll {
964
+ overflow: auto;
965
+ }
966
+
967
+ .apphub-catalog-sentinel {
968
+ height: 1px;
969
+ margin-top: 8px;
970
+ }
971
+
972
+ .apphub-catalog-footer {
973
+ margin: 12px 0 0;
974
+ text-align: center;
975
+ font-size: 0.8rem;
976
+ color: var(--ah-text-muted, #94a3b8);
977
+ }
978
+
979
+ .apphub-store__search {
980
+ width: 100%;
981
+ margin-bottom: 12px;
982
+ min-width: 160px;
983
+ padding: 8px 12px;
984
+ border-radius: 6px;
985
+ border: 1px solid #475569;
986
+ background: #0f172a;
987
+ color: #fff;
988
+ }
989
+
990
+ .apphub-store__section {
991
+ margin-bottom: 20px;
992
+ }
993
+
994
+ .apphub-store__section-title {
995
+ margin: 0 0 10px;
996
+ font-size: 0.9rem;
997
+ font-weight: 600;
998
+ color: #e2e8f0;
999
+ }
1000
+
1001
+ .apphub-store__section-hint {
1002
+ margin: -4px 0 10px;
1003
+ font-size: 0.75rem;
1004
+ color: #94a3b8;
1005
+ }
1006
+
1007
+ .apphub-store__section--testing .apphub-store__section-title {
1008
+ color: #fcd34d;
1009
+ }
1010
+
1011
+ .apphub-store__grid {
1012
+ list-style: none;
1013
+ margin: 0;
1014
+ padding: 0;
1015
+ display: grid;
1016
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 200px), 1fr));
1017
+ gap: 12px;
1018
+ }
1019
+
1020
+ .apphub-store__card {
1021
+ display: flex;
1022
+ flex-direction: column;
1023
+ gap: 8px;
1024
+ padding: 14px;
1025
+ border-radius: 8px;
1026
+ background: #334155;
1027
+ border: 1px solid #475569;
1028
+ }
1029
+
1030
+ .apphub-store__icon {
1031
+ font-size: 2rem;
1032
+ }
1033
+
1034
+ .apphub-store__meta p {
1035
+ margin: 4px 0 0;
1036
+ font-size: 0.8rem;
1037
+ color: #94a3b8;
1038
+ }
1039
+
1040
+ .apphub-store__btn {
1041
+ align-self: flex-start;
1042
+ padding: 6px 14px;
1043
+ border: none;
1044
+ border-radius: 6px;
1045
+ background: #3b82f6;
1046
+ color: #fff;
1047
+ cursor: pointer;
1048
+ }
1049
+
1050
+ .apphub-store__btn--secondary {
1051
+ background: #334155;
1052
+ border: 1px solid #475569;
1053
+ }
1054
+
1055
+ .apphub-store__btn--secondary:hover {
1056
+ background: #475569;
1057
+ }
1058
+
1059
+ .apphub-store__installed {
1060
+ color: #4ade80;
1061
+ font-weight: 600;
1062
+ }
1063
+
1064
+ .apphub-store__installed-row {
1065
+ display: flex;
1066
+ flex-wrap: wrap;
1067
+ align-items: center;
1068
+ gap: 8px;
1069
+ }
1070
+
1071
+ .apphub-store__card--draft {
1072
+ border-color: rgba(251, 191, 36, 0.35);
1073
+ }
1074
+
1075
+ .apphub-store__empty {
1076
+ text-align: center;
1077
+ color: #94a3b8;
1078
+ padding: 32px;
1079
+ }
1080
+
1081
+ .apphub-store__empty-hint {
1082
+ margin: 8px 0 0;
1083
+ font-size: 0.8rem;
1084
+ color: #64748b;
1085
+ }
1086
+
1087
+ .apphub-store__msg {
1088
+ margin: 0 0 12px;
1089
+ font-size: 0.875rem;
1090
+ color: #94a3b8;
1091
+ }
1092
+
1093
+ .apphub-store__msg--error {
1094
+ color: #fca5a5;
1095
+ }
1096
+
1097
+ .apphub-store__msg--warn {
1098
+ color: #fcd34d;
1099
+ }
1100
+
1101
+ .apphub-store__title-row {
1102
+ display: flex;
1103
+ flex-wrap: wrap;
1104
+ align-items: center;
1105
+ gap: 6px;
1106
+ }
1107
+
1108
+ .apphub-store__badge {
1109
+ display: inline-block;
1110
+ padding: 2px 8px;
1111
+ border-radius: 999px;
1112
+ font-size: 0.65rem;
1113
+ font-weight: 600;
1114
+ text-transform: uppercase;
1115
+ letter-spacing: 0.03em;
1116
+ }
1117
+
1118
+ .apphub-store__badge--draft {
1119
+ background: rgba(251, 191, 36, 0.2);
1120
+ color: #fcd34d;
1121
+ }
1122
+
1123
+ .apphub-store__badge--offline {
1124
+ background: rgba(148, 163, 184, 0.2);
1125
+ color: #cbd5e1;
1126
+ }
1127
+
1128
+ .apphub-store__card--offline {
1129
+ opacity: 0.72;
1130
+ }
1131
+
1132
+ .apphub-store__unavailable {
1133
+ font-size: 0.75rem;
1134
+ color: #94a3b8;
1135
+ font-weight: 600;
1136
+ }
1137
+
1138
+ /* Draft App Store — taskbar-only; colors via theme.css tokens */
1139
+ .apphub-draft-store {
1140
+ display: flex;
1141
+ flex-direction: column;
1142
+ height: 100%;
1143
+ min-height: 0;
1144
+ }
1145
+
1146
+ .apphub-draft-store__hero {
1147
+ display: flex;
1148
+ align-items: flex-start;
1149
+ gap: 14px;
1150
+ padding: 18px 20px 16px;
1151
+ border-bottom: 1px solid;
1152
+ }
1153
+
1154
+ .apphub-draft-store__hero-icon {
1155
+ flex-shrink: 0;
1156
+ width: 44px;
1157
+ height: 44px;
1158
+ display: flex;
1159
+ align-items: center;
1160
+ justify-content: center;
1161
+ font-size: 1.5rem;
1162
+ border-radius: 12px;
1163
+ border: 1px solid;
1164
+ box-shadow: 0 2px 8px var(--ah-shadow);
1165
+ }
1166
+
1167
+ .apphub-draft-store__hero-text {
1168
+ min-width: 0;
1169
+ flex: 1;
1170
+ }
1171
+
1172
+ .apphub-draft-store__title {
1173
+ margin: 0 0 4px;
1174
+ font-size: 1.15rem;
1175
+ font-weight: 700;
1176
+ letter-spacing: -0.01em;
1177
+ }
1178
+
1179
+ .apphub-draft-store__intro {
1180
+ margin: 0;
1181
+ font-size: 0.8rem;
1182
+ line-height: 1.45;
1183
+ max-width: 42em;
1184
+ }
1185
+
1186
+ .apphub-draft-store__body {
1187
+ flex: 1;
1188
+ min-height: 0;
1189
+ overflow: auto;
1190
+ padding: 16px 20px 20px;
1191
+ box-sizing: border-box;
1192
+ }
1193
+
1194
+ .apphub-draft-store__search {
1195
+ display: block;
1196
+ width: 100%;
1197
+ box-sizing: border-box;
1198
+ margin-bottom: 16px;
1199
+ padding: 9px 14px;
1200
+ border-radius: 8px;
1201
+ border: 1px solid;
1202
+ font-size: 0.85rem;
1203
+ }
1204
+
1205
+ .apphub-draft-store__search:focus {
1206
+ outline: none;
1207
+ border-color: var(--ah-draft-card-border);
1208
+ box-shadow: 0 0 0 2px var(--ah-hover);
1209
+ }
1210
+
1211
+ .apphub-draft-store__list {
1212
+ list-style: none;
1213
+ margin: 0;
1214
+ padding: 0;
1215
+ display: flex;
1216
+ flex-direction: column;
1217
+ gap: 12px;
1218
+ width: 100%;
1219
+ }
1220
+
1221
+ .apphub-draft-store__msg {
1222
+ margin: 0;
1223
+ font-size: 0.875rem;
1224
+ }
1225
+
1226
+ .apphub-draft-store__msg--error {
1227
+ color: #fca5a5;
1228
+ }
1229
+
1230
+ .apphub-draft-store__msg--warn {
1231
+ color: var(--ah-draft-accent-strong);
1232
+ }
1233
+
1234
+ .apphub-draft-store__empty {
1235
+ display: flex;
1236
+ flex-direction: column;
1237
+ align-items: center;
1238
+ gap: 10px;
1239
+ padding: 40px 20px;
1240
+ text-align: center;
1241
+ font-size: 0.9rem;
1242
+ }
1243
+
1244
+ .apphub-draft-store__empty-icon {
1245
+ font-size: 2rem;
1246
+ opacity: 0.7;
1247
+ }
1248
+
1249
+ .apphub-draft-card {
1250
+ padding: 14px 16px;
1251
+ border-radius: 12px;
1252
+ border: 1px solid;
1253
+ box-shadow: 0 2px 10px var(--ah-shadow);
1254
+ }
1255
+
1256
+ .apphub-draft-card__main {
1257
+ display: flex;
1258
+ gap: 14px;
1259
+ align-items: flex-start;
1260
+ }
1261
+
1262
+ .apphub-draft-card__icon {
1263
+ flex-shrink: 0;
1264
+ width: 48px;
1265
+ height: 48px;
1266
+ display: flex;
1267
+ align-items: center;
1268
+ justify-content: center;
1269
+ font-size: 1.75rem;
1270
+ border-radius: 10px;
1271
+ border: 1px solid;
1272
+ }
1273
+
1274
+ .apphub-draft-card__body {
1275
+ min-width: 0;
1276
+ flex: 1;
1277
+ }
1278
+
1279
+ .apphub-draft-card__name {
1280
+ margin: 0 0 4px;
1281
+ font-size: 0.95rem;
1282
+ font-weight: 600;
1283
+ }
1284
+
1285
+ .apphub-draft-card__slug {
1286
+ margin: 0 0 6px;
1287
+ font-size: 0.7rem;
1288
+ font-family: ui-monospace, monospace;
1289
+ }
1290
+
1291
+ .apphub-draft-card__desc {
1292
+ margin: 0;
1293
+ font-size: 0.78rem;
1294
+ line-height: 1.4;
1295
+ }
1296
+
1297
+ .apphub-draft-card__actions {
1298
+ display: flex;
1299
+ flex-wrap: wrap;
1300
+ align-items: center;
1301
+ gap: 8px;
1302
+ margin-top: 14px;
1303
+ padding-top: 12px;
1304
+ border-top: 1px solid;
1305
+ }
1306
+
1307
+ .apphub-draft-card__btn {
1308
+ padding: 7px 14px;
1309
+ border-radius: 8px;
1310
+ font-size: 0.78rem;
1311
+ font-weight: 600;
1312
+ cursor: pointer;
1313
+ transition: background 0.12s ease, border-color 0.12s ease;
1314
+ }
1315
+
1316
+ .apphub-draft-card__btn--primary {
1317
+ border: none;
1318
+ background: linear-gradient(180deg, #3b82f6 0%, #2563eb 100%);
1319
+ color: #fff;
1320
+ box-shadow: 0 2px 8px rgba(37, 99, 235, 0.35);
1321
+ }
1322
+
1323
+ .apphub-draft-card__btn--primary:hover {
1324
+ background: linear-gradient(180deg, #60a5fa 0%, #3b82f6 100%);
1325
+ }
1326
+
1327
+ .apphub-draft-card__btn--secondary {
1328
+ border: 1px solid;
1329
+ }
1330
+
1331
+ .apphub-draft-card__btn:disabled {
1332
+ opacity: 0.55;
1333
+ cursor: not-allowed;
1334
+ }
1335
+
1336
+ .apphub-draft-card__installed {
1337
+ display: inline-flex;
1338
+ align-items: center;
1339
+ gap: 6px;
1340
+ font-size: 0.78rem;
1341
+ font-weight: 600;
1342
+ color: #4ade80;
1343
+ }
1344
+
1345
+ .apphub-draft-card__installed-check {
1346
+ width: 20px;
1347
+ height: 20px;
1348
+ display: inline-flex;
1349
+ align-items: center;
1350
+ justify-content: center;
1351
+ border-radius: 999px;
1352
+ background: rgba(74, 222, 128, 0.15);
1353
+ font-size: 0.7rem;
1354
+ }
1355
+
1356
+ .apphub-draft-card__unavailable {
1357
+ font-size: 0.78rem;
1358
+ color: #94a3b8;
1359
+ }
1360
+
1361
+ .apphub-draft-card__ping {
1362
+ margin: 10px 0 0;
1363
+ padding: 8px 10px;
1364
+ border-radius: 6px;
1365
+ font-size: 0.75rem;
1366
+ font-weight: 500;
1367
+ }
1368
+
1369
+ .apphub-draft-card__ping--ok {
1370
+ color: #86efac;
1371
+ background: rgba(74, 222, 128, 0.1);
1372
+ border: 1px solid rgba(74, 222, 128, 0.25);
1373
+ }
1374
+
1375
+ .apphub-draft-card__ping--bad {
1376
+ color: #fca5a5;
1377
+ background: rgba(248, 113, 113, 0.1);
1378
+ border: 1px solid rgba(248, 113, 113, 0.25);
1379
+ }
1380
+
1381
+ .apphub-runner {
1382
+ width: 100%;
1383
+ min-height: 400px;
1384
+ background: #0f172a;
1385
+ box-sizing: border-box;
1386
+ }
1387
+
1388
+ .apphub-runner__frame {
1389
+ display: block;
1390
+ width: 100%;
1391
+ min-height: 400px;
1392
+ height: 100%;
1393
+ border: none;
1394
+ background: #000;
1395
+ }
1396
+
1397
+ .apphub-runner__msg,
1398
+ .apphub-runner__error {
1399
+ padding: 24px;
1400
+ text-align: center;
1401
+ color: #94a3b8;
1402
+ }
1403
+
1404
+ .apphub-runner__error {
1405
+ color: #f87171;
1406
+ }
1407
+
1408
+ .apphub-runner__preflight {
1409
+ padding: 20px;
1410
+ box-sizing: border-box;
1411
+ }
1412
+
1413
+ .apphub-runner__preflight-head {
1414
+ display: flex;
1415
+ align-items: center;
1416
+ gap: 12px;
1417
+ margin-bottom: 16px;
1418
+ }
1419
+
1420
+ .apphub-runner__preflight-icon {
1421
+ display: flex;
1422
+ align-items: center;
1423
+ justify-content: center;
1424
+ width: 48px;
1425
+ height: 48px;
1426
+ border-radius: 10px;
1427
+ background: #1e293b;
1428
+ font-size: 1.5rem;
1429
+ }
1430
+
1431
+ .apphub-runner__preflight-title {
1432
+ margin: 0 0 4px;
1433
+ font-size: 1rem;
1434
+ font-weight: 600;
1435
+ color: #f1f5f9;
1436
+ }
1437
+
1438
+ .apphub-runner__preflight-badge {
1439
+ display: inline-block;
1440
+ padding: 2px 8px;
1441
+ border-radius: 999px;
1442
+ font-size: 0.7rem;
1443
+ font-weight: 600;
1444
+ color: #fde68a;
1445
+ background: rgba(251, 191, 36, 0.15);
1446
+ border: 1px solid rgba(251, 191, 36, 0.35);
1447
+ }
1448
+
1449
+ .apphub-runner__preflight-badge--hosted {
1450
+ margin-left: 6px;
1451
+ color: #93c5fd;
1452
+ background: rgba(59, 130, 246, 0.15);
1453
+ border-color: rgba(59, 130, 246, 0.35);
1454
+ }
1455
+
1456
+ .apphub-runner__preflight-dl {
1457
+ margin: 0 0 16px;
1458
+ padding: 12px;
1459
+ border-radius: 8px;
1460
+ background: #1e293b;
1461
+ border: 1px solid #334155;
1462
+ }
1463
+
1464
+ .apphub-runner__preflight-row {
1465
+ display: grid;
1466
+ grid-template-columns: 120px 1fr;
1467
+ gap: 8px;
1468
+ margin-bottom: 8px;
1469
+ font-size: 0.8rem;
1470
+ }
1471
+
1472
+ .apphub-runner__preflight-row:last-child {
1473
+ margin-bottom: 0;
1474
+ }
1475
+
1476
+ .apphub-runner__preflight-row dt {
1477
+ color: #94a3b8;
1478
+ }
1479
+
1480
+ .apphub-runner__preflight-row dd {
1481
+ margin: 0;
1482
+ color: #e2e8f0;
1483
+ word-break: break-all;
1484
+ }
1485
+
1486
+ .apphub-runner__preflight-actions {
1487
+ display: flex;
1488
+ flex-wrap: wrap;
1489
+ gap: 8px;
1490
+ margin-bottom: 12px;
1491
+ }
1492
+
1493
+ .apphub-runner__btn {
1494
+ padding: 8px 14px;
1495
+ border-radius: 6px;
1496
+ border: 1px solid #475569;
1497
+ background: #334155;
1498
+ color: #f1f5f9;
1499
+ font-size: 0.8rem;
1500
+ cursor: pointer;
1501
+ }
1502
+
1503
+ .apphub-runner__btn:disabled {
1504
+ opacity: 0.55;
1505
+ cursor: not-allowed;
1506
+ }
1507
+
1508
+ .apphub-runner__btn--primary {
1509
+ background: #2563eb;
1510
+ border-color: #3b82f6;
1511
+ }
1512
+
1513
+ .apphub-runner__btn--primary:hover:not(:disabled) {
1514
+ background: #1d4ed8;
1515
+ }
1516
+
1517
+ .apphub-runner__btn--secondary:hover:not(:disabled) {
1518
+ background: #475569;
1519
+ }
1520
+
1521
+ .apphub-runner__preflight-msg {
1522
+ margin: 8px 0 0;
1523
+ padding: 8px 10px;
1524
+ border-radius: 6px;
1525
+ font-size: 0.75rem;
1526
+ }
1527
+
1528
+ .apphub-runner__preflight-msg--ok {
1529
+ color: #86efac;
1530
+ background: rgba(74, 222, 128, 0.1);
1531
+ border: 1px solid rgba(74, 222, 128, 0.25);
1532
+ }
1533
+
1534
+ .apphub-runner__preflight-msg--bad {
1535
+ color: #fca5a5;
1536
+ background: rgba(248, 113, 113, 0.1);
1537
+ border: 1px solid rgba(248, 113, 113, 0.25);
1538
+ }
1539
+
1540
+ .apphub-store-settings {
1541
+ padding: 16px;
1542
+ box-sizing: border-box;
1543
+ }
1544
+
1545
+ .apphub-store-settings__section {
1546
+ margin-bottom: 16px;
1547
+ padding: 12px;
1548
+ border-radius: 8px;
1549
+ background: #1e293b;
1550
+ border: 1px solid #334155;
1551
+ }
1552
+
1553
+ .apphub-store-settings__section:last-child {
1554
+ margin-bottom: 0;
1555
+ }
1556
+
1557
+ .apphub-store-settings__heading {
1558
+ margin: 0 0 10px;
1559
+ font-size: 0.9rem;
1560
+ font-weight: 600;
1561
+ }
1562
+
1563
+ .apphub-store-settings__hint {
1564
+ margin: 0 0 12px;
1565
+ font-size: 0.8rem;
1566
+ color: #94a3b8;
1567
+ }
1568
+
1569
+ .apphub-store-settings__dl {
1570
+ margin: 0;
1571
+ }
1572
+
1573
+ .apphub-store-settings__row {
1574
+ display: flex;
1575
+ gap: 12px;
1576
+ padding: 6px 0;
1577
+ border-bottom: 1px solid #334155;
1578
+ font-size: 0.875rem;
1579
+ }
1580
+
1581
+ .apphub-store-settings__row:last-child {
1582
+ border-bottom: none;
1583
+ }
1584
+
1585
+ .apphub-store-settings__row dt {
1586
+ flex: 0 0 110px;
1587
+ color: #94a3b8;
1588
+ }
1589
+
1590
+ .apphub-store-settings__row dd {
1591
+ margin: 0;
1592
+ flex: 1;
1593
+ word-break: break-word;
1594
+ }
1595
+
1596
+ .apphub-store-settings__badge {
1597
+ display: inline-block;
1598
+ padding: 2px 8px;
1599
+ border-radius: 4px;
1600
+ font-size: 0.75rem;
1601
+ }
1602
+
1603
+ .apphub-store-settings__badge--ok {
1604
+ background: #14532d;
1605
+ color: #86efac;
1606
+ }
1607
+
1608
+ .apphub-store-settings__badge--warn {
1609
+ background: #422006;
1610
+ color: #fcd34d;
1611
+ }
1612
+
1613
+ .apphub-store-settings__field {
1614
+ margin-bottom: 12px;
1615
+ }
1616
+
1617
+ .apphub-store-settings__label {
1618
+ display: block;
1619
+ margin-bottom: 4px;
1620
+ font-size: 0.8rem;
1621
+ color: #94a3b8;
1622
+ }
1623
+
1624
+ .apphub-store-settings__select {
1625
+ width: 100%;
1626
+ padding: 8px 10px;
1627
+ border-radius: 6px;
1628
+ border: 1px solid #475569;
1629
+ background: #0f172a;
1630
+ color: #e2e8f0;
1631
+ }
1632
+
1633
+ .apphub-store-settings__check {
1634
+ display: flex;
1635
+ align-items: center;
1636
+ gap: 8px;
1637
+ margin-bottom: 12px;
1638
+ font-size: 0.875rem;
1639
+ cursor: pointer;
1640
+ }
1641
+
1642
+ .apphub-store-settings__zone-list {
1643
+ list-style: none;
1644
+ margin: 12px 0 0;
1645
+ padding: 0;
1646
+ display: flex;
1647
+ flex-direction: column;
1648
+ gap: 6px;
1649
+ }
1650
+
1651
+ .apphub-store-settings__zone-item {
1652
+ display: flex;
1653
+ gap: 8px;
1654
+ align-items: center;
1655
+ padding: 8px 10px;
1656
+ border-radius: 6px;
1657
+ background: #0f172a;
1658
+ border: 1px solid #334155;
1659
+ font-size: 0.875rem;
1660
+ }
1661
+
1662
+ .apphub-store-settings__zone-item--active {
1663
+ border-color: #3b82f6;
1664
+ background: #172554;
1665
+ }
1666
+
1667
+ .apphub-store-settings__zone-id {
1668
+ color: #64748b;
1669
+ font-size: 0.75rem;
1670
+ }
1671
+
1672
+ .apphub-store-settings__zone-chip {
1673
+ display: inline-block;
1674
+ padding: 6px 12px;
1675
+ border-radius: 6px;
1676
+ background: #172554;
1677
+ border: 1px solid #3b82f6;
1678
+ font-size: 0.875rem;
1679
+ }
1680
+
1681
+ .apphub-store-settings__msg {
1682
+ color: #94a3b8;
1683
+ font-size: 0.875rem;
1684
+ }
1685
+
1686
+ .apphub-store-settings__meta {
1687
+ margin: 8px 0 0;
1688
+ font-size: 0.75rem;
1689
+ color: #64748b;
1690
+ }
1691
+
1692
+ .apphub-store-settings__dev-list {
1693
+ list-style: none;
1694
+ margin: 0 0 12px;
1695
+ padding: 0;
1696
+ }
1697
+
1698
+ .apphub-store-settings__dev-item {
1699
+ display: flex;
1700
+ align-items: center;
1701
+ justify-content: space-between;
1702
+ gap: 8px;
1703
+ padding: 8px 0;
1704
+ border-bottom: 1px solid #334155;
1705
+ font-size: 0.85rem;
1706
+ }
1707
+
1708
+ .apphub-store-settings__dev-btn {
1709
+ padding: 4px 10px;
1710
+ border: none;
1711
+ border-radius: 4px;
1712
+ background: #475569;
1713
+ color: #fff;
1714
+ cursor: pointer;
1715
+ font-size: 0.75rem;
1716
+ }
1717
+
1718
+ .apphub-store-settings__refresh {
1719
+ margin-top: 12px;
1720
+ padding: 6px 14px;
1721
+ border: 1px solid #475569;
1722
+ border-radius: 6px;
1723
+ background: #334155;
1724
+ color: #e2e8f0;
1725
+ cursor: pointer;
1726
+ font-size: 0.875rem;
1727
+ }
1728
+
1729
+ /* Publish hosted package — Draft Store */
1730
+ .apphub-publish {
1731
+ margin-bottom: 20px;
1732
+ padding: 16px;
1733
+ border-radius: 12px;
1734
+ border: 1px solid;
1735
+ }
1736
+
1737
+ .apphub-publish__head {
1738
+ margin-bottom: 12px;
1739
+ }
1740
+
1741
+ .apphub-publish__title {
1742
+ margin: 0 0 6px;
1743
+ font-size: 1rem;
1744
+ font-weight: 700;
1745
+ }
1746
+
1747
+ .apphub-publish__intro {
1748
+ margin: 0;
1749
+ font-size: 0.8rem;
1750
+ line-height: 1.45;
1751
+ }
1752
+
1753
+ .apphub-publish__tabs {
1754
+ display: flex;
1755
+ gap: 8px;
1756
+ margin-bottom: 14px;
1757
+ }
1758
+
1759
+ .apphub-publish__tab {
1760
+ padding: 6px 12px;
1761
+ border-radius: 8px;
1762
+ border: 1px solid;
1763
+ background: transparent;
1764
+ font-size: 0.8rem;
1765
+ cursor: pointer;
1766
+ }
1767
+
1768
+ .apphub-publish__tab--active {
1769
+ font-weight: 600;
1770
+ }
1771
+
1772
+ .apphub-publish__form {
1773
+ display: flex;
1774
+ flex-direction: column;
1775
+ gap: 10px;
1776
+ }
1777
+
1778
+ .apphub-publish__field {
1779
+ display: flex;
1780
+ flex-direction: column;
1781
+ gap: 4px;
1782
+ }
1783
+
1784
+ .apphub-publish__label {
1785
+ font-size: 0.75rem;
1786
+ font-weight: 600;
1787
+ }
1788
+
1789
+ .apphub-publish__input,
1790
+ .apphub-publish__file {
1791
+ padding: 8px 10px;
1792
+ border-radius: 8px;
1793
+ border: 1px solid;
1794
+ font-size: 0.85rem;
1795
+ }
1796
+
1797
+ .apphub-publish__file-name {
1798
+ font-size: 0.75rem;
1799
+ opacity: 0.85;
1800
+ }
1801
+
1802
+ .apphub-publish__msg {
1803
+ margin: 0;
1804
+ font-size: 0.8rem;
1805
+ }
1806
+
1807
+ .apphub-publish__msg--ok {
1808
+ color: #86efac;
1809
+ }
1810
+
1811
+ .apphub-publish__msg--error {
1812
+ color: #fca5a5;
1813
+ }
1814
+
1815
+ .apphub-publish__msg--warn {
1816
+ color: var(--ah-draft-accent-strong, #fbbf24);
1817
+ }
1818
+
1819
+ .apphub-publish__submit {
1820
+ align-self: flex-start;
1821
+ padding: 8px 16px;
1822
+ border: none;
1823
+ border-radius: 8px;
1824
+ font-size: 0.85rem;
1825
+ font-weight: 600;
1826
+ cursor: pointer;
1827
+ }
1828
+
1829
+ .apphub-publish__submit:disabled {
1830
+ opacity: 0.55;
1831
+ cursor: not-allowed;
1832
+ }
1833
+
1834
+ /* DEV bundle review — App Store settings */
1835
+ .apphub-dev-review {
1836
+ margin-bottom: 16px;
1837
+ padding-bottom: 16px;
1838
+ border-bottom: 1px solid #334155;
1839
+ }
1840
+
1841
+ .apphub-dev-review__title {
1842
+ margin: 0 0 6px;
1843
+ font-size: 0.95rem;
1844
+ font-weight: 700;
1845
+ }
1846
+
1847
+ .apphub-dev-review__hint {
1848
+ margin: 0 0 12px;
1849
+ font-size: 0.8rem;
1850
+ color: #94a3b8;
1851
+ }
1852
+
1853
+ .apphub-dev-review__msg {
1854
+ margin: 0;
1855
+ font-size: 0.8rem;
1856
+ color: #94a3b8;
1857
+ }
1858
+
1859
+ .apphub-dev-review__list {
1860
+ list-style: none;
1861
+ margin: 0;
1862
+ padding: 0;
1863
+ display: flex;
1864
+ flex-direction: column;
1865
+ gap: 12px;
1866
+ }
1867
+
1868
+ .apphub-dev-review__item {
1869
+ padding: 12px;
1870
+ border-radius: 10px;
1871
+ border: 1px solid #334155;
1872
+ background: #1e293b;
1873
+ }
1874
+
1875
+ .apphub-dev-review__item-head {
1876
+ display: flex;
1877
+ align-items: flex-start;
1878
+ gap: 10px;
1879
+ }
1880
+
1881
+ .apphub-dev-review__icon {
1882
+ font-size: 1.25rem;
1883
+ }
1884
+
1885
+ .apphub-dev-review__meta {
1886
+ flex: 1;
1887
+ min-width: 0;
1888
+ display: flex;
1889
+ flex-direction: column;
1890
+ gap: 2px;
1891
+ font-size: 0.85rem;
1892
+ }
1893
+
1894
+ .apphub-dev-review__slug {
1895
+ font-size: 0.75rem;
1896
+ color: #94a3b8;
1897
+ }
1898
+
1899
+ .apphub-dev-review__badge {
1900
+ display: inline-block;
1901
+ margin-top: 4px;
1902
+ padding: 2px 8px;
1903
+ border-radius: 999px;
1904
+ font-size: 0.7rem;
1905
+ background: #334155;
1906
+ width: fit-content;
1907
+ }
1908
+
1909
+ .apphub-dev-review__actions {
1910
+ display: flex;
1911
+ flex-direction: column;
1912
+ gap: 6px;
1913
+ }
1914
+
1915
+ .apphub-dev-review__btn {
1916
+ padding: 5px 10px;
1917
+ border: none;
1918
+ border-radius: 6px;
1919
+ background: #475569;
1920
+ color: #fff;
1921
+ font-size: 0.72rem;
1922
+ cursor: pointer;
1923
+ white-space: nowrap;
1924
+ }
1925
+
1926
+ .apphub-dev-review__btn--primary {
1927
+ background: #2563eb;
1928
+ }
1929
+
1930
+ .apphub-dev-review__btn:disabled {
1931
+ opacity: 0.6;
1932
+ cursor: not-allowed;
1933
+ }
1934
+
1935
+ .apphub-dev-review__dl {
1936
+ margin: 10px 0 0;
1937
+ font-size: 0.75rem;
1938
+ }
1939
+
1940
+ .apphub-dev-review__row {
1941
+ display: flex;
1942
+ gap: 8px;
1943
+ margin-bottom: 4px;
1944
+ }
1945
+
1946
+ .apphub-dev-review__row dt {
1947
+ color: #94a3b8;
1948
+ min-width: 90px;
1949
+ }
1950
+
1951
+ .apphub-dev-review__mono {
1952
+ font-family: ui-monospace, monospace;
1953
+ word-break: break-all;
1954
+ }
1955
+
1956
+ .apphub-dev-review__files {
1957
+ margin-top: 10px;
1958
+ padding-top: 10px;
1959
+ border-top: 1px solid #334155;
1960
+ }
1961
+
1962
+ .apphub-dev-review__files-head {
1963
+ margin: 0 0 6px;
1964
+ font-size: 0.75rem;
1965
+ font-weight: 600;
1966
+ }
1967
+
1968
+ .apphub-dev-review__file-list {
1969
+ list-style: none;
1970
+ margin: 0;
1971
+ padding: 0;
1972
+ max-height: 140px;
1973
+ overflow: auto;
1974
+ font-size: 0.72rem;
1975
+ font-family: ui-monospace, monospace;
1976
+ }
1977
+
1978
+ .apphub-dev-review__file {
1979
+ padding: 2px 0;
1980
+ color: #cbd5e1;
1981
+ }
1982
+
1983
+ .apphub-dev-review__version {
1984
+ font-size: 0.72rem;
1985
+ color: #86efac;
1986
+ }
1987
+
1988
+ .apphub-version-history {
1989
+ margin-top: 10px;
1990
+ padding-top: 10px;
1991
+ border-top: 1px solid #334155;
1992
+ }
1993
+
1994
+ .apphub-version-history__head {
1995
+ margin: 0 0 8px;
1996
+ font-size: 0.75rem;
1997
+ font-weight: 600;
1998
+ }
1999
+
2000
+ .apphub-version-history__msg {
2001
+ margin: 0;
2002
+ font-size: 0.75rem;
2003
+ color: #94a3b8;
2004
+ }
2005
+
2006
+ .apphub-version-history__msg--error {
2007
+ color: #fca5a5;
2008
+ }
2009
+
2010
+ .apphub-version-history__list {
2011
+ list-style: none;
2012
+ margin: 0;
2013
+ padding: 0;
2014
+ display: flex;
2015
+ flex-direction: column;
2016
+ gap: 8px;
2017
+ max-height: 180px;
2018
+ overflow: auto;
2019
+ }
2020
+
2021
+ .apphub-version-history__item {
2022
+ padding: 8px 10px;
2023
+ border-radius: 8px;
2024
+ background: #0f172a;
2025
+ border: 1px solid #334155;
2026
+ }
2027
+
2028
+ .apphub-version-history__item--current {
2029
+ border-color: #2563eb;
2030
+ }
2031
+
2032
+ .apphub-version-history__row {
2033
+ display: flex;
2034
+ align-items: center;
2035
+ gap: 8px;
2036
+ font-size: 0.8rem;
2037
+ }
2038
+
2039
+ .apphub-version-history__badge {
2040
+ padding: 1px 6px;
2041
+ border-radius: 999px;
2042
+ font-size: 0.65rem;
2043
+ background: #1d4ed8;
2044
+ color: #fff;
2045
+ }
2046
+
2047
+ .apphub-version-history__meta,
2048
+ .apphub-version-history__hash {
2049
+ margin: 4px 0 0;
2050
+ font-size: 0.68rem;
2051
+ color: #94a3b8;
2052
+ font-family: ui-monospace, monospace;
2053
+ }
2054
+
2055
+ .apphub-store__version {
2056
+ margin: 0 0 4px;
2057
+ font-size: 0.75rem;
2058
+ color: #86efac;
2059
+ font-weight: 600;
2060
+ }
2061
+
2062
+ .apphub-store__version-installed {
2063
+ color: #94a3b8;
2064
+ font-weight: 400;
2065
+ }
2066
+
2067
+ /* Origin safety block — same-origin iframe embed */
2068
+ .apphub-origin-block {
2069
+ display: flex;
2070
+ align-items: center;
2071
+ justify-content: center;
2072
+ min-height: 100%;
2073
+ height: 100%;
2074
+ padding: 24px;
2075
+ box-sizing: border-box;
2076
+ background: #0f172a;
2077
+ color: #e2e8f0;
2078
+ font-family: system-ui, -apple-system, Segoe UI, sans-serif;
2079
+ }
2080
+
2081
+ .apphub-origin-block__panel {
2082
+ max-width: 520px;
2083
+ padding: 28px 32px;
2084
+ border-radius: 12px;
2085
+ border: 1px solid #334155;
2086
+ background: #1e293b;
2087
+ text-align: center;
2088
+ }
2089
+
2090
+ .apphub-origin-block__icon {
2091
+ font-size: 2.5rem;
2092
+ line-height: 1;
2093
+ }
2094
+
2095
+ .apphub-origin-block__title {
2096
+ margin: 16px 0 12px;
2097
+ font-size: 1.25rem;
2098
+ font-weight: 600;
2099
+ }
2100
+
2101
+ .apphub-origin-block__message,
2102
+ .apphub-origin-block__hint {
2103
+ margin: 0 0 12px;
2104
+ font-size: 0.9rem;
2105
+ line-height: 1.5;
2106
+ color: #94a3b8;
2107
+ }
2108
+
2109
+ .apphub-origin-block__hint {
2110
+ font-size: 0.82rem;
2111
+ margin-bottom: 0;
2112
+ }
2113
+
2114
+ .apphub-origin-block__dl {
2115
+ margin: 20px 0 0;
2116
+ padding-top: 16px;
2117
+ border-top: 1px solid #334155;
2118
+ text-align: left;
2119
+ }
2120
+
2121
+ .apphub-origin-block__row {
2122
+ margin-bottom: 8px;
2123
+ }
2124
+
2125
+ .apphub-origin-block__row dt {
2126
+ font-size: 0.72rem;
2127
+ color: #64748b;
2128
+ margin-bottom: 2px;
2129
+ }
2130
+
2131
+ .apphub-origin-block__row dd {
2132
+ margin: 0;
2133
+ font-size: 0.78rem;
2134
+ font-family: ui-monospace, monospace;
2135
+ word-break: break-all;
2136
+ color: #cbd5e1;
2137
+ }
2138
+
2139
+ .apphub-origin-block__dev {
2140
+ margin-top: 20px;
2141
+ padding-top: 16px;
2142
+ border-top: 1px solid #334155;
2143
+ text-align: left;
2144
+ }
2145
+
2146
+ .apphub-origin-block__dev-title {
2147
+ margin: 0 0 6px;
2148
+ font-size: 0.82rem;
2149
+ font-weight: 600;
2150
+ color: #e2e8f0;
2151
+ }
2152
+
2153
+ .apphub-origin-block__dev-status {
2154
+ margin: 0 0 10px;
2155
+ font-size: 0.78rem;
2156
+ color: #94a3b8;
2157
+ }
2158
+
2159
+ .apphub-origin-block__dev-btn {
2160
+ padding: 8px 14px;
2161
+ border-radius: 8px;
2162
+ border: 1px solid #475569;
2163
+ background: #0f172a;
2164
+ color: #e2e8f0;
2165
+ font-size: 0.8rem;
2166
+ cursor: pointer;
2167
+ }
2168
+
2169
+ .apphub-origin-block__dev-btn:hover {
2170
+ background: #1e293b;
2171
+ border-color: #64748b;
2172
+ }
2173
+
2174
+ /* Origin bootstrap loading — first visit before cache */
2175
+ .apphub-origin-loading {
2176
+ display: flex;
2177
+ align-items: center;
2178
+ justify-content: center;
2179
+ min-height: 100%;
2180
+ height: 100%;
2181
+ padding: 24px;
2182
+ box-sizing: border-box;
2183
+ background: #0f172a;
2184
+ color: #e2e8f0;
2185
+ font-family: system-ui, -apple-system, Segoe UI, sans-serif;
2186
+ }
2187
+
2188
+ .apphub-origin-loading__panel {
2189
+ max-width: 420px;
2190
+ padding: 32px 36px;
2191
+ border-radius: 12px;
2192
+ border: 1px solid #334155;
2193
+ background: #1e293b;
2194
+ text-align: center;
2195
+ }
2196
+
2197
+ .apphub-origin-loading__spinner {
2198
+ width: 40px;
2199
+ height: 40px;
2200
+ margin: 0 auto 20px;
2201
+ border: 3px solid #334155;
2202
+ border-top-color: #38bdf8;
2203
+ border-radius: 50%;
2204
+ animation: apphub-origin-loading-spin 0.85s linear infinite;
2205
+ }
2206
+
2207
+ @keyframes apphub-origin-loading-spin {
2208
+ to {
2209
+ transform: rotate(360deg);
2210
+ }
2211
+ }
2212
+
2213
+ .apphub-origin-loading__title {
2214
+ margin: 0 0 10px;
2215
+ font-size: 1.15rem;
2216
+ font-weight: 600;
2217
+ }
2218
+
2219
+ .apphub-origin-loading__hint {
2220
+ margin: 0;
2221
+ font-size: 0.85rem;
2222
+ line-height: 1.5;
2223
+ color: #94a3b8;
2224
+ }
2225
+
2226
+ /* DEV origin mode */
2227
+ .apphub-dev-origin-bar {
2228
+ display: flex;
2229
+ align-items: center;
2230
+ gap: 8px;
2231
+ padding: 4px 8px;
2232
+ border-radius: 8px;
2233
+ border: 1px solid rgba(148, 163, 184, 0.35);
2234
+ background: rgba(15, 23, 42, 0.92);
2235
+ color: #e2e8f0;
2236
+ pointer-events: auto;
2237
+ flex-shrink: 0;
2238
+ }
2239
+
2240
+ .apphub-dev-origin-bar--corner {
2241
+ position: absolute;
2242
+ top: 12px;
2243
+ right: 12px;
2244
+ z-index: 9999;
2245
+ max-width: min(420px, calc(100% - 24px));
2246
+ padding: 8px 12px;
2247
+ border-radius: 10px;
2248
+ backdrop-filter: blur(8px);
2249
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
2250
+ }
2251
+
2252
+ .apphub-dev-origin-bar--taskbar {
2253
+ margin-left: auto;
2254
+ margin-right: 8px;
2255
+ max-width: min(360px, 42vw);
2256
+ border-color: rgba(124, 58, 237, 0.45);
2257
+ background: rgba(30, 27, 75, 0.85);
2258
+ }
2259
+
2260
+ .apphub-dev-origin-bar--settings {
2261
+ margin-top: 20px;
2262
+ width: 100%;
2263
+ max-width: none;
2264
+ box-sizing: border-box;
2265
+ border-color: rgba(124, 58, 237, 0.45);
2266
+ background: rgba(30, 27, 75, 0.65);
2267
+ }
2268
+
2269
+ .apphub-settings-panel__dev-origin {
2270
+ display: block;
2271
+ }
2272
+
2273
+ .apphub-dev-origin-bar__badge {
2274
+ flex-shrink: 0;
2275
+ padding: 2px 6px;
2276
+ border-radius: 4px;
2277
+ background: #7c3aed;
2278
+ color: #fff;
2279
+ font-size: 0.65rem;
2280
+ font-weight: 700;
2281
+ letter-spacing: 0.04em;
2282
+ }
2283
+
2284
+ .apphub-dev-origin-bar__text {
2285
+ flex: 1;
2286
+ min-width: 0;
2287
+ display: flex;
2288
+ flex-direction: column;
2289
+ gap: 2px;
2290
+ }
2291
+
2292
+ .apphub-dev-origin-bar__title {
2293
+ font-size: 0.75rem;
2294
+ font-weight: 600;
2295
+ }
2296
+
2297
+ .apphub-dev-origin-bar__status {
2298
+ font-size: 0.68rem;
2299
+ color: #94a3b8;
2300
+ }
2301
+
2302
+ .apphub-dev-origin-bar__status--inline {
2303
+ overflow: hidden;
2304
+ text-overflow: ellipsis;
2305
+ white-space: nowrap;
2306
+ max-width: 140px;
2307
+ }
2308
+
2309
+ @media (min-width: 900px) {
2310
+ .apphub-dev-origin-bar__status--inline {
2311
+ max-width: 200px;
2312
+ }
2313
+ }
2314
+
2315
+ .apphub-dev-origin-bar__btn {
2316
+ flex-shrink: 0;
2317
+ padding: 6px 10px;
2318
+ border-radius: 6px;
2319
+ border: 1px solid #475569;
2320
+ background: #1e293b;
2321
+ color: #e2e8f0;
2322
+ font-size: 0.72rem;
2323
+ cursor: pointer;
2324
+ white-space: nowrap;
2325
+ }
2326
+
2327
+ .apphub-dev-origin-bar__btn:hover {
2328
+ background: #334155;
2329
+ }
2330
+
2331
+ .apphub-desktop--light .apphub-dev-origin-bar {
2332
+ background: rgba(255, 255, 255, 0.92);
2333
+ border-color: rgba(100, 116, 139, 0.35);
2334
+ color: #0f172a;
2335
+ }
2336
+
2337
+ .apphub-desktop--light .apphub-dev-origin-bar__status {
2338
+ color: #64748b;
2339
+ }
2340
+
2341
+ .apphub-desktop--light .apphub-dev-origin-bar__btn {
2342
+ background: #f1f5f9;
2343
+ border-color: #cbd5e1;
2344
+ color: #0f172a;
2345
+ }
2346
+
2347
+ .apphub-placeholder {
2348
+ display: flex;
2349
+ flex-direction: column;
2350
+ align-items: center;
2351
+ justify-content: center;
2352
+ height: 100%;
2353
+ min-height: 0;
2354
+ padding: 24px;
2355
+ text-align: center;
2356
+ color: #e2e8f0;
2357
+ box-sizing: border-box;
2358
+ }
2359
+
2360
+ .apphub-placeholder__icon {
2361
+ font-size: 3rem;
2362
+ margin: 0;
2363
+ }
2364
+
2365
+ .apphub-placeholder__hint {
2366
+ color: #94a3b8;
2367
+ font-size: 0.875rem;
2368
+ }
2369
+
2370
+ /* Drag-drop install zone */
2371
+ .apphub-drop-layer {
2372
+ position: absolute;
2373
+ inset: 0;
2374
+ bottom: 48px;
2375
+ z-index: 7;
2376
+ pointer-events: none;
2377
+ }
2378
+
2379
+ .apphub-drop-layer__glow {
2380
+ position: absolute;
2381
+ inset: 12px;
2382
+ border: 2px dashed rgba(96, 165, 250, 0.65);
2383
+ border-radius: 12px;
2384
+ background: rgba(59, 130, 246, 0.12);
2385
+ animation: apphub-drop-pulse 1.2s ease-in-out infinite;
2386
+ box-shadow: inset 0 0 48px rgba(59, 130, 246, 0.15);
2387
+ }
2388
+
2389
+ .apphub-drop-layer__hint {
2390
+ position: absolute;
2391
+ left: 50%;
2392
+ top: 50%;
2393
+ transform: translate(-50%, -50%);
2394
+ text-align: center;
2395
+ padding: 20px 28px;
2396
+ border-radius: 12px;
2397
+ background: rgba(15, 23, 42, 0.82);
2398
+ border: 1px solid rgba(96, 165, 250, 0.45);
2399
+ backdrop-filter: blur(8px);
2400
+ animation: apphub-drop-float 1.5s ease-in-out infinite;
2401
+ pointer-events: none;
2402
+ }
2403
+
2404
+ .apphub-drop-layer__hint-icon {
2405
+ display: block;
2406
+ font-size: 2rem;
2407
+ margin-bottom: 8px;
2408
+ opacity: 0.9;
2409
+ }
2410
+
2411
+ .apphub-drop-layer__hint p {
2412
+ margin: 0;
2413
+ font-size: 0.95rem;
2414
+ font-weight: 600;
2415
+ color: #e2e8f0;
2416
+ }
2417
+
2418
+ /* Drop install progress badge */
2419
+ .apphub-drop-badge {
2420
+ position: absolute;
2421
+ width: 88px;
2422
+ display: flex;
2423
+ flex-direction: column;
2424
+ align-items: center;
2425
+ z-index: 6;
2426
+ animation: apphub-badge-in 0.3s ease-out;
2427
+ }
2428
+
2429
+ .apphub-drop-badge__icon-wrap {
2430
+ position: relative;
2431
+ width: 64px;
2432
+ height: 64px;
2433
+ display: flex;
2434
+ align-items: center;
2435
+ justify-content: center;
2436
+ }
2437
+
2438
+ .apphub-drop-badge__icon-bg {
2439
+ position: absolute;
2440
+ inset: 4px;
2441
+ border-radius: 12px;
2442
+ background: rgba(15, 23, 42, 0.55);
2443
+ transition: background 0.3s ease;
2444
+ }
2445
+
2446
+ .apphub-drop-badge--installing .apphub-drop-badge__icon-bg {
2447
+ background: rgba(2, 6, 23, 0.88);
2448
+ }
2449
+
2450
+ .apphub-drop-badge--done .apphub-drop-badge__icon-bg {
2451
+ background: rgba(34, 197, 94, 0.25);
2452
+ }
2453
+
2454
+ .apphub-drop-badge__icon {
2455
+ position: relative;
2456
+ z-index: 1;
2457
+ font-size: 1.75rem;
2458
+ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4));
2459
+ }
2460
+
2461
+ .apphub-drop-badge__ring {
2462
+ position: absolute;
2463
+ inset: 0;
2464
+ width: 64px;
2465
+ height: 64px;
2466
+ transform: rotate(-90deg);
2467
+ }
2468
+
2469
+ .apphub-drop-badge__ring-track {
2470
+ fill: none;
2471
+ stroke: rgba(255, 255, 255, 0.12);
2472
+ stroke-width: 4;
2473
+ }
2474
+
2475
+ .apphub-drop-badge__ring-progress {
2476
+ fill: none;
2477
+ stroke: #60a5fa;
2478
+ stroke-width: 4;
2479
+ stroke-linecap: round;
2480
+ stroke-dasharray: 175.93;
2481
+ transition: stroke-dashoffset 0.15s linear;
2482
+ }
2483
+
2484
+ .apphub-drop-badge__check {
2485
+ position: absolute;
2486
+ z-index: 2;
2487
+ font-size: 1.5rem;
2488
+ color: #4ade80;
2489
+ animation: apphub-check-pop 0.4s cubic-bezier(0.34, 1.5, 0.64, 1);
2490
+ }
2491
+
2492
+ .apphub-drop-badge__label {
2493
+ margin: 6px 0 0;
2494
+ font-size: 0.72rem;
2495
+ text-align: center;
2496
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.85);
2497
+ line-height: 1.2;
2498
+ max-width: 88px;
2499
+ white-space: nowrap;
2500
+ overflow: hidden;
2501
+ text-overflow: ellipsis;
2502
+ }
2503
+
2504
+ .apphub-drop-badge__method {
2505
+ margin: 2px 0 0;
2506
+ font-size: 0.65rem;
2507
+ color: #94a3b8;
2508
+ text-align: center;
2509
+ }
2510
+
2511
+ @keyframes apphub-drop-pulse {
2512
+ 0%, 100% { opacity: 0.85; transform: scale(1); }
2513
+ 50% { opacity: 1; transform: scale(1.005); }
2514
+ }
2515
+
2516
+ @keyframes apphub-drop-float {
2517
+ 0%, 100% { transform: translate(-50%, -50%); }
2518
+ 50% { transform: translate(-50%, calc(-50% - 6px)); }
2519
+ }
2520
+
2521
+ @keyframes apphub-badge-in {
2522
+ from { opacity: 0; transform: scale(0.85); }
2523
+ to { opacity: 1; transform: scale(1); }
2524
+ }
2525
+
2526
+ @keyframes apphub-icon-pop {
2527
+ from { opacity: 0; transform: scale(0.6); }
2528
+ to { opacity: 1; transform: scale(1); }
2529
+ }
2530
+
2531
+ @keyframes apphub-check-pop {
2532
+ from { opacity: 0; transform: scale(0.3); }
2533
+ to { opacity: 1; transform: scale(1); }
2534
+ }
2535
+
2536
+ /* Desktop settings (Start menu) */
2537
+ .apphub-desktop-settings {
2538
+ margin-top: 8px;
2539
+ padding-top: 8px;
2540
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
2541
+ }
2542
+
2543
+ .apphub-desktop-settings__row {
2544
+ display: flex;
2545
+ align-items: center;
2546
+ gap: 8px;
2547
+ padding: 8px 10px;
2548
+ font-size: 0.8rem;
2549
+ color: #e2e8f0;
2550
+ cursor: pointer;
2551
+ border-radius: 6px;
2552
+ }
2553
+
2554
+ .apphub-desktop-settings__row:hover {
2555
+ background: rgba(255, 255, 255, 0.06);
2556
+ }
2557
+
2558
+ .apphub-desktop-settings__row input {
2559
+ accent-color: #3b82f6;
2560
+ }
2561
+
2562
+ /* Duplicate app dialog */
2563
+ .apphub-dup-dialog {
2564
+ position: fixed;
2565
+ inset: 0;
2566
+ z-index: 10000;
2567
+ display: flex;
2568
+ align-items: center;
2569
+ justify-content: center;
2570
+ background: rgba(2, 6, 23, 0.55);
2571
+ backdrop-filter: blur(4px);
2572
+ animation: apphub-badge-in 0.2s ease-out;
2573
+ }
2574
+
2575
+ .apphub-dup-dialog__panel {
2576
+ width: min(400px, calc(100vw - 32px));
2577
+ padding: 20px 22px;
2578
+ border-radius: 10px;
2579
+ background: #1e293b;
2580
+ border: 1px solid rgba(255, 255, 255, 0.12);
2581
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.45);
2582
+ }
2583
+
2584
+ .apphub-dup-dialog__title {
2585
+ margin: 0 0 10px;
2586
+ font-size: 1.05rem;
2587
+ color: #f8fafc;
2588
+ }
2589
+
2590
+ .apphub-dup-dialog__message {
2591
+ margin: 0 0 8px;
2592
+ font-size: 0.9rem;
2593
+ color: #cbd5e1;
2594
+ }
2595
+
2596
+ .apphub-dup-dialog__hint {
2597
+ margin: 0 0 16px;
2598
+ font-size: 0.8rem;
2599
+ color: #94a3b8;
2600
+ }
2601
+
2602
+ .apphub-dup-dialog__actions {
2603
+ display: flex;
2604
+ flex-wrap: wrap;
2605
+ gap: 8px;
2606
+ }
2607
+
2608
+ .apphub-dup-dialog__btn {
2609
+ padding: 8px 14px;
2610
+ border: 1px solid rgba(255, 255, 255, 0.15);
2611
+ border-radius: 6px;
2612
+ background: rgba(255, 255, 255, 0.06);
2613
+ color: #f1f5f9;
2614
+ font-size: 0.85rem;
2615
+ cursor: pointer;
2616
+ }
2617
+
2618
+ .apphub-dup-dialog__btn:hover {
2619
+ background: rgba(255, 255, 255, 0.12);
2620
+ }
2621
+
2622
+ .apphub-dup-dialog__btn--primary {
2623
+ background: #2563eb;
2624
+ border-color: #3b82f6;
2625
+ }
2626
+
2627
+ .apphub-dup-dialog__btn--primary:hover {
2628
+ background: #1d4ed8;
2629
+ }
2630
+
2631
+ .apphub-dup-dialog__btn--ghost {
2632
+ background: transparent;
2633
+ color: #94a3b8;
2634
+ }
2635
+
2636
+ /* Desktop icon context menu */
2637
+ .apphub-icon-menu {
2638
+ position: absolute;
2639
+ z-index: 35;
2640
+ min-width: 200px;
2641
+ padding: 4px 0;
2642
+ border: 1px solid rgba(255, 255, 255, 0.12);
2643
+ border-radius: 4px;
2644
+ background: rgba(32, 32, 32, 0.98);
2645
+ backdrop-filter: blur(16px);
2646
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.45);
2647
+ animation: apphub-icon-menu-in 0.12s ease-out;
2648
+ }
2649
+
2650
+ .apphub-icon-menu__item {
2651
+ display: block;
2652
+ width: 100%;
2653
+ padding: 8px 28px 8px 16px;
2654
+ border: none;
2655
+ background: transparent;
2656
+ color: #f3f4f6;
2657
+ font-size: 0.84rem;
2658
+ text-align: left;
2659
+ cursor: default;
2660
+ }
2661
+
2662
+ .apphub-icon-menu__item:hover {
2663
+ background: rgba(96, 165, 250, 0.35);
2664
+ }
2665
+
2666
+ .apphub-icon-menu__item--danger {
2667
+ color: #fca5a5;
2668
+ }
2669
+
2670
+ .apphub-icon-menu__item--danger:hover {
2671
+ background: rgba(248, 113, 113, 0.2);
2672
+ }
2673
+
2674
+ .apphub-icon-menu__sep {
2675
+ height: 1px;
2676
+ margin: 4px 0;
2677
+ background: rgba(255, 255, 255, 0.1);
2678
+ }
2679
+
2680
+ @keyframes apphub-icon-menu-in {
2681
+ from { opacity: 0; transform: scale(0.96); }
2682
+ to { opacity: 1; transform: scale(1); }
2683
+ }
2684
+
2685
+ /* Icon properties dialog */
2686
+ .apphub-icon-info {
2687
+ position: fixed;
2688
+ inset: 0;
2689
+ z-index: 10001;
2690
+ display: flex;
2691
+ align-items: center;
2692
+ justify-content: center;
2693
+ background: rgba(2, 6, 23, 0.55);
2694
+ backdrop-filter: blur(4px);
2695
+ }
2696
+
2697
+ .apphub-icon-info__panel {
2698
+ width: min(420px, calc(100vw - 32px));
2699
+ padding: 0;
2700
+ border-radius: 8px;
2701
+ background: #1e293b;
2702
+ border: 1px solid rgba(255, 255, 255, 0.12);
2703
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.45);
2704
+ overflow: hidden;
2705
+ }
2706
+
2707
+ .apphub-icon-info__header {
2708
+ display: flex;
2709
+ align-items: center;
2710
+ gap: 14px;
2711
+ padding: 18px 20px;
2712
+ background: rgba(255, 255, 255, 0.04);
2713
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
2714
+ }
2715
+
2716
+ .apphub-icon-info__icon {
2717
+ font-size: 2rem;
2718
+ line-height: 1;
2719
+ }
2720
+
2721
+ .apphub-icon-info__title {
2722
+ margin: 0;
2723
+ font-size: 1.05rem;
2724
+ color: #f8fafc;
2725
+ }
2726
+
2727
+ .apphub-icon-info__list {
2728
+ margin: 0;
2729
+ padding: 12px 20px 8px;
2730
+ }
2731
+
2732
+ .apphub-icon-info__row {
2733
+ display: grid;
2734
+ grid-template-columns: 120px 1fr;
2735
+ gap: 12px;
2736
+ padding: 8px 0;
2737
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
2738
+ }
2739
+
2740
+ .apphub-icon-info__row:last-child {
2741
+ border-bottom: none;
2742
+ }
2743
+
2744
+ .apphub-icon-info__row dt {
2745
+ margin: 0;
2746
+ font-size: 0.78rem;
2747
+ color: #94a3b8;
2748
+ }
2749
+
2750
+ .apphub-icon-info__row dd {
2751
+ margin: 0;
2752
+ font-size: 0.84rem;
2753
+ color: #e2e8f0;
2754
+ word-break: break-word;
2755
+ }
2756
+
2757
+ .apphub-icon-info__actions {
2758
+ display: flex;
2759
+ justify-content: flex-end;
2760
+ padding: 12px 20px 16px;
2761
+ }
2762
+
2763
+ .apphub-icon-info__btn {
2764
+ padding: 8px 20px;
2765
+ border: 1px solid rgba(255, 255, 255, 0.15);
2766
+ border-radius: 6px;
2767
+ background: rgba(255, 255, 255, 0.08);
2768
+ color: #f1f5f9;
2769
+ font-size: 0.85rem;
2770
+ cursor: pointer;
2771
+ }
2772
+
2773
+ .apphub-icon-info__btn:hover {
2774
+ background: rgba(255, 255, 255, 0.14);
2775
+ }
2776
+
2777
+ /* Icon rename dialog */
2778
+ .apphub-icon-rename {
2779
+ position: fixed;
2780
+ inset: 0;
2781
+ z-index: 10002;
2782
+ display: flex;
2783
+ align-items: center;
2784
+ justify-content: center;
2785
+ background: rgba(2, 6, 23, 0.55);
2786
+ backdrop-filter: blur(4px);
2787
+ }
2788
+
2789
+ .apphub-icon-rename__panel {
2790
+ width: min(360px, calc(100vw - 32px));
2791
+ padding: 20px 22px;
2792
+ border-radius: 8px;
2793
+ background: #1e293b;
2794
+ border: 1px solid rgba(255, 255, 255, 0.12);
2795
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.45);
2796
+ }
2797
+
2798
+ .apphub-icon-rename__title {
2799
+ margin: 0 0 14px;
2800
+ font-size: 1.05rem;
2801
+ color: #f8fafc;
2802
+ }
2803
+
2804
+ .apphub-icon-rename__label {
2805
+ display: flex;
2806
+ flex-direction: column;
2807
+ gap: 6px;
2808
+ font-size: 0.8rem;
2809
+ color: #94a3b8;
2810
+ }
2811
+
2812
+ .apphub-icon-rename__input {
2813
+ padding: 9px 12px;
2814
+ border: 1px solid rgba(255, 255, 255, 0.15);
2815
+ border-radius: 6px;
2816
+ background: #0f172a;
2817
+ color: #fff;
2818
+ font-size: 0.9rem;
2819
+ outline: none;
2820
+ }
2821
+
2822
+ .apphub-icon-rename__input:focus {
2823
+ border-color: #3b82f6;
2824
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.25);
2825
+ }
2826
+
2827
+ .apphub-icon-rename__error {
2828
+ margin: 8px 0 0;
2829
+ font-size: 0.8rem;
2830
+ color: #f87171;
2831
+ }
2832
+
2833
+ .apphub-icon-rename__actions {
2834
+ display: flex;
2835
+ gap: 8px;
2836
+ justify-content: flex-end;
2837
+ margin-top: 16px;
2838
+ }
2839
+
2840
+ .apphub-icon-rename__btn {
2841
+ padding: 8px 16px;
2842
+ border: 1px solid rgba(255, 255, 255, 0.15);
2843
+ border-radius: 6px;
2844
+ background: rgba(255, 255, 255, 0.06);
2845
+ color: #f1f5f9;
2846
+ font-size: 0.85rem;
2847
+ cursor: pointer;
2848
+ }
2849
+
2850
+ .apphub-icon-rename__btn--primary {
2851
+ background: #2563eb;
2852
+ border-color: #3b82f6;
2853
+ }
2854
+
2855
+ .apphub-icon-rename__btn--primary:hover {
2856
+ background: #1d4ed8;
2857
+ }
2858
+
2859
+ /* App groups (iPhone-style folders) */
2860
+ .apphub-desktop__icon--group {
2861
+ padding-top: 4px;
2862
+ }
2863
+
2864
+ .apphub-desktop__group-preview {
2865
+ position: relative;
2866
+ width: 52px;
2867
+ height: 52px;
2868
+ border-radius: 14px;
2869
+ background: rgba(255, 255, 255, 0.14);
2870
+ border: 1px solid rgba(255, 255, 255, 0.18);
2871
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12);
2872
+ backdrop-filter: blur(8px);
2873
+ }
2874
+
2875
+ .apphub-desktop__group-preview-item {
2876
+ position: absolute;
2877
+ width: 22px;
2878
+ height: 22px;
2879
+ display: flex;
2880
+ align-items: center;
2881
+ justify-content: center;
2882
+ font-size: 0.85rem;
2883
+ line-height: 1;
2884
+ border-radius: 6px;
2885
+ background: rgba(15, 23, 42, 0.35);
2886
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));
2887
+ }
2888
+
2889
+ .apphub-desktop__drop-target {
2890
+ position: absolute;
2891
+ z-index: 9;
2892
+ width: 88px;
2893
+ pointer-events: none;
2894
+ }
2895
+
2896
+ .apphub-desktop__drop-target-panel {
2897
+ padding: 8px 6px;
2898
+ border-radius: 14px;
2899
+ background: rgba(59, 130, 246, 0.22);
2900
+ border: 2px dashed rgba(96, 165, 250, 0.75);
2901
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
2902
+ animation: apphub-drop-pulse 1s ease-in-out infinite;
2903
+ }
2904
+
2905
+ .apphub-desktop__drop-target-label {
2906
+ margin: 0 0 6px;
2907
+ font-size: 0.62rem;
2908
+ font-weight: 600;
2909
+ text-align: center;
2910
+ color: #dbeafe;
2911
+ line-height: 1.2;
2912
+ }
2913
+
2914
+ .apphub-desktop__drop-target-grid {
2915
+ display: grid;
2916
+ grid-template-columns: repeat(3, 1fr);
2917
+ gap: 4px;
2918
+ justify-items: center;
2919
+ }
2920
+
2921
+ .apphub-desktop__drop-target-icon {
2922
+ width: 22px;
2923
+ height: 22px;
2924
+ display: flex;
2925
+ align-items: center;
2926
+ justify-content: center;
2927
+ font-size: 0.8rem;
2928
+ border-radius: 6px;
2929
+ background: rgba(15, 23, 42, 0.45);
2930
+ }
2931
+
2932
+ .apphub-icon-folder {
2933
+ position: absolute;
2934
+ z-index: 20;
2935
+ width: 88px;
2936
+ transform: translate(-4px, -8px);
2937
+ }
2938
+
2939
+ .apphub-icon-folder--preview {
2940
+ z-index: 25;
2941
+ pointer-events: none;
2942
+ transform: translate(-4px, -12px);
2943
+ }
2944
+
2945
+ .apphub-icon-folder--preview .apphub-icon-folder__panel {
2946
+ border-color: rgba(96, 165, 250, 0.55);
2947
+ box-shadow:
2948
+ 0 16px 40px rgba(0, 0, 0, 0.5),
2949
+ 0 0 0 2px rgba(96, 165, 250, 0.35);
2950
+ animation: apphub-folder-preview 0.85s ease-in-out infinite;
2951
+ }
2952
+
2953
+ .apphub-icon-folder__item--preview-new {
2954
+ background: rgba(96, 165, 250, 0.2);
2955
+ border-color: rgba(96, 165, 250, 0.45);
2956
+ border-radius: 10px;
2957
+ }
2958
+
2959
+ @keyframes apphub-folder-preview {
2960
+ 0%, 100% { transform: scale(1); }
2961
+ 50% { transform: scale(1.02); }
2962
+ }
2963
+
2964
+ .apphub-icon-folder__panel {
2965
+ width: min(280px, calc(100vw - 48px));
2966
+ margin-left: -4px;
2967
+ padding: 14px 14px 12px;
2968
+ border-radius: 18px;
2969
+ background: rgba(30, 41, 59, 0.94);
2970
+ border: 1px solid rgba(255, 255, 255, 0.14);
2971
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);
2972
+ backdrop-filter: blur(20px);
2973
+ animation: apphub-folder-in 0.22s cubic-bezier(0.16, 1, 0.3, 1);
2974
+ }
2975
+
2976
+ .apphub-icon-folder__header {
2977
+ display: flex;
2978
+ align-items: baseline;
2979
+ justify-content: space-between;
2980
+ gap: 8px;
2981
+ margin-bottom: 12px;
2982
+ }
2983
+
2984
+ .apphub-icon-folder__title {
2985
+ font-size: 0.85rem;
2986
+ font-weight: 600;
2987
+ color: #f8fafc;
2988
+ }
2989
+
2990
+ .apphub-icon-folder__count {
2991
+ font-size: 0.72rem;
2992
+ color: #94a3b8;
2993
+ }
2994
+
2995
+ .apphub-icon-folder__grid {
2996
+ display: grid;
2997
+ grid-template-columns: repeat(3, 1fr);
2998
+ gap: 10px;
2999
+ }
3000
+
3001
+ .apphub-icon-folder__item {
3002
+ display: flex;
3003
+ flex-direction: column;
3004
+ align-items: center;
3005
+ gap: 4px;
3006
+ padding: 8px 4px;
3007
+ border: 1px solid transparent;
3008
+ border-radius: 10px;
3009
+ background: transparent;
3010
+ color: inherit;
3011
+ cursor: default;
3012
+ }
3013
+
3014
+ .apphub-icon-folder__item:hover {
3015
+ background: rgba(255, 255, 255, 0.08);
3016
+ border-color: rgba(255, 255, 255, 0.1);
3017
+ }
3018
+
3019
+ .apphub-icon-folder__item--holding {
3020
+ transform: scale(1.08);
3021
+ background: rgba(96, 165, 250, 0.15);
3022
+ border-color: rgba(96, 165, 250, 0.35);
3023
+ }
3024
+
3025
+ .apphub-icon-folder__item--dragging {
3026
+ opacity: 0.5;
3027
+ }
3028
+
3029
+ .apphub-icon-folder__item-icon-wrap {
3030
+ position: relative;
3031
+ display: inline-flex;
3032
+ }
3033
+
3034
+ .apphub-icon-folder__item-icon {
3035
+ font-size: 1.5rem;
3036
+ line-height: 1;
3037
+ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.35));
3038
+ }
3039
+
3040
+ .apphub-icon-folder__item-flag {
3041
+ position: absolute;
3042
+ right: -4px;
3043
+ bottom: -2px;
3044
+ width: 14px;
3045
+ height: 14px;
3046
+ border-radius: 999px;
3047
+ font-size: 0.55rem;
3048
+ font-weight: 700;
3049
+ line-height: 14px;
3050
+ text-align: center;
3051
+ color: #fcd34d;
3052
+ background: rgba(15, 23, 42, 0.95);
3053
+ border: 1px solid rgba(251, 191, 36, 0.55);
3054
+ }
3055
+
3056
+ .apphub-icon-folder__item-label {
3057
+ width: 100%;
3058
+ font-size: 0.62rem;
3059
+ text-align: center;
3060
+ line-height: 1.2;
3061
+ max-height: 2.4em;
3062
+ overflow: hidden;
3063
+ display: -webkit-box;
3064
+ -webkit-line-clamp: 2;
3065
+ -webkit-box-orient: vertical;
3066
+ word-break: break-word;
3067
+ }
3068
+
3069
+ .apphub-icon-folder__hint {
3070
+ margin: 10px 0 0;
3071
+ font-size: 0.65rem;
3072
+ text-align: center;
3073
+ color: #64748b;
3074
+ }
3075
+
3076
+ @keyframes apphub-folder-in {
3077
+ from {
3078
+ opacity: 0;
3079
+ transform: scale(0.92) translateY(8px);
3080
+ }
3081
+ to {
3082
+ opacity: 1;
3083
+ transform: scale(1) translateY(0);
3084
+ }
3085
+ }
3086
+
3087
+ .apphub-desktop--light .apphub-desktop__group-preview {
3088
+ background: rgba(255, 255, 255, 0.72);
3089
+ border-color: rgba(15, 23, 42, 0.12);
3090
+ }
3091
+
3092
+ .apphub-desktop--light .apphub-icon-folder__panel {
3093
+ background: rgba(248, 250, 252, 0.96);
3094
+ border-color: rgba(15, 23, 42, 0.1);
3095
+ }
3096
+
3097
+ .apphub-desktop--light .apphub-icon-folder__title {
3098
+ color: #0f172a;
3099
+ }
3100
+
3101
+ .apphub-desktop--light .apphub-icon-folder__count,
3102
+ .apphub-desktop--light .apphub-icon-folder__hint {
3103
+ color: #64748b;
3104
+ }