├── LICENSE ├── README.md ├── assets ├── bg.png ├── cursors │ ├── colorpicker.png │ ├── default.png │ ├── grab.png │ ├── open.png │ ├── pointer.png │ └── text.png ├── discord.png ├── favicon.png ├── fonts │ └── SF-Pro.ttf ├── github.png ├── loading.png ├── loadspinner.png ├── script.js ├── twitter.png └── youtube.png ├── fonts └── SF-Pro.ttf ├── icon.png ├── index.html ├── manifest.json └── style.css /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 BrocoDev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | VisionTab Logo 3 |

4 | 5 |

VisionTab - VisionOS NewTab for Chromium

6 | 7 |

8 | Download 9 | • 10 | Discord 11 | • 12 | BrocoDev's Twitter 13 | • 14 | KewlAid's Twitter 15 |

16 | 17 | ## Overview 18 | 19 | VisionTab is a VisionOS styled New Tab for Chromium based web browsers. It's sleek, customizable, and recognizable. 20 | 21 | **VisionTab Safari Port** 22 | https://github.com/ntcrft/VisionTab-safari 23 | 24 | ## How to Install: 25 | 1. Download the .zip file frm the latest/preferred release. 26 | 2. Extract the .zip file. 27 | 3. On the top right of chrome, click the puzzle icon 28 | 4. Select 'Manage Extensions' 29 | 5. Enable Developer Mode on the top right of the newly opened page. 30 | 6. Select 'Load Unpacked' 31 | 7. Select the extracted folder. If there are subfolders, keep opening them until you reach the folder that contains the source code. 32 | 8. Enjoy! 33 | 34 | ## Credits 35 | 36 | 37 | -------------------------------------------------------------------------------- /assets/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/bg.png -------------------------------------------------------------------------------- /assets/cursors/colorpicker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/cursors/colorpicker.png -------------------------------------------------------------------------------- /assets/cursors/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/cursors/default.png -------------------------------------------------------------------------------- /assets/cursors/grab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/cursors/grab.png -------------------------------------------------------------------------------- /assets/cursors/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/cursors/open.png -------------------------------------------------------------------------------- /assets/cursors/pointer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/cursors/pointer.png -------------------------------------------------------------------------------- /assets/cursors/text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/cursors/text.png -------------------------------------------------------------------------------- /assets/discord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/discord.png -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/favicon.png -------------------------------------------------------------------------------- /assets/fonts/SF-Pro.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/fonts/SF-Pro.ttf -------------------------------------------------------------------------------- /assets/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/github.png -------------------------------------------------------------------------------- /assets/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/loading.png -------------------------------------------------------------------------------- /assets/loadspinner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/loadspinner.png -------------------------------------------------------------------------------- /assets/script.js: -------------------------------------------------------------------------------- 1 | let is24HourFormat = localStorage.getItem('is24HourFormat') === 'true' || false; 2 | let isCelsius = localStorage.getItem('isCelsius') === 'true' || false; 3 | let isWeatherVisible = localStorage.getItem('isWeatherVisible') === 'true' || false; 4 | // localStorage = new LocalStorage('./scratch', Number.MAX_VALUE); 5 | 6 | var toggler_24h = document.querySelector('.toggle-24h'); 7 | var toggler_celsius = document.querySelector('.toggle-celsius'); 8 | var toggler_weather = document.querySelector('.toggle-weather'); 9 | var toggler_celsiusContainer = document.querySelector('.toggle-setting[name=toggle-celsius]'); 10 | var weatherInfo = document.getElementById('weather-info'); 11 | 12 | if (is24HourFormat) { 13 | toggler_24h.classList.add('active'); 14 | } 15 | if (isCelsius) { 16 | toggler_celsius.classList.add('active'); 17 | } 18 | if (isWeatherVisible) { 19 | toggler_celsiusContainer.classList.add('active'); 20 | toggler_weather.classList.add('active'); 21 | weatherInfo.classList.add('active'); 22 | } 23 | 24 | toggler_24h.onclick = function() { 25 | toggler_24h.classList.toggle('active'); 26 | is24HourFormat = !is24HourFormat; 27 | localStorage.setItem('is24HourFormat', is24HourFormat); 28 | updateDateTime(); 29 | } 30 | 31 | toggler_celsius.onclick = function() { 32 | toggler_celsius.classList.toggle('active'); 33 | isCelsius = !isCelsius; 34 | localStorage.setItem('isCelsius', isCelsius); 35 | fetchWeather(); 36 | } 37 | 38 | toggler_weather.onclick = function() { 39 | toggler_weather.classList.toggle('active'); 40 | isWeatherVisible = !isWeatherVisible; 41 | localStorage.setItem('isWeatherVisible', isWeatherVisible); 42 | weatherInfo.classList.toggle('active'); 43 | toggler_celsiusContainer.classList.toggle('active'); 44 | } 45 | 46 | document.getElementById('fileInput').addEventListener('change', function(event) { 47 | const file = event.target.files[0]; 48 | if (file && file.type.startsWith('image/')) { 49 | const reader = new FileReader(); 50 | reader.onload = function(e) { 51 | const img = new Image(); 52 | img.onload = function() { 53 | const canvas = document.createElement('canvas'); 54 | const ctx = canvas.getContext('2d'); 55 | 56 | const maxWidth = 3200; 57 | const maxHeight = 2400; 58 | let width = img.width; 59 | let height = img.height; 60 | 61 | if (width > maxWidth || height > maxHeight) { 62 | if (width / height > maxWidth / maxHeight) { 63 | width = maxWidth; 64 | height = Math.round(maxWidth * img.height / img.width); 65 | } else { 66 | height = maxHeight; 67 | width = Math.round(maxHeight * img.width / img.height); 68 | } 69 | } 70 | 71 | canvas.width = width; 72 | canvas.height = height; 73 | 74 | ctx.drawImage(img, 0, 0, width, height); 75 | 76 | const base64Image = canvas.toDataURL('image/jpeg', 3.0); 77 | localStorage.setItem('bgImage', base64Image); 78 | alert('Background saved! Please refresh the page.'); 79 | }; 80 | img.src = e.target.result; 81 | }; 82 | reader.readAsDataURL(file); 83 | } else { 84 | alert('Please select a valid image file.'); 85 | } 86 | }); 87 | 88 | document.addEventListener('DOMContentLoaded', function() { 89 | 90 | document.getElementById('settings-button').addEventListener('click', function() { togglePanel('settings-popup'); }); 91 | document.getElementById('plus-button').addEventListener('click', function() { togglePanel('add-menu'); }); 92 | document.getElementById('add-close').addEventListener('click', function() { togglePanel('add-menu'); }); 93 | 94 | document.getElementById('add-button').addEventListener('click', function() { addShortcut(); }); 95 | initializeShortcuts(); 96 | loadShortcutsFromLocalStorage(); 97 | fetchAndSetBackgroundImage(); 98 | }); 99 | 100 | 101 | function addShortcut() { 102 | var shortcutUrl = document.getElementById('shortcut-url-field').value; 103 | var iconUrl = document.getElementById('icon-url-field').value; 104 | var shortcuts = document.getElementById('actions-grid'); 105 | 106 | if (shortcutUrl && iconUrl) { 107 | shortcuts.innerHTML += `Shortcut`; 108 | 109 | saveShortcutToLocalStorage(shortcutUrl, iconUrl); 110 | } else { 111 | alert('Please provide both the shortcut URL and the icon URL.'); 112 | } 113 | } 114 | 115 | function saveShortcutToLocalStorage(shortcutUrl, iconUrl) { 116 | let shortcuts = JSON.parse(localStorage.getItem('shortcuts')) || []; 117 | shortcuts.push({ url: shortcutUrl, icon: iconUrl }); 118 | localStorage.setItem('shortcuts', JSON.stringify(shortcuts)); 119 | loadShortcutsFromLocalStorage(); 120 | } 121 | 122 | function initializeShortcuts() { 123 | let shortcuts = JSON.parse(localStorage.getItem('shortcuts')) || []; 124 | 125 | if (shortcuts.length === 0) { 126 | const defaultShortcuts = [ 127 | { url: "https://discord.com/channels/@me", icon: "assets/discord.png" }, 128 | { url: "https://www.youtube.com", icon: "assets/youtube.png" }, 129 | { url: "https://www.x.com", icon: "assets/twitter.png" }, 130 | { url: "https://www.github.com", icon: "assets/github.png" } 131 | ]; 132 | 133 | localStorage.setItem('shortcuts', JSON.stringify(defaultShortcuts)); 134 | } 135 | } 136 | 137 | function loadShortcutsFromLocalStorage() { 138 | let shortcuts = JSON.parse(localStorage.getItem('shortcuts')) || []; 139 | let shortcutsContainer = document.getElementById('actions-grid'); 140 | let addShortcutsContainer = document.getElementById('shortcuts-add'); 141 | 142 | shortcutsContainer.innerHTML = ''; 143 | addShortcutsContainer.innerHTML = ''; 144 | 145 | shortcuts.forEach(shortcut => { 146 | let shortcutWrapper = document.createElement('div'); 147 | shortcutWrapper.classList.add('shortcut-wrapper'); 148 | shortcutWrapper.innerHTML = ` 149 | 150 | Shortcut 151 | 152 | 153 | `; 154 | 155 | addShortcutsContainer.appendChild(shortcutWrapper); 156 | 157 | let actionIcon = document.createElement('a'); 158 | actionIcon.href = shortcut.url; 159 | actionIcon.classList.add('action-icon'); 160 | actionIcon.innerHTML = `Shortcut`; 161 | 162 | shortcutsContainer.appendChild(actionIcon); 163 | 164 | setTimeout(() => { 165 | shortcutWrapper.classList.add('visible'); 166 | actionIcon.classList.add('visible'); 167 | }, 100); 168 | }); 169 | 170 | let addShortcut = document.createElement('a'); 171 | addShortcut.id = 'add-shortcut'; 172 | addShortcut.classList.add('action-icon'); 173 | addShortcut.innerHTML = '􀅼'; 174 | 175 | addShortcutsContainer.appendChild(addShortcut); 176 | 177 | setTimeout(() => { 178 | addShortcut.classList.add('visible'); 179 | }, 100); 180 | 181 | document.getElementById('add-shortcut').addEventListener('click', function() { togglePanel('add-shortcut-panel'); }); 182 | 183 | addShortcutsContainer.querySelectorAll('.remove-shortcut').forEach(button => { 184 | button.addEventListener('click', function() { 185 | removeShortcut(this.getAttribute('data-url')); 186 | }); 187 | }); 188 | } 189 | 190 | function removeShortcut(url) { 191 | let shortcuts = JSON.parse(localStorage.getItem('shortcuts')) || []; 192 | const shortcutElement = document.querySelector(`.shortcut[data-url="${url}"]`); 193 | 194 | if (shortcutElement) { 195 | shortcutElement.classList.add('fade-out'); 196 | 197 | setTimeout(() => { 198 | shortcutElement.remove(); 199 | shortcuts = shortcuts.filter(shortcut => shortcut.url !== url); 200 | localStorage.setItem('shortcuts', JSON.stringify(shortcuts)); 201 | loadShortcutsFromLocalStorage(); 202 | }, 500); 203 | } else { 204 | shortcuts = shortcuts.filter(shortcut => shortcut.url !== url); 205 | localStorage.setItem('shortcuts', JSON.stringify(shortcuts)); 206 | loadShortcutsFromLocalStorage(); 207 | } 208 | } 209 | 210 | 211 | function togglePanel(id) { 212 | const popup = document.getElementById(id); 213 | popup.classList.toggle('show'); 214 | } 215 | 216 | function fetchAndSetBackgroundImage() { 217 | const imageData = localStorage.getItem('bgImage'); 218 | if (imageData) { 219 | setBackgroundImage(imageData); 220 | } else { 221 | document.body.style.backgroundImage = `url('assets/bg.png')`; 222 | } 223 | } 224 | 225 | function setBackgroundImage(imageData) { 226 | document.body.style.backgroundImage = `url(${imageData})`; 227 | } 228 | 229 | document.getElementById('uploadDiv').addEventListener('click', function() { 230 | document.getElementById('fileInput').click(); 231 | }); 232 | 233 | function updateDateTime() { 234 | const now = new Date(); 235 | const dateString = now.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric' }); 236 | let hours = now.getHours(); 237 | const minutes = now.getMinutes().toString().padStart(2, '0'); 238 | 239 | if (!is24HourFormat) { 240 | const period = hours >= 12 ? 'PM' : 'AM'; 241 | hours = hours % 12 || 12; 242 | } 243 | 244 | const dateElement = document.getElementById('date'); 245 | const hoursElement = document.getElementById('hours'); 246 | const minutesElement = document.getElementById('minutes'); 247 | 248 | if (dateElement.textContent !== dateString) { 249 | dateElement.textContent = dateString; 250 | } 251 | 252 | if (hoursElement.textContent !== hours.toString().padStart(2, '0')) { 253 | hoursElement.textContent = hours.toString().padStart(2, '0'); 254 | } 255 | 256 | if (minutesElement.textContent !== minutes) { 257 | minutesElement.textContent = minutes; 258 | } 259 | } 260 | 261 | function fetchWeather() { 262 | if (navigator.geolocation) { 263 | navigator.geolocation.getCurrentPosition(position => { 264 | const latitude = position.coords.latitude; 265 | const longitude = position.coords.longitude; 266 | 267 | const temperatureUnit = isCelsius ? 'celsius' : 'fahrenheit'; 268 | fetch(`https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}¤t_weather=true&temperature_unit=${temperatureUnit}&hourly=temperature_2m,weathercode&timezone=auto&forecast_days=1`) 269 | .then(response => response.json()) 270 | .then(data => { 271 | displayCurrentWeather(data); 272 | displayHourlyForecast(data); 273 | }) 274 | .catch(error => { 275 | console.error('Error fetching weather:', error); 276 | document.getElementById('weather-info').innerHTML = '

