diff --git a/.config/ags/config.js b/.config/ags/config.js index d44c12ec7..4e9c0bb96 100644 --- a/.config/ags/config.js +++ b/.config/ags/config.js @@ -1,4 +1,8 @@ "use strict"; +const gi = imports.gi; +const availableModules = Object.keys(gi); +print("Available modules: " + availableModules.join(', ')); + // Import import Gdk from 'gi://Gdk'; import App from 'resource:///com/github/Aylur/ags/app.js' @@ -64,7 +68,7 @@ export default { }; // Stuff that don't need to be toggled. And they're async so ugh... -// Bar().catch(print); +// Bar().catch(print); // Use this to debug the bar forMonitors(Bar); forMonitors(BarCornerTopleft); forMonitors(BarCornerTopright); \ No newline at end of file diff --git a/.config/ags/data/weather.js b/.config/ags/data/weather.js new file mode 100644 index 000000000..57c34fb1b --- /dev/null +++ b/.config/ags/data/weather.js @@ -0,0 +1,94 @@ +export const WWO_CODE = { + "113": "Sunny", + "116": "PartlyCloudy", + "119": "Cloudy", + "122": "VeryCloudy", + "143": "Fog", + "176": "LightShowers", + "179": "LightSleetShowers", + "182": "LightSleet", + "185": "LightSleet", + "200": "ThunderyShowers", + "227": "LightSnow", + "230": "HeavySnow", + "248": "Fog", + "260": "Fog", + "263": "LightShowers", + "266": "LightRain", + "281": "LightSleet", + "284": "LightSleet", + "293": "LightRain", + "296": "LightRain", + "299": "HeavyShowers", + "302": "HeavyRain", + "305": "HeavyShowers", + "308": "HeavyRain", + "311": "LightSleet", + "314": "LightSleet", + "317": "LightSleet", + "320": "LightSnow", + "323": "LightSnowShowers", + "326": "LightSnowShowers", + "329": "HeavySnow", + "332": "HeavySnow", + "335": "HeavySnowShowers", + "338": "HeavySnow", + "350": "LightSleet", + "353": "LightShowers", + "356": "HeavyShowers", + "359": "HeavyRain", + "362": "LightSleetShowers", + "365": "LightSleetShowers", + "368": "LightSnowShowers", + "371": "HeavySnowShowers", + "374": "LightSleetShowers", + "377": "LightSleet", + "386": "ThunderyShowers", + "389": "ThunderyHeavyRain", + "392": "ThunderySnowShowers", + "395": "HeavySnowShowers", +} + +export const WEATHER_SYMBOL = { + "Unknown": "air", + "Cloudy": "cloud", + "Fog": "foggy", + "HeavyRain": "rainy", + "HeavyShowers": "rainy", + "HeavySnow": "snowing", + "HeavySnowShowers": "snowing", + "LightRain": "rainy", + "LightShowers": "rainy", + "LightSleet": "rainy", + "LightSleetShowers": "rainy", + "LightSnow": "cloudy_snowing", + "LightSnowShowers": "cloudy_snowing", + "PartlyCloudy": "partly_cloudy_day", + "Sunny": "clear_day", + "ThunderyHeavyRain": "thunderstorm", + "ThunderyShowers": "thunderstorm", + "ThunderySnowShowers": "thunderstorm", + "VeryCloudy": "cloud", +} + +export const NIGHT_WEATHER_SYMBOL = { + "Unknown": "air", + "Cloudy": "cloud", + "Fog": "foggy", + "HeavyRain": "rainy", + "HeavyShowers": "rainy", + "HeavySnow": "snowing", + "HeavySnowShowers": "snowing", + "LightRain": "rainy", + "LightShowers": "rainy", + "LightSleet": "rainy", + "LightSleetShowers": "rainy", + "LightSnow": "cloudy_snowing", + "LightSnowShowers": "cloudy_snowing", + "PartlyCloudy": "partly_cloudy_night", + "Sunny": "clear_night", + "ThunderyHeavyRain": "thunderstorm", + "ThunderyShowers": "thunderstorm", + "ThunderySnowShowers": "thunderstorm", + "VeryCloudy": "cloud", +} \ No newline at end of file diff --git a/.config/ags/lib/animatedcircularprogress.js b/.config/ags/lib/animatedcircularprogress.js index 4a86eb423..83c184227 100644 --- a/.config/ags/lib/animatedcircularprogress.js +++ b/.config/ags/lib/animatedcircularprogress.js @@ -83,22 +83,22 @@ export const AnimatedCircProg = ({ // Init animation if (initFrom != initTo) { - // area.css = `font-size: ${initFrom}px; transition: ${initAnimTime}ms linear;`; + area.css = `font-size: ${initFrom}px; transition: ${initAnimTime}ms linear;`; Utils.timeout(20, () => { area.css = `font-size: ${initTo}px;`; }, area) - // const transitionDistance = initTo - initFrom; - // const oneStep = initAnimTime / initAnimPoints; - // area.css = ` - // font-size: ${initFrom}px; - // transition: ${oneStep}ms linear; - // `; - // for (let i = 0; i < initAnimPoints; i++) { - // Utils.timeout(Math.max(10, i * oneStep), () => { - // if(!area) return; - // area.css = `${initFrom != initTo ? 'font-size: ' + (initFrom + (transitionDistance / initAnimPoints * (i + 1))) + 'px;' : ''}`; - // }); - // } + const transitionDistance = initTo - initFrom; + const oneStep = initAnimTime / initAnimPoints; + area.css = ` + font-size: ${initFrom}px; + transition: ${oneStep}ms linear; + `; + for (let i = 0; i < initAnimPoints; i++) { + Utils.timeout(Math.max(10, i * oneStep), () => { + if(!area) return; + area.css = `${initFrom != initTo ? 'font-size: ' + (initFrom + (transitionDistance / initAnimPoints * (i + 1))) + 'px;' : ''}`; + }); + } } else area.css = 'font-size: 0px;'; extraSetup(area); diff --git a/.config/ags/lib/cursorhover.js b/.config/ags/lib/cursorhover.js index c8c436b6c..89be913b9 100644 --- a/.config/ags/lib/cursorhover.js +++ b/.config/ags/lib/cursorhover.js @@ -1,6 +1,6 @@ const { Gdk } = imports.gi; -export function setupCursorHover(button) { +export function setupCursorHover(button) { // Hand pointing cursor on hover const display = Gdk.Display.get_default(); button.connect('enter-notify-event', () => { const cursor = Gdk.Cursor.new_from_name(display, 'pointer'); @@ -14,7 +14,7 @@ export function setupCursorHover(button) { } -export function setupCursorHoverAim(button) { +export function setupCursorHoverAim(button) { // Crosshair cursor on hover button.connect('enter-notify-event', () => { const display = Gdk.Display.get_default(); const cursor = Gdk.Cursor.new_from_name(display, 'crosshair'); @@ -28,7 +28,7 @@ export function setupCursorHoverAim(button) { }); } -export function setupCursorHoverGrab(button) { +export function setupCursorHoverGrab(button) { // Hand ready to grab on hover button.connect('enter-notify-event', () => { const display = Gdk.Display.get_default(); const cursor = Gdk.Cursor.new_from_name(display, 'grab'); @@ -42,7 +42,7 @@ export function setupCursorHoverGrab(button) { }); } -export function setupCursorHoverInfo(button) { +export function setupCursorHoverInfo(button) { // "?" mark cursor on hover const display = Gdk.Display.get_default(); button.connect('enter-notify-event', () => { const cursor = Gdk.Cursor.new_from_name(display, 'help'); @@ -55,43 +55,3 @@ export function setupCursorHoverInfo(button) { }); } -// failed radial ripple experiment -// -// var clicked = false; -// var dummy = false; -// var cursorX = 0; -// var cursorY = 0; -// const styleContext = button.get_style_context(); -// var clickColor = styleContext.get_property('background-color', Gtk.StateFlags.HOVER); -// clickColor.green += CLICK_BRIGHTEN_AMOUNT; -// clickColor.blue += CLICK_BRIGHTEN_AMOUNT; -// clickColor.red += CLICK_BRIGHTEN_AMOUNT; -// clickColor = clickColor.to_string(); -// button.add_events(Gdk.EventMask.POINTER_MOTION_MASK); -// button.connect('motion-notify-event', (widget, event) => { -// [dummy, cursorX, cursorY] = event.get_coords(); // Get the mouse coordinates relative to the widget -// if(!clicked) widget.css = ` -// background-image: radial-gradient(circle at ${cursorX}px ${cursorY}px, rgba(0,0,0,0), rgba(0,0,0,0) 0%, rgba(0,0,0,0) 0%, ${clickColor} 0%, ${clickColor} 0%, ${clickColor} 0%, ${clickColor} 0%, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 0%); -// `; -// }); - -// button.connect('button-press-event', (widget, event) => { -// clicked = true; -// [dummy, cursorX, cursorY] = event.get_coords(); // Get the mouse coordinates relative to the widget -// cursorX = Math.round(cursorX); cursorY = Math.round(cursorY); -// widget.css = ` -// background-image: radial-gradient(circle at ${cursorX}px ${cursorY}px, rgba(0,0,0,0), rgba(0,0,0,0) 0%, rgba(0,0,0,0) 0%, ${clickColor} 0%, ${clickColor} 0%, ${clickColor} 0%, ${clickColor} 0%, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 0%); -// `; -// widget.toggleClassName('growingRadial', true); -// widget.css = ` -// background-image: radial-gradient(circle at ${cursorX}px ${cursorY}px, rgba(0,0,0,0), rgba(0,0,0,0) 0%, rgba(0,0,0,0) 0%, ${clickColor} 0%, ${clickColor} 0%, ${clickColor} 70%, ${clickColor} 70%, rgba(0,0,0,0) 70%, rgba(0,0,0,0) 70%); -// ` -// }); -// button.connect('button-release-event', (widget, event) => { -// widget.toggleClassName('growingRadial', false); -// widget.toggleClassName('fadingRadial', false); -// widget.css = ` -// background-image: radial-gradient(circle at ${cursorX}px ${cursorY}px, rgba(0,0,0,0), rgba(0,0,0,0) 0%, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 70%, rgba(0,0,0,0) 70%, rgba(0,0,0,0) 70%, rgba(0,0,0,0) 70%); -// ` -// clicked = false; -// }); diff --git a/.config/ags/lib/notification.js b/.config/ags/lib/notification.js index 1189b62fa..628b01177 100644 --- a/.config/ags/lib/notification.js +++ b/.config/ags/lib/notification.js @@ -20,6 +20,10 @@ function guessMessageType(summary) { return 'chat'; } +function exists(widget) { + return widget !== null; +} + const NotificationIcon = (notifObject) => { // { appEntry, appIcon, image }, urgency = 'normal' if (notifObject.image) { @@ -71,9 +75,9 @@ const NotificationIcon = (notifObject) => { export default ({ notifObject, isPopup = false, - popupTimeout = 3000, props = {}, } = {}) => { + const popupTimeout = notifObject.timeout || (notifObject.urgency == 'critical' ? 8000 : 3000); const command = (isPopup ? () => notifObject.dismiss() : () => notifObject.close() @@ -82,11 +86,14 @@ export default ({ widget.sensitive = false; notificationBox.setCss(middleClickClose); Utils.timeout(200, () => { - wholeThing.revealChild = false; + if (wholeThing) wholeThing.revealChild = false; }, wholeThing); Utils.timeout(400, () => { command(); - wholeThing.destroy(); + if (wholeThing) { + wholeThing.destroy(); + wholeThing = null; + } }, wholeThing); } const widget = EventBox({ @@ -105,22 +112,39 @@ export default ({ }, onMiddleClick: (self) => { destroyWithAnims(); + }, + setup: (self) => { + self.on("button-press-event", () => { + wholeThing.attribute.held = true; + notificationContent.toggleClassName(`${isPopup ? 'popup-' : ''}notif-clicked-${notifObject.urgency}`, true); + Utils.timeout(800, () => { + if (wholeThing?.attribute.held) { + Utils.execAsync(['wl-copy', `${notifObject.body}`]) + notifTextSummary.label = notifObject.summary + " (copied)"; + Utils.timeout(3000, () => notifTextSummary.label = notifObject.summary) + } + }) + }).on("button-release-event", () => { + wholeThing.attribute.held = false; + notificationContent.toggleClassName(`${isPopup ? 'popup-' : ''}notif-clicked-${notifObject.urgency}`, false); + }) } }); - const wholeThing = Revealer({ + let wholeThing = Revealer({ attribute: { - 'id': notifObject.id, 'close': undefined, - 'hovered': false, + 'destroyWithAnims': destroyWithAnims, 'dragging': false, - 'destroyWithAnims': () => destroyWithAnims, + 'held': false, + 'hovered': false, + 'id': notifObject.id, }, revealChild: false, transition: 'slide_down', transitionDuration: 200, child: Box({ // Box to make sure css-based spacing works homogeneous: true, - }) + }), }); const display = Gdk.Display.get_default(); @@ -205,6 +229,23 @@ export default ({ notifTime = 'Yesterday'; else notifTime = messageTime.format('%d/%m'); + const notifTextSummary = Label({ + xalign: 0, + className: 'txt-small txt-semibold titlefont', + justify: Gtk.Justification.LEFT, + hexpand: true, + maxWidthChars: 24, + truncate: 'end', + ellipsize: 3, + useMarkup: notifObject.summary.startsWith('<'), + label: notifObject.summary, + }); + const notifTextBody = Label({ + vpack: 'center', + justification: 'right', + className: 'txt-smaller txt-semibold', + label: notifTime, + }); const notifText = Box({ valign: Gtk.Align.CENTER, vertical: true, @@ -212,23 +253,8 @@ export default ({ children: [ Box({ children: [ - Label({ - xalign: 0, - className: 'txt-small txt-semibold titlefont', - justify: Gtk.Justification.LEFT, - hexpand: true, - maxWidthChars: 24, - truncate: 'end', - ellipsize: 3, - useMarkup: notifObject.summary.startsWith('<'), - label: notifObject.summary, - }), - Label({ - vpack: 'center', - justification: 'right', - className: 'txt-smaller txt-semibold', - label: notifTime, - }), + notifTextSummary, + notifTextBody, ] }), notifTextPreview, @@ -313,6 +339,7 @@ export default ({ .hook(gesture, self => { var offset_x = gesture.get_offset()[1]; var offset_y = gesture.get_offset()[2]; + // Which dir? if (initDirVertical == -1) { if (Math.abs(offset_y) > MOVE_THRESHOLD) initDirVertical = 1; @@ -321,7 +348,7 @@ export default ({ initDirX = (offset_x > 0 ? 1 : -1); } } - + // Horizontal drag if (initDirVertical == 0 && offset_x > MOVE_THRESHOLD) { if (initDirX < 0) self.setCss(`margin-left: 0px; margin-right: 0px;`); @@ -342,12 +369,12 @@ export default ({ `); } } - - wholeThing.attribute.dragging = Math.abs(offset_x) > 10; - - if (widget.window) - widget.window.set_cursor(Gdk.Cursor.new_from_name(display, 'grabbing')); - + // Update dragging + wholeThing.attribute.dragging = Math.abs(offset_x) > MOVE_THRESHOLD; + if (Math.abs(offset_x) > MOVE_THRESHOLD || + Math.abs(offset_y) > MOVE_THRESHOLD) wholeThing.attribute.held = false; + widget.window?.set_cursor(Gdk.Cursor.new_from_name(display, 'grabbing')); + // Vertical drag if (initDirVertical == 1 && offset_y > MOVE_THRESHOLD && !expanded) { notifTextPreview.revealChild = false; notifTextExpanded.revealChild = true; @@ -380,11 +407,14 @@ export default ({ widget.sensitive = false; } Utils.timeout(200, () => { - wholeThing.revealChild = false + if (wholeThing) wholeThing.revealChild = false; }, wholeThing); Utils.timeout(400, () => { command(); - wholeThing.destroy(); + if (wholeThing) { + wholeThing.destroy(); + wholeThing = null; + } }, wholeThing); } else { @@ -405,6 +435,17 @@ export default ({ }) widget.add(notificationBox); wholeThing.child.children = [widget]; - + if (isPopup) Utils.timeout(popupTimeout, () => { + if (wholeThing) { + wholeThing.revealChild = false; + Utils.timeout(200, () => { + if (wholeThing) { + wholeThing.destroy(); + wholeThing = null; + } + command(); + }, wholeThing); + } + }) return wholeThing; } diff --git a/.config/ags/lib/statusicons.js b/.config/ags/lib/statusicons.js index 609ed916f..1e9425787 100644 --- a/.config/ags/lib/statusicons.js +++ b/.config/ags/lib/statusicons.js @@ -73,10 +73,10 @@ export const NotificationIndicator = (notifCenterName = 'sideright') => { export const BluetoothIndicator = () => Widget.Stack({ transition: 'slide_up_down', - items: [ - ['false', Widget.Label({ className: 'txt-norm icon-material', label: 'bluetooth_disabled' })], - ['true', Widget.Label({ className: 'txt-norm icon-material', label: 'bluetooth' })], - ], + children: { + 'false': Widget.Label({ className: 'txt-norm icon-material', label: 'bluetooth_disabled' }), + 'true': Widget.Label({ className: 'txt-norm icon-material', label: 'bluetooth' }), + }, setup: (self) => self .hook(Bluetooth, stack => { stack.shown = String(Bluetooth.enabled); @@ -87,13 +87,13 @@ export const BluetoothIndicator = () => Widget.Stack({ const NetworkWiredIndicator = () => Widget.Stack({ transition: 'slide_up_down', - items: [ - ['fallback', SimpleNetworkIndicator()], - ['unknown', Widget.Label({ className: 'txt-norm icon-material', label: 'wifi_off' })], - ['disconnected', Widget.Label({ className: 'txt-norm icon-material', label: 'signal_wifi_off' })], - ['connected', Widget.Label({ className: 'txt-norm icon-material', label: 'lan' })], - ['connecting', Widget.Label({ className: 'txt-norm icon-material', label: 'settings_ethernet' })], - ], + children: { + 'fallback': SimpleNetworkIndicator(), + 'unknown': Widget.Label({ className: 'txt-norm icon-material', label: 'wifi_off' }), + 'disconnected': Widget.Label({ className: 'txt-norm icon-material', label: 'signal_wifi_off' }), + 'connected': Widget.Label({ className: 'txt-norm icon-material', label: 'lan' }), + 'connecting': Widget.Label({ className: 'txt-norm icon-material', label: 'settings_ethernet' }), + }, setup: (self) => self.hook(Network, stack => { if (!Network.wired) return; @@ -118,16 +118,16 @@ const SimpleNetworkIndicator = () => Widget.Icon({ const NetworkWifiIndicator = () => Widget.Stack({ transition: 'slide_up_down', - items: [ - ['disabled', Widget.Label({ className: 'txt-norm icon-material', label: 'wifi_off' })], - ['disconnected', Widget.Label({ className: 'txt-norm icon-material', label: 'signal_wifi_off' })], - ['connecting', Widget.Label({ className: 'txt-norm icon-material', label: 'settings_ethernet' })], - ['0', Widget.Label({ className: 'txt-norm icon-material', label: 'signal_wifi_0_bar' })], - ['1', Widget.Label({ className: 'txt-norm icon-material', label: 'network_wifi_1_bar' })], - ['2', Widget.Label({ className: 'txt-norm icon-material', label: 'network_wifi_2_bar' })], - ['3', Widget.Label({ className: 'txt-norm icon-material', label: 'network_wifi_3_bar' })], - ['4', Widget.Label({ className: 'txt-norm icon-material', label: 'signal_wifi_4_bar' })], - ], + children: { + 'disabled': Widget.Label({ className: 'txt-norm icon-material', label: 'wifi_off' }), + 'disconnected': Widget.Label({ className: 'txt-norm icon-material', label: 'signal_wifi_off' }), + 'connecting': Widget.Label({ className: 'txt-norm icon-material', label: 'settings_ethernet' }), + '0': Widget.Label({ className: 'txt-norm icon-material', label: 'signal_wifi_0_bar' }), + '1': Widget.Label({ className: 'txt-norm icon-material', label: 'network_wifi_1_bar' }), + '2': Widget.Label({ className: 'txt-norm icon-material', label: 'network_wifi_2_bar' }), + '3': Widget.Label({ className: 'txt-norm icon-material', label: 'network_wifi_3_bar' }), + '4': Widget.Label({ className: 'txt-norm icon-material', label: 'signal_wifi_4_bar' }), + }, setup: (self) => self.hook(Network, (stack) => { if (!Network.wifi) { return; @@ -143,11 +143,11 @@ const NetworkWifiIndicator = () => Widget.Stack({ export const NetworkIndicator = () => Widget.Stack({ transition: 'slide_up_down', - items: [ - ['fallback', SimpleNetworkIndicator()], - ['wifi', NetworkWifiIndicator()], - ['wired', NetworkWiredIndicator()], - ], + children: { + 'fallback': SimpleNetworkIndicator(), + 'wifi': NetworkWifiIndicator(), + 'wired': NetworkWiredIndicator(), + }, setup: (self) => self.hook(Network, stack => { if (!Network.primary) { stack.shown = 'wifi'; @@ -176,14 +176,21 @@ const HyprlandXkbKeyboardLayout = async ({ useFlag } = {}) => { } languageStackArray = Array.from({ length: initLangs.length }, (_, i) => { const lang = languages.find(lang => lang.layout == initLangs[i]); - if (!lang) return [ - initLangs[i], - Widget.Label({ label: initLangs[i] }) - ]; - return [ - lang.layout, - Widget.Label({ label: (useFlag ? lang.flag : lang.layout) }) - ]; + // if (!lang) return [ + // initLangs[i], + // Widget.Label({ label: initLangs[i] }) + // ]; + // return [ + // lang.layout, + // Widget.Label({ label: (useFlag ? lang.flag : lang.layout) }) + // ]; + // Object + if (!lang) return { + [initLangs[i]]: Widget.Label({ label: initLangs[i] }) + }; + return { + [lang.layout]: Widget.Label({ label: (useFlag ? lang.flag : lang.layout) }) + }; }); }; updateCurrentKeyboards(); @@ -192,12 +199,15 @@ const HyprlandXkbKeyboardLayout = async ({ useFlag } = {}) => { transition: 'slide_left', revealChild: languageStackArray.length > 1, }); + const widgetKids = { + ...languageStackArray.reduce((obj, lang) => { + return { ...obj, ...lang }; + }, {}), + 'undef': Widget.Label({ label: '?' }), + } const widgetContent = Widget.Stack({ transition: 'slide_up_down', - items: [ - ...languageStackArray, - ['undef', Widget.Label({ label: '?' })] - ], + children: widgetKids, setup: (self) => self.hook(Hyprland, (stack, kbName, layoutName) => { if (!kbName) { return; diff --git a/.config/ags/scripts/color_generation/applycolor.sh b/.config/ags/scripts/color_generation/applycolor.sh index 64aa9cae2..b0b206e08 100755 --- a/.config/ags/scripts/color_generation/applycolor.sh +++ b/.config/ags/scripts/color_generation/applycolor.sh @@ -41,7 +41,7 @@ get_light_dark() { lightdark="" if [ ! -f ~/.cache/ags/user/colormode.txt ]; then echo "" > ~/.cache/ags/user/colormode.txt - else + else lightdark=$(cat ~/.cache/ags/user/colormode.txt) # either "" or "-l" fi echo "$lightdark" @@ -55,7 +55,7 @@ apply_gtklock() { sassc ~/.config/ags/scripts/templates/gtklock/main.scss ~/.config/gtklock/style.css return fi - + # Check if scripts/templates/gtklock/style.css exists if [ ! -f "scripts/templates/gtklock/style.css" ]; then echo "Template file not found for Gtklock. Skipping that." @@ -99,6 +99,29 @@ apply_foot() { cp "$HOME/.config/foot/foot_new.ini" "$HOME/.config/foot/foot.ini" } +apply_term() { + # Check if scripts/templates/foot/foot.ini exists + if [ ! -f "scripts/templates/terminal/sequences.material" ]; then + echo "Template file not found for Terminal. Skipping that." + return + fi + if [ ! -d "$HOME/.cache/ags/user/colorschemes" ]; then + mkdir -p "$HOME/.cache/ags/user/colorschemes" + fi + # Copy template + cp "scripts/templates/terminal/sequences.material" "$HOME/.cache/ags/user/colorschemes/sequences" + # Apply colors + for i in "${!colorlist[@]}"; do + sed -i "s/${colorlist[$i]} #/${colorvalues[$i]#\#}/g" "$HOME/.cache/ags/user/colorschemes/sequences" + done + + for file in /dev/pts/*; do + if [[ $file =~ ^/dev/pts/[0-9]+$ ]]; then + cat "$HOME/.cache/ags/user/colorschemes/sequences" > "$file" + fi + done +} + apply_hyprland() { # Check if scripts/templates/hypr/colors.conf exists if [ ! -f "scripts/templates/hypr/colors.conf" ]; then @@ -111,14 +134,14 @@ apply_hyprland() { for i in "${!colorlist[@]}"; do sed -i "s/{{ ${colorlist[$i]} }}/${colorvalues[$i]#\#}/g" "$HOME/.config/hypr/colors_new.conf" done - + mv "$HOME/.config/hypr/colors_new.conf" "$HOME/.config/hypr/colors.conf" } apply_gtk() { # Using gradience-cli lightdark=$(get_light_dark) - - # Copy template + + # Copy template cp "scripts/templates/gradience/preset_template.json" "scripts/templates/gradience/preset.json" # Apply colors @@ -129,8 +152,8 @@ apply_gtk() { # Using gradience-cli mkdir -p "$HOME/.config/presets" # create gradience presets folder gradience-cli apply -p scripts/templates/gradience/preset.json --gtk both - # Set light/dark preference - # And set GTK theme manually as Gradience defaults to light adw-gtk3 + # Set light/dark preference + # And set GTK theme manually as Gradience defaults to light adw-gtk3 # (which is unreadable when broken when you use dark mode) if [ "$lightdark" = "-l" ]; then gsettings set org.gnome.desktop.interface gtk-theme 'adw-gtk3' @@ -152,4 +175,4 @@ apply_hyprland & apply_gtk & apply_gtklock & apply_fuzzel & -apply_foot \ No newline at end of file +apply_term & diff --git a/.config/ags/scripts/color_generation/colorgen.sh b/.config/ags/scripts/color_generation/colorgen.sh index ebdb31dca..32daa20b9 100755 --- a/.config/ags/scripts/color_generation/colorgen.sh +++ b/.config/ags/scripts/color_generation/colorgen.sh @@ -1,4 +1,4 @@ -#!/usr/bin/bash +#!/usr/bin/env bash # check if no arguments if [ $# -eq 0 ]; then @@ -10,51 +10,50 @@ fi lightdark="" if [ ! -f "$HOME/.cache/ags/user/colormode.txt" ]; then echo "" > "$HOME/.cache/ags/user/colormode.txt" -else +else lightdark=$(cat "$HOME/.cache/ags/user/colormode.txt") # either "" or "-l" fi # check if the file ~/.cache/ags/user/colorbackend.txt exists. if not, create it. else, read it to $lightdark backend="material" if [ ! -f "$HOME/.cache/ags/user/colorbackend.txt" ]; then echo "material" > "$HOME/.cache/ags/user/colorbackend.txt" -else +else backend=$(cat "$HOME/.cache/ags/user/colorbackend.txt") # either "" or "-l" fi cd "$HOME/.config/ags/scripts/" || exit if [[ "$1" = "#"* ]]; then # this is a color - color_generation/generate_colors_material.py --color "$1" "$lightdark" > $HOME/.cache/ags/user/generated_colors.txt + color_generation/generate_colors_material.py --color "$1" "$lightdark" > "$HOME/.cache/ags/user/generated_colors.txt" if [ "$2" = "--apply" ]; then - cp $HOME/.cache/ags/user/generated_colors.txt "$HOME/.config/ags/scss/_material.scss" + cp "$HOME/.cache/ags/user/generated_colors.txt" "$HOME/.config/ags/scss/_material.scss" color_generation/applycolor.sh fi elif [ "$backend" = "material" ]; then - color_generation/generate_colors_material.py --path "$1" "$lightdark" > $HOME/.cache/ags/user/generated_colors.txt + color_generation/generate_colors_material.py --path "$1" "$lightdark" > "$HOME/.cache/ags/user/generated_colors.txt" if [ "$2" = "--apply" ]; then - cp $HOME/.cache/ags/user/generated_colors.txt "$HOME/.config/ags/scss/_material.scss" + cp "$HOME/.cache/ags/user/generated_colors.txt" "$HOME/.config/ags/scss/_material.scss" color_generation/applycolor.sh fi elif [ "$backend" = "pywal" ]; then # clear and generate wal -c - echo wal -i "$1" -n -t -s -e "$lightdark" -q - wal -i "$1" -n -t -s -e $lightdark -q + wal -i "$1" -n $lightdark -q # copy scss - cp "$HOME/.cache/wal/colors.scss" $HOME/.cache/ags/user/generated_colors.txt - - cat color_generation/pywal_to_material.scss >> $HOME/.cache/ags/user/generated_colors.txt + cp "$HOME/.cache/wal/colors.scss" "$HOME/.cache/ags/user/generated_colors.txt" + + cat color_generation/pywal_to_material.scss >> "$HOME/.cache/ags/user/generated_colors.txt" if [ "$2" = "--apply" ]; then - sassc $HOME/.cache/ags/user/generated_colors.txt $HOME/.cache/ags/user/generated_colors_classes.scss --style compact - sed -i "s/ { color//g" $HOME/.cache/ags/user/generated_colors_classes.scss - sed -i "s/\./$/g" $HOME/.cache/ags/user/generated_colors_classes.scss - sed -i "s/}//g" $HOME/.cache/ags/user/generated_colors_classes.scss + sassc "$HOME/.cache/ags/user/generated_colors.txt" "$HOME/.cache/ags/user/generated_colors_classes.scss" --style compact + sed -i "s/ { color//g" "$HOME/.cache/ags/user/generated_colors_classes.scss" + sed -i "s/\./$/g" "$HOME/.cache/ags/user/generated_colors_classes.scss" + sed -i "s/}//g" "$HOME/.cache/ags/user/generated_colors_classes.scss" if [ "$lightdark" = "-l" ]; then - printf "\n"'$darkmode: false;'"\n" >> $HOME/.cache/ags/user/generated_colors_classes.scss + printf "\n""\$darkmode: false;""\n" >> "$HOME/.cache/ags/user/generated_colors_classes.scss" else - printf "\n"'$darkmode: true;'"\n" >> $HOME/.cache/ags/user/generated_colors_classes.scss + printf "\n""\$darkmode: true;""\n" >> "$HOME/.cache/ags/user/generated_colors_classes.scss" fi - cp $HOME/.cache/ags/user/generated_colors_classes.scss "$HOME/.config/ags/scss/_material.scss" + cp "$HOME/.cache/ags/user/generated_colors_classes.scss" "$HOME/.config/ags/scss/_material.scss" color_generation/applycolor.sh fi diff --git a/.config/ags/scripts/color_generation/generate_colors_material.py b/.config/ags/scripts/color_generation/generate_colors_material.py index 4af7dd5c9..deb34bf83 100755 --- a/.config/ags/scripts/color_generation/generate_colors_material.py +++ b/.config/ags/scripts/color_generation/generate_colors_material.py @@ -1,4 +1,4 @@ -#!/bin/python3 +#!/usr/bin/env python3 from material_color_utilities_python import * from pathlib import Path import sys diff --git a/.config/ags/scripts/color_generation/switchcolor.sh b/.config/ags/scripts/color_generation/switchcolor.sh index de59f04cc..6e7e6b320 100755 --- a/.config/ags/scripts/color_generation/switchcolor.sh +++ b/.config/ags/scripts/color_generation/switchcolor.sh @@ -1,4 +1,4 @@ -#!/usr/bin/bash +#!/usr/bin/env bash color=$(hyprpicker --no-fancy) diff --git a/.config/ags/scripts/color_generation/switchwall.sh b/.config/ags/scripts/color_generation/switchwall.sh index 64bb4a031..1129ae02b 100755 --- a/.config/ags/scripts/color_generation/switchwall.sh +++ b/.config/ags/scripts/color_generation/switchwall.sh @@ -1,4 +1,4 @@ -#!/usr/bin/bash +#!/usr/bin/env bash if [ "$1" == "--noswitch" ]; then imgpath=$(swww query | awk -F 'image: ' '{print $2}') diff --git a/.config/ags/scripts/hyprland/workspace_action.sh b/.config/ags/scripts/hyprland/workspace_action.sh new file mode 100755 index 000000000..33f100866 --- /dev/null +++ b/.config/ags/scripts/hyprland/workspace_action.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +hyprctl dispatch "$1" $(((($(hyprctl activeworkspace -j | gojq -r .id) - 1) / 10) * 10 + $2)) diff --git a/.config/ags/scripts/sway/swayToRelativeWs.sh b/.config/ags/scripts/sway/swayToRelativeWs.sh index 557b385ec..c97ebdb93 100755 --- a/.config/ags/scripts/sway/swayToRelativeWs.sh +++ b/.config/ags/scripts/sway/swayToRelativeWs.sh @@ -1,4 +1,11 @@ -#!/bin/bash +#!/usr/bin/env bash + +# Check if sway is running +if ! pgrep -x sway > /dev/null; then + echo "Sway is not running" + exit 1 +fi + # Get the current workspace number current=$(swaymsg -t get_workspaces | gojq '.[] | select(.focused==true) | .num') @@ -20,4 +27,4 @@ if [[ $2 == 'move' ]]; then swaymsg move container to workspace $new_workspace else swaymsg workspace $new_workspace -fi \ No newline at end of file +fi diff --git a/.config/ags/scripts/templates/gradience/preset.json b/.config/ags/scripts/templates/gradience/preset.json index 095d5b526..243111683 100644 --- a/.config/ags/scripts/templates/gradience/preset.json +++ b/.config/ags/scripts/templates/gradience/preset.json @@ -87,9 +87,9 @@ "BLACK_500": "#393634", "BLACK_700": "#33302F", "BLACK_900": "#2B2928", - "accent_bg_color": "#e4b5ff", - "accent_fg_color": "#471868", - "accent_color": "#e4b5ff", + "accent_bg_color": "#ffb1c3", + "accent_fg_color": "#66002a", + "accent_color": "#ffb1c3", "destructive_bg_color": "#ffb4a9", "destructive_fg_color": "#680003", "destructive_color": "#ffb4a9", @@ -99,22 +99,22 @@ "warning_fg_color": "rgba(0, 0, 0, 0.87)", "error_bg_color": "#ffb4a9", "error_fg_color": "#680003", - "window_bg_color": "#111012", - "window_fg_color": "#e7e0e5", - "view_bg_color": "#1d1b1e", - "view_fg_color": "#e7e0e5", + "window_bg_color": "#130F10", + "window_fg_color": "#ecdfe0", + "view_bg_color": "#201a1b", + "view_fg_color": "#ecdfe0", "headerbar_bg_color": "mix(@dialog_bg_color, @window_bg_color, 0.5)", - "headerbar_fg_color": "#eedcf5", - "headerbar_border_color": "#4f4256", + "headerbar_fg_color": "#ffd9df", + "headerbar_border_color": "#5c3f45", "headerbar_backdrop_color": "@headerbar_bg_color", "headerbar_shade_color": "rgba(0, 0, 0, 0.09)", - "card_bg_color": "#111012", - "card_fg_color": "#eedcf5", + "card_bg_color": "#130F10", + "card_fg_color": "#ffd9df", "card_shade_color": "rgba(0, 0, 0, 0.09)", - "dialog_bg_color": "#4f4256", - "dialog_fg_color": "#eedcf5", - "popover_bg_color": "#4f4256", - "popover_fg_color": "#eedcf5", + "dialog_bg_color": "#5c3f45", + "dialog_fg_color": "#ffd9df", + "popover_bg_color": "#5c3f45", + "popover_fg_color": "#ffd9df", "thumbnail_bg_color": "#1a1b26", "thumbnail_fg_color": "#AEE5FA", "shade_color": "rgba(0, 0, 0, 0.36)", diff --git a/.config/ags/scripts/templates/hypr/colors.conf b/.config/ags/scripts/templates/hypr/colors.conf index 0c1ba7f08..7588d93e7 100644 --- a/.config/ags/scripts/templates/hypr/colors.conf +++ b/.config/ags/scripts/templates/hypr/colors.conf @@ -5,23 +5,11 @@ general { col.inactive_border = rgba({{ $secondaryContainer }}CC) } -plugin { - droidbars { # This is my hyprbars mod that broke :( - # example config - bar_height = 30 - background_color = rgba({{ $background }}FF) - # background_color_active = rgba({{ $surfaceVariant }}FF) # Not added yet - text_color = rgba({{ $onSecondaryContainer }}FF) - font_family = Rubik, Geist, AR One Sans, Reddit Sans, Inter, Roboto, Ubuntu, Noto Sans, sans-serif - button_font_fmily = JetBrainsMono NF +misc { + background_color = rgba({{ $surface }}FF) +} - # example buttons (R -> L) - # droidbars-button = [0]isLeft(0/1), [1]color, [2]color2, [3]width, [4]height, [5]icon, [6]buttonType, [7]on-click - droidbars-button = 0, rgba({{ $onSecondaryContainer }}FF), rgba({{ $primary }}FF), 42, 16,‎ 󰖭, normal, hyprctl dispatch killactive - droidbars-button = 0, rgba({{ $onSecondaryContainer }}FF), rgba({{ $primary }}FF), 42, 16,‎ , normal, hyprctl dispatch fullscreen 1 - droidbars-button = 1, rgba({{ $onSecondaryContainer }}FF), rgba({{ $primary }}FF), 16, 16,‎󰐃, pin, hyprctl dispatch pin - droidbars-button = 1, rgba({{ $onSecondaryContainer }}FF), rgba({{ $primary }}FF), 16, 16,󰗘, float, hyprctl dispatch togglefloating - } +plugin { hyprbars { # Honestly idk if it works like css, but well, why not bar_text_font = Rubik, Geist, AR One Sans, Reddit Sans, Inter, Roboto, Ubuntu, Noto Sans, sans-serif diff --git a/.config/ags/scripts/templates/terminal/sequences.material b/.config/ags/scripts/templates/terminal/sequences.material new file mode 100644 index 000000000..907eb9f22 --- /dev/null +++ b/.config/ags/scripts/templates/terminal/sequences.material @@ -0,0 +1 @@ +]4;0;#$background #\]4;1;#$error #\]4;2;#$inversePrimary #\]4;3;#$onPrimaryContainer #\]4;4;#$onPrimaryContainer #\]4;5;#$onSecondaryContainer #\]4;6;#$primary #\]4;7;#$onSurfaceVariant #\]4;8;#$background #\]4;9;#$error #\]4;10;#$inversePrimary #\]4;11;#$onPrimaryContainer #\]4;12;#$onPrimaryContainer #\]4;13;#$onSecondaryContainer #\]4;14;#$primary #\]4;15;#$onSurfaceVariant #\]10;#$onSurfaceVariant #\]11;#$background #\]12;#$onSurfaceVariant #\]13;#$onSurfaceVariant #\]17;#$onSurfaceVariant #\]19;#$background #\]4;232;#$background #\]4;256;#$onSurfaceVariant #\]708;#$background #\ \ No newline at end of file diff --git a/.config/ags/scripts/templates/terminal/sequences.term b/.config/ags/scripts/templates/terminal/sequences.term new file mode 100644 index 000000000..d7af58a14 --- /dev/null +++ b/.config/ags/scripts/templates/terminal/sequences.term @@ -0,0 +1 @@ +]4;0;#regular0\]4;1;#regular1\]4;2;#regular2\]4;3;#regular3\]4;4;#regular4\]4;5;#regular5\]4;6;#regular6\]4;7;#regular7\]4;8;#bright0\]4;9;#bright1\]4;10;#bright2\]4;11;#bright3\]4;12;#bright4\]4;13;#bright5\]4;14;#bright6\]4;15;#bright7\]10;#regular7\]11;#regular0\]12;#regular7\]13;#regular7\]17;#regular7\]19;#regular0\]4;232;#regular0\]4;256;#regular7\]708;#regular0\ \ No newline at end of file diff --git a/.config/ags/scss/_bar.scss b/.config/ags/scss/_bar.scss index 41cd21d22..7ad45ed44 100644 --- a/.config/ags/scss/_bar.scss +++ b/.config/ags/scss/_bar.scss @@ -48,24 +48,6 @@ $bar_subgroup_bg: $surfaceVariant; padding-left: 0.341rem; } -.bar-group-pad-left { - padding-left: 1.364rem; - padding-right: 0.681rem; -} - -.bar-group-pad-right { - padding-left: 0.681rem; - padding-right: 1.364rem; -} - -.bar-group-pad-leftonly { - padding-left: 0.681rem; -} - -.bar-group-pad-rightonly { - padding-right: 0.681rem; -} - .bar-group-standalone { @include bar-group-rounding; -gtk-outline-radius: 1.364rem; @@ -142,6 +124,7 @@ $bar_subgroup_bg: $surfaceVariant; .bar-batt { @include full-rounding; + @include element_decel; min-height: 1.77rem; min-width: 1.77rem; border-radius: 10rem; @@ -173,24 +156,17 @@ $bar_subgroup_bg: $surfaceVariant; } .bar-batt-circprog-low { - @include fluent_decel_long; - min-width: 0.068rem; // line width - min-height: 1.636rem; - padding: 0rem; background-color: $error; color: $errorContainer; } .bar-batt-circprog-full { - @include fluent_decel_long; - min-width: 0.068rem; // line width - min-height: 1.636rem; - padding: 0rem; background-color: $successContainer; color: $onSuccessContainer; } .bar-music-playstate { + @include element_decel; min-height: 1.77rem; min-width: 1.77rem; border-radius: 10rem; @@ -237,24 +213,6 @@ $bar_subgroup_bg: $surfaceVariant; background-color: rgba(30, 30, 30, 0.6); } -.bar-music-bottom-bg { - border-radius: 1.364rem; - min-width: 34.091rem; -} - -.bar-music-bottom-ctl-bg { - border-radius: 1.364rem; - background-color: rgba(30, 30, 30, 0.6); -} - -.bar-music-extended-textbox { - margin: 1.023rem; -} - -.bar-music-bottom-cover { - border-radius: 10rem; -} - .bar-music-hide-false { @include menu_decel; transition-duration: 100ms; @@ -267,70 +225,6 @@ $bar_subgroup_bg: $surfaceVariant; opacity: 0; } -.bar-music-btn { - font-size: 1.364rem; - border-radius: 10rem; - min-height: 2.591rem; - min-width: 2.591rem; -} - -.bar-music-btn:hover, -.bar-music-btn:focus { - background-color: $hovercolor; -} - -.bar-prog-batt { - min-height: 0.955rem; - min-width: 0.068rem; - padding: 0rem; - border-radius: 10rem; - - trough { - min-height: 0.954rem; - min-width: 0.068rem; - border-radius: 10rem; - } - - progress { - min-height: 0.68rem; - min-width: 0.68rem; - margin: 0rem 0.137rem; - border-radius: 10rem; - background-color: $t_onSecondaryContainer; - } -} - -.bar-prog-batt-low { - progress { - background-color: $errorContainer; - } -} - -.bar-prog-batt-full { - progress { - background-color: $onSuccessContainer; - } -} - -.bar-batt-chargestate { - border-radius: 10rem; - background-color: transparent; -} - -.bar-batt-chargestate-charging { - border-radius: 10rem; - min-width: 0.681rem; - min-height: 0.681rem; - background-color: $onSurfaceVariant; -} - -.bar-batt-chargestate-charging-smaller { - border-radius: 10rem; - min-width: 0.409rem; - min-height: 0.409rem; - background-color: $onSurfaceVariant; -} - .bar-corner-spacing { min-width: $rounding_large; min-height: $rounding_large; @@ -388,13 +282,14 @@ $bar_subgroup_bg: $surfaceVariant; .bar-systray-item { @include full-rounding; + @include element_decel; min-height: 1.032rem; min-width: 1.032rem; } .bar-statusicons { @include full-rounding; - @include menu_decel; + @include element_decel; margin: 0.273rem; padding: 0rem 0.614rem; } @@ -409,6 +304,7 @@ $bar_subgroup_bg: $surfaceVariant; .bar-util-btn { @include full-rounding; + @include element_decel; min-height: 1.77rem; min-width: 1.77rem; background-color: $bar_subgroup_bg; diff --git a/.config/ags/scss/_cheatsheet.scss b/.config/ags/scss/_cheatsheet.scss index b32b0c463..8681e1cf4 100644 --- a/.config/ags/scss/_cheatsheet.scss +++ b/.config/ags/scss/_cheatsheet.scss @@ -31,7 +31,7 @@ // .cheatsheet-action {} .cheatsheet-closebtn { - @include menu_decel; + @include element_decel; @include full-rounding; min-width: 2.386rem; min-height: 2.386rem; diff --git a/.config/ags/scss/_colors.scss b/.config/ags/scss/_colors.scss index 6aa9424f3..2cc6ef45b 100644 --- a/.config/ags/scss/_colors.scss +++ b/.config/ags/scss/_colors.scss @@ -40,8 +40,7 @@ $transparentize_surface_amount_less: 0.6; $transparentize_surface_amount_less_less: 0.55; $transparentize_surface_amount: 0.7; $transparentize_surface_amount_more: 0.8; -$transparentize_surface_amount_subtract_surface: $transparentize_surface_amount - - $transparentize_amount; +$transparentize_surface_amount_subtract_surface: $transparentize_surface_amount - $transparentize_amount; @if $darkmode ==true { // Less transparency @@ -50,8 +49,7 @@ $transparentize_surface_amount_subtract_surface: $transparentize_surface_amount $transparentize_surface_amount_less_less: 0.55; $transparentize_surface_amount: 0.69; $transparentize_surface_amount_more: 0.9; - $transparentize_surface_amount_subtract_surface: $transparentize_surface_amount - - $transparentize_amount; + $transparentize_surface_amount_subtract_surface: $transparentize_surface_amount - $transparentize_amount; } @if $transparency_enabled ==false { @@ -76,69 +74,33 @@ $onSuccessContainer: #0c1f13; $t_primary: transparentize($primary, $transparentize_amount); $t_onPrimary: transparentize($onPrimary, $transparentize_amount); $t_primaryContainer: transparentize($primaryContainer, $transparentize_amount); -$t_onPrimaryContainer: transparentize( - $onPrimaryContainer, - $transparentize_amount -); +$t_onPrimaryContainer: transparentize($onPrimaryContainer, $transparentize_amount); $t_secondary: transparentize($secondary, $transparentize_amount); $t_onSecondary: transparentize($onSecondary, $transparentize_amount); -$t_secondaryContainer: transparentize( - $secondaryContainer, - $transparentize_amount -); -$l_t_secondaryContainer: transparentize( - $secondaryContainer, - $transparentize_surface_amount_less -); -$t_onSecondaryContainer: transparentize( - $onSecondaryContainer, - $transparentize_amount -); +$t_secondaryContainer: transparentize($secondaryContainer, $transparentize_amount); +$l_t_secondaryContainer: transparentize($secondaryContainer, $transparentize_surface_amount_less); +$t_onSecondaryContainer: transparentize($onSecondaryContainer, $transparentize_amount); $t_t_t_onSecondaryContainer: transparentize($onSecondaryContainer, 0.93); $t_tertiary: transparentize($tertiary, $transparentize_amount); $t_onTertiary: transparentize($onTertiary, $transparentize_amount); -$t_tertiaryContainer: transparentize( - $tertiaryContainer, - $transparentize_amount -); -$t_onTertiaryContainer: transparentize( - $onTertiaryContainer, - $transparentize_amount -); +$t_tertiaryContainer: transparentize($tertiaryContainer, $transparentize_amount); +$t_onTertiaryContainer: transparentize($onTertiaryContainer, $transparentize_amount); $t_error: transparentize($error, $transparentize_amount); $t_onError: transparentize($onError, $transparentize_amount); $t_errorContainer: transparentize($errorContainer, $transparentize_amount); $t_onErrorContainer: transparentize($onErrorContainer, $transparentize_amount); $t_colorbarbg: transparentize($colorbarbg, $transparentize_amount); $t_background: transparentize($background, $transparentize_amount); -$t_t_background: transparentize( - $background, - $transparentize_surface_amount_more -); +$t_t_background: transparentize($background, $transparentize_surface_amount_more); $t_onBackground: transparentize($onBackground, $transparentize_amount); $t_surface: transparentize($surface, $transparentize_surface_amount); $t_t_surface: transparentize($surface, $transparentize_surface_amount_more); $t_onSurface: transparentize($onSurface, $transparentize_surface_amount); -$t_surfaceVariant: transparentize( - $surfaceVariant, - $transparentize_surface_amount -); -$t_onSurfaceVariant: transparentize( - $onSurfaceVariant, - $transparentize_surface_amount -); -$t_t_surfaceVariant: transparentize( - $surfaceVariant, - $transparentize_surface_amount_more -); -$l_t_surfaceVariant: transparentize( - $surfaceVariant, - $transparentize_surface_amount_less -); -$l_l_t_surfaceVariant: transparentize( - $surfaceVariant, - $transparentize_surface_amount_less_less -); +$t_surfaceVariant: transparentize($surfaceVariant, $transparentize_surface_amount); +$t_onSurfaceVariant: transparentize($onSurfaceVariant, $transparentize_surface_amount); +$t_t_surfaceVariant: transparentize($surfaceVariant, $transparentize_surface_amount_more); +$l_t_surfaceVariant: transparentize($surfaceVariant, $transparentize_surface_amount_less); +$l_l_t_surfaceVariant: transparentize($surfaceVariant, $transparentize_surface_amount_less_less); $t_outline: transparentize($outline, $transparentize_amount); $t_shadow: transparentize($shadow, $transparentize_amount); $t_inverseSurface: transparentize($inverseSurface, $transparentize_amount); @@ -148,10 +110,8 @@ $t_inversePrimary: transparentize($inversePrimary, $transparentize_amount); $t_success: transparentize($error, $transparentize_amount); $t_onSuccess: transparentize($onError, $transparentize_amount); $t_successContainer: transparentize($errorContainer, $transparentize_amount); -$t_onSuccessContainer: transparentize( - $onErrorContainer, - $transparentize_amount -); +$t_onSuccessContainer: transparentize($onErrorContainer, + $transparentize_amount); // Others $hovercolor: mix($t_surface, $t_onSurface, 50%); @@ -169,4 +129,4 @@ $term3: $onPrimaryContainer; $term4: $onPrimaryContainer; $term5: $onSecondaryContainer; $term6: $primary; -$term7: $onSurfaceVariant; +$term7: $onSurfaceVariant; \ No newline at end of file diff --git a/.config/ags/scss/_common.scss b/.config/ags/scss/_common.scss index 65d3887f8..0af4e65e6 100644 --- a/.config/ags/scss/_common.scss +++ b/.config/ags/scss/_common.scss @@ -103,7 +103,7 @@ tooltip { } .switch-bg { - @include menu_decel; + @include element_decel; @include full-rounding; background-color: mix($surface, $background, 50%); border: 0.136rem solid $onSurface; diff --git a/.config/ags/scss/_lib_classes.scss b/.config/ags/scss/_lib_classes.scss index 9de6194e9..844afc932 100644 --- a/.config/ags/scss/_lib_classes.scss +++ b/.config/ags/scss/_lib_classes.scss @@ -264,6 +264,14 @@ margin-right: 0rem; } +.spacing-h-4 > overlay > *:first-child { + margin-right: 0.273rem; +} + +.spacing-h-4 > overlay:last-child > * { + margin-right: 0rem; +} + .spacing-h-5 > * { margin-right: 0.341rem; } @@ -420,6 +428,14 @@ margin-bottom: 1.023rem; } +.width-10 { + min-width: 0.682rem; +} + +.height-10 { + min-width: 0.682rem; +} + .invisible { opacity: 0; background-color: transparent; diff --git a/.config/ags/scss/_lib_mixins.scss b/.config/ags/scss/_lib_mixins.scss index ee9255b5f..ba5babffc 100644 --- a/.config/ags/scss/_lib_mixins.scss +++ b/.config/ags/scss/_lib_mixins.scss @@ -42,7 +42,7 @@ $rounding_large: 1.705rem; @mixin icon-material { // Material Design Icons - font-family: "Material Symbols Rounded", "Material Symbols Outlined", + font-family: "Material Symbols Rounded", "MaterialSymbolsRounded", "Material Symbols Outlined", "Material Symbols Sharp"; } @@ -139,12 +139,10 @@ $elevation_margin: 0.476rem; } @mixin fluent_decel { - // Used for small transitions, as this looks clear transition: 200ms cubic-bezier(0.1, 1, 0, 1); } @mixin fluent_decel_long { - // Used for small transitions, as this looks clear transition: 1000ms cubic-bezier(0.1, 1, 0, 1); } diff --git a/.config/ags/scss/_material.scss b/.config/ags/scss/_material.scss index 7607c9a74..2bce3c53d 100644 --- a/.config/ags/scss/_material.scss +++ b/.config/ags/scss/_material.scss @@ -1,29 +1,29 @@ $darkmode: true; -$primary: #e4b5ff; -$onPrimary: #471868; -$primaryContainer: #5f3280; -$onPrimaryContainer: #f4d9ff; -$secondary: #d2c1d9; -$onSecondary: #372c3e; -$secondaryContainer: #4f4256; -$onSecondaryContainer: #eedcf5; -$tertiary: #f4b7ba; -$onTertiary: #4b2528; -$tertiaryContainer: #663b3e; -$onTertiaryContainer: #ffdadc; +$primary: #ffb1c3; +$onPrimary: #66002a; +$primaryContainer: #861c40; +$onPrimaryContainer: #ffd9e0; +$secondary: #e4bcc3; +$onSecondary: #42292e; +$secondaryContainer: #5c3f45; +$onSecondaryContainer: #ffd9df; +$tertiary: #ecbe91; +$onTertiary: #462a08; +$tertiaryContainer: #60401d; +$onTertiaryContainer: #ffdcb9; $error: #ffb4a9; $onError: #680003; $errorContainer: #930006; $onErrorContainer: #ffb4a9; -$colorbarbg: #111012; -$background: #111012; -$onBackground: #e7e0e5; -$surface: #1d1b1e; -$onSurface: #e7e0e5; -$surfaceVariant: #4b454d; -$onSurfaceVariant: #cdc3ce; -$outline: #968e98; +$colorbarbg: #130F10; +$background: #130F10; +$onBackground: #ecdfe0; +$surface: #201a1b; +$onSurface: #ecdfe0; +$surfaceVariant: #514345; +$onSurfaceVariant: #d6c1c4; +$outline: #9f8c8f; $shadow: #000000; -$inverseSurface: #e7e0e5; -$inverseOnSurface: #322f33; -$inversePrimary: #784a9a; +$inverseSurface: #ecdfe0; +$inverseOnSurface: #362f30; +$inversePrimary: #a53557; diff --git a/.config/ags/scss/_music.scss b/.config/ags/scss/_music.scss index d96441c99..8fcbdfea5 100644 --- a/.config/ags/scss/_music.scss +++ b/.config/ags/scss/_music.scss @@ -41,7 +41,7 @@ $onSecondaryContainer: mix($color7, $color2, 90%); .osd-music-cover-fallback { - @include menu_decel; + @include element_decel; @include small-rounding; // margin: 1.023rem; min-width: 7.5rem; @@ -73,21 +73,21 @@ $onSecondaryContainer: mix($color7, $color2, 90%); } .osd-music-title { - @include menu_decel; + @include element_decel; @include titlefont; font-size: 1.364rem; color: $onSecondaryContainer; } .osd-music-artists { - @include menu_decel; + @include element_decel; @include mainfont; font-size: 0.955rem; color: mix($onSecondaryContainer, $secondaryContainer, 80%); } .osd-music-pill { - @include menu_decel; + @include element_decel; @include full-rounding; @include titlefont; min-width: 1.833rem; @@ -97,7 +97,7 @@ $onSecondaryContainer: mix($color7, $color2, 90%); } .osd-music-controls { - @include menu_decel; + @include element_decel; @include full-rounding; @include titlefont; min-width: 1.833rem; @@ -123,7 +123,7 @@ $onSecondaryContainer: mix($color7, $color2, 90%); } .osd-music-controlbtn-txt { - @include menu_decel; + @include element_decel; transition: 100ms cubic-bezier(0.05, 0.7, 0.1, 1); @include icon-material; font-size: 1.364rem; diff --git a/.config/ags/scss/_notifications.scss b/.config/ags/scss/_notifications.scss index 24357c0b4..a5de8e7c5 100644 --- a/.config/ags/scss/_notifications.scss +++ b/.config/ags/scss/_notifications.scss @@ -28,6 +28,18 @@ $notif_surface: $t_background; padding-right: $rounding_small + 0.545rem; } +.notif-clicked-low { + background-color: mix($l_l_t_surfaceVariant, $t_onSurfaceVariant, 85%); +} + +.notif-clicked-normal { + background-color: mix($l_l_t_surfaceVariant, $t_onSurfaceVariant, 85%); +} + +.notif-clicked-critical { + background-color: mix($secondaryContainer, $onSecondaryContainer, 95%); +} + .popup-notif-low { @include notif-rounding; min-width: 30.682rem; @@ -55,6 +67,18 @@ $notif_surface: $t_background; padding-right: $rounding_small + 0.545rem; } +.popup-notif-clicked-low { + background-color: mix($notif_surface, $onBackground, 94%); +} + +.popup-notif-clicked-normal { + background-color: mix($notif_surface, $onBackground, 94%); +} + +.popup-notif-clicked-critical { + background-color: mix($secondaryContainer, $onSecondaryContainer, 96%); +} + .notif-body-low { color: mix($onSurfaceVariant, $surfaceVariant, 67%); } @@ -138,10 +162,8 @@ $notif_surface: $t_background; .osd-notif { @include notif-rounding; - background-color: transparentize( - $background, - $transparentize_surface_amount_subtract_surface - ); + background-color: transparentize($background, + $transparentize_surface_amount_subtract_surface ); min-width: 30.682rem; } @@ -217,4 +239,4 @@ $notif_surface: $t_background; .notif-action-critical:active { background-color: mix($t_onSecondaryContainer, $t_secondaryContainer, 23%); -} +} \ No newline at end of file diff --git a/.config/ags/scss/_overview.scss b/.config/ags/scss/_overview.scss index 9695517fe..8afa43b81 100644 --- a/.config/ags/scss/_overview.scss +++ b/.config/ags/scss/_overview.scss @@ -3,7 +3,7 @@ } .overview-search-box { - @include menu_decel; + @include element_decel; @include large-rounding; @include elevation-border; @include elevation2; diff --git a/.config/ags/scss/_sidebars.scss b/.config/ags/scss/_sidebars.scss index fdec7bc8f..c6b00853b 100644 --- a/.config/ags/scss/_sidebars.scss +++ b/.config/ags/scss/_sidebars.scss @@ -78,7 +78,7 @@ $onChatgpt: $onPrimary; .sidebar-iconbutton { @include full-rounding; - @include menu_decel; + @include element_decel; color: $onSurface; min-width: 2.727rem; min-height: 2.727rem; @@ -94,18 +94,12 @@ $onChatgpt: $onPrimary; } .sidebar-button { - @include menu_decel; + @include element_decel; padding: 0rem $rounding_small; background-color: $t_secondaryContainer; color: $onSecondaryContainer; } -.sidebar-button-nopad { - @include menu_decel; - background-color: $t_secondaryContainer; - color: $onSecondaryContainer; -} - .sidebar-button:hover, .sidebar-button:focus { background-color: $hovercolor; @@ -115,33 +109,6 @@ $onChatgpt: $onPrimary; background-color: $activecolor; } -.sidebar-button-nopad:hover, -.sidebar-button-nopad:focus { - background-color: $hovercolor; -} - -.sidebar-button-nopad:active { - background-color: $activecolor; -} - -.sidebar-button-left { - border-top-left-radius: $rounding_small; - border-bottom-left-radius: $rounding_small; -} - -.sidebar-button-right { - border-top-right-radius: $rounding_small; - border-bottom-right-radius: $rounding_mediumsmall; -} - -.sidebar-button-alone { - @include small-rounding; -} - -.sidebar-button-alone-normal { - @include small-rounding; -} - .sidebar-button-active { background-color: $primary; color: $onPrimary; @@ -236,6 +203,7 @@ $onChatgpt: $onPrimary; slider { @include full-rounding; + @include element_decel; min-width: 0.273rem; min-height: 2.045rem; background-color: $t_onSurfaceVariant; @@ -253,7 +221,7 @@ $onChatgpt: $onPrimary; .sidebar-calendar-btn { @include full-rounding; - @include menu_decel; + @include element_decel; min-height: 2.523rem; min-width: 2.523rem; color: $onSurface; @@ -297,6 +265,7 @@ $onChatgpt: $onPrimary; .sidebar-calendar-monthyear-btn { @include full-rounding; + @include element_decel; padding: 0rem 0.682rem; background-color: $t_surfaceVariant; color: $onSurfaceVariant; @@ -315,6 +284,7 @@ $onChatgpt: $onPrimary; .sidebar-calendar-monthshift-btn { @include full-rounding; + @include element_decel; min-width: 2.045rem; min-height: 2.045rem; background-color: $t_surfaceVariant; @@ -333,7 +303,7 @@ $onChatgpt: $onPrimary; .sidebar-selector-tab { @include small-rounding; - @include menu_decel; + @include element_decel; min-height: 2.5rem; color: $onSurface; } @@ -357,7 +327,7 @@ $onChatgpt: $onPrimary; } .sidebar-selector-highlight { - transition: 180ms ease-in-out; // Doesn't look that good, but it syncs with GtkStack animation of the actual todo widget content + transition: 180ms ease-in-out; // Doesn't look that good, but it syncs with the GtkStack color: $primary; // padding: 0rem 2.045rem; min-height: 0.205rem; @@ -372,6 +342,7 @@ $onChatgpt: $onPrimary; } .sidebar-todo-item-action { + @include element_decel; border-radius: 9999px; min-width: 1.705rem; min-height: 1.705rem; @@ -401,13 +372,14 @@ $onChatgpt: $onPrimary; .sidebar-todo-new { @include full-rounding; + @include element_decel; color: $onSecondaryContainer; margin: 0.341rem; padding: 0.205rem 0.545rem; border: 0.068rem solid $onSurface; } -.sidebar-todo-newz, +.sidebar-todo-new, .sidebar-todo-new:focus { background-color: mix($t_secondaryContainer, $t_onSecondaryContainer, 97%); } @@ -417,7 +389,7 @@ $onChatgpt: $onPrimary; } .sidebar-todo-add { - @include menu_decel; + @include element_decel; @include small-rounding; min-width: 1.705rem; min-height: 1.705rem; @@ -435,7 +407,7 @@ $onChatgpt: $onPrimary; } .sidebar-todo-add-available { - @include menu_decel; + @include element_decel; @include small-rounding; min-width: 1.705rem; min-height: 1.705rem; @@ -454,7 +426,7 @@ $onChatgpt: $onPrimary; } .sidebar-todo-entry { - @include menu_decel; + @include element_decel; @include small-rounding; background-color: $surfaceVariant; color: $onSurfaceVariant; @@ -491,7 +463,7 @@ $onChatgpt: $onPrimary; } .sidebar-chat-apiswitcher-icon { - @include menu_decel; + @include element_decel; @include full-rounding; min-width: 2.182rem; min-height: 2.182rem; @@ -504,7 +476,7 @@ $onChatgpt: $onPrimary; } .sidebar-chat-viewport { - @include menu_decel; + @include element_decel; // margin: 0.682rem 0rem; padding: 0.682rem 0rem; } @@ -523,8 +495,16 @@ $onChatgpt: $onPrimary; min-width: 0rem; } +.sidebar-chat-wrapper { + transition: 400ms cubic-bezier(0.1, 1, 0, 1); +} + +.sidebar-chat-wrapper-extended { + min-height: 7.500rem; +} + .sidebar-chat-send { - @include menu_decel; + @include element_decel; min-width: 1.705rem; min-height: 1.705rem; border-radius: $rounding_medium - 0.681rem; @@ -558,7 +538,7 @@ $onChatgpt: $onPrimary; } .sidebar-chat-indicator { - @include menu_decel; + @include element_decel; @include full-rounding; min-width: 0.136rem; background-color: $onBackground; @@ -622,6 +602,7 @@ $onChatgpt: $onPrimary; .sidebar-chat-codeblock-topbar-btn { @include full-rounding; + @include element_decel; padding: 0.273rem 0.477rem; } @@ -660,7 +641,7 @@ $onChatgpt: $onPrimary; .sidebar-chat-welcome-logo { @include full-rounding; - @include menu_decel; + @include element_decel; min-height: 4.773rem; min-width: 4.773rem; @include icon-material; @@ -670,12 +651,13 @@ $onChatgpt: $onPrimary; } .sidebar-chat-chip { - @include menu_decel; + @include element_decel; @include small-rounding; padding: 0.341rem 0.477rem; } .sidebar-chat-chip-action { + @include element_decel; background-color: $textboxColor; color: $onSurfaceVariant; } @@ -695,7 +677,7 @@ $onChatgpt: $onPrimary; } .sidebar-chat-chip-toggle { - @include menu_decel; + @include element_decel; @include small-rounding; padding: 0.341rem 0.477rem; background-color: $textboxColor; @@ -713,7 +695,7 @@ $onChatgpt: $onPrimary; .sidebar-pin { @include small-rounding; - @include menu_decel; + @include element_decel; min-height: 2.386rem; min-width: 2.386rem; color: $onSurface; @@ -770,6 +752,7 @@ $onChatgpt: $onPrimary; } .sidebar-waifu-image-actions { + @include element_decel; padding: 0.313rem; } diff --git a/.config/ags/services/chatgpt.js b/.config/ags/services/chatgpt.js index 05b3f726e..793d1a50f 100644 --- a/.config/ags/services/chatgpt.js +++ b/.config/ags/services/chatgpt.js @@ -19,8 +19,6 @@ const initMessages = { role: "assistant", content: "## NixOS advantages\n- **Reproducible**: A config working on one device will also work on another\n- **Declarative**: One config language to rule them all. Effortlessly share them with others.\n- **Reliable**: Per-program software versioning. Mitigates the impact of software breakage", }, { role: "user", content: "whats skeumorphism", }, { role: "assistant", content: "## Skeuomorphism\n- A design philosophy- From early days of interface designing- Tries to imitate real-life objects- It's in fact still used by Apple in their icons until today.", }, - { role: "user", content: "REDALiCE", }, - { role: "assistant", content: "## REDALiCE \n- Japanese Hardcore artist\n- Leader of HARDCORE TANO*C, Japan's biggest hardcore record\n- A few of his tracks: SAIKYOSTRONGER, ALiVE, RESONANCE", }, ]; function expandTilde(path) { diff --git a/.config/ags/services/gemini.js b/.config/ags/services/gemini.js index 5a69a8291..02b501765 100644 --- a/.config/ags/services/gemini.js +++ b/.config/ags/services/gemini.js @@ -17,8 +17,6 @@ const initMessages = { role: "model", parts: [{ text: "## NixOS advantages\n- **Reproducible**: A config working on one device will also work on another\n- **Declarative**: One config language to rule them all. Effortlessly share them with others.\n- **Reliable**: Per-program software versioning. Mitigates the impact of software breakage" }], }, { role: "user", parts: [{ text: "whats skeumorphism" }], }, { role: "model", parts: [{ text: "## Skeuomorphism\n- A design philosophy- From early days of interface designing- Tries to imitate real-life objects- It's in fact still used by Apple in their icons until today." }], }, - { role: "user", parts: [{ text: "REDALiCE" }], }, - { role: "model", parts: [{ text: "## REDALiCE \n- Japanese Hardcore artist\n- Leader of HARDCORE TANO*C, Japan's biggest hardcore record\n- A few of his tracks: SAIKYOSTRONGER, ALiVE, RESONANCE" }], }, { role: "user", parts: [{ text: "\"ignorance is bliss\"" }], }, { role: "model", parts: [{ text: "## \"Ignorance is bliss\"\n- A Latin proverb that means being unaware of something negative can be a source of happiness\n- Often used to justify avoiding difficult truths or responsibilities\n- Can also be interpreted as a warning against seeking knowledge that may bring pain or sorrow" }], }, ]; @@ -40,7 +38,7 @@ function replaceapidom(URL) { } return URL; } -const CHAT_MODELS = ["gpt-3.5-turbo-1106", "gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-0613"] +const CHAT_MODELS = ["gemini-pro"] const ONE_CYCLE_COUNT = 3; class GeminiMessage extends Service { @@ -251,7 +249,7 @@ class GeminiService extends Service { const session = new Soup.Session(); const message = new Soup.Message({ method: 'POST', - uri: GLib.Uri.parse(replaceapidom(`https://generativelanguage.googleapis.com/v1/models/gemini-pro:streamGenerateContent?key=${this._key}`), GLib.UriFlags.NONE), + uri: GLib.Uri.parse(replaceapidom(`https://generativelanguage.googleapis.com/v1/models/${this.modelName}:streamGenerateContent?key=${this._key}`), GLib.UriFlags.NONE), }); message.request_headers.append('Content-Type', `application/json`); message.set_request_body_from_bytes('application/json', new GLib.Bytes(JSON.stringify(body))); diff --git a/.config/ags/services/messages.js b/.config/ags/services/messages.js index b282b3f45..7f0db3d83 100644 --- a/.config/ags/services/messages.js +++ b/.config/ags/services/messages.js @@ -11,15 +11,16 @@ export function fileExists(filePath) { const FIRST_RUN_FILE = "firstrun.txt"; const FIRST_RUN_PATH = GLib.build_filenamev([GLib.get_user_cache_dir(), "ags", "user", FIRST_RUN_FILE]); const FIRST_RUN_FILE_CONTENT = "Just a file to confirm that you have been greeted ;)"; -const APP_NAME = "ags"; +const APP_NAME = "illogical-impulse"; const FIRST_RUN_NOTIF_TITLE = "Welcome!"; -const FIRST_RUN_NOTIF_BODY = `Looks like this is your first run.\nHit Super + / for a list of keybinds.`; +const FIRST_RUN_NOTIF_BODY = `Looks like this is your first run. For a list of keybinds, hit Super + /.`; export async function firstRunWelcome() { if (!fileExists(FIRST_RUN_PATH)) { Utils.writeFile(FIRST_RUN_FILE_CONTENT, FIRST_RUN_PATH) .then(() => { // Note that we add a little delay to make sure the cool circular progress works + Utils.execAsync(['hyprctl', 'keyword', 'bind', "Super,Slash,exec,ags -t cheatsheet"]); Utils.execAsync(['bash', '-c', `sleep 0.5; notify-send "Millis since epoch" "$(date +%s%N | cut -b1-13)"; sleep 0.5; notify-send '${FIRST_RUN_NOTIF_TITLE}' '${FIRST_RUN_NOTIF_BODY}' -a '${APP_NAME}' &` ]).catch(print) diff --git a/.config/ags/services/waifus.js b/.config/ags/services/waifus.js index 11afb77d3..30ba8e73f 100644 --- a/.config/ags/services/waifus.js +++ b/.config/ags/services/waifus.js @@ -83,12 +83,14 @@ class WaifuService extends Service { async fetch(msg) { // Init - const userArgs = msg.split(' '); + const userArgs = msg.split(/\s+/); + let taglist = []; this._nsfw = false; // Construct body/headers for (let i = 0; i < userArgs.length; i++) { - const thisArg = userArgs[i]; + const thisArg = userArgs[i].trim(); + if(thisArg.length == 0) continue; if (thisArg == '--im') this._mode = 'im'; else if (thisArg == '--nekos') this._mode = 'nekos'; else if (thisArg.includes('pics')) this._mode = 'pics'; diff --git a/.config/ags/style.css b/.config/ags/style.css index cf6b98153..e6f208c4e 100644 --- a/.config/ags/style.css +++ b/.config/ags/style.css @@ -41,16 +41,16 @@ transition: 0ms; } .txt { - color: #e7e0e5; } + color: #ecdfe0; } .txt-primary { - color: #eccbff; } + color: #ffc8d5; } .txt-onSecondaryContainer { - color: #eedcf5; } + color: #ffd9df; } .txt-onSurfaceVariant { - color: #cdc3ce; } + color: #d6c1c4; } .txt-shadow { text-shadow: 1px 2px 8px rgba(0, 0, 0, 0.69); @@ -104,10 +104,10 @@ font-size: 0px; } .txt-subtext { - color: #a6a1a5; } + color: #aaa0a1; } .txt-action { - color: #c7c1c5; } + color: #cbc0c1; } .txt-semibold { font-weight: 500; } @@ -121,8 +121,8 @@ .btn-primary { border-radius: 9999px; -gtk-outline-radius: 9999px; - background-color: #eccbff; - color: #471868; + background-color: #ffc8d5; + color: #66002a; padding: 0.682rem 1.023rem; } .titlefont { @@ -132,20 +132,20 @@ font-family: "Rubik", "Geist", "AR One Sans", "Reddit Sans", "Inter", "Roboto", "Ubuntu", "Noto Sans", sans-serif; } .icon-material { - font-family: "Material Symbols Rounded", "Material Symbols Outlined", "Material Symbols Sharp"; } + font-family: "Material Symbols Rounded", "MaterialSymbolsRounded", "Material Symbols Outlined", "Material Symbols Sharp"; } .icon-nerd { font-family: "SpaceMono NF", "SpaceMono Nerd Font", "JetBrains Mono NF", "JetBrains Mono Nerd Font", monospace; } .separator-line { - background-color: #968e98; + background-color: #9f8c8f; min-width: 0.068rem; min-height: 0.068rem; } .separator-circle { border-radius: 9999px; -gtk-outline-radius: 9999px; - background-color: #968e98; + background-color: #9f8c8f; margin: 0rem 0.682rem; min-width: 0.273rem; min-height: 0.273rem; } @@ -216,6 +216,12 @@ .spacing-h-4 > *:last-child { margin-right: 0rem; } +.spacing-h-4 > overlay > *:first-child { + margin-right: 0.273rem; } + +.spacing-h-4 > overlay:last-child > * { + margin-right: 0rem; } + .spacing-h-5 > * { margin-right: 0.341rem; } @@ -334,6 +340,12 @@ .margin-bottom-15 { margin-bottom: 1.023rem; } +.width-10 { + min-width: 0.682rem; } + +.height-10 { + min-width: 0.682rem; } + .invisible { opacity: 0; background-color: transparent; @@ -403,10 +415,10 @@ transition: 500ms cubic-bezier(0.85, 0, 0.15, 1); } * { - caret-color: #eccbff; } + caret-color: #ffc8d5; } * selection { - background-color: #d2c1d9; - color: #372c3e; } + background-color: #e4bcc3; + color: #42292e; } @keyframes appear { from { @@ -415,13 +427,13 @@ opacity: 1; } } menu { - border-top: 1px solid rgba(60, 57, 61, 0.121); - border-left: 1px solid rgba(60, 57, 61, 0.121); - border-right: 1px solid rgba(46, 43, 47, 0.1105); - border-bottom: 1px solid rgba(46, 43, 47, 0.1105); + border-top: 1px solid rgba(63, 56, 57, 0.121); + border-left: 1px solid rgba(63, 56, 57, 0.121); + border-right: 1px solid rgba(49, 42, 43, 0.1105); + border-bottom: 1px solid rgba(49, 42, 43, 0.1105); padding: 0.681rem; - background: #38343a; - color: #cdc3ce; + background: #3d3234; + color: #d6c1c4; border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; animation-name: appear; @@ -444,10 +456,10 @@ menu > menuitem { menu > menuitem:hover, menu > menuitem:focus { - background-color: #474249; } + background-color: #4c4042; } menu > menuitem:active { - background-color: #565158; } + background-color: #5c4f51; } radio { border-radius: 9999px; @@ -455,13 +467,13 @@ radio { margin: 0.273rem; min-width: 15px; min-height: 15px; - border: 0.068rem solid #968e98; } + border: 0.068rem solid #9f8c8f; } radio:checked { min-width: 8px; min-height: 8px; - background-color: #471868; - border: 0.477rem solid #eccbff; } + background-color: #66002a; + border: 0.477rem solid #ffc8d5; } tooltip { animation-name: appear; @@ -470,43 +482,43 @@ tooltip { animation-iteration-count: 1; border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; - background-color: #38343a; - color: #cdc3ce; - border: 1px solid #cdc3ce; } + background-color: #3d3234; + color: #d6c1c4; + border: 1px solid #d6c1c4; } .configtoggle-box { padding: 0.205rem 0.341rem; border: 0.136rem solid transparent; } .configtoggle-box:focus { - border: 0.136rem solid #6f6a6f; } + border: 0.136rem solid #73696a; } .switch-bg { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 9999px; -gtk-outline-radius: 9999px; - background-color: #171518; - border: 0.136rem solid #e7e0e5; + background-color: #1a1415; + border: 0.136rem solid #ecdfe0; min-width: 2.864rem; min-height: 1.637rem; } .switch-bg-true { - background-color: #eccbff; - border: 0.136rem solid #eccbff; } + background-color: #ffc8d5; + border: 0.136rem solid #ffc8d5; } .switch-fg { border-radius: 9999px; -gtk-outline-radius: 9999px; transition: 300ms cubic-bezier(0.1, 1, 0, 1); - background-color: #e7e0e5; - color: #1f1c20; + background-color: #ecdfe0; + color: #221b1c; min-width: 0.819rem; min-height: 0.819rem; margin-left: 0.477rem; } .switch-fg-true { - background-color: #471868; - color: #eccbff; + background-color: #66002a; + color: #ffc8d5; min-width: 1.431rem; min-height: 1.431rem; margin-left: 1.431rem; } @@ -519,14 +531,14 @@ tooltip { .segment-container { border-radius: 9999px; -gtk-outline-radius: 9999px; - border: 0.068rem solid #968e98; } + border: 0.068rem solid #9f8c8f; } .segment-container > *:first-child { border-top-left-radius: 9999px; border-bottom-left-radius: 9999px; } .segment-container > * { - border-right: 0.068rem solid #968e98; + border-right: 0.068rem solid #9f8c8f; padding: 0.341rem 0.682rem; } .segment-container > *:last-child { @@ -535,20 +547,20 @@ tooltip { border-bottom-right-radius: 9999px; } .segment-btn { - color: #e7e0e5; } + color: #ecdfe0; } .segment-btn:focus, .segment-btn:hover { background-color: rgba(128, 128, 128, 0.3); } .segment-btn-enabled { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .segment-btn-enabled:hover, .segment-btn-enabled:focus { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .gap-v-5 { min-height: 0.341rem; } @@ -572,7 +584,7 @@ tooltip { min-height: 2.727rem; } .bar-bg { - background-color: #0f0e10; + background-color: #110d0e; min-height: 2.727rem; } .bar-sidespace { @@ -582,7 +594,7 @@ tooltip { padding: 0.273rem 0rem; } .bar-group { - background-color: rgba(56, 52, 58, 0.45); } + background-color: rgba(61, 50, 52, 0.45); } .bar-group-pad { padding: 0.205rem; } @@ -597,20 +609,6 @@ tooltip { padding-right: 1.023rem; padding-left: 0.341rem; } -.bar-group-pad-left { - padding-left: 1.364rem; - padding-right: 0.681rem; } - -.bar-group-pad-right { - padding-left: 0.681rem; - padding-right: 1.364rem; } - -.bar-group-pad-leftonly { - padding-left: 0.681rem; } - -.bar-group-pad-rightonly { - padding-right: 0.681rem; } - .bar-group-standalone { border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; @@ -641,23 +639,23 @@ tooltip { .bar-ws { min-width: 1.774rem; - color: #656265; - color: #706d70; } + color: #696162; + color: #746c6d; } .bar-ws-active { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .bar-ws-occupied { - background-color: #38343a; - color: #cdc3ce; } + background-color: #3d3234; + color: #d6c1c4; } .bar-separator { border-radius: 9999px; -gtk-outline-radius: 9999px; min-width: 0.341rem; min-height: 0.341rem; - background-color: rgba(51, 48, 52, 0.31); + background-color: rgba(54, 47, 48, 0.31); margin: 0rem 0.341rem; } .bar-clock-box { @@ -670,16 +668,17 @@ tooltip { .bar-date { font-family: "Gabarito", "Poppins", "Lexend", sans-serif; font-size: 1rem; - color: #e7e0e5; } + color: #ecdfe0; } .bar-batt { border-radius: 9999px; -gtk-outline-radius: 9999px; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-height: 1.77rem; min-width: 1.77rem; border-radius: 10rem; - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .bar-sidemodule { min-width: 26rem; } @@ -697,50 +696,43 @@ tooltip { min-width: 0.068rem; min-height: 1.636rem; padding: 0rem; - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .bar-batt-circprog-low { - transition: 1000ms cubic-bezier(0.1, 1, 0, 1); - min-width: 0.068rem; - min-height: 1.636rem; - padding: 0rem; background-color: #ffb4a9; color: #930006; } .bar-batt-circprog-full { - transition: 1000ms cubic-bezier(0.1, 1, 0, 1); - min-width: 0.068rem; - min-height: 1.636rem; - padding: 0rem; background-color: #374b3e; color: #d1e9d6; } .bar-music-playstate { + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-height: 1.77rem; min-width: 1.77rem; border-radius: 10rem; - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .bar-music-circprog { transition: 1000ms cubic-bezier(0.1, 1, 0, 1); min-width: 0.068rem; min-height: 1.636rem; padding: 0rem; - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .bar-music-playstate-playing { min-height: 1.77rem; min-width: 1.77rem; border-radius: 10rem; - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .bar-music-playstate-txt { transition: 100ms cubic-bezier(0.05, 0.7, 0.1, 1); - font-family: "Material Symbols Rounded", "Material Symbols Outlined", "Material Symbols Sharp"; } + font-family: "Material Symbols Rounded", "MaterialSymbolsRounded", "Material Symbols Outlined", "Material Symbols Sharp"; } .bar-music-cover { background-position: center; @@ -756,20 +748,6 @@ tooltip { border-radius: 1.364rem; background-color: rgba(30, 30, 30, 0.6); } -.bar-music-bottom-bg { - border-radius: 1.364rem; - min-width: 34.091rem; } - -.bar-music-bottom-ctl-bg { - border-radius: 1.364rem; - background-color: rgba(30, 30, 30, 0.6); } - -.bar-music-extended-textbox { - margin: 1.023rem; } - -.bar-music-bottom-cover { - border-radius: 10rem; } - .bar-music-hide-false { transition: 300ms cubic-bezier(0.1, 1, 0, 1); transition-duration: 100ms; @@ -780,60 +758,12 @@ tooltip { transition-duration: 100ms; opacity: 0; } -.bar-music-btn { - font-size: 1.364rem; - border-radius: 10rem; - min-height: 2.591rem; - min-width: 2.591rem; } - -.bar-music-btn:hover, -.bar-music-btn:focus { - background-color: rgba(128, 128, 128, 0.3); } - -.bar-prog-batt { - min-height: 0.955rem; - min-width: 0.068rem; - padding: 0rem; - border-radius: 10rem; } - .bar-prog-batt trough { - min-height: 0.954rem; - min-width: 0.068rem; - border-radius: 10rem; } - .bar-prog-batt progress { - min-height: 0.68rem; - min-width: 0.68rem; - margin: 0rem 0.137rem; - border-radius: 10rem; - background-color: #eedcf5; } - -.bar-prog-batt-low progress { - background-color: #930006; } - -.bar-prog-batt-full progress { - background-color: #d1e9d6; } - -.bar-batt-chargestate { - border-radius: 10rem; - background-color: transparent; } - -.bar-batt-chargestate-charging { - border-radius: 10rem; - min-width: 0.681rem; - min-height: 0.681rem; - background-color: #cdc3ce; } - -.bar-batt-chargestate-charging-smaller { - border-radius: 10rem; - min-width: 0.409rem; - min-height: 0.409rem; - background-color: #cdc3ce; } - .bar-corner-spacing { min-width: 1.705rem; min-height: 1.705rem; } .corner { - background-color: #0f0e10; + background-color: #110d0e; border-radius: 1.705rem; -gtk-outline-radius: 1.705rem; } @@ -845,7 +775,7 @@ tooltip { .bar-topdesc { margin-top: -0.136rem; margin-bottom: -0.341rem; - color: #a6a1a5; } + color: #aaa0a1; } .bar-space-button { padding: 0.341rem; } @@ -877,47 +807,49 @@ tooltip { .bar-systray-item { border-radius: 9999px; -gtk-outline-radius: 9999px; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-height: 1.032rem; min-width: 1.032rem; } .bar-statusicons { border-radius: 9999px; -gtk-outline-radius: 9999px; - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); margin: 0.273rem; padding: 0rem 0.614rem; } .bar-statusicons-hover { - background-color: #252325; } + background-color: #272223; } .bar-statusicons-active { - background-color: #3a383b; } + background-color: #3d3738; } .bar-util-btn { border-radius: 9999px; -gtk-outline-radius: 9999px; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-height: 1.77rem; min-width: 1.77rem; - background-color: #38343a; } + background-color: #3d3234; } .bar-util-btn:hover, .bar-util-btn:focus { - background-color: #474249; } + background-color: #4c4042; } .bar-util-btn:active { - background-color: #565158; } + background-color: #5c4f51; } .cheatsheet-bg { border-radius: 1.705rem; -gtk-outline-radius: 1.705rem; - border-top: 1px solid rgba(167, 161, 166, 0.19); - border-left: 1px solid rgba(167, 161, 166, 0.19); - border-right: 1px solid rgba(131, 126, 131, 0.145); - border-bottom: 1px solid rgba(131, 126, 131, 0.145); + border-top: 1px solid rgba(171, 160, 161, 0.19); + border-left: 1px solid rgba(171, 160, 161, 0.19); + border-right: 1px solid rgba(135, 125, 126, 0.145); + border-bottom: 1px solid rgba(135, 125, 126, 0.145); box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; margin-bottom: 0.682rem; - background-color: #0f0e10; + background-color: #110d0e; padding: 1.364rem; } .cheatsheet-key { @@ -928,19 +860,19 @@ tooltip { padding: 0.136rem 0.205rem; border-radius: 0.409rem; -gtk-outline-radius: 0.409rem; - color: #eccbff; - border: 0.068rem solid #eccbff; - box-shadow: 0rem 0.136rem 0rem #eccbff; + color: #ffc8d5; + border: 0.068rem solid #ffc8d5; + box-shadow: 0rem 0.136rem 0rem #ffc8d5; font-weight: 500; } .cheatsheet-key-notkey { min-height: 1.364rem; padding: 0.136rem 0.205rem; margin: 0.17rem; - color: #f4d9ff; } + color: #ffd9e0; } .cheatsheet-closebtn { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 9999px; -gtk-outline-radius: 9999px; min-width: 2.386rem; @@ -970,12 +902,12 @@ tooltip { .bg-time-clock { font-family: 'Gabarito'; font-size: 5.795rem; - color: #e7e0e5; } + color: #ecdfe0; } .bg-time-date { font-family: 'Gabarito'; font-size: 2.591rem; - color: #e7e0e5; } + color: #ecdfe0; } .bg-distro-box { border-radius: 1.705rem; @@ -986,12 +918,12 @@ tooltip { .bg-distro-txt { font-family: 'Gabarito'; font-size: 1.432rem; - color: #e7e0e5; } + color: #ecdfe0; } .bg-distro-name { font-family: 'Gabarito'; font-size: 1.432rem; - color: #eedcf5; } + color: #ffd9df; } .bg-graph { color: rgba(255, 255, 255, 0.5); @@ -1000,25 +932,25 @@ tooltip { .bg-quicklaunch-title { font-family: "Rubik", "Geist", "AR One Sans", "Reddit Sans", "Inter", "Roboto", "Ubuntu", "Noto Sans", sans-serif; - color: #cdc3ce; } + color: #d6c1c4; } .bg-quicklaunch-btn { font-family: "Rubik", "Geist", "AR One Sans", "Reddit Sans", "Inter", "Roboto", "Ubuntu", "Noto Sans", sans-serif; border-radius: 9999px; -gtk-outline-radius: 9999px; - background-color: #38343a; - color: #cdc3ce; - border: 0.068rem solid #a6a1a5; + background-color: #3d3234; + color: #d6c1c4; + border: 0.068rem solid #aaa0a1; min-width: 4.432rem; min-height: 2.045rem; padding: 0.273rem 0.682rem; } .bg-quicklaunch-btn:hover, .bg-quicklaunch-btn:focus { - background-color: #3f3b41; } + background-color: #45393b; } .bg-quicklaunch-btn:active { - background-color: #474249; } + background-color: #4c4042; } .bg-system-bg { border-radius: 1.159rem; @@ -1030,14 +962,14 @@ tooltip { min-height: 4.091rem; font-size: 0px; padding: 0rem; - background-color: #38343a; } + background-color: #3d3234; } .dock-bg { border-radius: 1.705rem; -gtk-outline-radius: 1.705rem; box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; - background-color: #0f0e10; + background-color: #110d0e; padding: 0.682rem; } .dock-app-btn { @@ -1047,10 +979,10 @@ tooltip { .dock-app-btn:hover, .dock-app-btn:focus { - background-color: rgba(41, 38, 42, 0.31); } + background-color: rgba(44, 37, 38, 0.31); } .dock-app-btn:active { - background-color: rgba(61, 57, 62, 0.31); } + background-color: rgba(64, 56, 57, 0.31); } .dock-app-icon { min-width: 3.409rem; @@ -1058,20 +990,20 @@ tooltip { .dock-separator { min-width: 0.068rem; - background-color: #38343a; } + background-color: #3d3234; } .osd-bg { min-width: 8.864rem; min-height: 3.409rem; } .osd-value { - border-top: 1px solid rgba(167, 161, 166, 0.19); - border-left: 1px solid rgba(167, 161, 166, 0.19); - border-right: 1px solid rgba(131, 126, 131, 0.145); - border-bottom: 1px solid rgba(131, 126, 131, 0.145); + border-top: 1px solid rgba(171, 160, 161, 0.19); + border-left: 1px solid rgba(171, 160, 161, 0.19); + border-right: 1px solid rgba(135, 125, 126, 0.145); + border-bottom: 1px solid rgba(135, 125, 126, 0.145); box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; - background-color: #0f0e10; + background-color: #110d0e; border-radius: 1.023rem; padding: 0.625rem 1.023rem; padding-top: 0.313rem; } @@ -1086,36 +1018,36 @@ tooltip { min-height: 0.954rem; min-width: 0.068rem; border-radius: 10rem; - background-color: #4f4256; } + background-color: #5c3f45; } .osd-progress progress { transition: 200ms cubic-bezier(0.1, 1, 0, 1); min-height: 0.680rem; min-width: 0.680rem; margin: 0rem 0.137rem; border-radius: 10rem; - background-color: #eedcf5; } + background-color: #ffd9df; } .osd-icon { - color: #f4d9ff; } + color: #ffd9e0; } .osd-label { font-size: 1.023rem; font-weight: 500; - color: #e7e0e5; + color: #ecdfe0; margin-top: 0.341rem; } .osd-value-txt { font-family: "Gabarito", "Poppins", "Lexend", sans-serif; font-size: 1.688rem; font-weight: 500; - color: #e7e0e5; } + color: #ecdfe0; } .osd-notifs { padding-top: 0.313rem; } .osd-colorscheme { border-radius: 1.023rem; - background-color: #0f0e10; + background-color: #110d0e; padding: 1.023rem; box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; } @@ -1133,46 +1065,46 @@ tooltip { margin: 0.409rem; } .osd-color-primary { - background-color: #eccbff; - color: #471868; } + background-color: #ffc8d5; + color: #66002a; } .osd-color-primary box { - background-color: #471868; } + background-color: #66002a; } .osd-color-primaryContainer { - background-color: #6f478d; - color: #f4d9ff; } + background-color: #923353; + color: #ffd9e0; } .osd-color-primaryContainer box { - background-color: #f4d9ff; } + background-color: #ffd9e0; } .osd-color-secondary { - background-color: #d2c1d9; - color: #372c3e; } + background-color: #e4bcc3; + color: #42292e; } .osd-color-secondary box { - background-color: #372c3e; } + background-color: #42292e; } .osd-color-secondaryContainer { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .osd-color-secondaryContainer box { - background-color: #eedcf5; } + background-color: #ffd9df; } .osd-color-surfaceVariant { - background-color: #38343a; - color: #cdc3ce; } + background-color: #3d3234; + color: #d6c1c4; } .osd-color-surfaceVariant box { - background-color: #cdc3ce; } + background-color: #d6c1c4; } .osd-color-surface { - background-color: #1f1c20; - color: #e7e0e5; } + background-color: #221b1c; + color: #ecdfe0; } .osd-color-surface box { - background-color: #e7e0e5; } + background-color: #ecdfe0; } .osd-color-background { - background-color: #0f0e10; - color: #e7e0e5; } + background-color: #110d0e; + color: #ecdfe0; } .osd-color-background box { - background-color: #e7e0e5; } + background-color: #ecdfe0; } .osd-show { transition: 200ms cubic-bezier(0.1, 1, 0, 1); } @@ -1184,32 +1116,32 @@ tooltip { margin-top: 2.727rem; } .overview-search-box { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 1.705rem; -gtk-outline-radius: 1.705rem; - border-top: 1px solid rgba(167, 161, 166, 0.19); - border-left: 1px solid rgba(167, 161, 166, 0.19); - border-right: 1px solid rgba(131, 126, 131, 0.145); - border-bottom: 1px solid rgba(131, 126, 131, 0.145); + border-top: 1px solid rgba(171, 160, 161, 0.19); + border-left: 1px solid rgba(171, 160, 161, 0.19); + border-right: 1px solid rgba(135, 125, 126, 0.145); + border-bottom: 1px solid rgba(135, 125, 126, 0.145); box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; min-width: 13.636rem; min-height: 3.409rem; padding: 0rem 1.364rem; padding-right: 2.864rem; - background-color: #0f0e10; - color: #e7e0e5; + background-color: #110d0e; + color: #ecdfe0; caret-color: transparent; } .overview-search-box selection { - background-color: #d2c1d9; - color: #372c3e; } + background-color: #e4bcc3; + color: #42292e; } .overview-search-box-extended { min-width: 25.909rem; - caret-color: #eedcf5; } + caret-color: #ffd9df; } .overview-search-prompt { - color: #a6a1a5; } + color: #aaa0a1; } .overview-search-icon { margin: 0rem 1.023rem; } @@ -1225,16 +1157,16 @@ tooltip { .overview-search-results { border-radius: 1.705rem; -gtk-outline-radius: 1.705rem; - border-top: 1px solid rgba(167, 161, 166, 0.19); - border-left: 1px solid rgba(167, 161, 166, 0.19); - border-right: 1px solid rgba(131, 126, 131, 0.145); - border-bottom: 1px solid rgba(131, 126, 131, 0.145); + border-top: 1px solid rgba(171, 160, 161, 0.19); + border-left: 1px solid rgba(171, 160, 161, 0.19); + border-right: 1px solid rgba(135, 125, 126, 0.145); + border-bottom: 1px solid rgba(135, 125, 126, 0.145); box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; min-width: 28.773rem; padding: 0.682rem; - background-color: #0f0e10; - color: #e7e0e5; } + background-color: #110d0e; + color: #ecdfe0; } .overview-search-results-icon { margin: 0rem 0.682rem; @@ -1268,43 +1200,43 @@ tooltip { .overview-tasks { border-radius: 1.705rem; -gtk-outline-radius: 1.705rem; - border-top: 1px solid rgba(167, 161, 166, 0.19); - border-left: 1px solid rgba(167, 161, 166, 0.19); - border-right: 1px solid rgba(131, 126, 131, 0.145); - border-bottom: 1px solid rgba(131, 126, 131, 0.145); + border-top: 1px solid rgba(171, 160, 161, 0.19); + border-left: 1px solid rgba(171, 160, 161, 0.19); + border-right: 1px solid rgba(135, 125, 126, 0.145); + border-bottom: 1px solid rgba(135, 125, 126, 0.145); box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; padding: 0.341rem; - background-color: #0f0e10; - color: #e7e0e5; } + background-color: #110d0e; + color: #ecdfe0; } .overview-tasks-workspace { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; margin: 0.341rem; - background-color: rgba(52, 48, 52, 0.1147); } + background-color: rgba(55, 47, 48, 0.1147); } .overview-tasks-workspace-number { font-family: "Rubik", "Geist", "AR One Sans", "Reddit Sans", "Inter", "Roboto", "Ubuntu", "Noto Sans", sans-serif; - color: rgba(217, 210, 215, 0.31); } + color: rgba(222, 209, 210, 0.31); } .overview-tasks-window { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; transition: 300ms cubic-bezier(0.1, 1, 0, 1); - background-color: rgba(56, 52, 58, 0.31); - color: #eedcf5; - border: 0.068rem solid rgba(238, 220, 245, 0.07); } + background-color: rgba(61, 50, 52, 0.31); + color: #ffd9df; + border: 0.068rem solid rgba(255, 217, 223, 0.07); } .overview-tasks-window:hover, .overview-tasks-window:focus { - background-color: rgba(100, 85, 109, 0.525); } + background-color: rgba(114, 82, 89, 0.525); } .overview-tasks-window:active { - background-color: rgba(118, 100, 128, 0.55); } + background-color: rgba(133, 97, 105, 0.55); } .overview-tasks-window-selected { - background-color: rgba(118, 100, 128, 0.55); } + background-color: rgba(133, 97, 105, 0.55); } .overview-tasks-window-dragging { opacity: 0.2; } @@ -1312,13 +1244,13 @@ tooltip { .osk-window { border-radius: 1.705rem; -gtk-outline-radius: 1.705rem; - border-top: 1px solid rgba(167, 161, 166, 0.19); - border-left: 1px solid rgba(167, 161, 166, 0.19); - border-right: 1px solid rgba(131, 126, 131, 0.145); - border-bottom: 1px solid rgba(131, 126, 131, 0.145); + border-top: 1px solid rgba(171, 160, 161, 0.19); + border-left: 1px solid rgba(171, 160, 161, 0.19); + border-right: 1px solid rgba(135, 125, 126, 0.145); + border-bottom: 1px solid rgba(135, 125, 126, 0.145); box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; - background-color: #0f0e10; } + background-color: #110d0e; } .osk-body { padding: 1.023rem; @@ -1335,7 +1267,7 @@ tooltip { .osk-dragline { border-radius: 9999px; -gtk-outline-radius: 9999px; - background-color: #38343a; + background-color: #3d3234; min-height: 0.273rem; min-width: 10.227rem; margin-top: 0.545rem; @@ -1343,8 +1275,8 @@ tooltip { .osk-key { border-radius: 0.682rem; - background-color: rgba(56, 52, 58, 0.31); - color: #cdc3ce; + background-color: rgba(61, 50, 52, 0.31); + color: #d6c1c4; padding: 0.188rem; font-weight: 500; font-size: 1.091rem; } @@ -1386,31 +1318,31 @@ tooltip { .osk-control-button { border-radius: 0.682rem; - background-color: rgba(56, 52, 58, 0.31); - color: #cdc3ce; + background-color: rgba(61, 50, 52, 0.31); + color: #d6c1c4; font-weight: 500; font-size: 1.091rem; padding: 0.682rem; } .osk-control-button:hover, .osk-control-button:focus { - background-color: rgba(71, 66, 73, 0.31); } + background-color: rgba(76, 64, 66, 0.31); } .osk-control-button:active { - background-color: rgba(101, 95, 102, 0.31); + background-color: rgba(107, 93, 95, 0.31); font-size: 1.091rem; } .sidebar-right { transition: 300ms cubic-bezier(0.1, 1, 0, 1); - border-top: 1px solid rgba(167, 161, 166, 0.19); - border-left: 1px solid rgba(167, 161, 166, 0.19); - border-right: 1px solid rgba(131, 126, 131, 0.145); - border-bottom: 1px solid rgba(131, 126, 131, 0.145); + border-top: 1px solid rgba(171, 160, 161, 0.19); + border-left: 1px solid rgba(171, 160, 161, 0.19); + border-right: 1px solid rgba(135, 125, 126, 0.145); + border-bottom: 1px solid rgba(135, 125, 126, 0.145); box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; border-radius: 1.297rem; min-width: 27.818rem; - background-color: #0f0e10; + background-color: #110d0e; padding: 1.023rem; } .sideright-show { @@ -1422,15 +1354,15 @@ tooltip { .sidebar-left { transition: 300ms cubic-bezier(0.1, 1, 0, 1); - border-top: 1px solid rgba(167, 161, 166, 0.19); - border-left: 1px solid rgba(167, 161, 166, 0.19); - border-right: 1px solid rgba(131, 126, 131, 0.145); - border-bottom: 1px solid rgba(131, 126, 131, 0.145); + border-top: 1px solid rgba(171, 160, 161, 0.19); + border-left: 1px solid rgba(171, 160, 161, 0.19); + border-right: 1px solid rgba(135, 125, 126, 0.145); + border-bottom: 1px solid rgba(135, 125, 126, 0.145); box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.45); margin: 0.476rem; border-radius: 1.297rem; min-width: 27.818rem; - background-color: #0f0e10; + background-color: #110d0e; padding: 1.023rem; } .sideleft-show { @@ -1444,12 +1376,12 @@ tooltip { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; padding: 0.341rem; - background-color: rgba(31, 28, 32, 0.31); } + background-color: rgba(34, 27, 28, 0.31); } .sidebar-group-nopad { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; - background-color: rgba(31, 28, 32, 0.31); } + background-color: rgba(34, 27, 28, 0.31); } .sidebar-group-invisible { padding: 0.341rem; } @@ -1461,13 +1393,13 @@ tooltip { border-radius: 9999px; -gtk-outline-radius: 9999px; padding: 0.341rem; - background-color: rgba(31, 28, 32, 0.31); } + background-color: rgba(34, 27, 28, 0.31); } .sidebar-iconbutton { border-radius: 9999px; -gtk-outline-radius: 9999px; - transition: 300ms cubic-bezier(0.1, 1, 0, 1); - color: #e7e0e5; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); + color: #ecdfe0; min-width: 2.727rem; min-height: 2.727rem; } @@ -1479,15 +1411,10 @@ tooltip { background-color: rgba(128, 128, 128, 0.7); } .sidebar-button { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); padding: 0rem 0.818rem; - background-color: #4f4256; - color: #eedcf5; } - -.sidebar-button-nopad { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .sidebar-button:hover, .sidebar-button:focus { @@ -1496,44 +1423,21 @@ tooltip { .sidebar-button:active { background-color: rgba(128, 128, 128, 0.7); } -.sidebar-button-nopad:hover, -.sidebar-button-nopad:focus { - background-color: rgba(128, 128, 128, 0.3); } - -.sidebar-button-nopad:active { - background-color: rgba(128, 128, 128, 0.7); } - -.sidebar-button-left { - border-top-left-radius: 0.818rem; - border-bottom-left-radius: 0.818rem; } - -.sidebar-button-right { - border-top-right-radius: 0.818rem; - border-bottom-right-radius: 0.955rem; } - -.sidebar-button-alone { - border-radius: 0.818rem; - -gtk-outline-radius: 0.818rem; } - -.sidebar-button-alone-normal { - border-radius: 0.818rem; - -gtk-outline-radius: 0.818rem; } - .sidebar-button-active { - background-color: #eccbff; - color: #471868; } + background-color: #ffc8d5; + color: #66002a; } .sidebar-button-active:hover, .sidebar-button-active:focus { - background-color: rgba(228, 198, 246, 0.79); } + background-color: rgba(246, 195, 207, 0.79); } .sidebar-button-active:active { - background-color: rgba(213, 187, 228, 0.58); } + background-color: rgba(228, 185, 195, 0.58); } .sidebar-buttons-separator { min-width: 0.068rem; min-height: 0.068rem; - background-color: #cdc3ce; } + background-color: #d6c1c4; } .sidebar-navrail { padding: 0rem 1.159rem; } @@ -1551,13 +1455,13 @@ tooltip { background-color: rgba(128, 128, 128, 0.7); } .sidebar-navrail-btn-active > box > label:first-child { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .sidebar-navrail-btn-active:hover > box > label:first-child, .sidebar-navrail-btn-active:focus > box > label:first-child { - background-color: rgba(80, 67, 87, 0.93); - color: rgba(236, 218, 243, 0.93); } + background-color: rgba(93, 64, 70, 0.93); + color: rgba(253, 215, 221, 0.93); } .sidebar-sysinfo-grouppad { padding: 1.159rem; } @@ -1567,8 +1471,8 @@ tooltip { min-width: 0.818rem; min-height: 4.091rem; padding: 0.409rem; - background-color: #4f4256; - color: #eedcf5; + background-color: #5c3f45; + color: #ffd9df; font-size: 0px; } .sidebar-memory-swap-circprog { @@ -1577,16 +1481,16 @@ tooltip { min-height: 2.255rem; padding: 0.409rem; margin: 0.918rem; - background-color: #4f4256; - color: #eedcf5; + background-color: #5c3f45; + color: #ffd9df; font-size: 0px; } .sidebar-cpu-circprog { min-width: 0.818rem; min-height: 3.409rem; padding: 0.409rem; - background-color: #4f4256; - color: #eedcf5; + background-color: #5c3f45; + color: #ffd9df; transition: 1000ms cubic-bezier(0.1, 1, 0, 1); font-size: 0px; } @@ -1599,24 +1503,25 @@ tooltip { .sidebar-scrollbar slider { border-radius: 9999px; -gtk-outline-radius: 9999px; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-width: 0.273rem; min-height: 2.045rem; - background-color: rgba(205, 195, 206, 0.31); } + background-color: rgba(214, 193, 196, 0.31); } .sidebar-scrollbar slider:hover, .sidebar-scrollbar slider:focus { - background-color: rgba(205, 195, 206, 0.448); } + background-color: rgba(214, 193, 196, 0.448); } .sidebar-scrollbar slider:active { - background-color: #837c84; } + background-color: #8a7a7c; } .sidebar-calendar-btn { border-radius: 9999px; -gtk-outline-radius: 9999px; - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-height: 2.523rem; min-width: 2.523rem; - color: #e7e0e5; } + color: #ecdfe0; } .sidebar-calendar-btn:hover, .sidebar-calendar-btn:focus { @@ -1630,18 +1535,18 @@ tooltip { margin-right: -10.341rem; } .sidebar-calendar-btn-today { - background-color: #eccbff; - color: #471868; } + background-color: #ffc8d5; + color: #66002a; } .sidebar-calendar-btn-today:hover, .sidebar-calendar-btn-today:focus { - background-color: rgba(228, 198, 246, 0.79); } + background-color: rgba(246, 195, 207, 0.79); } .sidebar-calendar-btn-today:active { - background-color: rgba(213, 187, 228, 0.58); } + background-color: rgba(228, 185, 195, 0.58); } .sidebar-calendar-btn-othermonth { - color: #837e83; } + color: #877d7e; } .sidebar-calendar-header { margin: 0.341rem; } @@ -1649,41 +1554,43 @@ tooltip { .sidebar-calendar-monthyear-btn { border-radius: 9999px; -gtk-outline-radius: 9999px; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); padding: 0rem 0.682rem; - background-color: rgba(56, 52, 58, 0.31); - color: #cdc3ce; } + background-color: rgba(61, 50, 52, 0.31); + color: #d6c1c4; } .sidebar-calendar-monthyear-btn:hover, .sidebar-calendar-monthyear-btn:focus { background-color: rgba(128, 128, 128, 0.3); - color: #c6bcc7; } + color: #cebabd; } .sidebar-calendar-monthyear-btn:active { background-color: rgba(128, 128, 128, 0.7); - color: #b7aeb8; } + color: #bfacae; } .sidebar-calendar-monthshift-btn { border-radius: 9999px; -gtk-outline-radius: 9999px; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-width: 2.045rem; min-height: 2.045rem; - background-color: rgba(56, 52, 58, 0.31); - color: #cdc3ce; } + background-color: rgba(61, 50, 52, 0.31); + color: #d6c1c4; } .sidebar-calendar-monthshift-btn:hover { background-color: rgba(128, 128, 128, 0.3); - color: #c6bcc7; } + color: #cebabd; } .sidebar-calendar-monthshift-btn:active { background-color: rgba(128, 128, 128, 0.7); - color: #b7aeb8; } + color: #bfacae; } .sidebar-selector-tab { border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-height: 2.5rem; - color: #e7e0e5; } + color: #ecdfe0; } .sidebar-selector-tab:hover, .sidebar-selector-tab:focus { @@ -1693,7 +1600,7 @@ tooltip { background-color: rgba(128, 128, 128, 0.7); } .sidebar-selector-tab-active > box > label { - color: #eccbff; } + color: #ffc8d5; } .sidebar-selector-highlight-offset { margin-top: -0.205rem; @@ -1701,16 +1608,17 @@ tooltip { .sidebar-selector-highlight { transition: 180ms ease-in-out; - color: #eccbff; + color: #ffc8d5; min-height: 0.205rem; } .sidebar-todo-item { padding-right: 0.545rem; } .sidebar-todo-item-even { - background-color: rgba(56, 52, 58, 0.1); } + background-color: rgba(61, 50, 52, 0.1); } .sidebar-todo-item-action { + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 9999px; min-width: 1.705rem; min-height: 1.705rem; } @@ -1727,7 +1635,7 @@ tooltip { min-width: 0rem; } .sidebar-todo-crosser-crossed { - background-color: #e7e0e5; } + background-color: #ecdfe0; } .sidebar-todo-crosser-removed { background-color: #ffb4a9; } @@ -1735,78 +1643,79 @@ tooltip { .sidebar-todo-new { border-radius: 9999px; -gtk-outline-radius: 9999px; - color: #eedcf5; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); + color: #ffd9df; margin: 0.341rem; padding: 0.205rem 0.545rem; - border: 0.068rem solid #e7e0e5; } + border: 0.068rem solid #ecdfe0; } -.sidebar-todo-newz, +.sidebar-todo-new, .sidebar-todo-new:focus { - background-color: #54475b; } + background-color: #61444a; } .sidebar-todo-new:active { - background-color: #6f6176; } + background-color: #7d5e64; } .sidebar-todo-add { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; min-width: 1.705rem; min-height: 1.705rem; - color: #eedcf5; - border: 0.068rem solid #e7e0e5; } + color: #ffd9df; + border: 0.068rem solid #ecdfe0; } .sidebar-todo-add:hover, .sidebar-todo-add:focus { - background-color: #54475b; } + background-color: #61444a; } .sidebar-todo-add:active { - background-color: #6f6176; } + background-color: #7d5e64; } .sidebar-todo-add-available { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; min-width: 1.705rem; min-height: 1.705rem; - background-color: #eccbff; - color: #471868; - border: 0.068rem solid #eccbff; } + background-color: #ffc8d5; + color: #66002a; + border: 0.068rem solid #ffc8d5; } .sidebar-todo-add-available:hover, .sidebar-todo-add-available:focus { - background-color: #e7c6fa; } + background-color: #fac2d0; } .sidebar-todo-add-available:active { - background-color: #cba7e1; } + background-color: #e0a0b3; } .sidebar-todo-entry { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; - background-color: #38343a; - color: #cdc3ce; - caret-color: #cdc3ce; + background-color: #3d3234; + color: #d6c1c4; + caret-color: #d6c1c4; margin: 0rem 0.341rem; min-height: 1.773rem; min-width: 0rem; padding: 0.205rem 0.682rem; - border: 0.068rem solid #837c84; } + border: 0.068rem solid #8a7a7c; } .sidebar-todo-entry:focus { - border: 0.068rem solid #beb5bf; } + border: 0.068rem solid #c7b3b6; } .sidebar-module { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; padding: 0.341rem; - background-color: rgba(31, 28, 32, 0.31); } + background-color: rgba(34, 27, 28, 0.31); } .sidebar-module-btn-arrow { border-radius: 9999px; -gtk-outline-radius: 9999px; - font-family: "Material Symbols Rounded", "Material Symbols Outlined", "Material Symbols Sharp"; - background-color: rgba(56, 52, 58, 0.31); + font-family: "Material Symbols Rounded", "MaterialSymbolsRounded", "Material Symbols Outlined", "Material Symbols Sharp"; + background-color: rgba(61, 50, 52, 0.31); min-width: 1.705rem; min-height: 1.705rem; } @@ -1814,79 +1723,85 @@ tooltip { border-radius: 9999px; -gtk-outline-radius: 9999px; padding: 0.341rem; - background-color: rgba(31, 28, 32, 0.31); } + background-color: rgba(34, 27, 28, 0.31); } .sidebar-chat-apiswitcher-icon { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 9999px; -gtk-outline-radius: 9999px; min-width: 2.182rem; min-height: 2.182rem; - color: #e7e0e5; } + color: #ecdfe0; } .sidebar-chat-apiswitcher-icon-enabled { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .sidebar-chat-viewport { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); padding: 0.682rem 0rem; } .sidebar-chat-textarea { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; - background-color: #242125; - color: #cdc3ce; + background-color: #272021; + color: #d6c1c4; padding: 0.682rem; } .sidebar-chat-entry { - color: #cdc3ce; - caret-color: #cdc3ce; + color: #d6c1c4; + caret-color: #d6c1c4; min-height: 1.773rem; min-width: 0rem; } +.sidebar-chat-wrapper { + transition: 400ms cubic-bezier(0.1, 1, 0, 1); } + +.sidebar-chat-wrapper-extended { + min-height: 7.500rem; } + .sidebar-chat-send { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-width: 1.705rem; min-height: 1.705rem; border-radius: 0.478rem; } .sidebar-chat-send:hover, .sidebar-chat-send:focus { - background-color: #38343a; } + background-color: #3d3234; } .sidebar-chat-send:active { - background-color: #5b565c; } + background-color: #605556; } .sidebar-chat-send-available { - background-color: #eccbff; - color: #471868; } + background-color: #ffc8d5; + color: #66002a; } .sidebar-chat-send-available:hover, .sidebar-chat-send-available:focus { - background-color: #e7c6fa; } + background-color: #fac2d0; } .sidebar-chat-send-available:active { - background-color: #cba7e1; } + background-color: #e0a0b3; } .sidebar-chat-message { margin: 0.682rem; } .sidebar-chat-indicator { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 9999px; -gtk-outline-radius: 9999px; min-width: 0.136rem; - background-color: #e7e0e5; } + background-color: #ecdfe0; } .sidebar-chat-indicator-user { - background-color: #e7e0e5; } + background-color: #ecdfe0; } .sidebar-chat-indicator-bot { - background-color: #eccbff; } + background-color: #ffc8d5; } .sidebar-chat-indicator-System { - background-color: #d2c1d9; } + background-color: #e4bcc3; } .sidebar-chat-name { font-family: "Gabarito", "Poppins", "Lexend", sans-serif; @@ -1905,19 +1820,19 @@ tooltip { .sidebar-chat-codeblock { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; - background-color: rgba(86, 81, 88, 0.31); - color: #cdc3ce; + background-color: rgba(92, 79, 81, 0.31); + color: #d6c1c4; margin: 0rem 0.682rem; - border: 0.068rem solid rgba(238, 220, 245, 0.07); } + border: 0.068rem solid rgba(255, 217, 223, 0.07); } .sidebar-chat-codeblock-topbar { font-family: "Rubik", "Geist", "AR One Sans", "Reddit Sans", "Inter", "Roboto", "Ubuntu", "Noto Sans", sans-serif; margin: 0.273rem; margin-bottom: 0rem; - background-color: rgba(117, 105, 122, 0.517); - color: #eedcf5; + background-color: rgba(129, 102, 107, 0.517); + color: #ffd9df; border-radius: 0.886rem; - border: 0.068rem solid #5f5166; + border: 0.068rem solid #6c4e54; border-top-left-radius: 0.886rem; border-top-right-radius: 0.886rem; padding: 0.341rem 0.477rem; } @@ -1930,14 +1845,15 @@ tooltip { .sidebar-chat-codeblock-topbar-btn { border-radius: 9999px; -gtk-outline-radius: 9999px; + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); padding: 0.273rem 0.477rem; } .sidebar-chat-codeblock-topbar-btn:hover, .sidebar-chat-codeblock-topbar-btn:focus { - background-color: #6f6176; } + background-color: #7d5e64; } .sidebar-chat-codeblock-topbar-btn:active { - background-color: #8f8096; } + background-color: #9d7d83; } .sidebar-chat-codeblock-code { font-family: "JetBrains Mono NF", "JetBrains Mono Nerd Font", "JetBrains Mono NL", "SpaceMono NF", "SpaceMono Nerd Font", monospace; @@ -1945,7 +1861,7 @@ tooltip { .sidebar-chat-divider { min-height: 1px; - background-color: #746d75; + background-color: #7a6b6e; margin: 0rem 0.545rem; } .sidebar-chat-welcome-txt { @@ -1962,23 +1878,24 @@ tooltip { .sidebar-chat-welcome-logo { border-radius: 9999px; -gtk-outline-radius: 9999px; - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-height: 4.773rem; min-width: 4.773rem; - font-family: "Material Symbols Rounded", "Material Symbols Outlined", "Material Symbols Sharp"; + font-family: "Material Symbols Rounded", "MaterialSymbolsRounded", "Material Symbols Outlined", "Material Symbols Sharp"; font-size: 2.727rem; - background-color: #e7e0e5; - color: #0f0e10; } + background-color: #ecdfe0; + color: #110d0e; } .sidebar-chat-chip { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; padding: 0.341rem 0.477rem; } .sidebar-chat-chip-action { - background-color: #242125; - color: #cdc3ce; } + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); + background-color: #272021; + color: #d6c1c4; } .sidebar-chat-chip-action:hover, .sidebar-chat-chip-action:focus { @@ -1988,16 +1905,16 @@ tooltip { background-color: rgba(128, 128, 128, 0.7); } .sidebar-chat-chip-action-active { - color: #746d75; - border: 0.068rem solid #746d75; } + color: #7a6b6e; + border: 0.068rem solid #7a6b6e; } .sidebar-chat-chip-toggle { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; padding: 0.341rem 0.477rem; - background-color: #242125; - color: #cdc3ce; } + background-color: #272021; + color: #d6c1c4; } .sidebar-chat-chip-toggle:focus, .sidebar-chat-chip-toggle:hover { @@ -2009,10 +1926,10 @@ tooltip { .sidebar-pin { border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); min-height: 2.386rem; min-width: 2.386rem; - color: #e7e0e5; } + color: #ecdfe0; } .sidebar-pin:hover, .sidebar-pin:focus { @@ -2022,16 +1939,16 @@ tooltip { background-color: rgba(128, 128, 128, 0.7); } .sidebar-pin-enabled { - background-color: #eccbff; } + background-color: #ffc8d5; } .sidebar-pin-enabled label { - color: #471868; } + color: #66002a; } .sidebar-pin-enabled:hover, .sidebar-pin-enabled:focus { - background-color: #dcb9f0; } + background-color: #f0b4c4; } .sidebar-pin-enabled:active { - background-color: #cba7e1; } + background-color: #e0a0b3; } .sidebar-waifu-heading { font-family: "Gabarito", "Poppins", "Lexend", sans-serif; @@ -2055,6 +1972,7 @@ tooltip { background-position: center; } .sidebar-waifu-image-actions { + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); padding: 0.313rem; } .sidebar-waifu-image-action { @@ -2074,24 +1992,24 @@ tooltip { .session-bg { margin-top: -2.727rem; - background-color: rgba(15, 14, 16, 0.64); } + background-color: rgba(17, 13, 14, 0.64); } .session-button { border-radius: 1.705rem; -gtk-outline-radius: 1.705rem; min-width: 8.182rem; min-height: 8.182rem; - background-color: #38343a; - color: #cdc3ce; + background-color: #3d3234; + color: #d6c1c4; font-size: 3rem; } .session-button-focused { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .session-button-desc { - background-color: #2c282d; - color: #dad2da; + background-color: #302728; + color: #e1d0d2; border-bottom-left-radius: 1.705rem; border-bottom-right-radius: 1.705rem; padding: 0.205rem 0.341rem; @@ -2102,40 +2020,49 @@ tooltip { -gtk-outline-radius: 1.705rem; min-width: 8.182rem; min-height: 5.455rem; - background-color: #38343a; - color: #cdc3ce; + background-color: #3d3234; + color: #d6c1c4; font-size: 3rem; } .notif-low { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; - background-color: rgba(56, 52, 58, 0.45); - color: #cdc3ce; + background-color: rgba(61, 50, 52, 0.45); + color: #d6c1c4; padding: 0.818rem; padding-right: 1.363rem; } .notif-normal { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; - background-color: rgba(56, 52, 58, 0.45); - color: #cdc3ce; + background-color: rgba(61, 50, 52, 0.45); + color: #d6c1c4; padding: 0.818rem; padding-right: 1.363rem; } .notif-critical { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; - background-color: #4f4256; - color: #eedcf5; + background-color: #5c3f45; + color: #ffd9df; padding: 0.818rem; padding-right: 1.363rem; } +.notif-clicked-low { + background-color: rgba(79, 67, 69, 0.429); } + +.notif-clicked-normal { + background-color: rgba(79, 67, 69, 0.429); } + +.notif-clicked-critical { + background-color: #64474d; } + .popup-notif-low { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; min-width: 30.682rem; - background-color: #0f0e10; - color: #cdc3ce; + background-color: #110d0e; + color: #d6c1c4; padding: 0.818rem; padding-right: 1.363rem; } @@ -2143,8 +2070,8 @@ tooltip { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; min-width: 30.682rem; - background-color: #0f0e10; - color: #cdc3ce; + background-color: #110d0e; + color: #d6c1c4; padding: 0.818rem; padding-right: 1.363rem; } @@ -2152,19 +2079,28 @@ tooltip { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; min-width: 30.682rem; - background-color: #4f4256; - color: #eedcf5; + background-color: #5c3f45; + color: #ffd9df; padding: 0.818rem; padding-right: 1.363rem; } +.popup-notif-clicked-low { + background-color: #1e1a1b; } + +.popup-notif-clicked-normal { + background-color: #1e1a1b; } + +.popup-notif-clicked-critical { + background-color: #63454b; } + .notif-body-low { - color: #9c949d; } + color: #a49294; } .notif-body-normal { - color: #9c949d; } + color: #a49294; } .notif-body-critical { - color: #baa9c1; } + color: #c9a6ac; } .notif-icon { border-radius: 9999px; @@ -2173,20 +2109,20 @@ tooltip { min-height: 3.409rem; } .notif-icon-material { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .notif-icon-material-low { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .notif-icon-material-normal { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .notif-icon-material-critical { - background-color: #eedcf5; - color: #4f4256; } + background-color: #ffd9df; + color: #5c3f45; } .notif-expand-btn { border-radius: 1.159rem; @@ -2214,20 +2150,20 @@ tooltip { background-color: rgba(128, 128, 128, 0.7); } .notif-listaction-btn-enabled { - background-color: #4f4256; - color: #eedcf5; } + background-color: #5c3f45; + color: #ffd9df; } .notif-listaction-btn-enabled:hover, .notif-listaction-btn-enabled:focus { - background-color: #5f5166; } + background-color: #6c4e54; } .notif-listaction-btn-enabled:active { - background-color: #77697e; } + background-color: #85666c; } .osd-notif { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; - background-color: rgba(15, 14, 16, 0.46); + background-color: rgba(17, 13, 14, 0.46); min-width: 30.682rem; } .notif-circprog-low { @@ -2235,21 +2171,21 @@ tooltip { min-width: 0.136rem; min-height: 3.136rem; padding: 0rem; - color: #eedcf5; } + color: #ffd9df; } .notif-circprog-normal { transition: 0ms linear; min-width: 0.136rem; min-height: 3.136rem; padding: 0rem; - color: #eedcf5; } + color: #ffd9df; } .notif-circprog-critical { transition: 0ms linear; min-width: 0.136rem; min-height: 3.136rem; padding: 0rem; - color: #4f4256; } + color: #5c3f45; } .notif-actions { min-height: 2.045rem; } @@ -2259,8 +2195,8 @@ tooltip { -gtk-outline-radius: 0.818rem; } .notif-action-low { - background-color: rgba(48, 45, 49, 0.31); - color: #cdc3ce; } + background-color: rgba(52, 44, 45, 0.31); + color: #d6c1c4; } .notif-action-low:focus, .notif-action-low:hover { @@ -2270,8 +2206,8 @@ tooltip { background-color: rgba(128, 128, 128, 0.7); } .notif-action-normal { - background-color: rgba(48, 45, 49, 0.31); - color: #cdc3ce; } + background-color: rgba(52, 44, 45, 0.31); + color: #d6c1c4; } .notif-action-normal:focus, .notif-action-normal:hover { @@ -2281,15 +2217,15 @@ tooltip { background-color: rgba(128, 128, 128, 0.7); } .notif-action-critical { - background-color: #5f5166; - color: #cdc3ce; } + background-color: #6c4e54; + color: #d6c1c4; } .notif-action-critical:focus, .notif-action-critical:hover { - background-color: #6c5e73; } + background-color: #795b61; } .notif-action-critical:active { - background-color: #74657b; } + background-color: #816268; } @keyframes flyin-top { from { @@ -2313,18 +2249,18 @@ tooltip { border-radius: 1.159rem; -gtk-outline-radius: 1.159rem; min-width: 29.659rem; - background-color: #0f0e10; + background-color: #110d0e; padding: 0rem 1.023rem; - background: linear-gradient(127deg, rgba(45, 42, 47, 0.7), rgba(45, 42, 47, 0.55) 70.71%), linear-gradient(217deg, rgba(75, 69, 77, 0.7), rgba(75, 69, 77, 0.55) 70.71%), radial-gradient(circle at 0% 100%, #4f4256 13%, rgba(0, 0, 0, 0) 100%), linear-gradient(336deg, rgba(79, 66, 86, 0.7), rgba(79, 66, 86, 0.55) 70.71%), linear-gradient(#0f0e10, #0f0e10); } + background: linear-gradient(127deg, rgba(49, 40, 42, 0.7), rgba(49, 40, 42, 0.55) 70.71%), linear-gradient(217deg, rgba(81, 67, 69, 0.7), rgba(81, 67, 69, 0.55) 70.71%), radial-gradient(circle at 0% 100%, #5c3f45 13%, rgba(0, 0, 0, 0) 100%), linear-gradient(336deg, rgba(92, 63, 69, 0.7), rgba(92, 63, 69, 0.55) 70.71%), linear-gradient(#110d0e, #110d0e); } .osd-music-cover-fallback { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 0.818rem; -gtk-outline-radius: 0.818rem; min-width: 7.5rem; min-height: 7.5rem; - background-color: rgba(31, 28, 32, 0.31); - color: #d7d1d6; } + background-color: rgba(34, 27, 28, 0.31); + color: #ddcfd1; } .osd-music-cover { border-radius: 0.818rem; @@ -2347,36 +2283,36 @@ tooltip { margin: 1.023rem 0rem; } .osd-music-title { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); font-family: "Gabarito", "Poppins", "Lexend", sans-serif; font-size: 1.364rem; - color: #d7d1d6; } + color: #ddcfd1; } .osd-music-artists { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); font-family: "Rubik", "Geist", "AR One Sans", "Reddit Sans", "Inter", "Roboto", "Ubuntu", "Noto Sans", sans-serif; font-size: 0.955rem; - color: rgba(202, 197, 202, 0.9); } + color: rgba(208, 195, 197, 0.9); } .osd-music-pill { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 9999px; -gtk-outline-radius: 9999px; font-family: "Gabarito", "Poppins", "Lexend", sans-serif; min-width: 1.833rem; padding: 0.273rem 0.682rem; - background-color: rgba(52, 47, 55, 0.5); - color: #d7d1d6; } + background-color: rgba(58, 45, 47, 0.5); + color: #ddcfd1; } .osd-music-controls { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); border-radius: 9999px; -gtk-outline-radius: 9999px; font-family: "Gabarito", "Poppins", "Lexend", sans-serif; min-width: 1.833rem; padding: 0.205rem; - background-color: rgba(52, 47, 55, 0.5); - color: #d7d1d6; } + background-color: rgba(58, 45, 47, 0.5); + color: #ddcfd1; } .osd-music-controlbtn { transition: 300ms cubic-bezier(0.1, 1, 0, 1); @@ -2387,15 +2323,15 @@ tooltip { .osd-music-controlbtn:hover, .osd-music-controlbtn:focus { - background-color: rgba(93, 88, 95, 0.55); } + background-color: rgba(99, 86, 88, 0.55); } .osd-music-controlbtn:active { - background-color: rgba(108, 103, 110, 0.575); } + background-color: rgba(114, 101, 103, 0.575); } .osd-music-controlbtn-txt { - transition: 300ms cubic-bezier(0.1, 1, 0, 1); + transition: 300ms cubic-bezier(0, 0.55, 0.45, 1); transition: 100ms cubic-bezier(0.05, 0.7, 0.1, 1); - font-family: "Material Symbols Rounded", "Material Symbols Outlined", "Material Symbols Sharp"; + font-family: "Material Symbols Rounded", "MaterialSymbolsRounded", "Material Symbols Outlined", "Material Symbols Sharp"; font-size: 1.364rem; margin: -0.1rem 0rem; } @@ -2404,19 +2340,19 @@ tooltip { min-width: 0.409rem; min-height: 3.068rem; padding: 0.273rem; - color: #d7d1d6; } + color: #ddcfd1; } .osd-music-playstate { transition: 300ms cubic-bezier(0.1, 1, 0, 1); min-height: 3.068rem; min-width: 3.068rem; border-radius: 10rem; - background-color: rgba(52, 47, 55, 0.5); - color: #d7d1d6; } + background-color: rgba(58, 45, 47, 0.5); + color: #ddcfd1; } .osd-music-playstate-btn > label { transition: 50ms cubic-bezier(0.05, 0.7, 0.1, 1); - font-family: "Material Symbols Rounded", "Material Symbols Outlined", "Material Symbols Sharp"; + font-family: "Material Symbols Rounded", "MaterialSymbolsRounded", "Material Symbols Outlined", "Material Symbols Sharp"; font-size: 1.364rem; margin: -0.1rem 0rem; } diff --git a/.config/ags/widgets/bar/music.js b/.config/ags/widgets/bar/music.js index 7bcfcd10c..ae986086a 100644 --- a/.config/ags/widgets/bar/music.js +++ b/.config/ags/widgets/bar/music.js @@ -1,12 +1,14 @@ import Widget from 'resource:///com/github/Aylur/ags/widget.js'; import * as Utils from 'resource:///com/github/Aylur/ags/utils.js'; import Mpris from 'resource:///com/github/Aylur/ags/service/mpris.js'; +const { Box, Label, Overlay, Revealer } = Widget; const { execAsync, exec } = Utils; import { AnimatedCircProg } from "../../lib/animatedcircularprogress.js"; +import { MaterialIcon } from '../../lib/materialicon.js'; import { showMusicControls } from '../../variables.js'; function trimTrackTitle(title) { - if(!title) return ''; + if (!title) return ''; const cleanRegexes = [ /【[^】]*】/, // Touhou n weeb stuff /\[FREE DOWNLOAD\]/, // F-777 @@ -15,6 +17,54 @@ function trimTrackTitle(title) { return title; } +const BarGroup = ({ child }) => Widget.Box({ + className: 'bar-group-margin bar-sides', + children: [ + Widget.Box({ + className: 'bar-group bar-group-standalone bar-group-pad-system', + children: [child], + }), + ] +}); + +const BarResource = (name, icon, command) => { + const resourceCircProg = AnimatedCircProg({ + className: 'bar-batt-circprog', + vpack: 'center', + hpack: 'center', + }); + const resourceProgress = Overlay({ + child: Widget.Box({ + vpack: 'center', + className: 'bar-batt', + homogeneous: true, + children: [ + MaterialIcon(icon, 'small'), + ], + }), + overlays: [resourceCircProg] + }); + const resourceLabel = Label({ + className: 'txt-smallie txt-onSurfaceVariant', + }); + const widget = Box({ + className: 'spacing-h-4 txt-onSurfaceVariant', + children: [ + resourceLabel, + resourceProgress, + ], + setup: (self) => self + .poll(5000, () => execAsync(['bash', '-c', command]) + .then((output) => { + resourceCircProg.css = `font-size: ${Number(output)}px;`; + resourceLabel.label = `${Math.round(Number(output))}%`; + widget.tooltipText = `${name}: ${Math.round(Number(output))}%`; + }).catch(print)) + , + }); + return widget; +} + const TrackProgress = () => { const _updateProgress = (circprog) => { const mpris = Mpris.getPlayer(''); @@ -84,22 +134,48 @@ export default () => { }), }) }) + const musicStuff = Box({ + className: 'spacing-h-10', + hexpand: true, + children: [ + playingState, + trackTitle, + ] + }) + const systemResources = BarGroup({ + child: Box({ + children: [ + BarResource('RAM Usage', 'memory', `free | awk '/^Mem/ {printf("%.2f\\n", ($3/$2) * 100)}'`), + Revealer({ + revealChild: true, + transition: 'slide_left', + transitionDuration: 200, + child: Box({ + className: 'spacing-h-10 margin-left-10', + children: [ + BarResource('Swap Usage', 'swap_horiz', `free | awk '/^Swap/ {if ($2 > 0) printf("%.2f\\n", ($3/$2) * 100); else print "0";}'`), + BarResource('CPU Usage', 'settings_motion_mode', `top -bn1 | grep Cpu | awk '{print $2}'`), + ] + }), + setup: (self) => self.hook(Mpris, label => { + const mpris = Mpris.getPlayer(''); + self.revealChild = (!mpris); + }), + }) + ], + }) + }); return Widget.EventBox({ onScrollUp: (self) => switchToRelativeWorkspace(self, -1), onScrollDown: (self) => switchToRelativeWorkspace(self, +1), onPrimaryClickRelease: () => showMusicControls.setValue(!showMusicControls.value), onSecondaryClickRelease: () => execAsync(['bash', '-c', 'playerctl next || playerctl position `bc <<< "100 * $(playerctl metadata mpris:length) / 1000000 / 100"` &']), onMiddleClickRelease: () => execAsync('playerctl play-pause').catch(print), - child: Widget.Box({ - className: 'bar-group-margin bar-sides', + child: Box({ + className: 'spacing-h-5', children: [ - Widget.Box({ - className: 'bar-group bar-group-standalone bar-group-pad-music spacing-h-10', - children: [ - playingState, - trackTitle, - ] - }) + BarGroup({ child: musicStuff }), + systemResources, ] }) }); diff --git a/.config/ags/widgets/bar/system.js b/.config/ags/widgets/bar/system.js index 4358c80c2..1ca2fcc9a 100644 --- a/.config/ags/widgets/bar/system.js +++ b/.config/ags/widgets/bar/system.js @@ -1,5 +1,4 @@ -// This is for the right pill of the bar. -// For the cool memory indicator on the sidebar, see sysinfo.js +// This is for the right pills of the bar. import Widget from 'resource:///com/github/Aylur/ags/widget.js'; import * as Utils from 'resource:///com/github/Aylur/ags/utils.js'; const { Box, Label, Button, Overlay, Revealer, Scrollable, Stack, EventBox } = Widget; @@ -8,8 +7,11 @@ const { GLib } = imports.gi; import Battery from 'resource:///com/github/Aylur/ags/service/battery.js'; import { MaterialIcon } from '../../lib/materialicon.js'; import { AnimatedCircProg } from "../../lib/animatedcircularprogress.js"; +import { WWO_CODE, WEATHER_SYMBOL, NIGHT_WEATHER_SYMBOL } from '../../data/weather.js'; const BATTERY_LOW = 20; +const WEATHER_CACHE_FOLDER = `${GLib.get_user_cache_dir()}/ags/weather`; +Utils.exec(`mkdir -p ${WEATHER_CACHE_FOLDER}`); const BatBatteryProgress = () => { const _updateProgress = (circprog) => { // Set circular progress value @@ -90,7 +92,7 @@ const BarBattery = () => Box({ transitionDuration: 150, revealChild: false, transition: 'slide_right', - child: MaterialIcon('bolt', 'norm', {tooltipText: "Charging"}), + child: MaterialIcon('bolt', 'norm', { tooltipText: "Charging" }), setup: (self) => self.hook(Battery, revealer => { self.revealChild = Battery.charging; }), @@ -121,42 +123,6 @@ const BarBattery = () => Box({ ] }); -const BarResource = (name, icon, command) => { - const resourceLabel = Label({ - className: 'txt-smallie txt-onSurfaceVariant', - }); - const resourceCircProg = AnimatedCircProg({ - className: 'bar-batt-circprog', - vpack: 'center', hpack: 'center', - }); - const widget = Box({ - className: 'spacing-h-4 txt-onSurfaceVariant', - children: [ - resourceLabel, - Overlay({ - child: Widget.Box({ - vpack: 'center', - className: 'bar-batt', - homogeneous: true, - children: [ - MaterialIcon(icon, 'small'), - ], - }), - overlays: [resourceCircProg] - }), - ], - setup: (self) => self - .poll(5000, () => execAsync(['bash', '-c', command]) - .then((output) => { - resourceCircProg.css = `font-size: ${Number(output)}px;`; - resourceLabel.label = `${Math.round(Number(output))}%`; - widget.tooltipText = `${name}: ${Math.round(Number(output))}%`; - }).catch(print)) - , - }); - return widget; -} - const BarGroup = ({ child }) => Widget.Box({ className: 'bar-group-margin bar-sides', children: [ @@ -166,6 +132,72 @@ const BarGroup = ({ child }) => Widget.Box({ }), ] }); +const BatteryModule = () => Stack({ + transition: 'slide_up_down', + transitionDuration: 150, + children: { + 'laptop': Box({ + className: 'spacing-h-5', children: [ + BarGroup({ child: Utilities() }), + BarGroup({ child: BarBattery() }), + ] + }), + 'desktop': BarGroup({ + child: Box({ + hexpand: true, + hpack: 'center', + className: 'spacing-h-5', + children: [ + MaterialIcon('device_thermostat', 'small'), + Label({ + label: 'Weather', + }) + ], + setup: (self) => self.poll(900000, async (self) => { + const WEATHER_CACHE_PATH = WEATHER_CACHE_FOLDER + '/wttr.in.txt'; + Utils.execAsync('curl ipinfo.io') + .then(output => { + return JSON.parse(output)['city'].toLowerCase(); + }) + .then((city) => execAsync(`curl https://wttr.in/${city}?format=j1`) + .then(output => { + const weather = JSON.parse(output); + Utils.writeFile(JSON.stringify(weather), WEATHER_CACHE_PATH) + .catch(print); + const weatherCode = weather.current_condition[0].weatherCode; + const weatherDesc = weather.current_condition[0].weatherDesc[0].value; + const temperature = weather.current_condition[0].temp_C; + const feelsLike = weather.current_condition[0].FeelsLikeC; + const weatherSymbol = WEATHER_SYMBOL[WWO_CODE[weatherCode]]; + self.children[0].label = weatherSymbol; + self.children[1].label = `${temperature}℃ • Feels like ${feelsLike}℃`; + self.tooltipText = weatherDesc; + }).catch((err) => { + try { // Read from cache + const weather = JSON.parse( + Utils.readFile(WEATHER_CACHE_PATH) + ); + const weatherCode = weather.current_condition[0].weatherCode; + const weatherDesc = weather.current_condition[0].weatherDesc[0].value; + const temperature = weather.current_condition[0].temp_C; + const feelsLike = weather.current_condition[0].FeelsLikeC; + const weatherSymbol = WEATHER_SYMBOL[WWO_CODE[weatherCode]]; + self.children[0].label = weatherSymbol; + self.children[1].label = `${temperature}℃ • Feels like ${feelsLike}℃`; + self.tooltipText = weatherDesc; + } catch (err) { + print(err); + } + })); + }), + }) + }), + }, + setup: (stack) => Utils.timeout(10, () => { + if (!Battery.available) stack.shown = 'desktop'; + else stack.shown = 'laptop'; + }) +}) const switchToRelativeWorkspace = async (self, num) => { try { @@ -184,28 +216,7 @@ export default () => Widget.EventBox({ className: 'spacing-h-5', children: [ BarGroup({ child: BarClock() }), - Stack({ - transition: 'slide_up_down', - transitionDuration: 150, - items: [ - ['laptop', Box({ - className: 'spacing-h-5', children: [ - BarGroup({ child: Utilities() }), - BarGroup({ child: BarBattery() }), - ] - })], - ['desktop', Box({ - className: 'spacing-h-5', children: [ - BarGroup({ child: BarResource('RAM usage', 'memory', `free | awk '/^Mem/ {printf("%.2f\\n", ($3/$2) * 100)}'`), }), - BarGroup({ child: BarResource('Swap usage', 'swap_horiz', `free | awk '/^Swap/ {printf("%.2f\\n", ($3/$2) * 100)}'`), }), - ] - })], - ], - setup: (stack) => Utils.timeout(10, () => { - if (!Battery.available) stack.shown = 'desktop'; - else stack.shown = 'laptop'; - }) - }) + BatteryModule(), ] }) }); diff --git a/.config/ags/widgets/bar/workspaces_hyprland.js b/.config/ags/widgets/bar/workspaces_hyprland.js index 0c3c63e1d..ae841ebe1 100644 --- a/.config/ags/widgets/bar/workspaces_hyprland.js +++ b/.config/ags/widgets/bar/workspaces_hyprland.js @@ -4,11 +4,12 @@ const Cairo = imports.cairo; const Pango = imports.gi.Pango; const PangoCairo = imports.gi.PangoCairo; import App from 'resource:///com/github/Aylur/ags/app.js'; +import * as Utils from 'resource:///com/github/Aylur/ags/utils.js' import Widget from 'resource:///com/github/Aylur/ags/widget.js'; const { Box, DrawingArea, EventBox } = Widget; import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js'; -const NUM_OF_WORKSPACES = 10; +const NUM_OF_WORKSPACES_SHOWN = 10; // Limit = 53 I think const dummyWs = Box({ className: 'bar-ws' }); // Not shown. Only for getting size props const dummyActiveWs = Box({ className: 'bar-ws bar-ws-active' }); // Not shown. Only for getting size props const dummyOccupiedWs = Box({ className: 'bar-ws bar-ws-occupied' }); // Not shown. Only for getting size props @@ -16,38 +17,40 @@ const dummyOccupiedWs = Box({ className: 'bar-ws bar-ws-occupied' }); // Not sho // Font size = workspace id const WorkspaceContents = (count = 10) => { return DrawingArea({ - css: `transition: 90ms cubic-bezier(0.1, 1, 0, 1);`, + // css: `transition: 90ms cubic-bezier(0.1, 1, 0, 1);`, attribute: { initialized: false, workspaceMask: 0, updateMask: (self) => { - if (self.attribute.initialized) return; // We only need this to run once + const offset = Math.floor((Hyprland.active.workspace.id - 1) / count) * NUM_OF_WORKSPACES_SHOWN; + // if (self.attribute.initialized) return; // We only need this to run once const workspaces = Hyprland.workspaces; let workspaceMask = 0; for (let i = 0; i < workspaces.length; i++) { const ws = workspaces[i]; - if (ws.id <= 0) continue; // Ignore scratchpads - if (ws.id > count) return; // Not rendered - if (workspaces[i].windows > 0) { - workspaceMask |= (1 << ws.id); - } + if (ws.id <= offset || ws.id > offset + count) continue; // Out of range, ignore + if (workspaces[i].windows > 0) + workspaceMask |= (1 << (ws.id - offset)); } + // console.log('Mask:', workspaceMask.toString(2)); self.attribute.workspaceMask = workspaceMask; - self.attribute.initialized = true; + // self.attribute.initialized = true; + self.queue_draw(); }, toggleMask: (self, occupied, name) => { if (occupied) self.attribute.workspaceMask |= (1 << parseInt(name)); else self.attribute.workspaceMask &= ~(1 << parseInt(name)); + self.queue_draw(); }, }, setup: (area) => area - .hook(Hyprland.active.workspace, (area) => - area.setCss(`font-size: ${Hyprland.active.workspace.id}px;`) - ) + .hook(Hyprland.active.workspace, (self) => { + self.setCss(`font-size: ${(Hyprland.active.workspace.id - 1) % count + 1}px;`); + }) .hook(Hyprland, (self) => self.attribute.updateMask(self), 'notify::workspaces') - .hook(Hyprland, (self, name) => self.attribute.toggleMask(self, true, name), 'workspace-added') - .hook(Hyprland, (self, name) => self.attribute.toggleMask(self, false, name), 'workspace-removed') .on('draw', Lang.bind(area, (area, cr) => { + const offset = Math.floor((Hyprland.active.workspace.id - 1) / count) * NUM_OF_WORKSPACES_SHOWN; + const allocation = area.get_allocation(); const { width, height } = allocation; @@ -113,12 +116,12 @@ const WorkspaceContents = (count = 10) => { } else cr.setSourceRGBA(wsfg.red, wsfg.green, wsfg.blue, wsfg.alpha); - layout.set_text(`${i}`, -1); + + layout.set_text(`${i + offset}`, -1); const [layoutWidth, layoutHeight] = layout.get_pixel_size(); const x = -workspaceRadius + (workspaceDiameter * i) - (layoutWidth / 2); const y = (height - layoutHeight) / 2; cr.moveTo(x, y); - // cr.showText(text); PangoCairo.show_layout(cr, layout); cr.stroke(); } @@ -142,16 +145,17 @@ export default () => EventBox({ onScrollDown: () => Hyprland.sendMessage(`dispatch workspace +1`), onMiddleClickRelease: () => App.toggleWindow('overview'), onSecondaryClickRelease: () => App.toggleWindow('osk'), - attribute: { clicked: false }, + attribute: { + clicked: false, + ws_group: 0, + }, child: Box({ homogeneous: true, className: 'bar-group-margin', children: [Box({ className: 'bar-group bar-group-standalone bar-group-pad', css: 'min-width: 2px;', - children: [ - WorkspaceContents(10), - ] + children: [WorkspaceContents(NUM_OF_WORKSPACES_SHOWN)], })] }), setup: (self) => { @@ -160,16 +164,18 @@ export default () => EventBox({ if (!self.attribute.clicked) return; const [_, cursorX, cursorY] = event.get_coords(); const widgetWidth = self.get_allocation().width; - const wsId = Math.ceil(cursorX * NUM_OF_WORKSPACES / widgetWidth); - Hyprland.sendMessage(`dispatch workspace ${wsId}`) + const wsId = Math.ceil(cursorX * NUM_OF_WORKSPACES_SHOWN / widgetWidth); + Utils.execAsync([`${App.configDir}/scripts/hyprland/workspace_action.sh`, 'workspace', `${wsId}`]); }) self.on('button-press-event', (self, event) => { if (!(event.get_button()[1] === 1)) return; // We're only interested in left-click here self.attribute.clicked = true; const [_, cursorX, cursorY] = event.get_coords(); const widgetWidth = self.get_allocation().width; - const wsId = Math.ceil(cursorX * NUM_OF_WORKSPACES / widgetWidth); - Hyprland.sendMessage(`dispatch workspace ${wsId}`); + // const wsId = Math.ceil(cursorX * NUM_OF_WORKSPACES_PER_GROUP / widgetWidth) + self.attribute.ws_group * NUM_OF_WORKSPACES_PER_GROUP; + // Hyprland.sendMessage(`dispatch workspace ${wsId}`); + const wsId = Math.ceil(cursorX * NUM_OF_WORKSPACES_SHOWN / widgetWidth); + Utils.execAsync([`${App.configDir}/scripts/hyprland/workspace_action.sh`, 'workspace', `${wsId}`]); }) self.on('button-release-event', (self) => self.attribute.clicked = false); } diff --git a/.config/ags/widgets/cheatsheet/main.js b/.config/ags/widgets/cheatsheet/main.js index 2eced0f03..d2e41f5c0 100644 --- a/.config/ags/widgets/cheatsheet/main.js +++ b/.config/ags/widgets/cheatsheet/main.js @@ -71,7 +71,7 @@ const clickOutsideToClose = Widget.EventBox({ export default () => Widget.Window({ name: 'cheatsheet', exclusivity: 'ignore', - focusable: true, + keymode: 'exclusive', popup: true, visible: false, child: Widget.Box({ diff --git a/.config/ags/widgets/desktopbackground/system.js b/.config/ags/widgets/desktopbackground/system.js index 6d49c5248..a22888fab 100644 --- a/.config/ags/widgets/desktopbackground/system.js +++ b/.config/ags/widgets/desktopbackground/system.js @@ -63,9 +63,9 @@ const resources = Box({ label.label = `${output}` }).catch(print); }, { hpack: 'end' }), - ResourceValue('Swap', 'swap_horiz', 10000, `free | awk '/^Swap/ {printf("%.2f\\n", ($3/$2) * 100)}'`, + ResourceValue('Swap', 'swap_horiz', 10000, `free | awk '/^Swap/ {if ($2 > 0) printf("%.2f\\n", ($3/$2) * 100); else print "0";}'`, (label) => { - execAsync(['bash', '-c', `free -h | awk '/^Swap/ {print $3 " / " $2}' | sed 's/Gi/Gib/g'`]) + execAsync(['bash', '-c', `free -h | awk '/^Swap/ {if ($2 != "0") print $3 " / " $2; else print "No swap"}' | sed 's/Gi/Gib/g'`]) .then((output) => { label.label = `${output}` }).catch(print); diff --git a/.config/ags/widgets/desktopbackground/wallpaper.js b/.config/ags/widgets/desktopbackground/wallpaper.js index 0b3cce444..ad1272adc 100644 --- a/.config/ags/widgets/desktopbackground/wallpaper.js +++ b/.config/ags/widgets/desktopbackground/wallpaper.js @@ -99,10 +99,10 @@ export default (monitor = 0) => { const stack = Stack({ transition: 'crossfade', transitionDuration: 180, - items: [ - ['image', wallpaperImage], - ['prompt', wallpaperPrompt], - ], + children: { + 'image': wallpaperImage, + 'prompt': wallpaperPrompt, + }, setup: (self) => self .hook(Wallpaper, (self) => { const wallPath = Wallpaper.get(monitor); diff --git a/.config/ags/widgets/indicators/musiccontrols.js b/.config/ags/widgets/indicators/musiccontrols.js index 1ae05ae8f..f817eca4a 100644 --- a/.config/ags/widgets/indicators/musiccontrols.js +++ b/.config/ags/widgets/indicators/musiccontrols.js @@ -365,6 +365,7 @@ export default () => MarginRevealer({ for (let i = 0; i < children.length; i++) { const child = children[i]; child.destroy(); + child = null; } return; } diff --git a/.config/ags/widgets/indicators/notificationpopups.js b/.config/ags/widgets/indicators/notificationpopups.js index f5c0b3675..ab8e68af9 100644 --- a/.config/ags/widgets/indicators/notificationpopups.js +++ b/.config/ags/widgets/indicators/notificationpopups.js @@ -10,12 +10,14 @@ export default () => Box({ attribute: { 'map': new Map(), 'dismiss': (box, id, force = false) => { - if (!id || !box.attribute.map.has(id) || box.attribute.map.get(id).attribute.hovered && !force) + if (!id || !box.attribute.map.has(id)) return; + const notifWidget = box.attribute.map.get(id); + if (notifWidget == null || notifWidget.attribute.hovered && !force) + return; // cuz already destroyed - const notif = box.attribute.map.get(id); - notif.revealChild = false; - notif.attribute.destroyWithAnims(); + notifWidget.revealChild = false; + notifWidget.attribute.destroyWithAnims(); box.attribute.map.delete(id); }, 'notify': (box, id) => { @@ -32,8 +34,6 @@ export default () => Box({ box.attribute.map.set(id, newNotif); box.pack_end(box.attribute.map.get(id), false, false, 0); box.show_all(); - - // box.children = Array.from(box.attribute.map.values()).reverse(); }, }, setup: (self) => self diff --git a/.config/ags/widgets/overview/main.js b/.config/ags/widgets/overview/main.js index 534fd8481..436b444e9 100644 --- a/.config/ags/widgets/overview/main.js +++ b/.config/ags/widgets/overview/main.js @@ -4,7 +4,7 @@ import { SearchAndWindows } from "./windowcontent.js"; export default () => Widget.Window({ name: 'overview', exclusivity: 'ignore', - focusable: true, + keymode: 'exclusive', popup: true, visible: false, anchor: ['top'], diff --git a/.config/ags/widgets/overview/miscfunctions.js b/.config/ags/widgets/overview/miscfunctions.js index 2ca0bf954..9b7e51cbf 100644 --- a/.config/ags/widgets/overview/miscfunctions.js +++ b/.config/ags/widgets/overview/miscfunctions.js @@ -53,7 +53,7 @@ export function launchCustomCommand(command) { execAsync([`bash`, `-c`, `systemctl suspend`]).catch(print); } else if (args[0] == '>logout') { // Log out - execAsync([`bash`, `-c`, `loginctl terminate-user $USER`]).catch(print); + execAsync([`bash`, `-c`, `pkill Hyprland || pkill sway`]).catch(print); } } diff --git a/.config/ags/widgets/overview/overview_hyprland.js b/.config/ags/widgets/overview/overview_hyprland.js index 7f3d6d1ad..053caba6c 100644 --- a/.config/ags/widgets/overview/overview_hyprland.js +++ b/.config/ags/widgets/overview/overview_hyprland.js @@ -1,3 +1,7 @@ +// TODO +// - Make client destroy/create not destroy and recreate the whole thing +// - Active ws hook optimization: only update when moving to next group +// const { Gdk, Gtk } = imports.gi; import { SCREEN_HEIGHT, SCREEN_WIDTH } from '../../imports.js'; import App from 'resource:///com/github/Aylur/ags/app.js'; @@ -10,42 +14,16 @@ const { execAsync, exec } = Utils; import { setupCursorHoverGrab } from "../../lib/cursorhover.js"; import { dumpToWorkspace, swapWorkspace } from "./actions.js"; -const OVERVIEW_SCALE = 0.18; // = overview workspace box / screen size +const OVERVIEW_SCALE = 0.18; +const NUM_OF_WORKSPACE_ROWS = 2; +const NUM_OF_WORKSPACE_COLS = 5; const OVERVIEW_WS_NUM_SCALE = 0.09; +const NUM_OF_WORKSPACES_SHOWN = NUM_OF_WORKSPACE_COLS * NUM_OF_WORKSPACE_ROWS; const OVERVIEW_WS_NUM_MARGIN_SCALE = 0.07; const TARGET = [Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags.SAME_APP, 0)]; const overviewTick = Variable(false); -function truncateTitle(str) { - let lastDash = -1; - let found = -1; // 0: em dash, 1: en dash, 2: minus, 3: vertical bar, 4: middle dot - for (let i = str.length - 1; i >= 0; i--) { - if (str[i] === '—') { - found = 0; - lastDash = i; - } - else if (str[i] === '–' && found < 1) { - found = 1; - lastDash = i; - } - else if (str[i] === '-' && found < 2) { - found = 2; - lastDash = i; - } - else if (str[i] === '|' && found < 3) { - found = 3; - lastDash = i; - } - else if (str[i] === '·' && found < 4) { - found = 4; - lastDash = i; - } - } - if (lastDash === -1) return str; - return str.substring(0, lastDash); -} - function iconExists(iconName) { let iconTheme = Gtk.IconTheme.get_default(); return iconTheme.has_icon(iconName); @@ -76,7 +54,11 @@ const ContextMenuWorkspaceArray = ({ label, actionFunc, thisWorkspace }) => Widg setup: (menuItem) => { let submenu = new Gtk.Menu(); submenu.className = 'menu'; - for (let i = 1; i <= 10; i++) { + + const offset = Math.floor((Hyprland.active.workspace.id - 1) / NUM_OF_WORKSPACES_SHOWN) * NUM_OF_WORKSPACES_SHOWN; + const startWorkspace = offset + 1; + const endWorkspace = startWorkspace + NUM_OF_WORKSPACES_SHOWN - 1; + for (let i = startWorkspace; i <= endWorkspace; i++) { let button = new Gtk.MenuItem({ label: `Workspace ${i}` }); @@ -91,11 +73,22 @@ const ContextMenuWorkspaceArray = ({ label, actionFunc, thisWorkspace }) => Widg } }) -const client = ({ address, size: [w, h], workspace: { id, name }, class: c, title, xwayland }) => { +const Window = ({ address, at: [x, y], size: [w, h], workspace: { id, name }, class: c, title, xwayland }) => { const revealInfoCondition = (Math.min(w, h) * OVERVIEW_SCALE > 70); - if (w <= 0 || h <= 0) return null; + if (w <= 0 || h <= 0 || (c === '' && title === '')) return null; + if (x + w <= 0) x += (Math.floor(x / SCREEN_WIDTH) * SCREEN_WIDTH); + else if (x < 0) { x = 0; w = x + w; } + if (y + h <= 0) x += (Math.floor(y / SCREEN_HEIGHT) * SCREEN_HEIGHT); + else if (y < 0) { y = 0; h = y + h; } + + if (x >= SCREEN_WIDTH) x %= SCREEN_WIDTH; + else if (x + w > SCREEN_WIDTH) w = SCREEN_WIDTH - x; + if (y >= SCREEN_HEIGHT) y %= SCREEN_HEIGHT; + else if (y + h > SCREEN_HEIGHT) h = SCREEN_HEIGHT - y; + // title = truncateTitle(title); return Widget.Button({ + attribute: { x, y }, className: 'overview-tasks-window', hpack: 'center', vpack: 'center', @@ -188,8 +181,9 @@ const client = ({ address, size: [w, h], workspace: { id, name }, class: c, titl }); } -const workspace = index => { +const Workspace = (index) => { const fixed = Gtk.Fixed.new(); + // const clientMap = new Map(); const WorkspaceNumber = (index) => Widget.Label({ className: 'overview-tasks-workspace-number', label: `${index}`, @@ -202,8 +196,8 @@ const workspace = index => { className: 'overview-tasks-workspace', vpack: 'center', css: ` - min-width: ${SCREEN_WIDTH * OVERVIEW_SCALE}px; - min-height: ${SCREEN_HEIGHT * OVERVIEW_SCALE}px; + min-width: ${SCREEN_WIDTH * OVERVIEW_SCALE}px; + min-height: ${SCREEN_HEIGHT * OVERVIEW_SCALE}px; `, children: [Widget.EventBox({ hexpand: true, @@ -222,36 +216,30 @@ const workspace = index => { child: fixed, })], }); - widget.update = (clients) => { - clients = clients.filter(({ workspace: { id } }) => id === index); - - // this is for my monitor layout - // shifts clients back by SCREEN_WIDTHpx if necessary - clients = clients.map(client => { - const [x, y] = client.at; - if (x > SCREEN_WIDTH) - client.at = [x - SCREEN_WIDTH, y]; - return client; - }); - - const children = fixed.get_children(); - for (let i = 0; i < children.length; i++) { - const child = children[i]; - child.destroy(); - } - fixed.put(WorkspaceNumber(index), 0, 0); - - for (let i = 0; i < clients.length; i++) { - const c = clients[i]; - if (c.mapped) { - fixed.put(client(c), c.at[0] * OVERVIEW_SCALE, c.at[1] * OVERVIEW_SCALE); - } - } - - - - fixed.show_all(); + widget.clear = () => { + fixed.get_children().forEach(ch => ch.destroy()); + const offset = Math.floor((Hyprland.active.workspace.id - 1) / NUM_OF_WORKSPACES_SHOWN) * NUM_OF_WORKSPACES_SHOWN; + fixed.put(WorkspaceNumber(offset + index), 0, 0); + } + widget.set = (clientJson) => { + // if(clientMap.get(clientJson.address)) clientMap.get(clientJson.address).destroy(); + const newWindow = Window(clientJson); + if (newWindow === null) return; + // clientMap.set(clientJson.address, newWindow); + fixed.put(newWindow, + Math.max(0, newWindow.attribute.x * OVERVIEW_SCALE), + Math.max(0, newWindow.attribute.y * OVERVIEW_SCALE) + ); }; + // widget.unset = (clientAddress) => { + // if(clientMap.get(clientAddress)) { + // clientMap.get(clientAddress).destroy(); + // clientMap.delete(clientAddress); + // } + // }; + widget.show = () => { + fixed.show_all(); + } return widget; }; @@ -264,30 +252,37 @@ const arr = (s, n) => { }; const OverviewRow = ({ startWorkspace, workspaces, windowName = 'overview' }) => Widget.Box({ - children: arr(startWorkspace, workspaces).map(workspace), + children: arr(startWorkspace, workspaces).map(Workspace), attribute: { - 'update': box => { + update: (box) => { + const offset = Math.floor((Hyprland.active.workspace.id - 1) / NUM_OF_WORKSPACES_SHOWN) * NUM_OF_WORKSPACES_SHOWN; if (!App.getWindow(windowName).visible) return; execAsync('hyprctl -j clients').then(clients => { - const json = JSON.parse(clients); - const children = box.get_children(); - for (let i = 0; i < children.length; i++) { - const ch = children[i]; - ch.update(json) + const allClients = JSON.parse(clients); + const kids = box.get_children(); + kids.forEach(kid => kid.clear()); + for (let i = 0; i < allClients.length; i++) { + const client = allClients[i]; + if (offset + startWorkspace <= client.workspace.id && + client.workspace.id <= offset + startWorkspace + workspaces) { + kids[client.workspace.id - (offset + startWorkspace)] + ?.set(client); + } } + kids.forEach(kid => kid.show()); }).catch(print); } }, setup: (box) => box .hook(overviewTick, (box) => box.attribute.update(box)) - // .hook(Hyprland, (box, name, data) => { // idk, does this make it lag occasionally? - // console.log(name) - // if (["changefloatingmode", "movewindow"].includes(name)) - // box.attribute.update(box); - // }, 'event') - .hook(Hyprland, (box) => box.attribute.update(box), 'client-added') - .hook(Hyprland, (box) => box.attribute.update(box), 'client-removed') + .hook(Hyprland, (box, clientAddress) => { + box.attribute.update(box) + }, 'client-removed') + .hook(Hyprland, (box, clientAddress) => { + box.attribute.update(box); + }, 'client-added') + .hook(Hyprland.active.workspace, (box) => box.attribute.update(box)) .hook(App, (box, name, visible) => { // Update on open if (name == 'overview' && visible) box.attribute.update(box); }) @@ -295,19 +290,18 @@ const OverviewRow = ({ startWorkspace, workspaces, windowName = 'overview' }) => }); -export default () => { - const overviewRevealer = Widget.Revealer({ - revealChild: true, - transition: 'slide_down', - transitionDuration: 200, - child: Widget.Box({ - vertical: true, - className: 'overview-tasks', - children: [ - OverviewRow({ startWorkspace: 1, workspaces: 5 }), - OverviewRow({ startWorkspace: 6, workspaces: 5 }), - ] - }), - }); - return overviewRevealer; -}; +export default () => Widget.Revealer({ + revealChild: true, + transition: 'slide_down', + transitionDuration: 200, + child: Widget.Box({ + vertical: true, + className: 'overview-tasks', + children: Array.from({ length: NUM_OF_WORKSPACE_ROWS }, (_, index) => + OverviewRow({ + startWorkspace: 1 + index * NUM_OF_WORKSPACE_COLS, + workspaces: NUM_OF_WORKSPACE_COLS, + }) + ) + }), +}); diff --git a/.config/ags/widgets/overview/searchbuttons.js b/.config/ags/widgets/overview/searchbuttons.js index bd43ca819..8ea12c887 100644 --- a/.config/ags/widgets/overview/searchbuttons.js +++ b/.config/ags/widgets/overview/searchbuttons.js @@ -149,6 +149,7 @@ export const ExecuteCommandButton = ({ command, terminal = false }) => searchIte actionName: `Execute ${terminal ? 'in terminal' : ''}`, content: `${command}`, onActivate: () => execAndClose(command, terminal), + extraClassName: 'techfont', }) export const CustomCommandButton = ({ text = '' }) => searchItem({ diff --git a/.config/ags/widgets/overview/searchitem.js b/.config/ags/widgets/overview/searchitem.js index 97b65d3ba..276885ad0 100644 --- a/.config/ags/widgets/overview/searchitem.js +++ b/.config/ags/widgets/overview/searchitem.js @@ -1,6 +1,6 @@ import Widget from 'resource:///com/github/Aylur/ags/widget.js'; -export const searchItem = ({ materialIconName, name, actionName, content, onActivate }) => { +export const searchItem = ({ materialIconName, name, actionName, content, onActivate, extraClassName = '', ...rest }) => { const actionText = Widget.Revealer({ revealChild: false, transition: "crossfade", @@ -17,7 +17,7 @@ export const searchItem = ({ materialIconName, name, actionName, content, onActi child: actionText, }) return Widget.Button({ - className: 'overview-search-result-btn', + className: `overview-search-result-btn txt ${extraClassName}`, onClicked: onActivate, child: Widget.Box({ children: [ @@ -33,13 +33,13 @@ export const searchItem = ({ materialIconName, name, actionName, content, onActi children: [ Widget.Label({ hpack: 'start', - className: 'overview-search-results-txt txt txt-smallie txt-subtext', + className: 'overview-search-results-txt txt-smallie txt-subtext', label: `${name}`, truncate: "end", }), Widget.Label({ hpack: 'start', - className: 'overview-search-results-txt txt txt-norm', + className: 'overview-search-results-txt txt-norm', label: `${content}`, truncate: "end", }), diff --git a/.config/ags/widgets/overview/windowcontent.js b/.config/ags/widgets/overview/windowcontent.js index e61250f54..68b9d34a4 100644 --- a/.config/ags/widgets/overview/windowcontent.js +++ b/.config/ags/widgets/overview/windowcontent.js @@ -106,7 +106,7 @@ export const SearchAndWindows = () => { if (couldBeMath(text)) { // Eval on typing is dangerous, this is a workaround try { - const fullResult = eval(text); + const fullResult = eval(text.replace(/\^/g, "**")); // copy execAsync(['wl-copy', `${fullResult}`]).catch(print); App.closeWindow('overview'); @@ -168,7 +168,7 @@ export const SearchAndWindows = () => { // Calculate if (couldBeMath(text)) { // Eval on typing is dangerous; this is a small workaround. try { - const fullResult = eval(text); + const fullResult = eval(text.replace(/\^/g, "**")); resultsBox.add(CalculationResultButton({ result: fullResult, text: text })); } catch (e) { // console.log(e); diff --git a/.config/ags/widgets/session/main.js b/.config/ags/widgets/session/main.js index 8508ba317..acf66ddf9 100644 --- a/.config/ags/widgets/session/main.js +++ b/.config/ags/widgets/session/main.js @@ -5,7 +5,7 @@ export default () => Widget.Window({ // On-screen keyboard name: 'session', popup: true, visible: false, - focusable: true, + keymode: 'exclusive', layer: 'overlay', exclusivity: 'ignore', // anchor: ['top', 'bottom', 'left', 'right'], diff --git a/.config/ags/widgets/session/sessionscreen.js b/.config/ags/widgets/session/sessionscreen.js index 0b760fd21..8ecb14452 100644 --- a/.config/ags/widgets/session/sessionscreen.js +++ b/.config/ags/widgets/session/sessionscreen.js @@ -63,7 +63,7 @@ export default () => { // lock, logout, sleep // const lockButton = SessionButton('Lock', 'lock', () => { App.closeWindow('session'); execAsync('gtklock') }); const lockButton = SessionButton('Lock', 'lock', () => { App.closeWindow('session'); execAsync('swaylock') }); - const logoutButton = SessionButton('Logout', 'logout', () => { App.closeWindow('session'); execAsync(['bash', '-c', 'loginctl terminate-user $USER']) }); + const logoutButton = SessionButton('Logout', 'logout', () => { App.closeWindow('session'); execAsync(['bash', '-c', 'pkill Hyprland || pkill sway']) }); const sleepButton = SessionButton('Sleep', 'sleep', () => { App.closeWindow('session'); execAsync('systemctl suspend') }); // hibernate, shutdown, reboot const hibernateButton = SessionButton('Hibernate', 'downloading', () => { App.closeWindow('session'); execAsync('systemctl hibernate') }); diff --git a/.config/ags/widgets/sideleft/apis/ai_chatmessage.js b/.config/ags/widgets/sideleft/apis/ai_chatmessage.js index 22f32f64b..66b589cd1 100644 --- a/.config/ags/widgets/sideleft/apis/ai_chatmessage.js +++ b/.config/ags/widgets/sideleft/apis/ai_chatmessage.js @@ -1,4 +1,5 @@ const { Gdk, Gio, GLib, Gtk } = imports.gi; +import GtkSource from "gi://GtkSource?version=3.0"; import App from 'resource:///com/github/Aylur/ags/app.js'; import Widget from 'resource:///com/github/Aylur/ags/widget.js'; import * as Utils from 'resource:///com/github/Aylur/ags/utils.js'; @@ -6,12 +7,12 @@ const { Box, Button, Label, Scrollable } = Widget; const { execAsync, exec } = Utils; import { MaterialIcon } from "../../../lib/materialicon.js"; import md2pango from "../../../lib/md2pango.js"; -import GtkSource from "gi://GtkSource?version=3.0"; + const CUSTOM_SOURCEVIEW_SCHEME_PATH = `${App.configDir}/data/sourceviewtheme.xml`; const CUSTOM_SCHEME_ID = 'custom'; const USERNAME = GLib.get_user_name(); -const CHATGPT_CURSOR = ' (o) '; +const CHATGPT_CURSOR = ' ...'; /////////////////////// Custom source view colorscheme ///////////////////////// diff --git a/.config/ags/widgets/sideleft/apis/chatgpt.js b/.config/ags/widgets/sideleft/apis/chatgpt.js index 90d538ed4..91de66250 100644 --- a/.config/ags/widgets/sideleft/apis/chatgpt.js +++ b/.config/ags/widgets/sideleft/apis/chatgpt.js @@ -122,7 +122,7 @@ export const ChatGPTSettings = () => MarginRevealer({ }, }), ConfigToggle({ - icon: 'description', + icon: 'model_training', name: 'Enhancements', desc: 'Tells ChatGPT:\n- It\'s a Linux sidebar assistant\n- Be brief and use bullet points', initValue: ChatGPT.assistantPrompt, diff --git a/.config/ags/widgets/sideleft/apis/gemini.js b/.config/ags/widgets/sideleft/apis/gemini.js index 6f9c68333..0931c9730 100644 --- a/.config/ags/widgets/sideleft/apis/gemini.js +++ b/.config/ags/widgets/sideleft/apis/gemini.js @@ -110,7 +110,7 @@ export const GeminiSettings = () => MarginRevealer({ className: 'sidebar-chat-settings-toggles', children: [ ConfigToggle({ - icon: 'description', + icon: 'model_training', name: 'Enhancements', desc: 'Tells Gemini:\n- It\'s a Linux sidebar assistant\n- Be brief and use bullet points', initValue: Gemini.assistantPrompt, diff --git a/.config/ags/widgets/sideleft/apis/waifu.js b/.config/ags/widgets/sideleft/apis/waifu.js index c5a61531b..ef31b6d66 100644 --- a/.config/ags/widgets/sideleft/apis/waifu.js +++ b/.config/ags/widgets/sideleft/apis/waifu.js @@ -72,12 +72,12 @@ const WaifuImage = (taglist) => { homogeneous: false, transition: 'slide_up_down', transitionDuration: 150, - items: [ - ['api', ImageState('api', 'Calling API')], - ['download', ImageState('downloading', 'Downloading image')], - ['done', ImageState('done', 'Finished!')], - ['error', ImageState('error', 'Error')], - ] + children: { + 'api': ImageState('api', 'Calling API'), + 'download': ImageState('downloading', 'Downloading image'), + 'done': ImageState('done', 'Finished!'), + 'error': ImageState('error', 'Error'), + }, }); const downloadIndicator = MarginRevealer({ vpack: 'center', diff --git a/.config/ags/widgets/sideleft/apiwidgets.js b/.config/ags/widgets/sideleft/apiwidgets.js index 5963a12c4..4ac117f53 100644 --- a/.config/ags/widgets/sideleft/apiwidgets.js +++ b/.config/ags/widgets/sideleft/apiwidgets.js @@ -1,16 +1,22 @@ +const { Gtk, Gdk } = imports.gi; import App from 'resource:///com/github/Aylur/ags/app.js'; import Widget from 'resource:///com/github/Aylur/ags/widget.js'; +import AgsWidget from "resource:///com/github/Aylur/ags/widgets/widget.js"; import * as Utils from 'resource:///com/github/Aylur/ags/utils.js'; -const { Box, Button, CenterBox, Entry, EventBox, Icon, Label, Revealer, Scrollable, Stack } = Widget; +const { Box, Button, CenterBox, Entry, EventBox, Icon, Label, Overlay, Revealer, Scrollable, Stack } = Widget; const { execAsync, exec } = Utils; import { setupCursorHover, setupCursorHoverInfo } from "../../lib/cursorhover.js"; +import { contentStack } from './sideleft.js'; // APIs import ChatGPT from '../../services/chatgpt.js'; import Gemini from '../../services/gemini.js'; import { geminiView, geminiCommands, sendMessage as geminiSendMessage, geminiTabIcon } from './apis/gemini.js'; import { chatGPTView, chatGPTCommands, sendMessage as chatGPTSendMessage, chatGPTTabIcon } from './apis/chatgpt.js'; import { waifuView, waifuCommands, sendMessage as waifuSendMessage, waifuTabIcon } from './apis/waifu.js'; +const TextView = Widget.subclass(Gtk.TextView, "AgsTextView"); + +const EXPAND_INPUT_THRESHOLD = 30; const APIS = [ { name: 'Assistant (ChatGPT 3.5)', @@ -40,9 +46,25 @@ const APIS = [ let currentApiId = 0; APIS[currentApiId].tabIcon.toggleClassName('sidebar-chat-apiswitcher-icon-enabled', true); -export const chatEntry = Entry({ - className: 'sidebar-chat-entry', +function apiSendMessage(textView) { + // Get text + const buffer = textView.get_buffer(); + const [start, end] = buffer.get_bounds(); + const text = buffer.get_text(start, end, true).trimStart(); + if (!text || text.length == 0) return; + // Send + APIS[currentApiId].sendCommand(text) + // Reset + buffer.set_text("", -1); + chatEntryWrapper.toggleClassName('sidebar-chat-wrapper-extended', false); + chatEntry.set_valign(Gtk.Align.CENTER); +} + +export const chatEntry = TextView({ hexpand: true, + wrapMode: Gtk.WrapMode.WORD_CHAR, + acceptsTab: false, + className: 'sidebar-chat-entry txt txt-smallie', setup: (self) => self .hook(ChatGPT, (self) => { if (APIS[currentApiId].name != 'Assistant (ChatGPT 3.5)') return; @@ -52,31 +74,84 @@ export const chatEntry = Entry({ if (APIS[currentApiId].name != 'Assistant (Gemini Pro)') return; self.placeholderText = (Gemini.key.length > 0 ? 'Message Gemini...' : 'Enter Google AI API Key...'); }, 'hasKey') + .on("key-press-event", (widget, event) => { + const keyval = event.get_keyval()[1]; + if (event.get_keyval()[1] === Gdk.KEY_Return && event.get_state()[1] == Gdk.ModifierType.MOD2_MASK) { + apiSendMessage(widget); + return true; + } + // Global keybinds + if (!(event.get_state()[1] & Gdk.ModifierType.CONTROL_MASK) && + event.get_keyval()[1] === Gdk.KEY_Page_Down) { + const toSwitchTab = contentStack.get_visible_child(); + toSwitchTab.attribute.nextTab(); + } + else if (!(event.get_state()[1] & Gdk.ModifierType.CONTROL_MASK) && + event.get_keyval()[1] === Gdk.KEY_Page_Up) { + const toSwitchTab = contentStack.get_visible_child(); + toSwitchTab.attribute.prevTab(); + } + }) , - onChange: (entry) => { - chatSendButton.toggleClassName('sidebar-chat-send-available', entry.text.length > 0); - }, - onAccept: (entry) => { - APIS[currentApiId].sendCommand(entry.text) - entry.text = ''; - }, +}); + +chatEntry.get_buffer().connect("changed", (buffer) => { + const bufferText = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter(), true); + chatSendButton.toggleClassName('sidebar-chat-send-available', bufferText.length > 0); + chatPlaceholderRevealer.revealChild = (bufferText.length == 0); + if (buffer.get_line_count() > 1 || bufferText.length > EXPAND_INPUT_THRESHOLD) { + chatEntryWrapper.toggleClassName('sidebar-chat-wrapper-extended', true); + chatEntry.set_valign(Gtk.Align.FILL); + chatPlaceholder.set_valign(Gtk.Align.FILL); + } + else { + chatEntryWrapper.toggleClassName('sidebar-chat-wrapper-extended', false); + chatEntry.set_valign(Gtk.Align.CENTER); + chatPlaceholder.set_valign(Gtk.Align.CENTER); + } +}); + +const chatEntryWrapper = Scrollable({ + className: 'sidebar-chat-wrapper', + hscroll: 'never', + vscroll: 'always', + child: chatEntry, }); const chatSendButton = Button({ className: 'txt-norm icon-material sidebar-chat-send', - vpack: 'center', + vpack: 'end', label: 'arrow_upward', setup: setupCursorHover, onClicked: (self) => { - APIS[currentApiId].sendCommand(chatEntry.text); - chatEntry.text = ''; + APIS[currentApiId].sendCommand(chatEntry.get_buffer().text); + chatEntry.get_buffer().set_text("", -1); }, }); +const chatPlaceholder = Label({ + className: 'txt-subtext txt-smallie margin-left-5', + hpack: 'start', + vpack: 'center', + label: APIS[currentApiId].placeholderText, +}); + +const chatPlaceholderRevealer = Revealer({ + revealChild: true, + transition: 'crossfade', + transitionDuration: 200, + child: chatPlaceholder, +}); + const textboxArea = Box({ // Entry area - className: 'sidebar-chat-textarea spacing-h-10', + className: 'sidebar-chat-textarea', children: [ - chatEntry, + Overlay({ + passThrough: true, + child: chatEntryWrapper, + overlays: [chatPlaceholderRevealer], + }), + Box({ className: 'width-10' }), chatSendButton, ] }); @@ -97,8 +172,8 @@ function switchToTab(id) { APIS[id].tabIcon.toggleClassName('sidebar-chat-apiswitcher-icon-enabled', true); apiContentStack.shown = APIS[id].name; apiCommandStack.shown = APIS[id].name; - chatEntry.placeholderText = APIS[id].placeholderText, - currentApiId = id; + chatPlaceholder.label = APIS[id].placeholderText; + currentApiId = id; } const apiSwitcher = CenterBox({ diff --git a/.config/ags/widgets/sideleft/main.js b/.config/ags/widgets/sideleft/main.js index d942b6c3a..8a76a96ac 100644 --- a/.config/ags/widgets/sideleft/main.js +++ b/.config/ags/widgets/sideleft/main.js @@ -2,7 +2,7 @@ import PopupWindow from '../../lib/popupwindow.js'; import SidebarLeft from "./sideleft.js"; export default () => PopupWindow({ - focusable: true, + keymode: 'exclusive', anchor: ['left', 'top', 'bottom'], name: 'sideleft', layer: 'top', diff --git a/.config/ags/widgets/sideleft/sideleft.js b/.config/ags/widgets/sideleft/sideleft.js index fc1a6b699..fadf7cad0 100644 --- a/.config/ags/widgets/sideleft/sideleft.js +++ b/.config/ags/widgets/sideleft/sideleft.js @@ -27,7 +27,7 @@ const contents = [ ] let currentTabId = 0; -const contentStack = Stack({ +export const contentStack = Stack({ vexpand: true, transition: 'slide_left_right', items: contents.map(item => [item.name, item.content]), @@ -117,15 +117,14 @@ const pinButton = Button({ vpack: 'start', className: 'sidebar-pin', child: MaterialIcon('push_pin', 'larger'), - tooltipText: 'Pin sidebar', + tooltipText: 'Pin sidebar (Ctrl+P)', onClicked: (self) => self.attribute.toggle(self), - // QoL: Focus Pin button on open. Hit keybind -> space/enter = toggle pin state - setup: (self) => self - .hook(App, (self, currentName, visible) => { - if (currentName === 'sideleft' && visible) - self.grab_focus(); + setup: (self) => { + setupCursorHover(self); + self.hook(App, (self, currentName, visible) => { + if (currentName === 'sideleft' && visible) self.grab_focus(); }) - , + }, }) export default () => Box({ @@ -163,7 +162,7 @@ export default () => Box({ ], setup: (self) => self .on('key-press-event', (widget, event) => { // Handle keybinds - if (event.get_state()[1] & Gdk.ModifierType.CONTROL_MASK) { + if (event.get_state()[1] & Gdk.ModifierType.CONTROL_MASK) { // Ctrl held // Pin sidebar if (event.get_keyval()[1] == Gdk.KEY_p) pinButton.attribute.toggle(pinButton); @@ -176,7 +175,7 @@ export default () => Box({ switchToTab(Math.min(currentTabId + 1, contents.length - 1)); } if (contentStack.shown == 'apis') { // If api tab is focused - // Automatically focus entry when typing + // Focus entry when typing if (( !(event.get_state()[1] & Gdk.ModifierType.CONTROL_MASK) && event.get_keyval()[1] >= 32 && event.get_keyval()[1] <= 126 && @@ -186,8 +185,9 @@ export default () => Box({ event.get_keyval()[1] === Gdk.KEY_v) ) { chatEntry.grab_focus(); - chatEntry.set_text(chatEntry.text + String.fromCharCode(event.get_keyval()[1])); - chatEntry.set_position(-1); + const buffer = chatEntry.get_buffer(); + buffer.set_text(buffer.text + String.fromCharCode(event.get_keyval()[1]), -1); + buffer.place_cursor(buffer.get_iter_at_offset(-1)); } // Switch API type else if (!(event.get_state()[1] & Gdk.ModifierType.CONTROL_MASK) && diff --git a/.config/ags/widgets/sideright/calendar.js b/.config/ags/widgets/sideright/calendar.js index d952505d0..579a21f50 100644 --- a/.config/ags/widgets/sideright/calendar.js +++ b/.config/ags/widgets/sideright/calendar.js @@ -146,11 +146,11 @@ const CalendarWidget = () => { const defaultShown = 'calendar'; const contentStack = Widget.Stack({ hexpand: true, - items: [ - ['calendar', CalendarWidget()], - ['todo', TodoWidget()], - // ['stars', Widget.Label({ label: 'GitHub feed will be here' })], - ], + children: { + 'calendar': CalendarWidget(), + 'todo': TodoWidget(), + // 'stars': Widget.Label({ label: 'GitHub feed will be here' }), + }, transition: 'slide_up_down', transitionDuration: 180, setup: (stack) => Utils.timeout(1, () => { @@ -159,7 +159,7 @@ const contentStack = Widget.Stack({ }) const StackButton = (stackItemName, icon, name) => Widget.Button({ - className: 'button-minsize sidebar-navrail-btn sidebar-button-alone txt-small spacing-h-5', + className: 'button-minsize sidebar-navrail-btn txt-small spacing-h-5', onClicked: (button) => { contentStack.shown = stackItemName; const kids = button.get_parent().get_children(); diff --git a/.config/ags/widgets/sideright/main.js b/.config/ags/widgets/sideright/main.js index 7254d7e44..561d771c5 100644 --- a/.config/ags/widgets/sideright/main.js +++ b/.config/ags/widgets/sideright/main.js @@ -2,7 +2,7 @@ import PopupWindow from '../../lib/popupwindow.js'; import SidebarRight from "./sideright.js"; export default () => PopupWindow({ - focusable: true, + keymode: 'exclusive', anchor: ['right', 'top', 'bottom'], name: 'sideright', showClassName: 'sideright-show', diff --git a/.config/ags/widgets/sideright/notificationlist.js b/.config/ags/widgets/sideright/notificationlist.js index a4c4b7ca0..f3fa95111 100644 --- a/.config/ags/widgets/sideright/notificationlist.js +++ b/.config/ags/widgets/sideright/notificationlist.js @@ -85,7 +85,8 @@ export default (props) => { self.toggleClassName('notif-listaction-btn-enabled', Notifications.dnd); }); const clearButton = ListActionButton('clear_all', 'Clear', () => { - notificationList.get_children().forEach(ch => ch.destroy()); + // Manual destruction is not necessary + // since Notifications.clear() sends destroy signals to every notif Notifications.clear(); }); const listTitle = Box({ @@ -121,10 +122,10 @@ export default (props) => { const listContents = Stack({ transition: 'crossfade', transitionDuration: 150, - items: [ - ['empty', notifEmptyContent], - ['list', notifList] - ], + children: { + 'empty': notifEmptyContent, + 'list': notifList, + }, setup: (self) => self .hook(Notifications, (self) => self.shown = (Notifications.notifications.length > 0 ? 'list' : 'empty')) , diff --git a/.config/ags/widgets/sideright/sideright.js b/.config/ags/widgets/sideright/sideright.js index 6105ae0a8..911ed1411 100644 --- a/.config/ags/widgets/sideright/sideright.js +++ b/.config/ags/widgets/sideright/sideright.js @@ -25,9 +25,10 @@ const timeRow = Box({ className: 'txt-small txt', setup: (self) => self .poll(5000, label => { - execAsync(['bash', '-c', `uptime -p | sed -e 's/up //;s/ hours,/h/;s/ minutes/m/'`]).then(upTimeString => { - label.label = `Uptime: ${upTimeString}`; - }).catch(print); + execAsync(['bash', '-c', `w | sed -n '1p' | cut -d, -f1 | cut -d' ' -f4-`]) + .then(upTimeString => { + label.label = `Uptime: ${upTimeString}`; + }).catch(print); }) , }), diff --git a/.config/ags/widgets/sideright/todolist.js b/.config/ags/widgets/sideright/todolist.js index 7ef455320..3efea6ad6 100644 --- a/.config/ags/widgets/sideright/todolist.js +++ b/.config/ags/widgets/sideright/todolist.js @@ -202,10 +202,10 @@ const UndoneTodoList = () => { const todoItemsBox = Widget.Stack({ vpack: 'fill', transition: 'slide_left_right', - items: [ - ['undone', UndoneTodoList()], - ['done', todoItems(true)], - ], + children: { + 'undone': UndoneTodoList(), + 'done': todoItems(true), + }, }); export const TodoWidget = () => {