pinokiod 7.3.9 → 7.3.11

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 (52) hide show
  1. package/kernel/bin/brew.js +12 -2
  2. package/kernel/bin/caddy.js +24 -20
  3. package/kernel/bin/huggingface.js +2 -2
  4. package/kernel/bin/setup.js +2 -3
  5. package/kernel/bin/uv.js +13 -6
  6. package/kernel/connect/index.js +5 -1
  7. package/kernel/connect/providers/huggingface/index.js +213 -75
  8. package/kernel/environment.js +16 -1
  9. package/kernel/router/localhost_home_router.js +7 -0
  10. package/kernel/shell.js +1 -5
  11. package/kernel/util.js +1 -0
  12. package/package.json +1 -1
  13. package/server/index.js +75 -33
  14. package/server/public/common.js +52 -88
  15. package/server/public/install.js +20 -2
  16. package/server/public/layout.js +1 -1
  17. package/server/public/nav.js +3 -1
  18. package/server/public/style.css +1455 -521
  19. package/server/public/tab-link-popover.css +162 -18
  20. package/server/public/tab-link-popover.js +230 -21
  21. package/server/public/task-launcher.css +182 -91
  22. package/server/public/terminal-settings.js +227 -50
  23. package/server/public/universal-launcher.css +42 -33
  24. package/server/public/urldropdown.css +284 -0
  25. package/server/views/app.ejs +1718 -352
  26. package/server/views/autolaunch.ejs +4 -5
  27. package/server/views/checkpoints.ejs +223 -50
  28. package/server/views/connect/huggingface.ejs +406 -325
  29. package/server/views/connect.ejs +0 -1
  30. package/server/views/github.ejs +277 -324
  31. package/server/views/index.ejs +65 -8
  32. package/server/views/install.ejs +134 -65
  33. package/server/views/logs.ejs +9 -8
  34. package/server/views/net.ejs +341 -64
  35. package/server/views/network.ejs +85 -63
  36. package/server/views/partials/main_sidebar.ejs +249 -24
  37. package/server/views/plugins.ejs +141 -3
  38. package/server/views/settings.ejs +103 -7
  39. package/server/views/setup.ejs +0 -5
  40. package/server/views/skills.ejs +0 -1
  41. package/server/views/task_list.ejs +0 -1
  42. package/server/views/terminal.ejs +285 -60
  43. package/server/views/terminals.ejs +346 -6
  44. package/server/views/tools.ejs +828 -1691
  45. package/test/caddy-install.test.js +53 -0
  46. package/test/connect-setup.test.js +16 -0
  47. package/test/github-connection.test.js +1 -1
  48. package/test/huggingface-bin.test.js +4 -4
  49. package/test/huggingface-connect.test.js +73 -0
  50. package/test/main-sidebar.test.js +31 -0
  51. package/test/shell-run-template.test.js +5 -1
  52. package/test/uv-bin.test.js +29 -0
@@ -132,26 +132,6 @@
132
132
  }
133
133
 
134
134
  shouldPreferModalInput() {
135
- if (typeof navigator !== 'undefined') {
136
- try {
137
- if (navigator.userAgentData && typeof navigator.userAgentData.mobile === 'boolean') {
138
- if (navigator.userAgentData.mobile) {
139
- return true;
140
- }
141
- }
142
- } catch (_) {}
143
- const ua = navigator.userAgent || '';
144
- if (/Mobi|Android|iPhone|iPad|Tablet/i.test(ua)) {
145
- return true;
146
- }
147
- const platform = navigator.platform || '';
148
- const maxTouchPoints = typeof navigator.maxTouchPoints === 'number'
149
- ? navigator.maxTouchPoints
150
- : 0;
151
- if (/Mac/i.test(platform) && maxTouchPoints > 1) {
152
- return true;
153
- }
154
- }
155
135
  return false;
156
136
  }
157
137
 