Unable to fetch weather information

'; 277 | }); 278 | }, error => { 279 | console.error('Error getting location:', error); 280 | document.getElementById('weather-info').innerHTML = '

Unable to retrieve your location

'; 281 | }); 282 | } else { 283 | console.error('Geolocation is not supported by this browser'); 284 | document.getElementById('weather-info').innerHTML = '

Geolocation is not supported by this browser

'; 285 | } 286 | } 287 | 288 | function displayCurrentWeather(data) { 289 | const temperature = data.current_weather.temperature; 290 | const weatherCode = data.current_weather.weathercode; 291 | 292 | const high = Math.max(...data.hourly.temperature_2m.slice(0, 24)); 293 | const low = Math.min(...data.hourly.temperature_2m.slice(0, 24)); 294 | 295 | const weatherDescription = getWeatherDescription(weatherCode); 296 | 297 | const weatherHTML = ` 298 |

􀇕 Weather

299 | 300 |
301 |

${temperature}°

302 | 303 |
304 |

${weatherDescription}

305 |

H: ${high}° L: ${low}°

306 |
307 |
308 | `; 309 | 310 | const weatherInfoElement = document.getElementById('weather-info'); 311 | weatherInfoElement.innerHTML = weatherHTML; 312 | } 313 | 314 | function displayHourlyForecast(data) { 315 | const now = new Date(); 316 | const forecastHTML = []; 317 | 318 | for (let i = 0; i < 5; i++) { 319 | const futureTime = new Date(now.getTime() + i * 60 * 60 * 1000); 320 | let hour = futureTime.getHours(); 321 | let period = ''; 322 | 323 | if (!is24HourFormat) { 324 | period = hour >= 12 ? 'PM' : 'AM'; 325 | hour = hour % 12 || 12; 326 | } else { 327 | hour = hour.toString().padStart(2, '0'); 328 | } 329 | 330 | const temperature = data.hourly.temperature_2m[i]; 331 | const weatherCode = data.hourly.weathercode[i]; 332 | const weatherDescription = getWeatherIcon(weatherCode); 333 | 334 | forecastHTML.push(` 335 |
336 |

${hour}${is24HourFormat ? ':00' : period}

337 |

${weatherDescription.icon}

338 |

${temperature}°

