replicas-computer 0.2.8 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/assets/desktop/brand-wallpaper.svg +13 -51
- package/assets/desktop/geist-mono-400.ttf +0 -0
- package/assets/desktop/geist-mono-600.ttf +0 -0
- package/assets/desktop/geist-mono-700.ttf +0 -0
- package/assets/desktop/general-sans-300.ttf +0 -0
- package/assets/desktop/general-sans-400.ttf +0 -0
- package/assets/desktop/general-sans-600.ttf +0 -0
- package/assets/desktop/gtk-settings.ini +3 -3
- package/assets/desktop/launchers/editor.desktop +6 -0
- package/assets/desktop/launchers/files.desktop +6 -0
- package/assets/desktop/launchers/terminal.desktop +6 -0
- package/assets/desktop/novnc-index.html +7 -0
- package/assets/desktop/openbox-rc.xml +8 -8
- package/assets/desktop/openbox-theme/themerc +37 -37
- package/assets/desktop/replicas-terminal +11 -0
- package/assets/desktop/start-services.sh +9 -7
- package/assets/desktop/stream-index.html +7 -0
- package/assets/desktop/stream-viewer.css +16 -45
- package/assets/desktop/tint2rc +102 -53
- package/assets/desktop/viewer-theme.css +122 -0
- package/assets/desktop/viewer.css +5 -37
- package/dist/index.js +13 -5
- package/package.json +2 -2
- package/assets/desktop/geist-mono.woff2 +0 -0
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@ The versioned computer-use runtime for Replicas workspace images.
|
|
|
8
8
|
- `src/stream-viewer.ts` owns browser decoding, audio playback, reconnects, and interactive input.
|
|
9
9
|
- `src/viewer.ts` owns the optional noVNC fallback.
|
|
10
10
|
- `assets/desktop/start-services.sh` owns the X11 and stream process lifecycle.
|
|
11
|
+
- `assets/desktop/` owns the desktop theme: `brand-wallpaper.svg` (regenerate with `bun scripts/render-wallpaper.ts`), `tint2rc` dock, `openbox-theme/`, `gtk-settings.ini`, the `replicas-terminal` wrapper, and the bundled fonts (static TTF instances of General Sans and Geist Mono; variable and WOFF2 builds render with wrong metrics in Pango and VTE).
|
|
11
12
|
|
|
12
13
|
The viewer and agent command paths are independent. One on-demand encoder is shared by all viewers, stops when the last viewer disconnects, and restarts without reloading the page. The default 1920×1080 stream uses low-latency H.264 and Opus; noVNC remains available as an opt-in fallback.
|
|
13
14
|
|
|
@@ -1,54 +1,16 @@
|
|
|
1
|
-
<svg width="1920" height="1080" viewBox="0 0
|
|
2
|
-
<g clip-path="url(#clip0_brand_wallpaper)">
|
|
3
|
-
<g clip-path="url(#clip1_brand_wallpaper)">
|
|
4
|
-
<g filter="url(#filter0_n_brand_wallpaper)">
|
|
5
|
-
<path d="M905 5H5V1005H905V5Z" fill="url(#paint0_linear_brand_wallpaper)"/>
|
|
6
|
-
</g>
|
|
7
|
-
<g filter="url(#filter1_f_brand_wallpaper)">
|
|
8
|
-
<path d="M-2.98651 642.026C-2.98651 642.026 -141.133 716.811 -223.859 615.965C-306.584 515.119 -212.815 254.222 -157.739 166.382C-102.663 78.5416 289.934 113.449 372.659 214.295C455.385 315.141 -2.98651 642.026 -2.98651 642.026Z" fill="#082C25" fill-opacity="0.75"/>
|
|
9
|
-
</g>
|
|
10
|
-
<g filter="url(#filter2_f_brand_wallpaper)">
|
|
11
|
-
<path d="M835.074 696.861C835.074 696.861 907.89 736.28 951.494 683.124C995.099 629.969 945.674 492.451 916.643 446.151C887.613 399.851 680.677 418.25 637.072 471.405C593.468 524.561 835.074 696.861 835.074 696.861Z" fill="#082C25" fill-opacity="0.7"/>
|
|
12
|
-
</g>
|
|
13
|
-
</g>
|
|
14
|
-
</g>
|
|
1
|
+
<svg width="1920" height="1080" viewBox="0 0 1920 1080" xmlns="http://www.w3.org/2000/svg">
|
|
15
2
|
<defs>
|
|
16
|
-
<
|
|
17
|
-
<
|
|
18
|
-
<
|
|
19
|
-
<
|
|
20
|
-
<feColorMatrix in="noise" type="luminanceToAlpha" result="alphaNoise" />
|
|
21
|
-
<feComponentTransfer in="alphaNoise" result="coloredNoise1">
|
|
22
|
-
<feFuncA type="discrete" tableValues="1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "/>
|
|
23
|
-
</feComponentTransfer>
|
|
24
|
-
<feComposite operator="in" in2="shape" in="coloredNoise1" result="noise1Clipped" />
|
|
25
|
-
<feFlood flood-color="rgba(0, 0, 0, 0.2)" result="color1Flood" />
|
|
26
|
-
<feComposite operator="in" in2="noise1Clipped" in="color1Flood" result="color1" />
|
|
27
|
-
<feMerge result="effect1_noise_brand_wallpaper">
|
|
28
|
-
<feMergeNode in="shape" />
|
|
29
|
-
<feMergeNode in="color1" />
|
|
30
|
-
</feMerge>
|
|
31
|
-
</filter>
|
|
32
|
-
<filter id="filter1_f_brand_wallpaper" x="-496.13" y="-123.322" width="1118.34" height="1031.59" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
33
|
-
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
34
|
-
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
35
|
-
<feGaussianBlur stdDeviation="119.783" result="effect1_foregroundBlur_brand_wallpaper"/>
|
|
36
|
-
</filter>
|
|
37
|
-
<filter id="filter2_f_brand_wallpaper" x="505.533" y="293.449" width="589.474" height="543.749" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
38
|
-
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
39
|
-
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
40
|
-
<feGaussianBlur stdDeviation="63.1371" result="effect1_foregroundBlur_brand_wallpaper"/>
|
|
41
|
-
</filter>
|
|
42
|
-
<linearGradient id="paint0_linear_brand_wallpaper" x1="-5.01855" y1="5" x2="999.36" y2="898.989" gradientUnits="userSpaceOnUse">
|
|
43
|
-
<stop stop-color="#1B9179"/>
|
|
44
|
-
<stop offset="0.128829" stop-color="#1D8570"/>
|
|
45
|
-
<stop offset="1" stop-color="#082B24"/>
|
|
46
|
-
</linearGradient>
|
|
47
|
-
<clipPath id="clip0_brand_wallpaper">
|
|
48
|
-
<rect x="5" y="5" width="900" height="1000" fill="white"/>
|
|
49
|
-
</clipPath>
|
|
50
|
-
<clipPath id="clip1_brand_wallpaper">
|
|
51
|
-
<rect width="900" height="1000" fill="white" transform="translate(5 5)"/>
|
|
52
|
-
</clipPath>
|
|
3
|
+
<linearGradient id="cell" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#082b24" stop-opacity="0.95"/><stop offset="1" stop-color="#005b45" stop-opacity="0.82"/></linearGradient>
|
|
4
|
+
<radialGradient id="glow" gradientUnits="userSpaceOnUse" cx="960" cy="476" r="620"><stop stop-color="#3eeba3" stop-opacity="0.07"/><stop offset="1" stop-color="#3eeba3" stop-opacity="0"/></radialGradient>
|
|
5
|
+
<pattern id="grid" width="64" height="64" y="28" patternUnits="userSpaceOnUse"><path d="M0.5 0V64M0 0.5H64" stroke="#ffffff" stroke-opacity="0.12"/></pattern>
|
|
6
|
+
<filter id="cell-glow" x="-25%" y="-25%" width="150%" height="150%"><feDropShadow dx="0" dy="0" stdDeviation="10" flood-color="#3eeba3" flood-opacity="0.16"/></filter>
|
|
53
7
|
</defs>
|
|
8
|
+
<rect width="1920" height="1080" fill="#121212"/>
|
|
9
|
+
<rect width="1920" height="1080" fill="url(#glow)"/>
|
|
10
|
+
<rect width="1920" height="1080" fill="url(#grid)"/>
|
|
11
|
+
<g fill="url(#cell)" stroke="#3eeba3" filter="url(#cell-glow)"><rect x="768.5" y="220.5" width="64" height="64"/><rect x="768.5" y="284.5" width="64" height="64"/><rect x="832.5" y="220.5" width="64" height="64"/><rect x="832.5" y="284.5" width="64" height="64"/><rect x="896.5" y="220.5" width="64" height="64"/><rect x="896.5" y="284.5" width="64" height="64"/><rect x="960.5" y="220.5" width="64" height="64"/><rect x="960.5" y="284.5" width="64" height="64"/><rect x="1024.5" y="348.5" width="64" height="64"/><rect x="1024.5" y="412.5" width="64" height="64"/><rect x="1088.5" y="348.5" width="64" height="64"/><rect x="1088.5" y="412.5" width="64" height="64"/><rect x="768.5" y="476.5" width="64" height="64"/><rect x="768.5" y="540.5" width="64" height="64"/><rect x="832.5" y="476.5" width="64" height="64"/><rect x="832.5" y="540.5" width="64" height="64"/><rect x="896.5" y="476.5" width="64" height="64"/><rect x="896.5" y="540.5" width="64" height="64"/><rect x="960.5" y="476.5" width="64" height="64"/><rect x="960.5" y="540.5" width="64" height="64"/><rect x="768.5" y="604.5" width="64" height="64"/><rect x="768.5" y="668.5" width="64" height="64"/><rect x="832.5" y="604.5" width="64" height="64"/><rect x="832.5" y="668.5" width="64" height="64"/><rect x="1024.5" y="604.5" width="64" height="64"/><rect x="1024.5" y="668.5" width="64" height="64"/><rect x="1088.5" y="604.5" width="64" height="64"/><rect x="1088.5" y="668.5" width="64" height="64"/><rect x="320.5" y="156.5" width="64" height="64"/><rect x="384.5" y="220.5" width="64" height="64"/><rect x="256.5" y="284.5" width="64" height="64"/><rect x="320.5" y="284.5" width="64" height="64"/><rect x="384.5" y="284.5" width="64" height="64"/><rect x="1536.5" y="220.5" width="64" height="64"/><rect x="1472.5" y="284.5" width="64" height="64"/><rect x="1600.5" y="348.5" width="64" height="64"/><rect x="1536.5" y="348.5" width="64" height="64"/><rect x="1472.5" y="348.5" width="64" height="64"/><rect x="448.5" y="860.5" width="64" height="64"/><rect x="512.5" y="796.5" width="64" height="64"/><rect x="384.5" y="732.5" width="64" height="64"/><rect x="448.5" y="732.5" width="64" height="64"/><rect x="512.5" y="732.5" width="64" height="64"/><rect x="1344.5" y="796.5" width="64" height="64"/><rect x="1408.5" y="796.5" width="64" height="64"/><rect x="1472.5" y="796.5" width="64" height="64"/><rect x="1664.5" y="540.5" width="64" height="64"/><rect x="1728.5" y="540.5" width="64" height="64"/><rect x="1664.5" y="604.5" width="64" height="64"/><rect x="1728.5" y="604.5" width="64" height="64"/></g>
|
|
12
|
+
<g font-family="Geist Mono, monospace" font-size="5" font-weight="600" fill="#3eeba3"><text x="774" y="233">AGENT-73</text><text x="774" y="276">CODING</text><text x="774" y="297">AGENT-45</text><text x="774" y="340">DEPLOYING</text><text x="838" y="233">AGENT-10</text><text x="838" y="276">LINTING</text><text x="838" y="297">AGENT-82</text><text x="838" y="340">MERGING</text><text x="902" y="233">AGENT-47</text><text x="902" y="276">REFACTORING</text><text x="902" y="297">AGENT-19</text><text x="902" y="340">CODING</text><text x="966" y="233">AGENT-84</text><text x="966" y="276">RUNNING TESTS</text><text x="966" y="297">AGENT-56</text><text x="966" y="340">LINTING</text><text x="1030" y="361">AGENT-65</text><text x="1030" y="404">CODING</text><text x="1030" y="425">AGENT-37</text><text x="1030" y="468">DEPLOYING</text><text x="1094" y="361">AGENT-02</text><text x="1094" y="404">LINTING</text><text x="1094" y="425">AGENT-74</text><text x="1094" y="468">MERGING</text><text x="774" y="489">AGENT-61</text><text x="774" y="532">DEPLOYING</text><text x="774" y="553">AGENT-33</text><text x="774" y="596">REFACTORING</text><text x="838" y="489">AGENT-98</text><text x="838" y="532">MERGING</text><text x="838" y="553">AGENT-70</text><text x="838" y="596">RUNNING TESTS</text><text x="902" y="489">AGENT-35</text><text x="902" y="532">CODING</text><text x="902" y="553">AGENT-07</text><text x="902" y="596">DEPLOYING</text><text x="966" y="489">AGENT-72</text><text x="966" y="532">LINTING</text><text x="966" y="553">AGENT-44</text><text x="966" y="596">MERGING</text><text x="774" y="617">AGENT-05</text><text x="774" y="660">CODING</text><text x="774" y="681">AGENT-77</text><text x="774" y="724">DEPLOYING</text><text x="838" y="617">AGENT-42</text><text x="838" y="660">LINTING</text><text x="838" y="681">AGENT-14</text><text x="838" y="724">MERGING</text><text x="1030" y="617">AGENT-53</text><text x="1030" y="660">DEPLOYING</text><text x="1030" y="681">AGENT-25</text><text x="1030" y="724">REFACTORING</text><text x="1094" y="617">AGENT-90</text><text x="1094" y="660">MERGING</text><text x="1094" y="681">AGENT-62</text><text x="1094" y="724">RUNNING TESTS</text><text x="326" y="169">AGENT-42</text><text x="326" y="212">LINTING</text><text x="390" y="233">AGENT-51</text><text x="390" y="276">CODING</text><text x="262" y="297">AGENT-49</text><text x="262" y="340">REFACTORING</text><text x="326" y="297">AGENT-86</text><text x="326" y="340">RUNNING TESTS</text><text x="390" y="297">AGENT-23</text><text x="390" y="340">DEPLOYING</text><text x="1542" y="233">AGENT-17</text><text x="1542" y="276">CODING</text><text x="1478" y="297">AGENT-52</text><text x="1478" y="340">RUNNING TESTS</text><text x="1606" y="361">AGENT-98</text><text x="1606" y="404">RUNNING TESTS</text><text x="1542" y="361">AGENT-61</text><text x="1542" y="404">REFACTORING</text><text x="1478" y="361">AGENT-24</text><text x="1478" y="404">LINTING</text><text x="454" y="873">AGENT-08</text><text x="454" y="916">MERGING</text><text x="518" y="809">AGENT-73</text><text x="518" y="852">REFACTORING</text><text x="390" y="745">AGENT-27</text><text x="390" y="788">REFACTORING</text><text x="454" y="745">AGENT-64</text><text x="454" y="788">RUNNING TESTS</text><text x="518" y="745">AGENT-01</text><text x="518" y="788">DEPLOYING</text><text x="1350" y="809">AGENT-54</text><text x="1350" y="852">RUNNING TESTS</text><text x="1414" y="809">AGENT-91</text><text x="1414" y="852">DEPLOYING</text><text x="1478" y="809">AGENT-28</text><text x="1478" y="852">MERGING</text><text x="1670" y="553">AGENT-51</text><text x="1670" y="596">DEPLOYING</text><text x="1734" y="553">AGENT-88</text><text x="1734" y="596">MERGING</text><text x="1670" y="617">AGENT-23</text><text x="1670" y="660">REFACTORING</text><text x="1734" y="617">AGENT-60</text><text x="1734" y="660">RUNNING TESTS</text></g>
|
|
13
|
+
<path transform="translate(893.05 842)" fill="#ffffff" fill-opacity="0.85" d="M5.3 0H3.3V-28.7H13.2Q17.5 -28.7 20 -26.5Q22.6 -24.3 22.6 -20.2Q22.6 -16.9 20.5 -14.6Q18.4 -12.4 14.9 -12L23.3 0H20.9L12.8 -11.8H5.3ZM5.3 -27.1V-13.4H13Q16.5 -13.4 18.5 -15.2Q20.6 -17 20.6 -20.2Q20.6 -23.5 18.5 -25.3Q16.5 -27.1 13 -27.1Z M33.8 0.4Q31 0.4 28.8 -0.9Q26.6 -2.3 25.4 -4.9Q24.2 -7.4 24.2 -10.7Q24.2 -13.7 25.5 -16.2Q26.7 -18.6 28.8 -20Q30.9 -21.4 33.6 -21.4Q35.8 -21.4 37.5 -20.6Q39.2 -19.7 40.5 -18.2Q41.7 -16.7 42.3 -14.7Q42.9 -12.6 42.8 -10.1H25.2V-11.5H40.9Q40.7 -15.4 38.8 -17.7Q36.8 -19.9 33.6 -19.9Q31.4 -19.9 29.7 -18.7Q28 -17.6 27 -15.5Q26.1 -13.5 26.1 -10.7Q26.1 -7.8 27 -5.6Q27.9 -3.4 29.7 -2.3Q31.4 -1.1 33.8 -1.1Q36.7 -1.1 38.6 -2.7Q40.6 -4.3 41.1 -7.1H42.9Q42.3 -3.6 39.8 -1.6Q37.4 0.4 33.8 0.4Z M64.2 -10.5Q64.2 -7.2 63.1 -4.8Q61.9 -2.3 59.9 -1Q57.8 0.4 55 0.4Q52.5 0.4 50.5 -1Q48.5 -2.4 47.4 -4.8V7.7H45.5V-21H47.3V-15.9Q48.3 -18.5 50.4 -19.9Q52.5 -21.4 55 -21.4Q57.8 -21.4 59.9 -20Q61.9 -18.7 63.1 -16.2Q64.2 -13.8 64.2 -10.5ZM62.3 -10.5Q62.3 -14.8 60.3 -17.3Q58.3 -19.8 54.8 -19.8Q52.7 -19.8 51 -18.7Q49.3 -17.6 48.3 -15.5Q47.3 -13.5 47.3 -10.5Q47.3 -7.7 48.3 -5.6Q49.2 -3.5 50.9 -2.3Q52.6 -1.2 54.8 -1.2Q58.3 -1.2 60.3 -3.6Q62.3 -6.1 62.3 -10.5Z M68.7 0H66.8V-28.7H68.7Z M74.8 0H72.9V-21H74.8ZM75.6 -25.8Q75.6 -25.1 75.2 -24.6Q74.7 -24.1 73.9 -24.1Q73.1 -24.1 72.6 -24.6Q72.1 -25.1 72.1 -25.8Q72.1 -26.6 72.6 -27Q73.1 -27.5 73.9 -27.5Q74.7 -27.5 75.2 -27Q75.6 -26.6 75.6 -25.8Z M86.5 0.4Q83.8 0.4 81.8 -0.9Q79.7 -2.3 78.6 -4.8Q77.4 -7.3 77.4 -10.5Q77.4 -13.7 78.6 -16.2Q79.7 -18.6 81.8 -20Q83.9 -21.4 86.5 -21.4Q88.9 -21.4 90.7 -20.4Q92.6 -19.4 93.8 -17.6Q95 -15.7 95.5 -13.2H93.6Q93 -16.3 91.2 -18.1Q89.3 -19.8 86.5 -19.8Q84.4 -19.8 82.8 -18.6Q81.1 -17.4 80.2 -15.4Q79.3 -13.3 79.3 -10.5Q79.3 -7.7 80.2 -5.6Q81.1 -3.5 82.8 -2.3Q84.4 -1.1 86.5 -1.1Q89.3 -1.1 91.2 -2.9Q93.1 -4.7 93.6 -7.8H95.5Q95.1 -5.2 93.8 -3.4Q92.6 -1.6 90.8 -0.6Q88.9 0.4 86.5 0.4Z M111.1 0V-4.2Q110.3 -2.1 108.3 -0.9Q106.4 0.4 103.9 0.4Q100.6 0.4 98.7 -1.3Q96.7 -2.9 96.7 -5.7Q96.7 -8.8 99.2 -10.4Q101.6 -11.9 106.4 -11.9Q107.4 -11.9 108.3 -11.9Q109.3 -11.8 111 -11.7V-13.6Q111 -16.6 109.5 -18.2Q108.1 -19.9 105.4 -19.9Q102.6 -19.9 100.9 -18.2Q99.3 -16.5 99.2 -13.7H97.5Q97.5 -16 98.5 -17.7Q99.5 -19.4 101.3 -20.4Q103.1 -21.4 105.4 -21.4Q108.9 -21.4 110.9 -19.4Q112.8 -17.4 112.8 -13.8V0ZM98.6 -5.8Q98.6 -3.7 100.1 -2.4Q101.6 -1 104 -1Q107.2 -1 109.1 -3.1Q111 -5.1 111 -8.4V-10.4Q109.5 -10.5 108.5 -10.5Q107.4 -10.6 106.5 -10.6Q102.5 -10.6 100.5 -9.4Q98.6 -8.2 98.6 -5.8Z M131.9 -5.5Q131.9 -2.8 129.8 -1.2Q127.7 0.4 123.9 0.4Q120.3 0.4 118 -1.4Q115.8 -3.2 115.5 -6.4H117.3Q117.4 -3.9 119.2 -2.5Q121 -1.1 124 -1.1Q126.9 -1.1 128.5 -2.2Q130 -3.3 130 -5.3Q130 -7.1 128.9 -8Q127.8 -8.9 125.2 -9.4L122.4 -10Q119.3 -10.6 117.8 -12Q116.3 -13.4 116.3 -15.6Q116.3 -17.3 117.2 -18.6Q118.2 -19.9 119.8 -20.6Q121.5 -21.4 123.7 -21.4Q126 -21.4 127.7 -20.6Q129.5 -19.8 130.5 -18.3Q131.5 -16.8 131.7 -14.8H129.9Q129.7 -17.2 128 -18.6Q126.4 -19.9 123.7 -19.9Q121.2 -19.9 119.6 -18.8Q118.1 -17.7 118.1 -15.8Q118.1 -14 119.2 -13.1Q120.4 -12.1 123 -11.6L125.9 -11Q129 -10.4 130.5 -9.1Q131.9 -7.8 131.9 -5.5Z"/>
|
|
14
|
+
<g font-family="Geist Mono, monospace" font-size="14" fill="#ffffff" fill-opacity="0.4" text-anchor="middle"><text x="14" y="22">+</text><text x="1906" y="22">+</text><text x="14" y="1070">+</text><text x="1906" y="1070">+</text></g>
|
|
15
|
+
<text x="34" y="22" font-family="Geist Mono, monospace" font-size="10" letter-spacing="1.4" fill="#ffffff" fill-opacity="0.45">REPLICAS / DESKTOP</text>
|
|
54
16
|
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
[Settings]
|
|
2
|
-
gtk-theme-name=Yaru-dark
|
|
3
|
-
gtk-icon-theme-name=Yaru
|
|
2
|
+
gtk-theme-name=Yaru-viridian-dark
|
|
3
|
+
gtk-icon-theme-name=Yaru-viridian
|
|
4
4
|
gtk-cursor-theme-name=Bibata-Modern-Ice
|
|
5
5
|
gtk-cursor-theme-size=22
|
|
6
|
-
gtk-font-name=
|
|
6
|
+
gtk-font-name=General Sans 10
|
|
7
7
|
gtk-application-prefer-dark-theme=1
|
|
8
8
|
gtk-xft-antialias=1
|
|
9
9
|
gtk-xft-hinting=1
|
|
@@ -4,13 +4,20 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
6
6
|
<title>Replicas Desktop</title>
|
|
7
|
+
<link rel="stylesheet" href="./viewer-theme.css">
|
|
7
8
|
<link rel="stylesheet" href="./viewer.css">
|
|
8
9
|
<link rel="icon" href="./viewer-icon.svg" type="image/svg+xml">
|
|
9
10
|
</head>
|
|
10
11
|
<body>
|
|
11
12
|
<div id="screen"></div>
|
|
12
13
|
<div id="status" class="visible" role="status" aria-live="polite">
|
|
14
|
+
<span class="frame-corner" aria-hidden="true">+</span>
|
|
15
|
+
<span class="frame-corner" aria-hidden="true">+</span>
|
|
16
|
+
<span class="frame-corner" aria-hidden="true">+</span>
|
|
17
|
+
<span class="frame-corner" aria-hidden="true">+</span>
|
|
18
|
+
<span class="frame-label" aria-hidden="true">Replicas / Desktop</span>
|
|
13
19
|
<img src="./viewer-icon.svg" alt="">
|
|
20
|
+
<span id="status-title" aria-hidden="true">Replicas</span>
|
|
14
21
|
<span id="status-text">connecting…</span>
|
|
15
22
|
</div>
|
|
16
23
|
<div id="hint">This desktop runs Linux — ⌘ shortcuts won't work here. Use Ctrl instead (e.g. Ctrl+C / Ctrl+V).</div>
|
|
@@ -24,26 +24,26 @@
|
|
|
24
24
|
<keepBorder>yes</keepBorder>
|
|
25
25
|
<animateIconify>yes</animateIconify>
|
|
26
26
|
<font place="ActiveWindow">
|
|
27
|
-
<name>
|
|
28
|
-
<size>
|
|
27
|
+
<name>General Sans</name>
|
|
28
|
+
<size>10</size>
|
|
29
29
|
<weight>bold</weight>
|
|
30
30
|
<slant>normal</slant>
|
|
31
31
|
</font>
|
|
32
32
|
<font place="InactiveWindow">
|
|
33
|
-
<name>
|
|
34
|
-
<size>
|
|
33
|
+
<name>General Sans</name>
|
|
34
|
+
<size>10</size>
|
|
35
35
|
<weight>bold</weight>
|
|
36
36
|
<slant>normal</slant>
|
|
37
37
|
</font>
|
|
38
38
|
<font place="MenuHeader">
|
|
39
|
-
<name>
|
|
40
|
-
<size>
|
|
39
|
+
<name>General Sans</name>
|
|
40
|
+
<size>10</size>
|
|
41
41
|
<weight>normal</weight>
|
|
42
42
|
<slant>normal</slant>
|
|
43
43
|
</font>
|
|
44
44
|
<font place="MenuItem">
|
|
45
|
-
<name>
|
|
46
|
-
<size>
|
|
45
|
+
<name>General Sans</name>
|
|
46
|
+
<size>10</size>
|
|
47
47
|
<weight>normal</weight>
|
|
48
48
|
<slant>normal</slant>
|
|
49
49
|
</font>
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
border.width: 1
|
|
2
|
-
padding.width:
|
|
3
|
-
padding.height:
|
|
4
|
-
window.client.padding.width:
|
|
5
|
-
window.client.padding.height:
|
|
2
|
+
padding.width: 6
|
|
3
|
+
padding.height: 7
|
|
4
|
+
window.client.padding.width: 0
|
|
5
|
+
window.client.padding.height: 0
|
|
6
6
|
window.handle.width: 0
|
|
7
7
|
window.label.text.justify: center
|
|
8
8
|
|
|
9
|
-
window.active.border.color: #
|
|
10
|
-
window.inactive.border.color: #
|
|
11
|
-
window.*.client.color: #
|
|
9
|
+
window.active.border.color: #2b2d2c
|
|
10
|
+
window.inactive.border.color: #242424
|
|
11
|
+
window.*.client.color: #121212
|
|
12
12
|
window.*.title.bg: flat
|
|
13
|
-
window.active.title.bg.color: #
|
|
14
|
-
window.inactive.title.bg.color: #
|
|
13
|
+
window.active.title.bg.color: #171717
|
|
14
|
+
window.inactive.title.bg.color: #121212
|
|
15
15
|
window.active.label.bg: parentrelative
|
|
16
16
|
window.inactive.label.bg: parentrelative
|
|
17
17
|
window.active.button.*.bg: flat
|
|
18
|
-
window.active.button.*.bg.color: #
|
|
18
|
+
window.active.button.*.bg.color: #171717
|
|
19
19
|
window.inactive.button.*.bg: flat
|
|
20
|
-
window.inactive.button.*.bg.color: #
|
|
21
|
-
window.active.button.*.image.color: #
|
|
22
|
-
window.inactive.button.*.image.color: #
|
|
20
|
+
window.inactive.button.*.bg.color: #121212
|
|
21
|
+
window.active.button.*.image.color: #ededed
|
|
22
|
+
window.inactive.button.*.image.color: #6f6f6f
|
|
23
23
|
window.active.button.*.hover.bg: flat
|
|
24
|
-
window.active.button.*.hover.bg.color: #
|
|
24
|
+
window.active.button.*.hover.bg.color: #2b2b2b
|
|
25
25
|
window.inactive.button.*.hover.bg: flat
|
|
26
|
-
window.inactive.button.*.hover.bg.color: #
|
|
26
|
+
window.inactive.button.*.hover.bg.color: #2b2b2b
|
|
27
27
|
window.active.button.*.hover.image.color: #ffffff
|
|
28
28
|
window.inactive.button.*.hover.image.color: #ffffff
|
|
29
|
-
window.active.button.*.pressed.image.color: #
|
|
30
|
-
window.inactive.button.*.pressed.image.color: #
|
|
31
|
-
window.active.label.text.color: #
|
|
32
|
-
window.inactive.label.text.color: #
|
|
33
|
-
window.active.title.separator.color: #
|
|
34
|
-
window.inactive.title.separator.color: #
|
|
29
|
+
window.active.button.*.pressed.image.color: #3eeba3
|
|
30
|
+
window.inactive.button.*.pressed.image.color: #3eeba3
|
|
31
|
+
window.active.label.text.color: #ededed
|
|
32
|
+
window.inactive.label.text.color: #8a8a8a
|
|
33
|
+
window.active.title.separator.color: #171717
|
|
34
|
+
window.inactive.title.separator.color: #121212
|
|
35
35
|
|
|
36
36
|
menu.border.width: 1
|
|
37
37
|
menu.separator.width: 1
|
|
@@ -39,28 +39,28 @@ menu.separator.padding.width: 6
|
|
|
39
39
|
menu.separator.padding.height: 4
|
|
40
40
|
menu.overlap.x: 0
|
|
41
41
|
menu.overlap.y: 0
|
|
42
|
-
menu.border.color: #
|
|
43
|
-
menu.separator.color: #
|
|
44
|
-
menu.items.text.color: #
|
|
45
|
-
menu.items.disabled.text.color: #
|
|
46
|
-
menu.items.active.text.color: #
|
|
47
|
-
menu.items.active.disabled.text.color: #
|
|
42
|
+
menu.border.color: #2b2d2c
|
|
43
|
+
menu.separator.color: #2b2d2c
|
|
44
|
+
menu.items.text.color: #ededed
|
|
45
|
+
menu.items.disabled.text.color: #5c5c5c
|
|
46
|
+
menu.items.active.text.color: #121212
|
|
47
|
+
menu.items.active.disabled.text.color: #1c6a49
|
|
48
48
|
menu.items.bg: flat
|
|
49
|
-
menu.items.bg.color: #
|
|
49
|
+
menu.items.bg.color: #171717
|
|
50
50
|
menu.items.active.bg: flat
|
|
51
|
-
menu.items.active.bg.color: #
|
|
52
|
-
menu.title.text.color: #
|
|
51
|
+
menu.items.active.bg.color: #3eeba3
|
|
52
|
+
menu.title.text.color: #a3a3a3
|
|
53
53
|
menu.title.bg: flat
|
|
54
|
-
menu.title.bg.color: #
|
|
54
|
+
menu.title.bg.color: #121212
|
|
55
55
|
|
|
56
56
|
osd.border.width: 1
|
|
57
|
-
osd.border.color: #
|
|
57
|
+
osd.border.color: #2b2d2c
|
|
58
58
|
osd.bg: flat
|
|
59
|
-
osd.bg.color: #
|
|
59
|
+
osd.bg.color: #171717
|
|
60
60
|
osd.hilight.bg: flat
|
|
61
|
-
osd.hilight.bg.color: #
|
|
61
|
+
osd.hilight.bg.color: #3eeba3
|
|
62
62
|
osd.unhilight.bg: flat
|
|
63
|
-
osd.unhilight.bg.color: #
|
|
63
|
+
osd.unhilight.bg.color: #2b2b2b
|
|
64
64
|
osd.label.bg: flat
|
|
65
|
-
osd.label.bg.color: #
|
|
66
|
-
osd.label.text.color: #
|
|
65
|
+
osd.label.bg.color: #171717
|
|
66
|
+
osd.label.text.color: #ededed
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# xfce4-terminal 1.1 keeps its settings in xfconf, which needs a session bus this
|
|
3
|
+
# desktop does not run, so the theme is applied per launch instead of via terminalrc.
|
|
4
|
+
exec xfce4-terminal \
|
|
5
|
+
--font='Geist Mono 11' \
|
|
6
|
+
--color-bg='#121212' \
|
|
7
|
+
--color-text='#ededed' \
|
|
8
|
+
--hide-menubar \
|
|
9
|
+
--hide-toolbar \
|
|
10
|
+
--hide-scrollbar \
|
|
11
|
+
"$@"
|
|
@@ -266,11 +266,10 @@ clear_bridge_pid_if_unhealthy() {
|
|
|
266
266
|
paint_wallpaper() {
|
|
267
267
|
local wallpaper="${REPLICAS_DESKTOP_WALLPAPER:-$REPLICAS_DESKTOP_TEMPLATES/brand-wallpaper.svg}"
|
|
268
268
|
local rendered_wallpaper="$STATE_DIR/wallpaper-${WIDTH}x${HEIGHT}.png"
|
|
269
|
-
local dock_height="${REPLICAS_DESKTOP_DOCK_HEIGHT:-92}"
|
|
270
269
|
if command -v ffmpeg >/dev/null 2>&1 && [ -f "$wallpaper" ] && [ ! -f "$rendered_wallpaper" ]; then
|
|
271
270
|
ffmpeg -y -loglevel error \
|
|
272
271
|
-i "$wallpaper" \
|
|
273
|
-
-vf "scale=${WIDTH}:${HEIGHT}:force_original_aspect_ratio=increase,crop=${WIDTH}:${HEIGHT}
|
|
272
|
+
-vf "scale=${WIDTH}:${HEIGHT}:force_original_aspect_ratio=increase,crop=${WIDTH}:${HEIGHT}" \
|
|
274
273
|
-frames:v 1 "$rendered_wallpaper" >/dev/null 2>&1 || true
|
|
275
274
|
fi
|
|
276
275
|
|
|
@@ -279,9 +278,9 @@ paint_wallpaper() {
|
|
|
279
278
|
elif command -v hsetroot >/dev/null 2>&1 && [ -f "$wallpaper" ]; then
|
|
280
279
|
DISPLAY=":$DISPLAY_NUM" hsetroot -cover "$wallpaper" >/dev/null 2>&1 || true
|
|
281
280
|
elif command -v hsetroot >/dev/null 2>&1; then
|
|
282
|
-
DISPLAY=":$DISPLAY_NUM" hsetroot -solid '#
|
|
281
|
+
DISPLAY=":$DISPLAY_NUM" hsetroot -solid '#121212' >/dev/null 2>&1 || true
|
|
283
282
|
else
|
|
284
|
-
DISPLAY=":$DISPLAY_NUM" xsetroot -solid '#
|
|
283
|
+
DISPLAY=":$DISPLAY_NUM" xsetroot -solid '#121212' >/dev/null 2>&1 || true
|
|
285
284
|
fi
|
|
286
285
|
DISPLAY=":$DISPLAY_NUM" xsetroot -cursor_name left_ptr >/dev/null 2>&1 || true
|
|
287
286
|
}
|
|
@@ -290,8 +289,8 @@ acquire_start_lock
|
|
|
290
289
|
|
|
291
290
|
export XCURSOR_THEME="${XCURSOR_THEME:-Bibata-Modern-Ice}"
|
|
292
291
|
export XCURSOR_SIZE="${XCURSOR_SIZE:-22}"
|
|
293
|
-
export GTK_THEME="${GTK_THEME:-Yaru-dark}"
|
|
294
|
-
export GTK_ICON_THEME="${GTK_ICON_THEME:-Yaru}"
|
|
292
|
+
export GTK_THEME="${GTK_THEME:-Yaru-viridian-dark}"
|
|
293
|
+
export GTK_ICON_THEME="${GTK_ICON_THEME:-Yaru-viridian}"
|
|
295
294
|
|
|
296
295
|
REPLICAS_DESKTOP_TEMPLATES="${REPLICAS_DESKTOP_TEMPLATES:-/usr/local/share/replicas/desktop}"
|
|
297
296
|
mkdir -p \
|
|
@@ -302,7 +301,7 @@ mkdir -p \
|
|
|
302
301
|
"$HOME/.themes/Replicas-modern/openbox-3" \
|
|
303
302
|
"$HOME/.icons/default"
|
|
304
303
|
|
|
305
|
-
[ -f "$REPLICAS_DESKTOP_TEMPLATES/tint2rc" ] &&
|
|
304
|
+
[ -f "$REPLICAS_DESKTOP_TEMPLATES/tint2rc" ] && sed "s|/usr/local/share/replicas/desktop|$REPLICAS_DESKTOP_TEMPLATES|g" "$REPLICAS_DESKTOP_TEMPLATES/tint2rc" > "$HOME/.config/tint2/tint2rc"
|
|
306
305
|
[ -f "$REPLICAS_DESKTOP_TEMPLATES/openbox-rc.xml" ] && cp "$REPLICAS_DESKTOP_TEMPLATES/openbox-rc.xml" "$HOME/.config/openbox/rc.xml"
|
|
307
306
|
[ -f "$REPLICAS_DESKTOP_TEMPLATES/picom.conf" ] && cp "$REPLICAS_DESKTOP_TEMPLATES/picom.conf" "$HOME/.config/picom/picom.conf"
|
|
308
307
|
[ -f "$REPLICAS_DESKTOP_TEMPLATES/gtk-settings.ini" ] && cp "$REPLICAS_DESKTOP_TEMPLATES/gtk-settings.ini" "$HOME/.config/gtk-3.0/settings.ini"
|
|
@@ -312,6 +311,9 @@ fi
|
|
|
312
311
|
if [ -f "$REPLICAS_DESKTOP_TEMPLATES/replicas-chrome" ]; then
|
|
313
312
|
sudo install -m 0755 "$REPLICAS_DESKTOP_TEMPLATES/replicas-chrome" /usr/local/bin/replicas-chrome 2>/dev/null || true
|
|
314
313
|
fi
|
|
314
|
+
if [ -f "$REPLICAS_DESKTOP_TEMPLATES/replicas-terminal" ]; then
|
|
315
|
+
sudo install -m 0755 "$REPLICAS_DESKTOP_TEMPLATES/replicas-terminal" /usr/local/bin/replicas-terminal 2>/dev/null || true
|
|
316
|
+
fi
|
|
315
317
|
if [ -f "$REPLICAS_DESKTOP_TEMPLATES/replicas-chrome.desktop" ]; then
|
|
316
318
|
sudo install -m 0644 "$REPLICAS_DESKTOP_TEMPLATES/replicas-chrome.desktop" /usr/share/applications/replicas-chrome.desktop 2>/dev/null || true
|
|
317
319
|
fi
|
|
@@ -4,13 +4,20 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
6
6
|
<title>Replicas Desktop</title>
|
|
7
|
+
<link rel="stylesheet" href="./viewer-theme.css">
|
|
7
8
|
<link rel="stylesheet" href="./stream-viewer.css">
|
|
8
9
|
<link rel="icon" href="./viewer-icon.svg" type="image/svg+xml">
|
|
9
10
|
</head>
|
|
10
11
|
<body>
|
|
11
12
|
<video id="screen" tabindex="0" aria-label="Replicas desktop" autoplay muted playsinline></video>
|
|
12
13
|
<div id="status" class="visible" role="status" aria-live="polite">
|
|
14
|
+
<span class="frame-corner" aria-hidden="true">+</span>
|
|
15
|
+
<span class="frame-corner" aria-hidden="true">+</span>
|
|
16
|
+
<span class="frame-corner" aria-hidden="true">+</span>
|
|
17
|
+
<span class="frame-corner" aria-hidden="true">+</span>
|
|
18
|
+
<span class="frame-label" aria-hidden="true">Replicas / Desktop</span>
|
|
13
19
|
<img src="./viewer-icon.svg" alt="">
|
|
20
|
+
<span id="status-title" aria-hidden="true">Replicas</span>
|
|
14
21
|
<span id="status-text">connecting…</span>
|
|
15
22
|
</div>
|
|
16
23
|
<button id="audio-prompt" type="button">Enable audio</button>
|
|
@@ -1,63 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
font-family: "Geist Mono";
|
|
3
|
-
font-style: normal;
|
|
4
|
-
font-weight: 400 600;
|
|
5
|
-
font-display: swap;
|
|
6
|
-
src: url("./geist-mono.woff2") format("woff2");
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
html, body {
|
|
10
|
-
width: 100%;
|
|
11
|
-
height: 100%;
|
|
12
|
-
margin: 0;
|
|
13
|
-
overflow: hidden;
|
|
14
|
-
background: #050706;
|
|
15
|
-
font-family: "Geist Mono", ui-monospace, monospace;
|
|
16
|
-
}
|
|
17
|
-
|
|
1
|
+
html, body { background: var(--replicas-black); }
|
|
18
2
|
body { display: grid; place-items: center; }
|
|
19
3
|
|
|
20
4
|
#screen {
|
|
21
5
|
display: block;
|
|
22
6
|
outline: none;
|
|
23
|
-
background:
|
|
7
|
+
background: var(--replicas-black);
|
|
24
8
|
cursor: default;
|
|
25
9
|
touch-action: none;
|
|
26
10
|
}
|
|
27
11
|
|
|
28
|
-
#status {
|
|
29
|
-
position: fixed;
|
|
30
|
-
inset: 0;
|
|
31
|
-
display: flex;
|
|
32
|
-
gap: 16px;
|
|
33
|
-
align-items: center;
|
|
34
|
-
justify-content: center;
|
|
35
|
-
color: rgb(255 255 255 / 92%);
|
|
36
|
-
background: radial-gradient(circle at 18% 20%, rgb(62 235 163 / 16%), transparent 34%),
|
|
37
|
-
radial-gradient(circle at 84% 78%, rgb(8 44 37 / 85%), transparent 42%),
|
|
38
|
-
linear-gradient(135deg, #1b9179 0%, #1d8570 13%, #082b24 100%);
|
|
39
|
-
font-size: 24px;
|
|
40
|
-
pointer-events: none;
|
|
41
|
-
opacity: 0;
|
|
42
|
-
transition: opacity 180ms ease-out;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
#status.visible { opacity: 1; }
|
|
46
|
-
#status img { width: 52px; height: 52px; filter: drop-shadow(0 2px 16px rgb(62 235 163 / 50%)); }
|
|
12
|
+
#status { background: var(--replicas-grid); }
|
|
47
13
|
|
|
48
14
|
#audio-prompt {
|
|
49
15
|
position: fixed;
|
|
50
16
|
right: 16px;
|
|
51
17
|
bottom: 16px;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
border
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
18
|
+
height: 32px;
|
|
19
|
+
padding: 0 12px;
|
|
20
|
+
border: 1px solid rgb(255 255 255 / 50%);
|
|
21
|
+
border-radius: 0;
|
|
22
|
+
color: rgb(255 255 255 / 75%);
|
|
23
|
+
background: var(--replicas-black);
|
|
24
|
+
font: 700 11px/1 "Geist Mono", ui-monospace, monospace;
|
|
25
|
+
letter-spacing: 0.06em;
|
|
26
|
+
text-transform: uppercase;
|
|
58
27
|
cursor: pointer;
|
|
59
28
|
}
|
|
60
29
|
|
|
30
|
+
#audio-prompt:hover, #audio-prompt:focus-visible { border-color: var(--replicas-green); color: var(--replicas-green); outline: none; }
|
|
61
31
|
#audio-prompt[hidden] { display: none; }
|
|
62
32
|
|
|
63
33
|
#diagnostics {
|
|
@@ -65,9 +35,10 @@ body { display: grid; place-items: center; }
|
|
|
65
35
|
top: 12px;
|
|
66
36
|
right: 12px;
|
|
67
37
|
display: none;
|
|
68
|
-
padding:
|
|
38
|
+
padding: 6px 10px;
|
|
39
|
+
border: 1px solid rgb(255 255 255 / 16%);
|
|
69
40
|
color: rgb(255 255 255 / 78%);
|
|
70
|
-
background: rgb(
|
|
41
|
+
background: rgb(18 18 18 / 88%);
|
|
71
42
|
font-size: 11px;
|
|
72
43
|
pointer-events: none;
|
|
73
44
|
}
|
package/assets/desktop/tint2rc
CHANGED
|
@@ -1,89 +1,138 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
# Backgrounds come first: tint2 resolves *_background_id while parsing, so ids
|
|
2
|
+
# referenced before their definition silently fall back to transparent.
|
|
3
|
+
# id 1 -> panel_background_id
|
|
4
|
+
rounded = 18
|
|
5
|
+
border_width = 1
|
|
6
|
+
border_sides = TBLR
|
|
7
|
+
background_color = #171717 100
|
|
8
|
+
border_color = #ffffff 14
|
|
9
|
+
background_color_hover = #171717 100
|
|
10
|
+
border_color_hover = #ffffff 14
|
|
11
|
+
background_color_pressed = #171717 100
|
|
12
|
+
border_color_pressed = #ffffff 14
|
|
13
|
+
|
|
14
|
+
# id 2 -> launcher_icon_background_id
|
|
15
|
+
rounded = 12
|
|
16
|
+
border_width = 0
|
|
17
|
+
background_color = #ffffff 0
|
|
18
|
+
border_color = #000000 0
|
|
19
|
+
background_color_hover = #ffffff 10
|
|
20
|
+
border_color_hover = #000000 0
|
|
21
|
+
background_color_pressed = #ffffff 6
|
|
22
|
+
border_color_pressed = #000000 0
|
|
23
|
+
|
|
24
|
+
# id 3 -> task_background_id, task_iconified_background_id
|
|
25
|
+
rounded = 12
|
|
26
|
+
border_width = 0
|
|
27
|
+
background_color = #ffffff 8
|
|
28
|
+
border_color = #000000 0
|
|
29
|
+
background_color_hover = #ffffff 13
|
|
30
|
+
border_color_hover = #000000 0
|
|
31
|
+
background_color_pressed = #ffffff 6
|
|
32
|
+
border_color_pressed = #000000 0
|
|
33
|
+
|
|
34
|
+
# id 4 -> task_active_background_id, task_urgent_background_id
|
|
35
|
+
rounded = 12
|
|
36
|
+
border_width = 1
|
|
37
|
+
background_color = #3eeba3 12
|
|
38
|
+
border_color = #3eeba3 40
|
|
39
|
+
background_color_hover = #3eeba3 16
|
|
40
|
+
border_color_hover = #3eeba3 40
|
|
41
|
+
background_color_pressed = #3eeba3 10
|
|
42
|
+
border_color_pressed = #3eeba3 40
|
|
43
|
+
|
|
44
|
+
# id 5 -> tooltip_background_id
|
|
45
|
+
rounded = 6
|
|
46
|
+
border_width = 1
|
|
47
|
+
background_color = #121212 96
|
|
48
|
+
border_color = #ffffff 16
|
|
49
|
+
|
|
50
|
+
panel_items = PLT:C
|
|
51
|
+
panel_size = 100% 72
|
|
52
|
+
panel_margin = 0 12
|
|
53
|
+
panel_padding = 10 7 6
|
|
5
54
|
panel_background_id = 1
|
|
6
|
-
|
|
7
|
-
panel_dock = 0
|
|
55
|
+
panel_shrink = 1
|
|
8
56
|
panel_position = bottom center horizontal
|
|
9
57
|
panel_layer = top
|
|
10
58
|
panel_monitor = all
|
|
11
|
-
|
|
12
|
-
strut_policy = follow_size
|
|
59
|
+
panel_window_name = tint2
|
|
13
60
|
disable_transparency = 1
|
|
61
|
+
strut_policy = follow_size
|
|
62
|
+
wm_menu = 0
|
|
14
63
|
font_shadow = 0
|
|
64
|
+
mouse_effects = 1
|
|
65
|
+
mouse_hover_icon_asb = 100 0 12
|
|
66
|
+
mouse_pressed_icon_asb = 100 0 -14
|
|
15
67
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
background_color = #1a1a1a 0
|
|
24
|
-
border_color = #000000 0
|
|
25
|
-
rounded = 16
|
|
26
|
-
border_width = 0
|
|
27
|
-
background_color = #ffffff 10
|
|
28
|
-
border_color = #000000 0
|
|
68
|
+
button = new
|
|
69
|
+
button_icon = /usr/local/share/replicas/desktop/viewer-icon.svg
|
|
70
|
+
button_tooltip = Replicas Desktop
|
|
71
|
+
button_background_id = 0
|
|
72
|
+
button_centered = 1
|
|
73
|
+
button_max_icon_size = 46
|
|
74
|
+
button_padding = 10 0
|
|
29
75
|
|
|
30
|
-
launcher_padding =
|
|
31
|
-
launcher_background_id =
|
|
32
|
-
launcher_icon_background_id =
|
|
33
|
-
launcher_icon_size =
|
|
76
|
+
launcher_padding = 4 0 6
|
|
77
|
+
launcher_background_id = 0
|
|
78
|
+
launcher_icon_background_id = 2
|
|
79
|
+
launcher_icon_size = 42
|
|
34
80
|
launcher_icon_asb = 100 0 0
|
|
35
|
-
launcher_icon_theme = Yaru
|
|
81
|
+
launcher_icon_theme = Yaru-viridian
|
|
82
|
+
launcher_tooltip = 1
|
|
36
83
|
launcher_item_app = /usr/share/applications/replicas-chrome.desktop
|
|
37
|
-
launcher_item_app = /usr/share/
|
|
38
|
-
launcher_item_app = /usr/share/
|
|
39
|
-
launcher_item_app = /usr/share/
|
|
84
|
+
launcher_item_app = /usr/local/share/replicas/desktop/launchers/files.desktop
|
|
85
|
+
launcher_item_app = /usr/local/share/replicas/desktop/launchers/terminal.desktop
|
|
86
|
+
launcher_item_app = /usr/local/share/replicas/desktop/launchers/editor.desktop
|
|
40
87
|
|
|
41
88
|
taskbar_mode = single_desktop
|
|
42
|
-
|
|
89
|
+
taskbar_hide_if_empty = 1
|
|
90
|
+
taskbar_padding = 4 0 4
|
|
43
91
|
taskbar_background_id = 0
|
|
44
92
|
taskbar_active_background_id = 0
|
|
45
93
|
taskbar_name = 0
|
|
46
94
|
taskbar_distribute_size = 0
|
|
47
95
|
taskbar_sort_order = none
|
|
48
96
|
|
|
49
|
-
systray_padding = 8 0 8
|
|
50
|
-
systray_background_id = 1
|
|
51
|
-
systray_sort = ascending
|
|
52
|
-
systray_icon_size = 24
|
|
53
|
-
systray_icon_asb = 100 0 0
|
|
54
|
-
|
|
55
97
|
task_text = 0
|
|
56
98
|
task_icon = 1
|
|
57
99
|
task_centered = 1
|
|
58
100
|
task_align = center
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
task_padding = 10 0
|
|
101
|
+
task_maximum_size = 54 54
|
|
102
|
+
task_padding = 6 6
|
|
62
103
|
task_tooltip = 1
|
|
63
|
-
task_font =
|
|
64
|
-
task_font_color = #c8c8c8 100
|
|
65
|
-
task_active_font_color = #ffffff 100
|
|
104
|
+
task_font = General Sans 10
|
|
66
105
|
task_background_id = 3
|
|
67
106
|
task_active_background_id = 4
|
|
68
107
|
task_iconified_background_id = 3
|
|
69
108
|
task_urgent_background_id = 4
|
|
70
109
|
task_icon_asb = 100 0 0
|
|
71
110
|
task_active_icon_asb = 100 0 0
|
|
111
|
+
task_iconified_icon_asb = 55 0 0
|
|
112
|
+
urgent_nb_of_blink = 8
|
|
113
|
+
|
|
114
|
+
separator = new
|
|
115
|
+
separator_background_id = 0
|
|
116
|
+
separator_color = #ffffff 18
|
|
117
|
+
separator_style = line
|
|
118
|
+
separator_size = 1
|
|
119
|
+
separator_padding = 6 14
|
|
72
120
|
|
|
73
121
|
time1_format = %H:%M
|
|
74
|
-
time2_format = %a %b
|
|
75
|
-
time1_font =
|
|
76
|
-
time2_font =
|
|
77
|
-
clock_font_color = #
|
|
78
|
-
clock_padding =
|
|
79
|
-
clock_background_id =
|
|
122
|
+
time2_format = %a %-d %b
|
|
123
|
+
time1_font = General Sans Semibold 12
|
|
124
|
+
time2_font = Geist Mono 8
|
|
125
|
+
clock_font_color = #ededed 100
|
|
126
|
+
clock_padding = 12 0
|
|
127
|
+
clock_background_id = 0
|
|
128
|
+
clock_tooltip = %A, %B %-d
|
|
80
129
|
|
|
81
|
-
tooltip_padding =
|
|
82
|
-
tooltip_show_timeout = 0.
|
|
130
|
+
tooltip_padding = 10 6
|
|
131
|
+
tooltip_show_timeout = 0.4
|
|
83
132
|
tooltip_hide_timeout = 0.1
|
|
84
|
-
tooltip_background_id =
|
|
85
|
-
tooltip_font_color = #
|
|
86
|
-
tooltip_font =
|
|
133
|
+
tooltip_background_id = 5
|
|
134
|
+
tooltip_font_color = #ededed 100
|
|
135
|
+
tooltip_font = General Sans 10
|
|
87
136
|
|
|
88
137
|
mouse_middle = none
|
|
89
138
|
mouse_right = close
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: "Geist Mono";
|
|
3
|
+
font-style: normal;
|
|
4
|
+
font-weight: 400;
|
|
5
|
+
font-display: swap;
|
|
6
|
+
src: url("./geist-mono-400.ttf") format("truetype");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@font-face {
|
|
10
|
+
font-family: "Geist Mono";
|
|
11
|
+
font-style: normal;
|
|
12
|
+
font-weight: 600;
|
|
13
|
+
font-display: swap;
|
|
14
|
+
src: url("./geist-mono-600.ttf") format("truetype");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@font-face {
|
|
18
|
+
font-family: "Geist Mono";
|
|
19
|
+
font-style: normal;
|
|
20
|
+
font-weight: 700;
|
|
21
|
+
font-display: swap;
|
|
22
|
+
src: url("./geist-mono-700.ttf") format("truetype");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@font-face {
|
|
26
|
+
font-family: "General Sans";
|
|
27
|
+
font-style: normal;
|
|
28
|
+
font-weight: 300;
|
|
29
|
+
font-display: swap;
|
|
30
|
+
src: url("./general-sans-300.ttf") format("truetype");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
:root {
|
|
34
|
+
--replicas-black: #121212;
|
|
35
|
+
--replicas-green: #3eeba3;
|
|
36
|
+
--replicas-grid:
|
|
37
|
+
linear-gradient(to right, rgb(255 255 255 / 12%) 1px, transparent 1px) center / 64px 64px,
|
|
38
|
+
linear-gradient(to bottom, rgb(255 255 255 / 12%) 1px, transparent 1px) center / 64px 64px,
|
|
39
|
+
radial-gradient(circle at 50% 50%, rgb(62 235 163 / 7%), transparent 36%),
|
|
40
|
+
var(--replicas-black);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
html, body {
|
|
44
|
+
width: 100%;
|
|
45
|
+
height: 100%;
|
|
46
|
+
margin: 0;
|
|
47
|
+
overflow: hidden;
|
|
48
|
+
color: #ededed;
|
|
49
|
+
font-family: "Geist Mono", ui-monospace, monospace;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#status {
|
|
53
|
+
position: fixed;
|
|
54
|
+
inset: 0;
|
|
55
|
+
display: flex;
|
|
56
|
+
flex-direction: column;
|
|
57
|
+
gap: 18px;
|
|
58
|
+
align-items: center;
|
|
59
|
+
justify-content: center;
|
|
60
|
+
pointer-events: none;
|
|
61
|
+
opacity: 0;
|
|
62
|
+
transition: opacity 180ms ease-out;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#status.visible { opacity: 1; }
|
|
66
|
+
|
|
67
|
+
#status img {
|
|
68
|
+
width: 56px;
|
|
69
|
+
height: 56px;
|
|
70
|
+
filter: drop-shadow(0 0 18px rgb(62 235 163 / 45%));
|
|
71
|
+
animation: status-pulse 2.4s ease-in-out infinite;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@keyframes status-pulse {
|
|
75
|
+
0%, 100% { opacity: 1; }
|
|
76
|
+
50% { opacity: 0.55; }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@media (prefers-reduced-motion: reduce) {
|
|
80
|
+
#status img { animation: none; }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
#status-title {
|
|
84
|
+
color: #fff;
|
|
85
|
+
font-family: "General Sans", system-ui, sans-serif;
|
|
86
|
+
font-size: 30px;
|
|
87
|
+
font-weight: 300;
|
|
88
|
+
letter-spacing: -0.04em;
|
|
89
|
+
line-height: 1;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#status-text {
|
|
93
|
+
max-width: 72ch;
|
|
94
|
+
padding: 0 24px;
|
|
95
|
+
color: rgb(255 255 255 / 60%);
|
|
96
|
+
font-size: 11px;
|
|
97
|
+
font-weight: 600;
|
|
98
|
+
letter-spacing: 0.12em;
|
|
99
|
+
line-height: 1.5;
|
|
100
|
+
text-align: center;
|
|
101
|
+
text-transform: uppercase;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.frame-corner, .frame-label {
|
|
105
|
+
position: absolute;
|
|
106
|
+
color: rgb(255 255 255 / 40%);
|
|
107
|
+
font-size: 14px;
|
|
108
|
+
line-height: 1;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.frame-corner:nth-of-type(1) { top: 14px; left: 14px; }
|
|
112
|
+
.frame-corner:nth-of-type(2) { top: 14px; right: 14px; }
|
|
113
|
+
.frame-corner:nth-of-type(3) { bottom: 14px; left: 14px; }
|
|
114
|
+
.frame-corner:nth-of-type(4) { bottom: 14px; right: 14px; }
|
|
115
|
+
|
|
116
|
+
.frame-label {
|
|
117
|
+
top: 16px;
|
|
118
|
+
left: 34px;
|
|
119
|
+
font-size: 10px;
|
|
120
|
+
letter-spacing: 0.14em;
|
|
121
|
+
text-transform: uppercase;
|
|
122
|
+
}
|
|
@@ -1,51 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
font-family: "Geist Mono";
|
|
3
|
-
font-style: normal;
|
|
4
|
-
font-weight: 400 600;
|
|
5
|
-
font-display: swap;
|
|
6
|
-
src: url("./geist-mono.woff2") format("woff2");
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
html, body {
|
|
10
|
-
width: 100%;
|
|
11
|
-
height: 100%;
|
|
12
|
-
margin: 0;
|
|
13
|
-
overflow: hidden;
|
|
14
|
-
color: rgb(255 255 255 / 72%);
|
|
15
|
-
background: radial-gradient(circle at 18% 20%, rgb(62 235 163 / 16%), transparent 34%),
|
|
16
|
-
radial-gradient(circle at 84% 78%, rgb(8 44 37 / 85%), transparent 42%),
|
|
17
|
-
linear-gradient(135deg, #1b9179 0%, #1d8570 13%, #082b24 100%);
|
|
18
|
-
font-family: "Geist Mono", ui-monospace, monospace;
|
|
19
|
-
}
|
|
1
|
+
html, body { background: var(--replicas-grid); }
|
|
20
2
|
|
|
21
3
|
#screen { width: 100%; height: 100%; cursor: none; }
|
|
22
4
|
#screen > div { overflow: hidden !important; background: transparent !important; }
|
|
23
5
|
|
|
24
|
-
#status {
|
|
25
|
-
position: fixed;
|
|
26
|
-
inset: 0;
|
|
27
|
-
display: flex;
|
|
28
|
-
gap: 16px;
|
|
29
|
-
align-items: center;
|
|
30
|
-
justify-content: center;
|
|
31
|
-
pointer-events: none;
|
|
32
|
-
opacity: 0;
|
|
33
|
-
transition: opacity 240ms ease-out;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
#status.visible { opacity: 1; }
|
|
37
|
-
#status img { width: 52px; height: 52px; filter: drop-shadow(0 2px 16px rgb(62 235 163 / 50%)); }
|
|
38
|
-
#status-text { color: rgb(255 255 255 / 92%); font-size: 24px; font-weight: 500; text-shadow: 0 1px 24px rgb(0 0 0 / 50%); }
|
|
6
|
+
#status { transition-duration: 240ms; }
|
|
39
7
|
|
|
40
8
|
#hint {
|
|
41
9
|
position: fixed;
|
|
42
10
|
bottom: 20px;
|
|
43
11
|
left: 50%;
|
|
44
|
-
padding:
|
|
12
|
+
padding: 8px 12px;
|
|
45
13
|
border: 1px solid rgb(255 255 255 / 16%);
|
|
46
14
|
color: rgb(255 255 255 / 85%);
|
|
47
|
-
background: rgb(
|
|
48
|
-
font-size:
|
|
15
|
+
background: rgb(18 18 18 / 94%);
|
|
16
|
+
font-size: 11px;
|
|
49
17
|
font-weight: 500;
|
|
50
18
|
white-space: nowrap;
|
|
51
19
|
pointer-events: none;
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,7 @@ var STREAM_PORT = process.env.REPLICAS_DESKTOP_STREAM_PORT ? parseInt(process.en
|
|
|
31
31
|
var SERVICES_SCRIPT = process.env.REPLICAS_COMPUTER_SERVICES_SCRIPT || "/usr/local/bin/replicas-start-desktop-services";
|
|
32
32
|
var INPUT_LOCK_FILE = process.env.REPLICAS_DESKTOP_INPUT_LOCK_FILE || `${STATE_DIR}/input.lock`;
|
|
33
33
|
var CHROME_WRAPPER = "/usr/local/bin/replicas-chrome";
|
|
34
|
+
var TERMINAL_WRAPPER = "/usr/local/bin/replicas-terminal";
|
|
34
35
|
var INFO_WAIT_TIMEOUT_MS = 1e4;
|
|
35
36
|
var INFO_WAIT_INTERVAL_MS = 500;
|
|
36
37
|
var lastDesktopHealthAt = 0;
|
|
@@ -2673,7 +2674,7 @@ var APP_ALIASES = {
|
|
|
2673
2674
|
chrome: [CHROME_WRAPPER],
|
|
2674
2675
|
chromium: ["chromium", "--no-first-run", "--no-default-browser-check"],
|
|
2675
2676
|
firefox: ["firefox"],
|
|
2676
|
-
terminal: [
|
|
2677
|
+
terminal: [TERMINAL_WRAPPER],
|
|
2677
2678
|
xterm: ["xterm"],
|
|
2678
2679
|
notepad: ["mousepad"],
|
|
2679
2680
|
editor: ["mousepad"],
|
|
@@ -2925,7 +2926,7 @@ async function computerStatusCommand() {
|
|
|
2925
2926
|
}
|
|
2926
2927
|
|
|
2927
2928
|
// src/version.ts
|
|
2928
|
-
var COMPUTER_USE_VERSION = "0.2.
|
|
2929
|
+
var COMPUTER_USE_VERSION = "0.2.10";
|
|
2929
2930
|
var COMPUTER_USE_PROTOCOL_VERSION = 1;
|
|
2930
2931
|
|
|
2931
2932
|
// src/program.ts
|
|
@@ -3972,7 +3973,7 @@ async function runMediaServer() {
|
|
|
3972
3973
|
|
|
3973
3974
|
// src/setup.ts
|
|
3974
3975
|
import { spawnSync as spawnSync6 } from "child_process";
|
|
3975
|
-
import { accessSync, chmodSync as chmodSync2, constants, cpSync, existsSync as existsSync7, mkdirSync as mkdirSync6, writeFileSync as writeFileSync5 } from "fs";
|
|
3976
|
+
import { accessSync, chmodSync as chmodSync2, constants, cpSync, existsSync as existsSync7, mkdirSync as mkdirSync6, readdirSync, writeFileSync as writeFileSync5 } from "fs";
|
|
3976
3977
|
import { dirname as dirname7, resolve as resolve3 } from "path";
|
|
3977
3978
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
3978
3979
|
var dependencies = [
|
|
@@ -4000,6 +4001,7 @@ var dependencies = [
|
|
|
4000
4001
|
["sudo", "sudo"],
|
|
4001
4002
|
["systemctl", "systemctl"],
|
|
4002
4003
|
["hsetroot", "hsetroot"],
|
|
4004
|
+
["fontconfig", "fc-cache"],
|
|
4003
4005
|
["XFCE terminal", "xfce4-terminal"],
|
|
4004
4006
|
["Mousepad", "mousepad"],
|
|
4005
4007
|
["Thunar", "thunar"]
|
|
@@ -4083,25 +4085,31 @@ function setupComputer(options = {}) {
|
|
|
4083
4085
|
if (!existsSync7(assets)) throw new Error(`Computer-use assets are missing from ${assets}`);
|
|
4084
4086
|
mkdirSync6("/usr/local/share/replicas/desktop", { recursive: true });
|
|
4085
4087
|
cpSync(assets, "/usr/local/share/replicas/desktop", { recursive: true, force: true });
|
|
4088
|
+
const fontRoot = "/usr/local/share/fonts/replicas";
|
|
4089
|
+
mkdirSync6(fontRoot, { recursive: true });
|
|
4090
|
+
for (const file of readdirSync(assets).filter((name) => name.endsWith(".ttf"))) cpSync(resolve3(assets, file), resolve3(fontRoot, file), { force: true });
|
|
4091
|
+
spawnSync6("fc-cache", ["-f", fontRoot], { stdio: "ignore" });
|
|
4086
4092
|
const viewerRoot = "/usr/local/share/replicas/desktop/novnc";
|
|
4087
4093
|
mkdirSync6(viewerRoot, { recursive: true });
|
|
4088
4094
|
cpSync(noVncCore, resolve3(viewerRoot, "core"), { recursive: true, force: true });
|
|
4089
4095
|
cpSync(noVncVendor, resolve3(viewerRoot, "vendor"), { recursive: true, force: true });
|
|
4090
|
-
for (const file of ["novnc-index.html", "viewer.css", "viewer-icon.svg", "geist-mono.
|
|
4096
|
+
for (const file of ["novnc-index.html", "viewer.css", "viewer-theme.css", "viewer-icon.svg", "geist-mono-400.ttf", "geist-mono-600.ttf", "geist-mono-700.ttf", "general-sans-300.ttf"]) {
|
|
4091
4097
|
cpSync(resolve3(assets, file), resolve3(viewerRoot, file === "novnc-index.html" ? "index.html" : file), { force: true });
|
|
4092
4098
|
}
|
|
4093
4099
|
cpSync(resolve3(packageRoot2, "dist", "viewer.js"), resolve3(viewerRoot, "viewer.js"), { force: true });
|
|
4094
4100
|
const streamRoot = "/usr/local/share/replicas/desktop/stream";
|
|
4095
4101
|
mkdirSync6(streamRoot, { recursive: true });
|
|
4096
|
-
for (const file of ["stream-index.html", "stream-viewer.css", "viewer-icon.svg", "geist-mono.
|
|
4102
|
+
for (const file of ["stream-index.html", "stream-viewer.css", "viewer-theme.css", "viewer-icon.svg", "geist-mono-400.ttf", "geist-mono-600.ttf", "geist-mono-700.ttf", "general-sans-300.ttf"]) {
|
|
4097
4103
|
cpSync(resolve3(assets, file), resolve3(streamRoot, file), { force: true });
|
|
4098
4104
|
}
|
|
4099
4105
|
cpSync(resolve3(packageRoot2, "dist", "stream-viewer.js"), resolve3(streamRoot, "stream-viewer.js"), { force: true });
|
|
4100
4106
|
cpSync(resolve3(assets, "start-services.sh"), "/usr/local/bin/replicas-start-desktop-services", { force: true });
|
|
4101
4107
|
cpSync(resolve3(assets, "replicas-chrome"), "/usr/local/bin/replicas-chrome", { force: true });
|
|
4108
|
+
cpSync(resolve3(assets, "replicas-terminal"), "/usr/local/bin/replicas-terminal", { force: true });
|
|
4102
4109
|
cpSync(resolve3(assets, "replicas-chrome.desktop"), "/usr/share/applications/replicas-chrome.desktop", { force: true });
|
|
4103
4110
|
chmodSync2("/usr/local/bin/replicas-start-desktop-services", 493);
|
|
4104
4111
|
chmodSync2("/usr/local/bin/replicas-chrome", 493);
|
|
4112
|
+
chmodSync2("/usr/local/bin/replicas-terminal", 493);
|
|
4105
4113
|
writeFileSync5("/etc/systemd/system/replicas-computer.service", serviceUnit, { mode: 420 });
|
|
4106
4114
|
if (existsSync7("/run/systemd/system")) {
|
|
4107
4115
|
const reload = spawnSync6("systemctl", ["daemon-reload"], { stdio: "pipe" });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "replicas-computer",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.10",
|
|
4
4
|
"description": "Replicas workspace computer-use runtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
],
|
|
26
26
|
"author": "Replicas",
|
|
27
27
|
"license": "MIT",
|
|
28
|
-
"homepage": "https://
|
|
28
|
+
"homepage": "https://replicas.dev",
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|
|
31
31
|
"url": "https://github.com/replicas-group/replicas.git",
|
|
Binary file
|