@@ -651,41 +631,134 @@
651
631
  return;
652
632
  }
653
633
  const tracker = {
654
- lastTime: 0,
655
- lastX: 0,
656
- lastY: 0,
657
- handler: null,
658
- eventName: this.supportsPointer ? 'pointerdown' : 'touchstart'
634
+ active: false,
635
+ startTime: 0,
636
+ startX: 0,
637
+ startY: 0,
638
+ startScroll: null,
639
+ moved: false,
640
+ handlers: []
659
641
  };
660
- const handlePointerDown = (event) => {
642
+ const getScrollSnapshot = () => {
643
+ const viewport = node.querySelector('.xterm-viewport');
644
+ const doc = typeof document !== 'undefined' ? document.documentElement : null;
645
+ const body = typeof document !== 'undefined' ? document.body : null;
646
+ return {
647
+ viewportTop: viewport ? viewport.scrollTop : 0,
648
+ viewportLeft: viewport ? viewport.scrollLeft : 0,
649
+ pageTop: typeof window !== 'undefined' ? (window.pageYOffset || doc && doc.scrollTop || body && body.scrollTop || 0) : 0,
650
+ pageLeft: typeof window !== 'undefined' ? (window.pageXOffset || doc && doc.scrollLeft || body && body.scrollLeft || 0) : 0
651
+ };
652
+ };
653
+ const didScrollChange = (start, end) => {
654
+ if (!start || !end) {
655
+ return false;
656
+ }
657
+ return Math.abs(end.viewportTop - start.viewportTop) > 1
658
+ || Math.abs(end.viewportLeft - start.viewportLeft) > 1
659
+ || Math.abs(end.pageTop - start.pageTop) > 1
660
+ || Math.abs(end.pageLeft - start.pageLeft) > 1;
661
+ };
662
+ const resetTracker = () => {
663
+ tracker.active = false;
664
+ tracker.startScroll = null;
665
+ };
666
+ const getTouchPoint = (event, phase) => {
661
667
  if (!event) {
662
- return;
668
+ return null;
669
+ }
670
+ if (event.touches || event.changedTouches) {
671
+ const list = phase === 'end' ? event.changedTouches : event.touches;
672
+ const touch = list && list[0];
673
+ return touch && typeof touch.clientX === 'number' && typeof touch.clientY === 'number'
674
+ ? { x: touch.clientX, y: touch.clientY }
675
+ : null;
676
+ }
677
+ return typeof event.clientX === 'number' && typeof event.clientY === 'number'
678
+ ? { x: event.clientX, y: event.clientY }
679
+ : null;
680
+ };
681
+ const isInteractiveTarget = (target) => {
682
+ return Boolean(target && target.closest && target.closest('a, button, input, textarea, select, label, [role="button"], [contenteditable="true"], .terminal-keyboard-modal, .terminal-keyboard-backdrop'));
683
+ };
684
+ const isTouchEvent = (event) => {
685
+ if (!event) {
686
+ return false;
663
687
  }
664
- if (this.supportsPointer) {
688
+ if (event.touches || event.changedTouches) {
689
+ const list = event.touches || event.changedTouches;
690
+ if (list && list.length > 1) {
691
+ return false;
692
+ }
693
+ } else if (this.supportsPointer) {
665
694
  const pointerType = event.pointerType;
666
695
  if (pointerType && pointerType !== 'touch' && pointerType !== 'pen') {
667
- return;
696
+ return false;
668
697
  }
669
- } else if (event.touches && event.touches.length !== 1) {
698
+ }
699
+ return true;
700
+ };
701
+ const handleStart = (event) => {
702
+ if (!isTouchEvent(event) || this.modalOpen || isInteractiveTarget(event.target)) {
703
+ resetTracker();
704
+ return;
705
+ }
706
+ const point = getTouchPoint(event, 'start');
707
+ if (!point) {
708
+ resetTracker();
709
+ return;
710
+ }
711
+ tracker.active = true;
712
+ tracker.moved = false;
713
+ tracker.startTime = Date.now();
714
+ tracker.startX = point.x;
715
+ tracker.startY = point.y;
716
+ tracker.startScroll = getScrollSnapshot();
717
+ };
718
+ const handleMove = (event) => {
719
+ if (!tracker.active) {
720
+ return;
721
+ }
722
+ const point = getTouchPoint(event, 'move');
723
+ if (!point) {
724
+ return;
725
+ }
726
+ const distance = Math.hypot(point.x - tracker.startX, point.y - tracker.startY);
727
+ if (distance > 12) {
728
+ tracker.moved = true;
729
+ }
730
+ };
731
+ const handleEnd = (event) => {
732
+ if (!tracker.active) {
670
733
  return;
671
734
  }
672
- const pointSource = this.supportsPointer ? event : (event.touches && event.touches[0]);
673
- const pointX = pointSource && typeof pointSource.clientX === 'number' ? pointSource.clientX : 0;
674
- const pointY = pointSource && typeof pointSource.clientY === 'number' ? pointSource.clientY : 0;
675
- const now = Date.now();
676
- const delta = now - tracker.lastTime;
677
- const distance = Math.hypot(pointX - tracker.lastX, pointY - tracker.lastY);
678
- if (delta < 320 && distance < 40) {
735
+ const point = getTouchPoint(event, 'end');
736
+ const duration = Date.now() - tracker.startTime;
737
+ const distance = point ? Math.hypot(point.x - tracker.startX, point.y - tracker.startY) : Infinity;
738
+ const scrolled = didScrollChange(tracker.startScroll, getScrollSnapshot());
739
+ resetTracker();
740
+ if (!tracker.moved && !scrolled && duration < 700 && distance <= 12 && !isInteractiveTarget(event.target)) {
679
741
  event.preventDefault();
680
742
  event.stopPropagation();
681
743
  this.openModalFromGesture();
682
744
  }
683
- tracker.lastTime = now;
684
- tracker.lastX = pointX;
685
- tracker.lastY = pointY;
686
745
  };
687
- node.addEventListener(tracker.eventName, handlePointerDown, { passive: false });
688
- tracker.handler = handlePointerDown;
746
+ const addTrackedListener = (eventName, handler, options) => {
747
+ node.addEventListener(eventName, handler, options);
748
+ tracker.handlers.push({ eventName, handler, options });
749
+ };
750
+ if (this.supportsPointer) {
751
+ addTrackedListener('pointerdown', handleStart, { passive: true });
752
+ addTrackedListener('pointermove', handleMove, { passive: true });
753
+ addTrackedListener('pointerup', handleEnd, { passive: false });
754
+ addTrackedListener('pointercancel', resetTracker, { passive: true });
755
+ }
756
+ if (typeof window !== 'undefined' && 'TouchEvent' in window) {
757
+ addTrackedListener('touchstart', handleStart, { passive: true });
758
+ addTrackedListener('touchmove', handleMove, { passive: true });
759
+ addTrackedListener('touchend', handleEnd, { passive: false });
760
+ addTrackedListener('touchcancel', resetTracker, { passive: true });
761
+ }
689
762
  tracker.node = node;
690
763
  this.tapTrackers.set(term, tracker);
691
764
  }
@@ -706,9 +779,10 @@
706
779
  if (!tracker) {
707
780
  return;
708
781
  }
709
- if (tracker.node && tracker.handler) {
710
- const eventName = tracker.eventName || (this.supportsPointer ? 'pointerdown' : 'touchstart');
711
- tracker.node.removeEventListener(eventName, tracker.handler, { passive: false });
782
+ if (tracker.node && Array.isArray(tracker.handlers)) {
783
+ tracker.handlers.forEach(({ eventName, handler, options }) => {
784
+ tracker.node.removeEventListener(eventName, handler, options);
785
+ });
712
786
  }
713
787
  this.tapTrackers.delete(term);
714
788
  }
@@ -730,6 +804,9 @@
730
804
  : null;
731
805
  this.forceResizeButtons = new WeakMap();
732
806
  this.forceResizeHandler = null;
807
+ this.tooltipElement = null;
808
+ this.activeTooltipTarget = null;
809
+ this.boundTooltipReposition = () => this.positionTerminalTooltip();
733
810
  this.minimalRunnerMode = detectMinimalRunnerMode();
734
811
  this.currentFontFamily = typeof this.preferences.fontFamily === 'string' ? this.preferences.fontFamily.trim() : '';
735
812
  if (typeof document !== 'undefined') {
@@ -1187,6 +1264,8 @@
1187
1264
  const nextTheme = Object.assign({}, theme);
1188
1265
  const applied = this.applyOption(term, 'theme', nextTheme);
1189
1266
 
1267
+ console.log("nextTheme", nextTheme)
1268
+
1190
1269
  const element = term.element;
1191
1270
  if (element && element.style) {
1192
1271
  if (nextTheme.background) {
@@ -1287,15 +1366,111 @@
1287
1366
  return false;
1288
1367
  }
1289
1368
 
1369
+ getTerminalTooltipElement() {
1370
+ if (typeof document === 'undefined' || !document.body) {
1371
+ return null;
1372
+ }
1373
+ if (this.tooltipElement && document.body.contains(this.tooltipElement)) {
1374
+ return this.tooltipElement;
1375
+ }
1376
+ const tooltip = document.createElement('div');
1377
+ tooltip.className = 'terminal-tooltip';
1378
+ tooltip.setAttribute('role', 'tooltip');
1379
+ tooltip.setAttribute('aria-hidden', 'true');
1380
+ document.body.appendChild(tooltip);
1381
+ this.tooltipElement = tooltip;
1382
+ return tooltip;
1383
+ }
1384
+
1385
+ attachTerminalTooltip(target, text) {
1386
+ if (!target || typeof text !== 'string' || !text.trim()) {
1387
+ return;
1388
+ }
1389
+ target.setAttribute('data-terminal-tooltip', text);
1390
+ target.addEventListener('mouseenter', () => this.showTerminalTooltip(target));
1391
+ target.addEventListener('focus', () => this.showTerminalTooltip(target));
1392
+ target.addEventListener('mouseleave', () => this.hideTerminalTooltip(target));
1393
+ target.addEventListener('blur', () => this.hideTerminalTooltip(target));
1394
+ target.addEventListener('click', () => this.hideTerminalTooltip(target));
1395
+ target.addEventListener('keydown', (event) => {
1396
+ if (event && event.key === 'Escape') {
1397
+ this.hideTerminalTooltip(target);
1398
+ }
1399
+ });
1400
+ }
1401
+
1402
+ showTerminalTooltip(target) {
1403
+ if (typeof window === 'undefined' || !target) {
1404
+ return;
1405
+ }
1406
+ const text = target.getAttribute('data-terminal-tooltip') || '';
1407
+ if (!text.trim()) {
1408
+ return;
1409
+ }
1410
+ const tooltip = this.getTerminalTooltipElement();
1411
+ if (!tooltip) {
1412
+ return;
1413
+ }
1414
+ this.activeTooltipTarget = target;
1415
+ tooltip.textContent = text;
1416
+ tooltip.setAttribute('aria-hidden', 'false');
1417
+ tooltip.classList.remove('is-visible');
1418
+ this.positionTerminalTooltip();
1419
+ tooltip.classList.add('is-visible');
1420
+ window.addEventListener('resize', this.boundTooltipReposition);
1421
+ window.addEventListener('scroll', this.boundTooltipReposition, true);
1422
+ }
1423
+
1424
+ hideTerminalTooltip(target) {
1425
+ if (target && this.activeTooltipTarget && target !== this.activeTooltipTarget) {
1426
+ return;
1427
+ }
1428
+ if (typeof window !== 'undefined') {
1429
+ window.removeEventListener('resize', this.boundTooltipReposition);
1430
+ window.removeEventListener('scroll', this.boundTooltipReposition, true);
1431
+ }
1432
+ this.activeTooltipTarget = null;
1433
+ if (this.tooltipElement) {
1434
+ this.tooltipElement.classList.remove('is-visible');
1435
+ this.tooltipElement.setAttribute('aria-hidden', 'true');
1436
+ }
1437
+ }
1438
+
1439
+ positionTerminalTooltip() {
1440
+ if (typeof window === 'undefined' || !this.activeTooltipTarget || !this.tooltipElement) {
1441
+ return;
1442
+ }
1443
+ const targetRect = this.activeTooltipTarget.getBoundingClientRect();
1444
+ const tooltipRect = this.tooltipElement.getBoundingClientRect();
1445
+ const viewportWidth = window.innerWidth || document.documentElement.clientWidth || 0;
1446
+ const viewportHeight = window.innerHeight || document.documentElement.clientHeight || 0;
1447
+ const margin = 8;
1448
+ const gap = 8;
1449
+ const tooltipWidth = tooltipRect.width || this.tooltipElement.offsetWidth || 0;
1450
+ const tooltipHeight = tooltipRect.height || this.tooltipElement.offsetHeight || 0;
1451
+ let left = targetRect.right - tooltipWidth;
1452
+ let top = targetRect.bottom + gap;
1453
+
1454
+ if (top + tooltipHeight + margin > viewportHeight && targetRect.top - tooltipHeight - gap >= margin) {
1455
+ top = targetRect.top - tooltipHeight - gap;
1456
+ }
1457
+ left = Math.max(margin, Math.min(left, viewportWidth - tooltipWidth - margin));
1458
+ top = Math.max(margin, Math.min(top, viewportHeight - tooltipHeight - margin));
1459
+
1460
+ this.tooltipElement.style.left = `${Math.round(left)}px`;
1461
+ this.tooltipElement.style.top = `${Math.round(top)}px`;
1462
+ }
1463
+
1290
1464
  attachForceResizeButton(runner, host) {
1291
1465
  if (typeof document === 'undefined' || !runner || !host || this.forceResizeButtons.has(runner)) {
1292
1466
  return;
1293
1467
  }
1294
1468
  const button = document.createElement('button');
1295
1469
  button.type = 'button';
1296
- button.className = 'btn terminal-resize-button';
1297
- button.innerHTML = '<i class="fa-solid fa-expand"></i> Resize';
1298
- button.title = 'Resize to this window';
1470
+ button.className = 'btn terminal-utility-button terminal-resize-button';
1471
+ button.innerHTML = '<i class="fa-solid fa-ruler-combined" aria-hidden="true"></i>';
1472
+ button.setAttribute('aria-label', 'Sync terminal to current viewport');
1473
+ this.attachTerminalTooltip(button, 'Sync terminal to current viewport');
1299
1474
  button.addEventListener('click', (event) => {
1300
1475
  if (event) {
1301
1476
  event.preventDefault();
@@ -1390,10 +1565,12 @@
1390
1565
 
1391
1566
  const button = document.createElement('button');
1392
1567
  button.type = 'button';
1393
- button.className = 'btn terminal-config-button';
1394
- button.innerHTML = '<span class="terminal-config-label"><i class="fa-solid fa-sliders"></i> Config</span>';
1568
+ button.className = 'btn terminal-utility-button terminal-config-button';
1569
+ button.innerHTML = '<span class="terminal-config-label"><i class="fa-solid fa-sliders" aria-hidden="true"></i></span>';
1395
1570
  button.setAttribute('aria-haspopup', 'true');
1396
1571
  button.setAttribute('aria-expanded', 'false');
1572
+ button.setAttribute('aria-label', 'Terminal appearance');
1573
+ this.attachTerminalTooltip(button, 'Terminal appearance');
1397
1574
 
1398
1575
  const menu = document.createElement('div');
1399
1576
  menu.className = 'terminal-config-menu';
@@ -23,7 +23,7 @@
23
23
  --universal-launcher-primary-border-hover: var(--universal-quick-action-bg);
24
24
  --universal-create-dropdown-surface: #ffffff;
25
25
  --universal-create-dropdown-shadow: 0 12px 24px rgba(15, 23, 42, 0.14), 0 2px 8px rgba(15, 23, 42, 0.08);
26
- --universal-create-dropdown-hover: rgba(65, 105, 225, 0.1);
26
+ --universal-create-dropdown-hover: var(--pinokio-sidebar-tab-hover, rgba(15, 23, 42, 0.035));
27
27
  }
28
28
 
29
29
  body.dark {
@@ -49,31 +49,29 @@ body.dark {
49
49
  --universal-launcher-primary-border-hover: var(--universal-quick-action-text);
50
50
  --universal-create-dropdown-surface: #151517;
51
51
  --universal-create-dropdown-shadow: 0 16px 36px rgba(0, 0, 0, 0.38), 0 2px 10px rgba(0, 0, 0, 0.24);
52
- --universal-create-dropdown-hover: rgba(65, 105, 225, 0.22);
52
+ --universal-create-dropdown-hover: var(--pinokio-sidebar-tab-hover, rgba(255, 255, 255, 0.055));
53
53
  }
54
54
 
55
55
  .main-sidebar .universal-create-dropdown {
56
- position: absolute;
57
- top: calc(100% + 4px);
58
- left: auto;
59
- right: 0;
60
- z-index: 80;
61
- min-width: 172px;
62
- width: max-content;
63
- max-width: min(220px, calc(100vw - 24px));
56
+ position: static;
57
+ min-width: 0;
58
+ width: 100%;
59
+ max-width: none;
64
60
  height: auto !important;
65
61
  max-height: none !important;
66
62
  display: none;
67
63
  flex-direction: column;
68
64
  align-items: stretch;
69
65
  align-content: flex-start;
70
- gap: 2px;
71
- padding: 4px;
72
- border: 1px solid var(--universal-launcher-border-strong);
73
- border-radius: 8px;
74
- background: var(--universal-create-dropdown-surface);
75
- box-shadow: 0 10px 18px rgba(15, 23, 42, 0.12), 0 1px 4px rgba(15, 23, 42, 0.08);
76
- overflow: clip;
66
+ gap: 1px;
67
+ margin: 1px 0 3px;
68
+ padding: 1px 0 1px 27px;
69
+ border: 0;
70
+ border-radius: 0;
71
+ background: transparent;
72
+ box-shadow: none;
73
+ overflow: visible;
74
+ box-sizing: border-box;
77
75
  }
78
76
 
79
77
  .main-sidebar .universal-create-menu:not([open]) .universal-create-dropdown {
@@ -84,6 +82,15 @@ body.dark {
84
82
  display: flex !important;
85
83
  }
86
84
 
85
+ .main-sidebar .universal-create-menu[open] > summary {
86
+ background: var(--pinokio-sidebar-tab-hover, transparent) !important;
87
+ color: var(--pinokio-sidebar-tab-active-color, var(--universal-launcher-text)) !important;
88
+ }
89
+
90
+ .main-sidebar .universal-create-menu[open] > summary .main-sidebar-action-icon {
91
+ color: var(--pinokio-sidebar-icon-active, currentColor) !important;
92
+ }
93
+
87
94
  .main-sidebar .universal-create-dropdown button {
88
95
  appearance: none;
89
96
  border: 0;
@@ -92,15 +99,15 @@ body.dark {
92
99
  align-items: center;
93
100
  justify-content: flex-start;
94
101
  background: transparent;
95
- color: var(--universal-launcher-text);
102
+ color: var(--pinokio-sidebar-tab-muted, var(--universal-launcher-text));
96
103
  text-align: left;
97
- min-height: 32px;
104
+ min-height: 25px;
98
105
  gap: 3px;
99
- padding: 0 8px;
106
+ padding: 3px 5px;
100
107
  border-radius: 6px;
101
- font-size: 11px;
102
- font-weight: 600;
103
- line-height: 1;
108
+ font-size: 12px;
109
+ font-weight: 500;
110
+ line-height: 1.25;
104
111
  white-space: nowrap;
105
112
  cursor: pointer;
106
113
  box-sizing: border-box;
@@ -110,12 +117,14 @@ body.dark {
110
117
  .main-sidebar .universal-create-dropdown button:hover,
111
118
  .main-sidebar .universal-create-dropdown button:focus-visible {
112
119
  background: var(--universal-create-dropdown-hover);
120
+ color: var(--pinokio-sidebar-tab-active-color, var(--universal-launcher-text));
113
121
  outline: none;
114
122
  }
115
123
 
116
124
  body.dark .main-sidebar .universal-create-dropdown button:hover,
117
125
  body.dark .main-sidebar .universal-create-dropdown button:focus-visible {
118
126
  background: var(--universal-create-dropdown-hover);
127
+ color: var(--pinokio-sidebar-tab-active-color, var(--universal-launcher-text));
119
128
  }
120
129
 
121
130
  .universal-launcher-overlay {
@@ -1752,9 +1761,9 @@ body.dark .universal-launcher-error {
1752
1761
 
1753
1762
  .swal2-popup.universal-launcher-download-modal {
1754
1763
  border: 1px solid var(--universal-launcher-border);
1755
- border-radius: 12px;
1764
+ border-radius: 8px;
1756
1765
  background: var(--universal-launcher-panel-bg);
1757
- box-shadow: 0 26px 64px rgba(15, 23, 42, 0.18);
1766
+ box-shadow: 0 18px 50px rgba(15, 23, 42, 0.16);
1758
1767
  }
1759
1768
 
1760
1769
  .swal2-container.universal-launcher-download-container {
@@ -1782,7 +1791,7 @@ body.dark .universal-launcher-error {
1782
1791
  .universal-launcher-download-icon {
1783
1792
  width: 32px;
1784
1793
  height: 32px;
1785
- border-radius: 9px;
1794
+ border-radius: 7px;
1786
1795
  border: 1px solid var(--universal-launcher-border);
1787
1796
  background: var(--universal-launcher-panel-bg-muted);
1788
1797
  color: var(--universal-launcher-title-color);
@@ -1799,10 +1808,10 @@ body.dark .universal-launcher-error {
1799
1808
  }
1800
1809
 
1801
1810
  .universal-launcher-download-title {
1802
- font-size: 18px;
1803
- line-height: 1.15;
1804
- font-weight: 700;
1805
- letter-spacing: -0.03em;
1811
+ font-size: 16px;
1812
+ line-height: 1.25;
1813
+ font-weight: 600;
1814
+ letter-spacing: 0;
1806
1815
  color: var(--universal-launcher-text);
1807
1816
  }
1808
1817
 
@@ -1844,9 +1853,9 @@ body.dark .universal-launcher-error {
1844
1853
  .universal-launcher-download-input {
1845
1854
  width: 100%;
1846
1855
  box-sizing: border-box;
1847
- min-height: 38px;
1848
- padding: 0 12px;
1849
- border-radius: 8px;
1856
+ min-height: 36px;
1857
+ padding: 0 10px;
1858
+ border-radius: 6px;
1850
1859
  border: 1px solid var(--universal-launcher-border-strong);
1851
1860
  background: var(--universal-launcher-control-surface);
1852
1861
  color: var(--universal-launcher-text);