339 |
340 | `); 341 | } 342 | 343 | const hourlyForecastHTML = ` 344 |
345 | ${forecastHTML.join('')} 346 |
347 | `; 348 | 349 | const weatherInfoElement = document.getElementById('weather-info'); 350 | weatherInfoElement.innerHTML += hourlyForecastHTML; 351 | 352 | const forecastHourElements = document.querySelectorAll('.forecast-hour'); 353 | forecastHourElements.forEach((element) => { 354 | element.classList.remove('fade-in'); 355 | setTimeout(() => { 356 | element.classList.remove('fade-in'); 357 | }, 500); 358 | }); 359 | } 360 | 361 | 362 | 363 | function getWeatherIcon(code) { 364 | const weatherDetails = { 365 | 0: { icon: '􀆮', color: '#ffcc00' }, 366 | 1: { icon: '􀆬', color: '#999999' }, 367 | 2: { icon: '􀇕', color: '#999999' }, 368 | 3: { icon: '􀇃', color: '#999999' }, 369 | 45: { icon: '􀇋', color: '#999999' }, 370 | 48: { icon: '􀇋', color: '#999999' }, 371 | 51: { icon: '􀇅', color: '#009dff' }, 372 | 53: { icon: '􀇇', color: '#009dff' }, 373 | 55: { icon: '􀇉', color: '#009dff' }, 374 | 61: { icon: '􀇉', color: '#009dff' }, 375 | 63: { icon: '􀇉', color: '#009dff' }, 376 | 65: { icon: '􀇉', color: '#009dff' }, 377 | 71: { icon: '􀇏', color: '#ffffff' }, 378 | 73: { icon: '􀇏', color: '#ffffff' }, 379 | 75: { icon: '􀇥', color: '#ffffff' }, 380 | 95: { icon: '􀇓', color: '#b88400' }, 381 | }; 382 | 383 | return weatherDetails[code] || { icon: 'Unknown', color: '#ffcc00' }; 384 | } 385 | 386 | 387 | function getWeatherDescription(code) { 388 | const weatherCodes = { 389 | 0: 'Clear sky', 390 | 1: 'Mainly clear', 391 | 2: 'Partly cloudy', 392 | 3: 'Overcast', 393 | 45: 'Fog', 394 | 48: 'Depositing rime fog', 395 | 51: 'Light drizzle', 396 | 53: 'Moderate drizzle', 397 | 55: 'Dense drizzle', 398 | 61: 'Slight rain', 399 | 63: 'Moderate rain', 400 | 65: 'Heavy rain', 401 | 71: 'Slight snow fall', 402 | 73: 'Moderate snow fall', 403 | 75: 'Heavy snow fall', 404 | 95: 'Thunderstorm', 405 | }; 406 | 407 | return weatherCodes[code] || 'Unknown'; 408 | } 409 | 410 | document.addEventListener('DOMContentLoaded', function() { 411 | var settingsButton = document.querySelector('#settings-button'); 412 | var settingsMenu = document.querySelector('#settings-menu'); 413 | var closeButton = settingsMenu.querySelector('#settings-close'); 414 | 415 | settingsButton.onclick = function() { 416 | settingsMenu.classList.toggle('open'); 417 | } 418 | 419 | closeButton.onclick = function() { 420 | settingsMenu.classList.toggle('open'); 421 | } 422 | 423 | window.onclick = function(event) { 424 | if (event.target == settingsMenu) { 425 | settingsMenu.classList.toggle('open'); 426 | } 427 | } 428 | }); 429 | 430 | updateDateTime(); 431 | setInterval(updateDateTime, 1000); 432 | fetchWeather(); 433 | 434 | 435 | document.addEventListener('DOMContentLoaded', () => { 436 | const elements = { 437 | 'clock-color': document.getElementById('clock-color'), 438 | 'clock-color-alpha': document.getElementById('clock-alpha'), 439 | 'clock-stretch': document.getElementById('clock-stretch'), 440 | 'clock-sizevalue': document.getElementById('clock-sizevalue'), 441 | 'clock-colon': document.getElementById('clock-colon'), 442 | 'clock-colon-alpha': document.getElementById('clock-colon-alpha'), 443 | 444 | 'date-color': document.getElementById('date-color'), 445 | 'date-color-alpha': document.getElementById('date-alpha'), 446 | 'date-sizevalue': document.getElementById('date-sizevalue'), 447 | 448 | 'base-background': document.getElementById('base-background'), 449 | 'base-background-alpha': document.getElementById('base-alpha'), 450 | 451 | 'baseborder-color': document.getElementById('baseborder-color'), 452 | 'baseborder-color-alpha': document.getElementById('baseborder-color-alpha'), 453 | 'baseborder-widthvalue': document.getElementById('baseborder-widthvalue'), 454 | 'base-roundvalue': document.getElementById('base-roundvalue'), 455 | 456 | 'baseshadow-hoz': document.getElementById('baseshadow-hoz'), 457 | 'baseshadow-ver': document.getElementById('baseshadow-ver'), 458 | 'baseshadow-blur': document.getElementById('baseshadow-blur'), 459 | 'baseshadow-color': document.getElementById('baseshadow-color'), 460 | 'baseshadow-color-alpha': document.getElementById('baseshadow-color-alpha'), 461 | 462 | 'base-blurvalue': document.getElementById('base-blurvalue'), 463 | 464 | 'sc-roundness': document.getElementById('sc-roundness'), 465 | 'sb-background': document.getElementById('sb-background'), 466 | 'sb-background-alpha': document.getElementById('sb-alpha'), 467 | 468 | 'resetButton': document.getElementById('reset-settings') 469 | }; 470 | 471 | const cssVars = [ 472 | 'clock-color', 'clock-colon', 'clock-sizevalue', 'clock-stretch', 473 | 'date-color', 'date-sizevalue', 474 | 'base-background', 'baseborder-color', 'baseborder-widthvalue', 475 | 'baseshadow-hoz', 'baseshadow-ver', 'baseshadow-blur', 'baseshadow-color', 'baseshadow-color-alpha', 476 | 'base-roundvalue', 477 | 'base-blurvalue', 478 | 'sc-roundness', 'sb-background' 479 | ]; 480 | 481 | // Store default CSS values 482 | const defaultCssValues = {}; 483 | cssVars.forEach(cssVar => { 484 | defaultCssValues[cssVar] = getComputedStyle(document.documentElement).getPropertyValue(`--${cssVar}`).trim(); 485 | }); 486 | 487 | // Load saved settings 488 | chrome.storage.local.get(cssVars, (result) => { 489 | cssVars.forEach(cssVar => { 490 | if (result[cssVar]) { 491 | applyAndSaveSetting(cssVar, result[cssVar]); 492 | } 493 | }); 494 | }); 495 | 496 | // Add event listeners for real-time updates 497 | cssVars.forEach(cssVar => { 498 | const element = elements[cssVar]; 499 | const alphaElement = elements[`${cssVar}-alpha`]; 500 | 501 | if (element) { 502 | element.addEventListener('input', () => updateSetting(cssVar)); 503 | } 504 | if (alphaElement) { 505 | alphaElement.addEventListener('input', () => updateSetting(cssVar)); 506 | } 507 | }); 508 | 509 | elements.resetButton.addEventListener('click', () => { 510 | chrome.storage.local.clear(); 511 | location.reload(); 512 | }); 513 | 514 | function updateSetting(cssVar) { 515 | const element = elements[cssVar]; 516 | const alphaElement = elements[`${cssVar}-alpha`]; 517 | let value; 518 | 519 | if (element && element.value === '') { 520 | // If input is empty, use the default value 521 | value = defaultCssValues[cssVar]; 522 | } else if (element && alphaElement) { 523 | const alpha = alphaElement.value; 524 | value = hexToRGBA(element.value, alpha); 525 | } else if (element) { 526 | value = element.value; 527 | } 528 | 529 | if (value) { 530 | applyAndSaveSetting(cssVar, value); 531 | } 532 | } 533 | 534 | function applyAndSaveSetting(cssVar, value) { 535 | document.documentElement.style.setProperty(`--${cssVar}`, value); 536 | const element = elements[cssVar]; 537 | if (element) { 538 | if (element.type === 'color') { 539 | // Convert RGBA to HEX 540 | let rgba = value.match(/\d+/g); 541 | if (rgba && rgba.length >= 3) { 542 | let hex = '#' + ((1 << 24) + (parseInt(rgba[0]) << 16) + (parseInt(rgba[1]) << 8) + parseInt(rgba[2])).toString(16).slice(1); 543 | element.value = hex; 544 | } 545 | } else { 546 | element.value = value !== defaultCssValues[cssVar] ? value : ''; 547 | } 548 | } 549 | // Save to storage only if it's different from the default 550 | if (value !== defaultCssValues[cssVar]) { 551 | chrome.storage.local.set({ [cssVar]: value }); 552 | } else { 553 | chrome.storage.local.remove(cssVar); 554 | } 555 | } 556 | 557 | // Debugging logs 558 | console.log('Customization menu loaded.'); 559 | console.log('Default CSS values:', defaultCssValues); 560 | cssVars.forEach(cssVar => { 561 | const element = elements[cssVar]; 562 | if (element) { 563 | console.log(`Current ${cssVar}:`, element.value); 564 | } else { 565 | console.warn(`Element for ${cssVar} not found`); 566 | } 567 | }); 568 | }); 569 | 570 | function hexToRGBA(hex, alpha) { 571 | let r = parseInt(hex.slice(1, 3), 16), 572 | g = parseInt(hex.slice(3, 5), 16), 573 | b = parseInt(hex.slice(5, 7), 16); 574 | return `rgba(${r}, ${g}, ${b}, ${alpha})`; 575 | } 576 | 577 | 578 | // Function to get and display the CSS variable value from the or :root element 579 | function updateSliderValues() { 580 | // Get the current value of the --clock-size variable from the or :root element 581 | const rootElement = document.documentElement; 582 | const clockStretch = getComputedStyle(rootElement).getPropertyValue('--clock-stretch').trim(); 583 | const clockSize = getComputedStyle(rootElement).getPropertyValue('--clock-sizevalue').trim(); 584 | const dateSize = getComputedStyle(rootElement).getPropertyValue('--date-sizevalue').trim(); 585 | const baseBlur = getComputedStyle(rootElement).getPropertyValue('--base-blurvalue').trim(); 586 | const borderWidth = getComputedStyle(rootElement).getPropertyValue('--baseborder-widthvalue').trim(); 587 | const shadowBlur = getComputedStyle(rootElement).getPropertyValue('--baseshadow-blur').trim(); 588 | const shadowHoz = getComputedStyle(rootElement).getPropertyValue('--baseshadow-hoz').trim(); 589 | const shadowVer = getComputedStyle(rootElement).getPropertyValue('--baseshadow-ver').trim(); 590 | 591 | // Update the

element with the clock size 592 | document.getElementById('clock-stretch-value').textContent = clockStretch + "%"; 593 | document.getElementById('clocksize-value').textContent = clockSize + "px"; 594 | document.getElementById('datesize-value').textContent = dateSize + "px"; 595 | document.getElementById('base-blur-value').textContent = baseBlur + "px"; 596 | document.getElementById('baseborder-width-value').textContent = borderWidth + "px"; 597 | document.getElementById('baseshadow-blur-value').textContent = shadowBlur + "px"; 598 | document.getElementById('baseshadow-hoz-value').textContent = shadowHoz + "px"; 599 | document.getElementById('baseshadow-ver-value').textContent = shadowVer + "px"; 600 | } 601 | 602 | // Call the function initially to display the current clock size 603 | updateSliderValues(); 604 | 605 | // Set up an interval to continuously check and update the clock size every 100ms 606 | setInterval(updateSliderValues, 100); 607 | 608 | 609 | 610 | window.onload = function() { 611 | document.getElementById("loadingscreen").classList.add("loaded"); 612 | }; 613 | -------------------------------------------------------------------------------- /assets/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/twitter.png -------------------------------------------------------------------------------- /assets/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/assets/youtube.png -------------------------------------------------------------------------------- /fonts/SF-Pro.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/fonts/SF-Pro.ttf -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Broco8Dev/VisionTab/4921877d5cd87ead44483e22610c77a7b0c2bd68/icon.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | VisionTab 9 | 10 | 11 |

12 | 13 |
14 | 15 |
16 |
17 |
18 | 19 | : 20 | 21 |
22 |
23 | 24 |
25 |
26 | 32 | 33 | 34 | 35 |
36 |
37 |
38 |
39 | 40 |
41 |
42 | 43 | 44 | 45 |
46 |

􀍟

47 |
48 | 49 |
50 |

􀅼

51 |
52 | 53 |
54 | 58 | 59 |
60 |
61 |
62 | 63 | 64 | 65 | 66 |
67 |
68 | 69 |
70 | 71 |
72 | 76 | 77 |
78 |
79 | 80 |
81 |
82 | 83 | 84 | 85 |
86 |
87 |
88 | 89 |
90 | 91 | 92 |
93 | 98 |
99 |
100 |
101 | 102 | 103 | 104 | 105 |
106 | 107 |
108 | 109 | 110 | 111 | 112 |
113 |
114 |
115 |
116 |
117 | Import Background Image 118 | 􀈃 119 |
120 | 121 |
122 |
123 | 124 |
125 | 126 |
127 | 128 | 129 |
130 |
131 | 132 | 133 |

134 |
135 | 136 |
137 | 138 |

139 | 140 |
141 |
142 |
143 | 144 | 145 | 149 |
150 | 151 |
152 | 153 | 154 |

155 |
156 | 157 | 158 | 160 |
161 |
162 | 163 |
164 | 165 |
166 | 167 | 168 |
169 | 170 |
171 | 172 | 173 |
174 | 175 | 176 | 178 |
179 |
180 | 181 |
182 | 183 |
184 | 185 | 186 |
187 | 188 |
189 | 190 | 191 |
192 | 193 | 194 | 196 |
197 |
198 | 199 |
200 | 201 | 202 |
203 | 204 |

205 | 206 |
207 | 208 | 209 | 211 |
212 |
213 | 214 |
215 | 216 |
217 | 218 | 219 |
220 | 221 |
222 | 223 | 224 |
225 | 226 |
227 | 228 |

229 | 230 |
231 | 232 | 233 | 235 |
236 | 237 |
238 | 239 | 240 |

px

241 |
242 | 243 | 248 |
249 | 250 |
251 | 252 | 253 |
254 | 255 | 256 |
257 |
258 | 259 | 260 |
261 |
262 | 263 | 264 | 266 |
267 | 268 |
269 | 270 |

271 | 272 |
273 |
274 |
275 | 276 |
277 | 278 | 279 |
280 | 281 | 282 |
283 |
284 | 285 | 286 |
287 |
288 | 289 |
290 | 291 |

292 | 293 |
294 |
295 | 296 |
297 | 298 |

299 | 300 |
301 |
302 |
303 | 304 | 305 | 309 |
310 | 311 |
312 | 313 |

314 | 315 |
316 |
317 |
318 |
319 |
320 | 321 |
322 | 323 | 324 |
325 | 326 |
327 | 328 |
329 | 330 | 331 |
332 | 333 |
334 | 335 |

336 | 337 |
338 |
339 | 340 | 341 | 343 |
344 |
345 |
346 | 347 | 350 |
351 | 352 | 353 | 357 | 416 | 417 | 418 | 419 | 420 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "VisionTab", 3 | "description": "A customizable new-tab page based on Apple's VisionOS", 4 | "version": "1.3", 5 | "manifest_version": 3, 6 | "chrome_url_overrides": { "newtab": "index.html" }, 7 | "permissions": ["storage"], 8 | "content_scripts": [ 9 | { 10 | "matches": [""], 11 | "js": ["assets/script.js"] 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'SF Pro'; 3 | src: url('assets/fonts/SF-Pro.ttf') format('truetype'); 4 | font-stretch: 0 1000; 5 | font-weight: 100 900; 6 | font-style: normal; 7 | } 8 | 9 | * { 10 | cursor: url(assets/cursors/default.png) 5 0, auto; 11 | font-family: 'SF Pro', sans-serif; 12 | color: white; 13 | margin: 0; 14 | transition: all 0.3s cubic-bezier(0.29, -0.03, 0.16, 0.96); 15 | animation: auto; 16 | text-decoration: none; 17 | cursor: inherit; 18 | } 19 | 20 | :root { 21 | /* BACKGROUND */ 22 | /* background */ 23 | --bg-img: url(bg.png); 24 | 25 | 26 | /* CLOCK */ 27 | /* color of the clock */ 28 | --clock-color: rgba(255, 255, 255, 1.00); 29 | --clock-stretch: 132; 30 | 31 | /* color of the clock's colon */ 32 | --clock-colon: rgba(255, 255, 255, 0.50); 33 | 34 | /* size of the clock */ 35 | --clock-sizevalue: 100; 36 | --clock-size: calc(var(--clock-sizevalue) * 1px); 37 | 38 | 39 | /* DATE */ 40 | /* color of the date */ 41 | --date-color: rgba(255, 255, 255, 0.75); 42 | 43 | /* size of the date */ 44 | --date-sizevalue: 25; 45 | --date-size: calc(var(--date-sizevalue) * 1px); 46 | 47 | 48 | 49 | /* BASES ; more menu and main menu */ 50 | /* color of the base */ 51 | --base-background: rgba(255, 255, 255, 0); 52 | 53 | /* border of the base; 54 | - width *SOLID* color */ 55 | --baseborder-widthvalue: 1; 56 | --baseborder-width: calc(var(--baseborder-widthvalue) * 1px); 57 | --baseborder-color: rgba(255, 255, 255, 0.10); 58 | --base-border: var(--baseborder-width) solid var(--baseborder-color); 59 | 60 | /* roundness of the base */ 61 | --base-roundvalue: 24; 62 | --base-roundness: calc(var(--base-roundvalue) * 1px); 63 | 64 | /* shadow of the base; 65 | - hoz-offset ver-offset blur-strength color*/ 66 | --baseshadow-hoz: 0; 67 | --baseshadow-ver: 0; 68 | --baseshadow-blur: 20; 69 | --baseshadow-color: rgba(0, 0, 0, 0.5); 70 | --base-shadow: calc(var(--baseshadow-hoz) * 1px) calc(var(--baseshadow-ver) * 1px) calc(var(--baseshadow-blur) * 1px) var(--baseshadow-color); 71 | 72 | /* blur of the base */ 73 | --base-blurvalue: 20; 74 | --base-blur: calc(var(--base-blurvalue) * 1px); 75 | 76 | 77 | 78 | /* SHORTCUTS */ 79 | /* show the shortcut label (edited in html file); 80 | - set to auto if yes, set to none if no */ 81 | --show-label: none; 82 | 83 | /* roundness of shortcut icons*/ 84 | --sc-roundness: 21%; 85 | 86 | 87 | 88 | /* SEARCH BAR */ 89 | /* color of the searchbar */ 90 | --sb-background: rgba(0, 0, 0, 0.45); 91 | } 92 | 93 | @keyframes bg-load { 94 | 0% { 95 | background-size: 110%; 96 | } 97 | 50% { 98 | background-size: 110%; 99 | } 100 | 100% { 101 | background-size: 100%; 102 | } 103 | } 104 | 105 | body, html { 106 | background-color: #000; 107 | background-size: cover; 108 | background-position: center; 109 | background-repeat: no-repeat; 110 | background-attachment: fixed; 111 | animation: bg-load 1s cubic-bezier(0.29, -0.03, 0.16, 0.96); 112 | 113 | cursor: url(assets/cursors/default.png) 0 0, auto; 114 | height: 100%; 115 | width: 100%; 116 | margin: 0; 117 | padding: 0; 118 | display: flex; 119 | justify-content: space-evenly; 120 | flex-direction: row; 121 | align-items: center; 122 | user-select: none; 123 | } 124 | 125 | @keyframes loadspinner { 126 | 0% { transform: translateX(-50%) rotate(0deg); } 127 | 12.5% { transform: translateX(-50%) rotate(45deg); } 128 | 25% { transform: translateX(-50%) rotate(90deg); } 129 | 37.5% { transform: translateX(-50%) rotate(135deg); } 130 | 50% { transform: translateX(-50%) rotate(180deg); } 131 | 62.5% { transform: translateX(-50%) rotate(225deg); } 132 | 75% { transform: translateX(-50%) rotate(270deg); } 133 | 100% { transform: translateX(-50%) rotate(360deg); } 134 | } 135 | 136 | #loadingscreen.loaded { 137 | opacity: 0; 138 | width: 120vw; 139 | height: 120vh; 140 | filter: blur(var(--base-blur)); 141 | 142 | #loadspinner { 143 | position: fixed; 144 | top: 75%; 145 | left: 50%; 146 | width: 25px; 147 | animation: none; 148 | transition: none; 149 | transform: translateX(-50%); 150 | } 151 | } 152 | 153 | #loadingscreen { 154 | z-index: 1000; 155 | width: 100%; 156 | height: 100%; 157 | position: fixed; 158 | top: 50%; 159 | left: 50%; 160 | transform: translate(-50%, -50%); 161 | background-image: url(assets/loading.png), radial-gradient(50% 50% at 50% 50%, rgba(0, 0, 0, 0.00) 0%, rgba(0, 0, 0, 0.47) 32.69%, rgba(0, 0, 0, 0.65) 51.37%, rgba(0, 0, 0, 0.83) 72.55%, #000 100%); 162 | background-position: center; 163 | background-size: cover; 164 | opacity: 1; 165 | pointer-events: none; 166 | backdrop-filter: blur(var(--base-blur)); 167 | filter: blur(0); 168 | 169 | #loadspinner { 170 | position: fixed; 171 | top: 75%; 172 | left: 50%; 173 | width: 25px; 174 | animation: loadspinner 1s steps(1) infinite; 175 | transition: none; 176 | } 177 | } 178 | 179 | .slider-snapper { 180 | position: absolute; 181 | top: 4px; 182 | 183 | transform: translateX(-50%); 184 | 185 | width: 4px; 186 | height: 26px; 187 | 188 | background: rgba(255, 255, 255, 0.1); 189 | border-radius: 2px; 190 | mix-blend-mode: difference; 191 | 192 | pointer-events: none; 193 | } 194 | 195 | input[type="range"] { 196 | width: calc(100% - 5px); 197 | -webkit-appearance: none; 198 | appearance: none; 199 | cursor: url(assets/cursors/open.png) 0 0, auto; 200 | outline: none; 201 | overflow: hidden; 202 | border-radius: calc(var(--base-roundness) - 12px); 203 | background: none; 204 | box-shadow: 1px 1.5px 4px 0px rgba(0, 0, 0, 0.08) inset, 1px 1.5px 4px 0px rgba(0, 0, 0, 0.10) inset; 205 | } 206 | input[type="range"]:active { 207 | cursor: url(assets/cursors/grab.png) 0 0, auto; 208 | } 209 | 210 | input[type="range"]::-webkit-slider-runnable-track { 211 | height: 34px; 212 | border-radius: 12px; 213 | background: var(--sb-background); 214 | background-blend-mode: luminosity, color-burn; 215 | background-blend-mode: luminosity; 216 | } 217 | 218 | input[type="range"]::-webkit-slider-thumb { 219 | -webkit-appearance: none; 220 | appearance: none; 221 | 222 | height: 0px; 223 | width: 0px; 224 | background-color: transparent; 225 | 226 | box-shadow: -400px 0 0 400px rgba(255, 255, 255, 0.23); 227 | } 228 | 229 | input::-webkit-autofill { 230 | display: none; 231 | } 232 | 233 | .color-wheel { 234 | -webkit-appearance: none; 235 | -moz-appearance: none; 236 | appearance: none; 237 | width: 22px; 238 | min-width: 22px; 239 | height: 22px !important; 240 | min-height: 22px; 241 | background-color: transparent; 242 | border: none; 243 | cursor: url(assets/cursors/colorpicker.png) 0 0, auto; 244 | padding: 0px; 245 | opacity: 1; 246 | box-shadow: none; 247 | text-shadow: none; 248 | outline: none; 249 | } 250 | 251 | .color-wheel:hover { 252 | transform: scale(1.1); 253 | } 254 | 255 | .color-wheel:active { 256 | transform: scale(0.8); 257 | } 258 | 259 | .color-wheel::-webkit-color-swatch-wrapper { 260 | padding: 0; 261 | } 262 | 263 | .color-wheel::-webkit-color-swatch { 264 | border: 2px solid rgba(96, 96, 96, 0.674); 265 | border-radius: 50%; 266 | } 267 | 268 | .color-wheel::-webkit-color-swatch { 269 | border-radius: 50%; 270 | box-shadow: inset 0px 3px 5px rgba(0, 0, 0, 0.514); 271 | } 272 | 273 | .color-wheel::-webkit-color-picker { 274 | width: 200px; 275 | height: 200px; 276 | border: 10px solid red; 277 | border-radius: 10px; 278 | padding: 5px; 279 | background-color: transparent; 280 | } 281 | 282 | #clock-container { 283 | display: flex; 284 | flex-direction: column; 285 | justify-content: center; 286 | align-items: center; 287 | text-align: center; 288 | margin-right: 150px; 289 | } 290 | 291 | #date { 292 | font-size: var(--date-size); 293 | color: var(--date-color); 294 | font-size: var(--date-size); 295 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 296 | } 297 | 298 | #clock { 299 | font-family: 'SF Pro'; 300 | font-size: var(--clock-size); 301 | font-stretch: calc(var(--clock-stretch) * 1%); 302 | color: var(--clock-color); 303 | font-weight: 600; 304 | display: flex; 305 | transition: font-stretch 0s; 306 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 307 | } 308 | 309 | #hours { 310 | font: inherit; 311 | color: var(--clock-color); 312 | } 313 | 314 | #minutes { 315 | font: inherit; 316 | color: var(--clock-color); 317 | } 318 | 319 | #colon { 320 | font: inherit; 321 | color: var(--clock-colon); 322 | } 323 | 324 | #quick-actions { 325 | width: 100%; 326 | padding: 12px; 327 | box-sizing: border-box; 328 | display: flex; 329 | flex-direction: column; 330 | justify-content: center; 331 | align-content: center; 332 | border-radius: var(--base-roundness); 333 | border: var(--base-border); 334 | background: var(--base-background); 335 | box-shadow: var(--base-shadow); 336 | background-blend-mode: luminosity; 337 | backdrop-filter: blur(var(--base-blur)); 338 | gap: 20px; 339 | transition: all 0.3s cubic-bezier(0.29, -0.03, 0.16, 0.96); 340 | } 341 | 342 | .section-label { 343 | font-size: 16px; 344 | color: rgba(255, 255, 255, 0.8); 345 | font-weight: 500; 346 | text-align: center; 347 | width: 100%; 348 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 349 | } 350 | 351 | #actions-grid { 352 | display: flex; 353 | flex-direction: row; 354 | gap: 30px; 355 | justify-content: center; 356 | flex-wrap: wrap; 357 | width: 100%; 358 | transition: all 0.3s cubic-bezier(0.29, -0.03, 0.16, 0.96); 359 | } 360 | 361 | .action-icon { 362 | background-image: url(assets/loadingicon.png); 363 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 364 | width: 60px; 365 | height: 60px; 366 | border-radius: var(--sc-roundness); 367 | display: flex; 368 | justify-content: center; 369 | align-items: center; 370 | box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.217); 371 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 372 | } 373 | 374 | .action-icon:active { 375 | transform: scale(0.8); 376 | background-color: rgba(255, 255, 255, 0.142); 377 | } 378 | 379 | .action-icon:hover { 380 | background-color: rgba(255, 255, 255, 0.3); 381 | scale: 1.1; 382 | } 383 | 384 | .action-icon img { 385 | width: 60px; 386 | border-radius: var(--sc-roundness); 387 | height: 60px; 388 | object-fit:cover; 389 | } 390 | 391 | 392 | 393 | #searchbar { 394 | width: 100%; 395 | padding: 12px; 396 | box-sizing: border-box; 397 | display: flex; 398 | flex-direction: row; 399 | justify-content: center; 400 | align-content: center; 401 | border-radius: calc(var(--base-roundness) - 12px); 402 | background: var(--sb-background); 403 | box-shadow: 1px 1.5px 4px 0px rgba(0, 0, 0, 0.08) inset, 1px 1.5px 4px 0px rgba(0, 0, 0, 0.10) inset; 404 | background-blend-mode: luminosity; 405 | backdrop-filter: blur(var(--base-blur)); 406 | font-size: 18px; 407 | font-weight: 500; 408 | color: rgba(255, 255, 255, 0.23); 409 | gap: 5px; 410 | transition: all 0.0.3s cubic-bezier(0.68, 0.12, 0.15, 1.07); 411 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 412 | 413 | p{ 414 | color: inherit; 415 | font: inherit; 416 | } 417 | form{ 418 | width: 60px; 419 | color: inherit; 420 | display: flex; 421 | justify-content: center; 422 | align-content: center; 423 | align-items: center; 424 | } 425 | input{ 426 | color: inherit; 427 | font:inherit; 428 | width: 64px; 429 | display: flex; 430 | justify-content: center; 431 | align-content: center; 432 | align-items: center; 433 | background: transparent; 434 | border: transparent; 435 | outline: none; 436 | } 437 | ::placeholder { 438 | color: inherit; 439 | } 440 | } 441 | #searchbar:focus-within { 442 | color: white; 443 | 444 | input { 445 | width: 100%; 446 | } 447 | form { 448 | width: 100%; 449 | } 450 | } 451 | 452 | #weather-info { 453 | width: 100%; 454 | height: 178px; 455 | padding: 12px; 456 | box-sizing: border-box; 457 | display: none; 458 | flex-direction: column; 459 | justify-content: space-around; 460 | align-content: center; 461 | border-radius: var(--base-roundness); 462 | border: var(--base-border); 463 | background: var(--base-background); 464 | box-shadow: var(--base-shadow); 465 | background-blend-mode: luminosity; 466 | backdrop-filter: blur(var(--base-blur)); 467 | } 468 | 469 | #weather-info.active { 470 | display: flex; 471 | } 472 | 473 | #weather-desc { 474 | margin-bottom: 0; 475 | height: 10px; 476 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 477 | } 478 | 479 | #weather-margin { 480 | margin-top: 0; 481 | opacity: 0.7; 482 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 483 | } 484 | 485 | .weather-hstack { 486 | display: flex; 487 | flex-direction: row; 488 | justify-content: center; 489 | align-items: center; 490 | 491 | } 492 | 493 | .weather-vstack { 494 | margin-left: auto; 495 | text-align: right; 496 | display: flex; 497 | flex-direction: column; 498 | gap: 5px; 499 | } 500 | 501 | .weather-hstack h1 { 502 | font-weight: 300; 503 | font-size: 50px; 504 | margin-top: 0; 505 | margin-bottom: 0; 506 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 507 | } 508 | 509 | #hourly-forecast { 510 | align-items: flex-start; 511 | display: flex; 512 | flex-direction: row; 513 | justify-content: space-between; 514 | width: 100%; 515 | } 516 | 517 | .forecast-hour { 518 | display: flex; 519 | flex-direction: column; 520 | justify-content: center; 521 | align-items: center; 522 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 523 | } 524 | 525 | #forecast-icon { 526 | text-shadow: 0px 5px 10px rgba(0, 0, 0, 0.201); 527 | font-size: 18px; 528 | } 529 | 530 | #widgets { 531 | width: calc(356px + var(--baseborder-width) * 2 - 1px); 532 | display: flex; 533 | flex-direction: column; 534 | gap: 20px; 535 | } 536 | 537 | #settings-button { 538 | position: fixed; 539 | top: 20px; 540 | right: 20px; 541 | 542 | height: 40px; 543 | width: 40px; 544 | box-sizing: border-box; 545 | display: flex; 546 | justify-content: center; 547 | align-items: center; 548 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 549 | gap: 20px; 550 | 551 | border-radius: var(--base-roundness); 552 | border: var(--base-border); 553 | background: var(--base-background); 554 | box-shadow: var(--base-shadow); 555 | background-blend-mode: luminosity; 556 | backdrop-filter: blur(var(--base-blur)); 557 | outline:none; 558 | font-size: 16px; 559 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 560 | } 561 | 562 | #settings-button:hover { 563 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 564 | scale: 1.1; 565 | 566 | * { 567 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 568 | } 569 | } 570 | 571 | #settings-button:active { 572 | transform: scale(0.8); 573 | background-color: rgba(255, 255, 255, 0.142); 574 | } 575 | 576 | #plus-button { 577 | position: fixed; 578 | top: 20px; 579 | right: 70px; 580 | height: 40px; 581 | width: 40px; 582 | box-sizing: border-box; 583 | display: flex; 584 | justify-content: center; 585 | align-items: center; 586 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 587 | gap: 20px; 588 | 589 | border-radius: var(--base-roundness); 590 | border: var(--base-border); 591 | background: var(--base-background); 592 | box-shadow: var(--base-shadow); 593 | background-blend-mode: luminosity; 594 | backdrop-filter: blur(var(--base-blur)); 595 | outline:none; 596 | font-size: 16px; 597 | animation: fade-in 0.8s cubic-bezier(0.29, -0.03, 0.16, 0.96); 598 | } 599 | 600 | #plus-button:hover { 601 | scale: 1.1; 602 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 603 | 604 | * { 605 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 606 | } 607 | } 608 | 609 | #plus-button:active { 610 | transform: scale(0.8); 611 | background-color: rgba(255, 255, 255, 0.142); 612 | } 613 | 614 | #plus-button h1 { 615 | font-size: 20px; 616 | color: rgba(255, 255, 255, 0.543); 617 | } 618 | 619 | 620 | #settings-button h1 { 621 | font-size: 20px; 622 | color: rgba(255, 255, 255, 0.543); 623 | } 624 | 625 | .close-button { 626 | height: 20px; 627 | width: 20px; 628 | padding: 5px; 629 | display: flex; 630 | justify-content: center; 631 | align-items: center; 632 | border-radius: var(--base-roundness); 633 | outline: none; 634 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 635 | border: none; 636 | background: none; 637 | font-size: 12px; 638 | font-weight: 600; 639 | color: rgba(255, 255, 255, 0.5); 640 | } 641 | 642 | 643 | 644 | .close-button:hover { 645 | background-color: rgba(255, 255, 255, 0.05); 646 | } 647 | 648 | .close-button:active { 649 | transform: scale(0.5); 650 | background-color: rgba(255, 255, 255, 0.142); 651 | } 652 | 653 | #add-menu { 654 | pointer-events: none; 655 | position: fixed; 656 | top: 20px; 657 | right: 70px; 658 | width: 40px; 659 | height: 40px; 660 | opacity: 0; 661 | display: flex; 662 | box-sizing: border-box; 663 | padding: 12px 12px; 664 | gap: 10px; 665 | justify-content: flex-start; 666 | align-items: center; 667 | flex-direction: column; 668 | z-index: 100; 669 | border-radius: var(--base-roundness); 670 | border: var(--base-border); 671 | background: var(--base-background); 672 | box-shadow: var(--base-shadow); 673 | background-blend-mode: luminosity; 674 | backdrop-filter: blur(var(--base-blur)); 675 | outline:none; 676 | overflow-x: hidden; 677 | 678 | 679 | -moz-transition: all 0.2s cubic-bezier(0, 0, 1, 0); 680 | -webkit-transition: all 0.2s cubic-bezier(0, 0, 1, 0); 681 | -o-transition: all 0.2s cubic-bezier(0, 0, 1, 0); 682 | transition: all 0.2s cubic-bezier(0, 0, 1, 0); 683 | 684 | opacity: 0; 685 | filter: blur(50px); 686 | user-select: none; 687 | cursor: url(assets/cursors/default.png) 0 0, auto; 688 | 689 | #menu-header, #settings-list { 690 | * { 691 | margin-left: -100%; 692 | scale: 0.8; 693 | opacity: 0; 694 | } 695 | 696 | .setting:nth-child(1) {transition-delay: calc(100ms * 1);} 697 | .setting:nth-child(2) {transition-delay: calc(100ms * 2);} 698 | .setting:nth-child(3) {transition-delay: calc(100ms * 3);} 699 | .setting:nth-child(4) {transition-delay: calc(100ms * 4);} 700 | .setting:nth-child(5) {transition-delay: calc(100ms * 5);} 701 | .setting:nth-child(6) {transition-delay: calc(100ms * 6);} 702 | .setting:nth-child(7) {transition-delay: calc(100ms * 7);} 703 | .setting:nth-child(8) {transition-delay: calc(100ms * 8);} 704 | .setting:nth-child(9) {transition-delay: calc(100ms * 9);} 705 | .setting:nth-child(10) {transition-delay: calc(100ms * 10);} 706 | .setting:nth-child(11) {transition-delay: calc(100ms * 11);} 707 | .setting:nth-child(12) {transition-delay: calc(100ms * 12);} 708 | .setting:nth-child(13) {transition-delay: calc(100ms * 13);} 709 | .setting:nth-child(14) {transition-delay: calc(100ms * 14);} 710 | .setting:nth-child(15) {transition-delay: calc(100ms * 15);} 711 | } 712 | } 713 | 714 | 715 | 716 | #add-shortcut-panel { 717 | width: 100%; 718 | height: 100px; 719 | align-items: center; 720 | justify-content: center; 721 | } 722 | 723 | @keyframes fadeIn { 724 | 0% { 725 | opacity: 0; 726 | } 727 | 100% { 728 | opacity: 1; 729 | } 730 | } 731 | 732 | @keyframes fade-out { 733 | 0% { 734 | opacity: 1; 735 | } 736 | 100% { 737 | opacity: 0; 738 | } 739 | } 740 | 741 | .shortcut-wrapper.visible { 742 | opacity: 1; 743 | } 744 | 745 | #add-shortcut-panel input { 746 | margin-bottom: 10px; 747 | } 748 | 749 | #add-shortcut { 750 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 751 | } 752 | 753 | #shortcuts-add { 754 | display: grid; 755 | grid-template-columns: repeat(5, 1fr); 756 | width: 100%; 757 | height: 100%; 758 | gap: 10px; 759 | border-radius: calc(var(--base-roundness) - 12px); 760 | } 761 | 762 | #add-menu.show { 763 | pointer-events: all; 764 | position: fixed; 765 | top: 20px; 766 | right: 20px; 767 | width: 400px; 768 | height: calc(100vh - 40px); 769 | 770 | display: flex; 771 | box-sizing: border-box; 772 | padding: 12px 12px; 773 | gap: 10px; 774 | justify-content: flex-start; 775 | align-items: center; 776 | flex-direction: column; 777 | z-index: 100; 778 | border-radius: var(--base-roundness); 779 | border: var(--base-border); 780 | background: var(--base-background); 781 | box-shadow: var(--base-shadow); 782 | background-blend-mode: luminosity; 783 | backdrop-filter: blur(var(--base-blur)); 784 | outline:none; 785 | overflow-x: hidden; 786 | 787 | opacity: 1; 788 | filter: blur(0px); 789 | 790 | 791 | -moz-transition: all 0.4s cubic-bezier(0, 0, 0, 1); 792 | -webkit-transition: all 0.4s cubic-bezier(0, 0, 0, 1); 793 | -o-transition: all 0.4s cubic-bezier(0, 0, 0, 1); 794 | transition: all 0.4s cubic-bezier(0, 0, 0, 1); 795 | 796 | #menu-header, #settings-list { 797 | * { 798 | margin-left: 0; 799 | scale: 1; 800 | opacity: 1; 801 | } 802 | } 803 | } 804 | 805 | 806 | #settings-menu { 807 | pointer-events: none; 808 | position: fixed; 809 | top: 20px; 810 | right: 20px; 811 | width: 40px; 812 | height: 40px; 813 | 814 | box-sizing: border-box; 815 | padding: 12px 12px; 816 | padding-bottom: none; 817 | gap: 10px; 818 | display: flex; 819 | justify-content: center; 820 | align-items: center; 821 | flex-direction: column; 822 | z-index: 100; 823 | border-radius: var(--base-roundness); 824 | border: var(--base-border); 825 | background: var(--base-background); 826 | box-shadow: var(--base-shadow); 827 | background-blend-mode: luminosity; 828 | backdrop-filter: blur(var(--base-blur)); 829 | outline:none; 830 | overflow-x: hidden; 831 | 832 | opacity: 0; 833 | filter: blur(50px); 834 | user-select: none; 835 | 836 | 837 | -moz-transition: all 0.4s cubic-bezier(0, 0, 1, 0); 838 | -webkit-transition: all 0.4s cubic-bezier(0, 0, 1, 0); 839 | -o-transition: all 0.4s cubic-bezier(0, 0, 1, 0); 840 | transition: all 0.4s cubic-bezier(0, 0, 1, 0); 841 | pointer-events: none; 842 | 843 | #menu-header, #settings-list, #setting-applyreset { 844 | * { 845 | margin-left: -100%; 846 | scale: 0.8; 847 | opacity: 0; 848 | } 849 | 850 | .setting:nth-child(1) {transition-delay: calc(100ms * 1);} 851 | .setting:nth-child(2) {transition-delay: calc(100ms * 2);} 852 | .setting:nth-child(3) {transition-delay: calc(100ms * 3);} 853 | .setting:nth-child(4) {transition-delay: calc(100ms * 4);} 854 | .setting:nth-child(5) {transition-delay: calc(100ms * 5);} 855 | .setting:nth-child(6) {transition-delay: calc(100ms * 6);} 856 | .setting:nth-child(7) {transition-delay: calc(100ms * 7);} 857 | .setting:nth-child(8) {transition-delay: calc(100ms * 8);} 858 | .setting:nth-child(9) {transition-delay: calc(100ms * 9);} 859 | .setting:nth-child(10) {transition-delay: calc(100ms * 10);} 860 | .setting:nth-child(11) {transition-delay: calc(100ms * 11);} 861 | .setting:nth-child(12) {transition-delay: calc(100ms * 12);} 862 | .setting:nth-child(13) {transition-delay: calc(100ms * 13);} 863 | .setting:nth-child(14) {transition-delay: calc(100ms * 14);} 864 | .setting:nth-child(15) {transition-delay: calc(100ms * 15);} 865 | } 866 | } 867 | 868 | #settings-menu.open { 869 | pointer-events: all; 870 | position: fixed; 871 | top: 20px; 872 | right: 20px; 873 | width: 400px; 874 | height: calc(100vh - 40px); 875 | 876 | box-sizing: border-box; 877 | padding: 12px 12px; 878 | gap: 10px; 879 | display: flex; 880 | justify-content: center; 881 | align-items: center; 882 | flex-direction: column; 883 | z-index: 100; 884 | 885 | border-radius: var(--base-roundness); 886 | border: var(--base-border); 887 | background: var(--base-background); 888 | box-shadow: var(--base-shadow); 889 | background-blend-mode: luminosity; 890 | backdrop-filter: blur(var(--base-blur)); 891 | outline:none; 892 | 893 | opacity: 1; 894 | filter: blur(0px); 895 | 896 | 897 | -moz-transition: all 0.2s cubic-bezier(0, 0, 0, 1); 898 | -webkit-transition: all 0.2s cubic-bezier(0, 0, 0, 1); 899 | -o-transition: all 0.2s cubic-bezier(0, 0, 0, 1); 900 | transition: all 0.2s cubic-bezier(0, 0, 0, 1); 901 | 902 | #menu-header, #settings-list, #setting-applyreset { 903 | * { 904 | margin-left: 0; 905 | scale: 1; 906 | opacity: 1; 907 | } 908 | 909 | .setting-slider-label { 910 | position: absolute; 911 | left: 8px; 912 | top: 50%; 913 | transform: translateY(-50%); 914 | 915 | width: 100%; 916 | height: 5px; 917 | line-height: 0px; 918 | font-size: 14px; 919 | font-weight: 600; 920 | font-weight: 400; 921 | color: white; 922 | z-index: 100; 923 | pointer-events: none; 924 | } 925 | 926 | .slider-value { 927 | position: absolute; 928 | right: 13px; 929 | top: 50%; 930 | transform: translateY(-50%); 931 | 932 | height: 6px; 933 | line-height: 0px; 934 | font-size: 14px; 935 | font-weight: 600; 936 | font-weight: 400; 937 | color: var(--date-color); 938 | z-index: 100; 939 | pointer-events: none; 940 | text-align: right; 941 | } 942 | } 943 | } 944 | 945 | #menu-header { 946 | width: 100%; 947 | display: flex; 948 | flex-direction: row; 949 | 950 | h2 { 951 | width: 100%; 952 | } 953 | } 954 | 955 | #settings-list { 956 | overflow-x: hidden; 957 | overflow-y: scroll; 958 | width: 100%; 959 | height: 100%; 960 | max-height: 100%; 961 | display: flex; 962 | gap: 20px; 963 | flex-direction: column; 964 | align-content: flex-start; 965 | justify-content: flex-start; 966 | align-items: flex-start; 967 | border-radius: 6px; 968 | } 969 | 970 | .setting { 971 | width: calc(100% - 5px); 972 | display: flex; 973 | gap: 10px; 974 | flex-direction: column; 975 | } 976 | 977 | .setting > .setting-label { 978 | display: flex; 979 | justify-content: start; 980 | align-items: center; 981 | width: 100%; 982 | font-size: 14px; 983 | font-weight: 600; 984 | padding-left: 10px; 985 | padding-bottom: 0px !important; 986 | 987 | color: var(--date-color); 988 | } 989 | 990 | .toggle-setting > .setting-label { 991 | display: flex; 992 | justify-content: start; 993 | align-items: center; 994 | width: 100%; 995 | height: 34px; 996 | font-size: 14px; 997 | font-weight: 600; 998 | 999 | color: var(--date-color); 1000 | } 1001 | 1002 | .toggle-setting { 1003 | border-radius: calc(var(--base-roundness) - 12px); 1004 | background: var(--sb-background); 1005 | background-blend-mode: luminosity, color-burn; 1006 | box-shadow: 1px 1.5px 4px 0px rgba(0, 0, 0, 0.08) inset, 1px 1.5px 4px 0px rgba(0, 0, 0, 0.10) inset; 1007 | backdrop-filter: blur(var(--base-blur)); 1008 | width: calc(100% - 10px); 1009 | height: fit-content; 1010 | display: none; 1011 | gap: 10px; 1012 | padding: 2px 5px 2px 9px; 1013 | box-sizing: border-box; 1014 | flex-direction: row; 1015 | justify-content: center; 1016 | align-items: center; 1017 | } 1018 | 1019 | .toggle-setting.active { 1020 | display: flex; 1021 | } 1022 | 1023 | .toggle-setting:has(.color-wheel):not(.toggle-setting:has(.toggle-switch)) { 1024 | width: calc(100% - 5px); 1025 | height: 34px; 1026 | } 1027 | 1028 | .slider-container { 1029 | height: fit-content; 1030 | width: 100%; 1031 | } 1032 | 1033 | input::-webkit-outer-spin-button, 1034 | input::-webkit-inner-spin-button { 1035 | -webkit-appearance: none; 1036 | margin: 0; 1037 | } 1038 | 1039 | input[type=number] { 1040 | -moz-appearance: textfield; 1041 | } 1042 | 1043 | .setting-input { 1044 | width: calc(100% - 5px); 1045 | height: 34px; 1046 | padding: 2px 6px 2px 9px; 1047 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 1048 | box-sizing: border-box; 1049 | display: flex; 1050 | flex-direction: row; 1051 | justify-content: center; 1052 | align-content: center; 1053 | border-radius: calc(var(--base-roundness) - 12px); 1054 | background: var(--sb-background); 1055 | background-blend-mode: luminosity, color-burn; 1056 | box-shadow: 1px 1.5px 4px 0px rgba(0, 0, 0, 0.08) inset, 1px 1.5px 4px 0px rgba(0, 0, 0, 0.10) inset; 1057 | background-blend-mode: luminosity; 1058 | backdrop-filter: blur(var(--base-blur)); 1059 | border: none; 1060 | transition: all 0.5s ease; 1061 | font-size: 14px; 1062 | font-weight: 500; 1063 | color: rgba(255, 255, 255, 1); 1064 | gap: 0px; 1065 | border: none; 1066 | outline: none; 1067 | overflow: visible; 1068 | 1069 | 1070 | ::placeholder { 1071 | color: var(--date-color); 1072 | } 1073 | 1074 | label, p { 1075 | width: fit-content; 1076 | min-width: fit-content; 1077 | height: 100%; 1078 | 1079 | appearance: none; 1080 | background: transparent; 1081 | border: none; 1082 | outline: none; 1083 | 1084 | display: flex; 1085 | justify-content: center; 1086 | align-items: center; 1087 | 1088 | font: inherit; 1089 | color: white; 1090 | } 1091 | 1092 | input { 1093 | width: 100%; 1094 | height: 100%; 1095 | 1096 | appearance: none; 1097 | background: transparent; 1098 | border: none; 1099 | outline: none; 1100 | 1101 | display: flex; 1102 | justify-content: flex-end; 1103 | text-align: end; 1104 | align-items: center; 1105 | padding: 0; 1106 | 1107 | font: inherit; 1108 | color: var(--date-color); 1109 | } 1110 | input:focus, input:enabled { 1111 | color: white; 1112 | } 1113 | 1114 | p { 1115 | color: var(--date-color); 1116 | } 1117 | } 1118 | 1119 | #setting-applyreset { 1120 | width: 100%; 1121 | display: flex; 1122 | flex-direction: row; 1123 | gap: 10px; 1124 | } 1125 | 1126 | #uploadDiv { 1127 | width: calc(100% - 10px); 1128 | height: 34px; 1129 | justify-content: space-between; 1130 | color: rgba(255, 255, 255, 0.623); 1131 | padding-right: 2px; 1132 | 1133 | span { 1134 | display: flex; 1135 | align-items: center; 1136 | justify-content: center; 1137 | transition: none; 1138 | color: inherit; 1139 | } 1140 | 1141 | span[name=icon] { 1142 | width: 30px; 1143 | height: 30px; 1144 | } 1145 | } 1146 | 1147 | #uploadDiv:hover { 1148 | color: white; 1149 | background-color: var(--sb-background); 1150 | } 1151 | 1152 | #uploadDiv:active{ 1153 | transform: scale(0.8); 1154 | background-color: rgba(255, 255, 255, 0.142); 1155 | } 1156 | 1157 | 1158 | 1159 | #save-settings { 1160 | width: 100%; 1161 | min-height: 35px; 1162 | box-sizing: border-box; 1163 | display: flex; 1164 | flex-direction: row; 1165 | justify-content: center; 1166 | align-items: center; 1167 | border-radius: calc(var(--base-roundness) - 12px); 1168 | background: var(--sb-background); 1169 | background-blend-mode: luminosity, color-burn; 1170 | box-shadow: 1px -1.5px 4px 0px rgba(0, 0, 0, 0.08) inset, 1px -1.5px 4px 0px rgba(0, 0, 0, 0.10) inset; 1171 | background-blend-mode: luminosity; 1172 | backdrop-filter: blur(var(--base-blur)); 1173 | border: none; 1174 | font-size: 13.5px; 1175 | font-weight: 500; 1176 | color: rgba(255, 255, 255, 0.5); 1177 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 1178 | } 1179 | 1180 | .remove-shortcut { 1181 | width: 20px; 1182 | height: 20px; 1183 | 1184 | justify-content: center; 1185 | align-items: center; 1186 | display: flex; 1187 | border-radius: 50%; 1188 | border: var(--base-border); 1189 | background: rgba(255, 255, 255, 0.749); 1190 | box-shadow: var(--base-shadow); 1191 | background-blend-mode: luminosity; 1192 | color: black; 1193 | font-weight: 800; 1194 | text-align: center; 1195 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 1196 | outline:none; 1197 | font-size: 10px; 1198 | position: fixed; 1199 | top: -5px; 1200 | left: -5px; 1201 | backdrop-filter: blur(var(--base-blur)); 1202 | } 1203 | 1204 | .remove-shortcut:hover { 1205 | width: 23px; 1206 | height: 23px; 1207 | } 1208 | 1209 | #add-button { 1210 | width: 100%; 1211 | min-height: 35px; 1212 | box-sizing: border-box; 1213 | display: flex; 1214 | flex-direction: row; 1215 | justify-content: center; 1216 | align-items: center; 1217 | border-radius: calc(var(--base-roundness) - 12px); 1218 | background: var(--sb-background); 1219 | background-blend-mode: luminosity, color-burn; 1220 | box-shadow: 1px -1.5px 4px 0px rgba(0, 0, 0, 0.08) inset, 1px -1.5px 4px 0px rgba(0, 0, 0, 0.10) inset; 1221 | background-blend-mode: luminosity; 1222 | backdrop-filter: blur(var(--base-blur)); 1223 | border: none; 1224 | font-size: 13.5px; 1225 | font-weight: 500; 1226 | color: rgba(255, 255, 255, 0.5); 1227 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 1228 | } 1229 | 1230 | #reset-settings { 1231 | min-width: 68px; 1232 | height: 20px; 1233 | 1234 | box-sizing: border-box; 1235 | display: flex; 1236 | flex-direction: row; 1237 | justify-content: center; 1238 | align-items: center; 1239 | 1240 | border-radius: calc(var(--base-roundness) - 12px); 1241 | background: none; 1242 | border: none; 1243 | 1244 | font-size: 13.5px; 1245 | font-weight: 500; 1246 | color: rgba(255, 255, 255, 0.5); 1247 | 1248 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 1249 | } 1250 | 1251 | #reset-settings:hover{ 1252 | background-color: rgba(255, 255, 255, 0.05); 1253 | } 1254 | 1255 | #save-settings:hover { 1256 | font-size: 15px; 1257 | color: white; 1258 | } 1259 | 1260 | #save-settings:active{ 1261 | transform: scale(0.8); 1262 | background-color: rgba(255, 255, 255, 0.142); 1263 | } 1264 | 1265 | #reset-settings:active{ 1266 | transform: scale(0.8); 1267 | background-color: rgba(255, 255, 255, 0.142); 1268 | } 1269 | 1270 | ::-webkit-scrollbar { 1271 | background-color: transparent; 1272 | display: block; 1273 | width: 6px; 1274 | } 1275 | ::-webkit-scrollbar-thumb { 1276 | background-color: rgba(255, 255, 255, 0.2); 1277 | border-radius: 10px; 1278 | } 1279 | 1280 | 1281 | .toggle-switch, .toggle-switch .toggle-knob { 1282 | -moz-transition: all 0.2s ease; 1283 | -webkit-transition: all 0.2s ease; 1284 | -o-transition: all 0.2s ease; 1285 | transition: all 0.2s ease; 1286 | } 1287 | 1288 | .toggle-knob { 1289 | transform: translateX(5px); 1290 | } 1291 | 1292 | .toggle-switch { 1293 | cursor: url(assets/cursors/pointer.png) 5 0, auto; 1294 | height: 27px; 1295 | width: 45px !important; 1296 | min-width: 45px !important; 1297 | display: inline-block; 1298 | border-radius: 15px; 1299 | background: var(--sb-background); 1300 | background-blend-mode: luminosity, color-burn; 1301 | box-shadow: 1px 1.5px 4px 0px rgba(0, 0, 0, 0.08) inset, 1px 1.5px 4px 0px rgba(0, 0, 0, 0.10) inset; 1302 | background-blend-mode: luminosity; 1303 | backdrop-filter: blur(var(--base-blur)); 1304 | border: none; 1305 | } 1306 | 1307 | @keyframes fade-in { 1308 | 0% { 1309 | opacity: 1; 1310 | filter: blur(0); 1311 | scale: 1; 1312 | } 1313 | 1314 | 50% { 1315 | opacity: 1; 1316 | filter: blur(0); 1317 | scale: 1; 1318 | } 1319 | 1320 | 100% { 1321 | opacity: 1; 1322 | filter: blur(0); 1323 | scale: 1; 1324 | } 1325 | } 1326 | 1327 | .hidden { 1328 | opacity: 0; 1329 | position: fixed; 1330 | 1331 | } 1332 | 1333 | #fileInput { 1334 | display: none; 1335 | } 1336 | 1337 | .settings-center { 1338 | width: 100%; 1339 | } 1340 | 1341 | .toggle-knob { 1342 | width: 19px; 1343 | height: 19px; 1344 | display: inline-block; 1345 | background-color: rgba(255, 255, 255, 0.9); 1346 | 1347 | border-radius: 26px; 1348 | margin: 4px 4px; 1349 | } 1350 | 1351 | .toggle-switch.active { 1352 | background-color: #32d74b; 1353 | } 1354 | 1355 | .toggle-switch.active > .toggle-knob { 1356 | margin: 4px 17px !important; 1357 | } 1358 | 1359 | input[type=number]:autofill, 1360 | input[type=text]:autofill { 1361 | background: inherit; 1362 | } --------------------------------------------------------------------------------