A photo manager for VRChat.

move icons off of font awesome

-1
index.html
··· 5 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 6 <meta name="theme-color" content="#000000" /> 7 7 <link rel="icon" type="image/svg+xml" href="/src/assets/logo.png" /> 8 - <script src="https://kit.fontawesome.com/9a203e5ff1.js" crossorigin="anonymous"></script> 9 8 <title>VRChat Photo Manager</title> 10 9 </head> 11 10
+1
public/icon/angle-down-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"/></svg>
+1
public/icon/angle-up-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M201.4 137.4c12.5-12.5 32.8-12.5 45.3 0l160 160c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 205.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l160-160z"/></svg>
+1
public/icon/arrow-left-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg>
+1
public/icon/arrow-right-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"/></svg>
+1
public/icon/arrows-rotate-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M105.1 202.6c7.7-21.8 20.2-42.3 37.8-59.8c62.5-62.5 163.8-62.5 226.3 0L386.3 160H352c-17.7 0-32 14.3-32 32s14.3 32 32 32H463.5c0 0 0 0 0 0h.4c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v35.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0C73.2 122 55.6 150.7 44.8 181.4c-5.9 16.7 2.9 34.9 19.5 40.8s34.9-2.9 40.8-19.5zM39 289.3c-5 1.5-9.8 4.2-13.7 8.2c-4 4-6.7 8.8-8.1 14c-.3 1.2-.6 2.5-.8 3.8c-.3 1.7-.4 3.4-.4 5.1V432c0 17.7 14.3 32 32 32s32-14.3 32-32V396.9l17.6 17.5 0 0c87.5 87.4 229.3 87.4 316.7 0c24.4-24.4 42.1-53.1 52.9-83.7c5.9-16.7-2.9-34.9-19.5-40.8s-34.9 2.9-40.8 19.5c-7.7 21.8-20.2 42.3-37.8 59.8c-62.5 62.5-163.8 62.5-226.3 0l-.1-.1L125.6 352H160c17.7 0 32-14.3 32-32s-14.3-32-32-32H48.4c-1.6 0-3.2 .1-4.8 .3s-3.1 .5-4.6 1z"/></svg>
+1
public/icon/caret-down-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M137.4 374.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8L32 192c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z"/></svg>
+1
public/icon/check-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/></svg>
+1
public/icon/copy-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M208 0H332.1c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9V336c0 26.5-21.5 48-48 48H208c-26.5 0-48-21.5-48-48V48c0-26.5 21.5-48 48-48zM48 128h80v64H64V448H256V416h64v48c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48z"/></svg>
+1
public/icon/minus-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z"/></svg>
+1
public/icon/square-regular.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M384 80c8.8 0 16 7.2 16 16V416c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V96c0-8.8 7.2-16 16-16H384zM64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64z"/></svg>
+1
public/icon/trash-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>
+1
public/icon/x-solid.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M376.6 84.5c11.3-13.6 9.5-33.8-4.1-45.1s-33.8-9.5-45.1 4.1L192 206 56.6 43.5C45.3 29.9 25.1 28.1 11.5 39.4S-3.9 70.9 7.4 84.5L150.3 256 7.4 427.5c-11.3 13.6-9.5 33.8 4.1 45.1s33.8 9.5 45.1-4.1L192 306 327.4 468.5c11.3 13.6 31.5 15.4 45.1 4.1s15.4-31.5 4.1-45.1L233.7 256 376.6 84.5z"/></svg>
+1 -1
src-tauri/Cargo.lock
··· 3928 3928 3929 3929 [[package]] 3930 3930 name = "vrcpm-rs" 3931 - version = "0.1.3" 3931 + version = "0.1.4" 3932 3932 dependencies = [ 3933 3933 "dirs", 3934 3934 "mslnk",
+1 -1
src-tauri/Cargo.toml
··· 1 1 [package] 2 2 name = "vrcpm-rs" 3 - version = "0.1.3" 3 + version = "0.1.4" 4 4 description = "VRChat Photo Manager" 5 5 authors = ["_phaz"] 6 6 edition = "2021"
+12 -4
src/Components/NavBar.tsx
··· 128 128 <Show when={props.loggedIn().loggedIn}> 129 129 <div class="user-pfp" style={{ background: `url('https://cdn.phazed.xyz/id/avatars/${props.loggedIn().id}/${props.loggedIn().avatar}.png')` }}></div> 130 130 </Show> 131 - <i class="fa-solid fa-caret-down account-dropdown"></i> 131 + <div class="icon"> 132 + <img draggable="false" src="/icon/caret-down-solid.svg"></img> 133 + </div> 132 134 </div> 133 135 <div class="control-lights"> 134 - <i class="fa-solid fa-minus" onClick={() => appWindow.minimize()}></i> 135 - <i class="fa-regular fa-square" onClick={() => appWindow.toggleMaximize()}></i> 136 - <i class="fa-solid fa-x" onClick={() => appWindow.hide()}></i> 136 + <div class="light"> 137 + <img draggable="false" src="/icon/minus-solid.svg" onClick={() => appWindow.minimize()}></img> 138 + </div> 139 + <div class="light"> 140 + <img draggable="false" src="/icon/square-regular.svg" onClick={() => appWindow.toggleMaximize()}></img> 141 + </div> 142 + <div class="light"> 143 + <img draggable="false" src="/icon/x-solid.svg" onClick={() => appWindow.hide()}></img> 144 + </div> 137 145 </div> 138 146 </div> 139 147
+10 -2
src/Components/PhotoList.tsx
··· 493 493 </div> 494 494 </div> 495 495 496 - <div class="scroll-to-top" ref={( el ) => scrollToTop = el} onClick={() => targetScroll = 0}><i class="fa-solid fa-angle-up"></i></div> 497 - <div class="reload-photos" onClick={() => props.setConfirmationBox("Are you sure you want to reload all photos? This can cause the application to slow down while it is loading...", reloadPhotos)}><i class="fa-solid fa-arrows-rotate"></i></div> 496 + <div class="scroll-to-top" ref={( el ) => scrollToTop = el} onClick={() => targetScroll = 0}> 497 + <div class="icon"> 498 + <img draggable="false" src="/icon/angle-up-solid.svg"></img> 499 + </div> 500 + </div> 501 + <div class="reload-photos" onClick={() => props.setConfirmationBox("Are you sure you want to reload all photos? This can cause the application to slow down while it is loading...", reloadPhotos)}> 502 + <div class="icon" style={{ width: '17px' }}> 503 + <img draggable="false" src="/icon/arrows-rotate-solid.svg"></img> 504 + </div> 505 + </div> 498 506 499 507 <canvas class="photo-container" ref={( el ) => photoContainer = el}></canvas> 500 508 <canvas class="photo-container-bg" ref={( el ) => photoContainerBG = el}></canvas>
+30 -7
src/Components/PhotoViewer.tsx
··· 275 275 276 276 return ( 277 277 <div class="photo-viewer" ref={( el ) => viewer = el}> 278 - <div class="viewer-close viewer-button" onClick={() => props.setCurrentPhotoView(null)}><i class="fa-solid fa-x"></i></div> 278 + <div class="viewer-close viewer-button" onClick={() => props.setCurrentPhotoView(null)}> 279 + <div class="icon" style={{ width: '10px', margin: '0' }}> 280 + <img draggable="false" src="/icon/x-solid.svg"></img> 281 + </div> 282 + </div> 279 283 <div class="image-container" ref={( el ) => imageViewer = el}></div> 280 284 281 - <div class="prev-button" onClick={() => props.setPhotoNavChoice('prev')}><i class="fa-solid fa-arrow-left"></i></div> 282 - <div class="next-button" onClick={() => props.setPhotoNavChoice('next')}><i class="fa-solid fa-arrow-right"></i></div> 285 + <div class="prev-button" onClick={() => props.setPhotoNavChoice('prev')}> 286 + <div class="icon" style={{ width: '15px', margin: '0' }}> 287 + <img draggable="false" src="/icon/arrow-left-solid.svg"></img> 288 + </div> 289 + </div> 290 + 291 + <div class="next-button" onClick={() => props.setPhotoNavChoice('next')}> 292 + <div class="icon" style={{ width: '15px', margin: '0' }}> 293 + <img draggable="false" src="/icon/arrow-right-solid.svg"></img> 294 + </div> 295 + </div> 283 296 284 297 <div class="photo-tray" ref={( el ) => photoTray = el}></div> 285 298 286 299 <div class="photo-tray-close" 287 300 onClick={() => closeTray()} 288 301 ref={( el ) => photoTrayCloseBtn = el} 289 - ><i class="fa-solid fa-angle-down"></i></div> 302 + > 303 + <div class="icon" style={{ width: '12px', margin: '0' }}> 304 + <img draggable="false" src="/icon/angle-down-solid.svg"></img> 305 + </div> 306 + </div> 290 307 291 308 <div class="control-buttons" ref={( el ) => photoControls = el}> 292 309 <div class="viewer-button" ··· 327 344 }); 328 345 }} 329 346 > 330 - <i class="fa-solid fa-copy"></i> 347 + <div class="icon" style={{ width: '12px', margin: '0' }}> 348 + <img draggable="false" src="/icon/copy-solid.svg"></img> 349 + </div> 331 350 </div> 332 351 <div class="viewer-button" style={{ width: '50px' }} 333 352 onMouseOver={( el ) => anime({ targets: el.currentTarget, width: '70px', height: '30px', 'margin-left': '10px', 'margin-right': '10px' })} ··· 335 354 ref={( el ) => trayButton = el} 336 355 onClick={() => openTray()} 337 356 > 338 - <i class="fa-solid fa-angle-up"></i> 357 + <div class="icon" style={{ width: '12px', margin: '0' }}> 358 + <img draggable="false" src="/icon/angle-up-solid.svg"></img> 359 + </div> 339 360 </div> 340 361 <div class="viewer-button" 341 362 onMouseOver={( el ) => anime({ targets: el.currentTarget, width: '40px', height: '40px', 'margin-left': '15px', 'margin-right': '15px', 'margin-top': '-10px' })} 342 363 onMouseLeave={( el ) => anime({ targets: el.currentTarget, width: '30px', height: '30px', 'margin-left': '20px', 'margin-right': '20px', 'margin-top': '0px' })} 343 364 onClick={() => props.setConfirmationBox("Are you sure you want to delete this photo?", () => { invoke("delete_photo", { path: props.currentPhotoView().path, token: localStorage.getItem("token")! }); })} 344 365 > 345 - <i class="fa-solid fa-trash"></i> 366 + <div class="icon" style={{ width: '12px', margin: '0' }}> 367 + <img draggable="false" src="/icon/trash-solid.svg"></img> 368 + </div> 346 369 </div> 347 370 </div> 348 371 </div>
+14 -4
src/Components/SettingsMenu.tsx
··· 212 212 213 213 <label for="start-in-bg-check"> 214 214 <div class="selection-box"> 215 - <i class="fa-solid fa-check"></i> 215 + <div class="icon" style={{ width: '10px', margin: '0', display: 'inline-flex' }}> 216 + <img draggable="false" src="/icon/check-solid.svg"></img> 217 + </div> 216 218 </div> 217 219 </label> 218 220 </div> ··· 233 235 234 236 <label for="start-with-win-check"> 235 237 <div class="selection-box"> 236 - <i class="fa-solid fa-check"></i> 238 + <div class="icon" style={{ width: '10px', margin: '0', display: 'inline-flex' }}> 239 + <img draggable="false" src="/icon/check-solid.svg"></img> 240 + </div> 237 241 </div> 238 242 </label> 239 243 </div> ··· 258 262 259 263 <label for="transparent-check"> 260 264 <div class="selection-box"> 261 - <i class="fa-solid fa-check"></i> 265 + <div class="icon" style={{ width: '10px', margin: '0', display: 'inline-flex' }}> 266 + <img draggable="false" src="/icon/check-solid.svg"></img> 267 + </div> 262 268 </div> 263 269 </label> 264 270 </div> ··· 337 343 <div class="account-profile"> 338 344 <div class="account-pfp" style={{ background: `url('https://cdn.phazed.xyz/id/avatars/${props.loggedIn().id}/${props.loggedIn().avatar}.png')` }}></div> 339 345 <div class="account-desc"> 340 - <div class="reload-photos" onClick={() => refreshAccount()} style={{ opacity: 1 }}><i class="fa-solid fa-arrows-rotate"></i></div> 346 + <div class="reload-photos" onClick={() => refreshAccount()} style={{ opacity: 1 }}> 347 + <div class="icon" style={{ width: '17px' }}> 348 + <img draggable="false" src="/icon/arrows-rotate-solid.svg"></img> 349 + </div> 350 + </div> 341 351 <h2>{ props.loggedIn().username }</h2> 342 352 343 353 <Show when={props.storageInfo().sync}>
+17 -3
src/styles.css
··· 68 68 align-items: center; 69 69 } 70 70 71 - .control-lights i{ 71 + .control-lights .light{ 72 72 font-size: 20px; 73 73 text-align: center; 74 74 color: white; ··· 78 78 justify-content: center; 79 79 align-items: center; 80 80 height: 50px; 81 + filter: invert(100%); 81 82 } 82 83 83 - .control-lights i:hover{ 84 - background: #0005; 84 + .control-lights .light:hover{ 85 + background: #fff5; 86 + } 87 + 88 + .control-lights .light img{ 89 + width: 25%; 90 + } 91 + 92 + .icon{ 93 + width: 15px; 94 + filter: invert(100%); 95 + display: flex; 96 + align-items: center; 97 + justify-content: center; 98 + height: 100%; 85 99 } 86 100 87 101 .user-pfp{
+1 -1
vite.config.ts
··· 16 16 watch: { 17 17 ignored: [ 'src-tauri/**' ] 18 18 } 19 - }, 19 + } 20 20 }));