Add AGS bar, wezterm, and misc configs; exclude KDE private keys

- Add full AGS bar (GTK4/Astal/TypeScript) with all modules
- Add wezterm config
- Add niri config, starship, btop, xdg-portal, fish colors
- Add gitignores for browser caches, JetBrains runtime, AGS node_modules
- Exclude kdeconnect private/certificate pem files
This commit is contained in:
End 2026-04-12 14:44:49 -07:00
parent d770c3031e
commit bbf099c078
No known key found for this signature in database
109 changed files with 6578 additions and 2 deletions

7
.gitignore vendored Executable file
View file

@ -0,0 +1,7 @@
apps/.config/JetBrains/**/settingsSync
apps/.config/JetBrains/**/fus/
apps/.config/JetBrains/**/*.db
apps/.config/JetBrains/**/*.db-shm
apps/.config/JetBrains/**/*.db-wal
apps/.config/obsidian/
apps/.config/kwalletrc

1
.stowrc Executable file
View file

@ -0,0 +1 @@
--target=/home/end

0
README.md Normal file → Executable file
View file

44
apps/.config/.gitignore vendored Normal file
View file

@ -0,0 +1,44 @@
# Browser/Electron caches
*/Cache/
*/Code Cache/
*/GPUCache/
*/DawnGraphiteCache/
*/DawnWebGPUCache/
*/Crashpad/
*/IndexedDB/
*/Local Storage/
*/Session Storage/
*/Shared Dictionary/
*/WebStorage/
*/.org.chromium.Chromium.*
# Logs and runtime state
*.log
*/Cookies
*/Cookies-journal
*/DIPS
*/DIPS-wal
*/SharedStorage
*/SharedStorage-wal
*/TransportSecurity
*/Trust Tokens
*/Trust Tokens-journal
*/Network Persistent State
# Secrets
github-copilot/apps.json
# JetBrains runtime
JetBrains/*/event-log-metadata/
JetBrains/*/workspace/
JetBrains/*/tasks/
JetBrains/*/settingsSync/
JetBrains/*/*.db
JetBrains/*/options/recentProjects.xml
JetBrains/*/options/trusted-paths.xml
JetBrains/*/options/usage.statistics.xml
JetBrains/*/options/features.usage.statistics.xml
JetBrains/*/options/window.state.xml
# AGS runtime / build artifacts
ags/node_modules/
ags/@girs/

17
apps/.config/ags/app.ts Normal file
View file

@ -0,0 +1,17 @@
import app from "ags/gtk4/app"
import style from "./style.scss"
import Bar from "./widget/Bar"
import NotificationCenter from "./widget/NotificationCenter"
import NotificationPopup from "./widget/NotificationPopup"
import ClockCenter from "./widget/ClockCenter"
app.start({
css: style,
main() {
const monitors = app.get_monitors()
monitors.map(Bar)
monitors.map(NotificationCenter)
monitors.map(NotificationPopup)
monitors.map(ClockCenter)
},
})

21
apps/.config/ags/env.d.ts vendored Normal file
View file

@ -0,0 +1,21 @@
declare const SRC: string
declare module "inline:*" {
const content: string
export default content
}
declare module "*.scss" {
const content: string
export default content
}
declare module "*.blp" {
const content: string
export default content
}
declare module "*.css" {
const content: string
export default content
}

View file

@ -0,0 +1,10 @@
{
"dependencies": {
"ags": "*",
"gnim": "*"
},
"prettier": {
"semi": false,
"tabWidth": 2
}
}

530
apps/.config/ags/style.scss Normal file
View file

@ -0,0 +1,530 @@
// palette
$bg: #0b0d1a;
$surface: #0f1120;
$surface2: #141628;
$overlay: #1a1d35;
$purple: #c792ea;
$purple-dim: #9a70c7;
$cyan: #4ec9b0;
$green: #99c794;
$pink: #ec5f89;
$yellow: #fac863;
$red: #f97b58;
$text: #cdd6f4;
$subtext: #7f849c;
$border: rgba(78, 201, 176, 0.15);
* {
font-family: "Maple Mono NF", monospace;
font-size: 13px;
color: $text;
-gtk-icon-style: regular;
}
// bar
window.bar {
background: transparent;
}
.bar-centerbox {
background: $surface;
border-radius: 12px;
margin: 6px 8px 0;
border: 1px solid $border;
padding: 2px 6px;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
}
// modules
.module {
background: $surface2;
border-radius: 8px;
padding: 1px 8px;
margin: 2px 2px;
border: 1px solid $border;
label {
color: $text;
}
}
.module-icon {
font-size: 14px;
margin-right: 4px;
}
.workspaces {
background: transparent;
border: none;
padding: 0;
margin: 0 4px;
.ws-dot {
font-size: 8px;
margin: 0 2px;
color: $subtext;
transition: all 200ms ease;
&.active {
color: $purple;
font-size: 11px;
}
&.focused {
color: $cyan;
}
}
}
.window-title {
background: transparent;
border: none;
padding: 0 6px;
color: $subtext;
font-size: 12px;
}
.clock-module {
.time {
color: $text;
font-weight: bold;
font-size: 14px;
}
.date {
color: $subtext;
font-size: 11px;
margin-left: 6px;
}
}
.media-module {
min-width: 120px;
.media-icon {
color: $cyan;
}
.media-title {
color: $text;
font-size: 12px;
}
.media-btn {
background: transparent;
border: none;
padding: 0 3px;
color: $subtext;
border-radius: 6px;
&:hover {
color: $purple;
background: $overlay;
}
}
}
.volume-module {
.vol-icon {
color: $cyan;
}
.vol-muted {
color: $pink;
}
}
.brightness-module {
.bright-icon {
color: $yellow;
}
}
.mullvad-module {
&.on {
box-shadow: inset 0 0 0 1px $green;
border-radius: 9px;
}
&.off {
box-shadow: inset 0 0 0 1px $red;
border-radius: 9px;
}
}
.tailscale-module {
&.on {
box-shadow: inset 0 0 0 1px $green;
border-radius: 9px;
}
&.off {
box-shadow: inset 0 0 0 1px $red;
border-radius: 9px;
}
}
.vpn-status-label {
font-size: 12px;
font-weight: bold;
}
.vpn-detail {
color: $subtext;
font-size: 11px;
}
.network-module {
.net-icon {
color: $green;
}
.net-disconnected {
color: $pink;
}
.net-strength {
color: $subtext;
font-size: 11px;
}
.net-wired {
color: $cyan;
}
}
.battery-module {
.bat-icon {
color: $green;
}
.bat-charging {
color: $yellow;
}
.bat-low {
color: $pink;
}
.bat-label {
font-size: 12px;
}
}
.sysstat-module {
.stat-icon {
color: $purple;
}
.stat-label {
font-size: 12px;
}
}
.weather-module {
.weather-text {
font-size: 12px;
}
.unit-toggle {
background: $overlay;
border: 1px solid $border;
border-radius: 6px;
padding: 0 4px;
margin: 0;
min-height: 0;
min-width: 0;
font-size: 11px;
color: $subtext;
&:hover {
color: $cyan;
border-color: $cyan;
}
}
}
.notif-bell {
.bell-icon {
color: $subtext;
}
.bell-count {
color: $pink;
font-size: 10px;
font-weight: bold;
}
&.has-notifs .bell-icon {
color: $purple;
}
}
// tray
.tray-module {
background: $surface2;
border-radius: 8px;
padding: 1px 4px;
margin: 2px 2px;
border: 1px solid $border;
.tray-item {
background: transparent;
border: none;
padding: 1px 2px;
border-radius: 6px;
min-height: 0;
min-width: 0;
&:hover {
background: $overlay;
}
> button {
background: transparent;
border: none;
padding: 0;
margin: 0;
box-shadow: none;
min-height: 0;
min-width: 0;
&:hover,
&:active,
&:checked {
background: transparent;
box-shadow: none;
}
}
> button > image {
opacity: 0;
min-width: 0;
min-height: 0;
}
}
}
// volume popover
.open-mixer-btn {
background: $overlay;
border: 1px solid $border;
border-radius: 8px;
padding: 4px 10px;
color: $subtext;
margin-top: 4px;
&:hover {
color: $cyan;
border-color: $cyan;
}
}
.vol-pct {
color: $subtext;
font-size: 11px;
}
.mic-icon {
color: $green;
}
// notifications
window.notification-popup {
background: transparent;
}
.notif-popup-inner {
padding: 8px;
}
.notif-toast {
background: $surface;
border: 1px solid $border;
border-radius: 14px;
padding: 12px 14px;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
min-width: 320px;
.notif-app {
color: $purple;
font-size: 11px;
font-weight: bold;
}
.notif-close {
background: transparent;
border: none;
padding: 0 4px;
color: $subtext;
border-radius: 6px;
font-size: 11px;
&:hover {
color: $pink;
background: $overlay;
}
}
.notif-summary {
color: $text;
font-size: 13px;
font-weight: bold;
}
.notif-body {
color: $subtext;
font-size: 12px;
}
}
window.notification-center {
background: rgba(22, 22, 30, 0.85);
border-left: 1px solid $border;
}
.notif-center-inner {
padding: 16px 12px;
min-width: 340px;
}
.notif-center-header {
margin-bottom: 4px;
.notif-center-title {
font-size: 14px;
font-weight: bold;
color: $text;
}
.notif-clear-all {
background: $overlay;
border: 1px solid $border;
border-radius: 8px;
padding: 2px 10px;
color: $subtext;
font-size: 11px;
&:hover {
color: $pink;
border-color: $pink;
}
}
}
.notif-card {
background: $surface;
border: 1px solid $border;
border-radius: 12px;
padding: 10px 12px;
.notif-app {
color: $purple;
font-size: 11px;
font-weight: bold;
}
.notif-close {
background: transparent;
border: none;
padding: 0 4px;
color: $subtext;
border-radius: 6px;
font-size: 11px;
&:hover {
color: $pink;
background: $overlay;
}
}
.notif-summary {
color: $text;
font-size: 13px;
font-weight: bold;
}
.notif-body {
color: $subtext;
font-size: 12px;
}
}
.notif-empty {
color: $subtext;
font-size: 12px;
}
// clock popover
.clock-tz-label {
color: $subtext;
font-size: 12px;
}
.clock-section-title {
color: $subtext;
font-size: 11px;
font-weight: bold;
}
.tz-btn {
background: transparent;
border: none;
border-radius: 6px;
padding: 3px 8px;
color: $text;
font-size: 12px;
&:hover {
background: $overlay;
color: $purple;
}
}
calendar {
background: $surface2;
border: 1px solid $border;
border-radius: 10px;
padding: 4px;
color: $text;
&:selected {
background: $purple;
color: $bg;
border-radius: 6px;
}
&.highlight {
color: $cyan;
font-weight: bold;
}
header {
color: $text;
font-weight: bold;
}
button {
background: transparent;
border: none;
color: $subtext;
border-radius: 4px;
}
button:hover {
background: $overlay;
color: $text;
}
button.day {
color: $text;
}
button.day:selected {
background: $purple;
color: $bg;
}
button.day.today {
color: $purple;
font-weight: bold;
}
button.day.other-month {
color: $subtext;
opacity: 0.5;
}
}
.clock-center-inner {
padding: 14px 12px;
min-width: 260px;
}
// popovers reset GTK4's internal `contents` node padding
popover > contents {
padding: 0;
margin: 0;
background: transparent;
border: none;
box-shadow: none;
}
popover {
background: $surface;
border: 1px solid $border;
border-radius: 12px;
padding: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
scale {
min-width: 160px;
trough {
background: $overlay;
border-radius: 8px;
min-height: 6px;
}
highlight {
background: $purple;
border-radius: 8px;
}
slider {
background: $text;
border-radius: 50%;
min-width: 14px;
min-height: 14px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
}
}
}

View file

@ -0,0 +1,14 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"strict": true,
"module": "ES2022",
"target": "ES2020",
"lib": ["ES2023"],
"moduleResolution": "Bundler",
// "checkJs": true,
// "allowJs": true,
"jsx": "react-jsx",
"jsxImportSource": "ags/gtk4"
}
}

View file

@ -0,0 +1,64 @@
import { Astal, Gtk, Gdk } from "ags/gtk4"
import app from "ags/gtk4/app"
import Workspaces from "./modules/Workspaces"
import WindowTitle from "./modules/WindowTitle"
import Clock from "./modules/Clock"
import Media from "./modules/Media"
import SysStats from "./modules/SysStats"
import Weather from "./modules/Weather"
import Network from "./modules/Network"
import Battery from "./modules/Battery"
import Brightness from "./modules/Brightness"
import Volume from "./modules/Volume"
import NotifBell from "./modules/NotifBell"
import Tray from "./modules/Tray"
import Mullvad from "./modules/Mullvad"
import Tailscale from "./modules/Tailscale"
export default function Bar(gdkmonitor: Gdk.Monitor) {
const { TOP, LEFT, RIGHT } = Astal.WindowAnchor
return (
<window
visible
name="bar"
class="bar"
gdkmonitor={gdkmonitor}
exclusivity={Astal.Exclusivity.EXCLUSIVE}
keymode={Astal.Keymode.NONE}
anchor={TOP | LEFT | RIGHT}
application={app}
>
<box halign={Gtk.Align.CENTER} widthRequest={1080}>
<centerbox class="bar-centerbox" hexpand>
{/* Left */}
<box $type="start" spacing={4} halign={Gtk.Align.START} valign={Gtk.Align.CENTER}>
<Workspaces />
<WindowTitle />
</box>
{/* Center */}
<box $type="center" spacing={4} halign={Gtk.Align.CENTER} valign={Gtk.Align.CENTER}>
<Clock />
<Media />
</box>
{/* Right */}
<box $type="end" spacing={4} halign={Gtk.Align.END} valign={Gtk.Align.CENTER}>
<SysStats />
<Weather />
<Mullvad />
<Tailscale />
<Network />
<Battery />
<Brightness />
<Volume />
<Tray />
<NotifBell />
</box>
</centerbox>
</box>
</window>
)
}

View file

@ -0,0 +1,90 @@
import { Astal, Gtk, Gdk } from "ags/gtk4"
import app from "ags/gtk4/app"
import { execAsync } from "ags/process"
import { createState, createComputed, For } from "ags"
import { interval } from "ags/time"
const TIMEZONES = [
"America/Phoenix", "America/New_York", "America/Chicago",
"America/Denver", "America/Los_Angeles", "America/Anchorage",
"Pacific/Honolulu", "Europe/London", "Europe/Paris",
"Europe/Berlin", "Europe/Rome", "Europe/Moscow",
"Asia/Dubai", "Asia/Kolkata", "Asia/Bangkok",
"Asia/Shanghai", "Asia/Tokyo", "Asia/Seoul",
"Australia/Sydney", "Pacific/Auckland",
]
export default function ClockCenter(gdkmonitor: Gdk.Monitor) {
const { TOP } = Astal.WindowAnchor
const [time, setTime] = createState("")
const [date, setDate] = createState("")
const [tz, setTz] = createState("")
function pollTime() { execAsync(["date", "+%H:%M:%S"]).then(s => setTime(s.trim())).catch(() => {}) }
function pollDate() { execAsync(["date", "+%A, %B %d"]).then(s => setDate(s.trim())).catch(() => {}) }
function pollTz() { execAsync(["date", "+%Z"]).then(s => setTz(s.trim())).catch(() => {}) }
pollTime(); pollDate(); pollTz()
interval(1000, pollTime)
interval(60000, pollDate)
interval(10000, pollTz)
const [search, setSearch] = createState("")
const filtered = createComputed(() => {
const q = search().toLowerCase()
return TIMEZONES.filter(t => t.toLowerCase().includes(q))
})
const win = (
<window
visible={false}
name="clock-center"
class="notification-center"
gdkmonitor={gdkmonitor}
exclusivity={Astal.Exclusivity.NORMAL}
anchor={TOP}
marginTop={42}
keymode={Astal.Keymode.ON_DEMAND}
application={app}
onNotifyIsActive={({ isActive }: { isActive: boolean }) => {
if (!isActive) app.toggle_window("clock-center")
}}
>
<box orientation={Gtk.Orientation.VERTICAL} spacing={10} class="clock-center-inner" widthRequest={260}>
<Gtk.EventControllerKey
onKeyPressed={(_self: unknown, keyval: number) => {
if (keyval === Gdk.KEY_Escape) app.toggle_window("clock-center")
}}
/>
<box orientation={Gtk.Orientation.VERTICAL} spacing={2}>
<label label={time} class="time" xalign={0} />
<label label={date} class="clock-tz-label" xalign={0} />
<label label={tz} class="clock-section-title" xalign={0} />
</box>
<Gtk.Calendar showDayNames showHeading />
<label label="Switch timezone" xalign={0} class="clock-section-title" />
<entry
placeholderText="Search..."
onNotifyText={({ text }: { text: string }) => setSearch(text)}
/>
<scrolledwindow maxContentHeight={160} vexpand>
<box orientation={Gtk.Orientation.VERTICAL} spacing={2}>
<For each={filtered} id={zone => zone}>
{zone => (
<button class="tz-btn" onClicked={() => {
execAsync(["timedatectl", "set-timezone", zone]).catch(() => {})
app.toggle_window("clock-center")
}}>
<label label={zone} xalign={0} />
</button>
)}
</For>
</box>
</scrolledwindow>
</box>
</window>
) as unknown as Astal.Window
return win
}

View file

@ -0,0 +1,98 @@
import { Astal, Gtk, Gdk } from "ags/gtk4"
import app from "ags/gtk4/app"
import { For } from "ags"
import { history, removeNotif, clearAll, type NotifEntry } from "./notifStore"
function NotifCard({ entry }: { entry: NotifEntry }) {
const rightClick = new Gtk.GestureClick()
rightClick.button = 3
rightClick.connect("pressed", () => {
removeNotif(entry.id)
try { entry.notif.dismiss() } catch {}
})
// Left click only fires when clicking the card background (not child widgets)
const leftClick = new Gtk.GestureClick()
leftClick.button = 1
leftClick.propagation_phase = Gtk.PropagationPhase.TARGET
leftClick.connect("pressed", () => {
try { entry.notif.invoke("default") } catch {}
app.toggle_window("notification-center")
})
const box = (
<box class="notif-card" orientation={Gtk.Orientation.VERTICAL} spacing={6}>
<box spacing={8}>
<label class="notif-app" label={entry.app_name || "notification"} xalign={0} hexpand />
<button class="notif-close" onClicked={() => {
removeNotif(entry.id)
try { entry.notif.dismiss() } catch {}
}}>
<label label="✕" />
</button>
</box>
{entry.summary
? <label class="notif-summary" label={entry.summary} xalign={0} wrap maxWidthChars={36} />
: <></>
}
{entry.body
? <label class="notif-body" label={entry.body} xalign={0} wrap maxWidthChars={36} />
: <></>
}
</box>
) as unknown as Gtk.Box
box.add_controller(leftClick)
box.add_controller(rightClick)
return box
}
export default function NotificationCenter(gdkmonitor: Gdk.Monitor) {
const { RIGHT, TOP, BOTTOM } = Astal.WindowAnchor
return (
<window
visible={false}
name="notification-center"
class="notification-center"
gdkmonitor={gdkmonitor}
exclusivity={Astal.Exclusivity.NORMAL}
anchor={RIGHT | TOP | BOTTOM}
keymode={Astal.Keymode.ON_DEMAND}
application={app}
>
<box orientation={Gtk.Orientation.VERTICAL} spacing={8} class="notif-center-inner">
<Gtk.EventControllerKey
onKeyPressed={({ widget }, keyval: number) => {
if (keyval === Gdk.KEY_Escape) app.toggle_window("notification-center")
}}
/>
<box class="notif-center-header">
<label class="notif-center-title" label="Notifications" hexpand xalign={0} />
<button class="notif-clear-all" onClicked={() => clearAll()}>
<label label="Clear all" />
</button>
</box>
<label
class="notif-empty"
label="Nothing here"
valign={Gtk.Align.CENTER}
vexpand
visible={history(h => h.length === 0)}
/>
<scrolledwindow
vexpand
visible={history(h => h.length > 0)}
vscrollbarPolicy={Gtk.PolicyType.AUTOMATIC}
hscrollbarPolicy={Gtk.PolicyType.NEVER}
>
<box orientation={Gtk.Orientation.VERTICAL} spacing={6}>
<For each={history(h => [...h].reverse())} id={e => e.id}>
{e => <NotifCard entry={e} />}
</For>
</box>
</scrolledwindow>
</box>
</window>
)
}

View file

@ -0,0 +1,69 @@
import { Astal, Gtk, Gdk } from "ags/gtk4"
import app from "ags/gtk4/app"
import Notifd from "gi://AstalNotifd"
import Pango from "gi://Pango"
import { createBinding, For } from "ags"
import { timeout } from "ags/time"
import { addNotif } from "./notifStore"
type N = ReturnType<typeof Notifd.get_default>["notifications"][0]
function Toast({ notif }: { notif: N }) {
const gesture = new Gtk.GestureClick()
gesture.button = 3
gesture.connect("pressed", () => { try { notif.dismiss() } catch {} })
const box = (
<box class="notif-toast" orientation={Gtk.Orientation.VERTICAL} spacing={6}>
<box spacing={8}>
<label class="notif-app" label={notif.app_name || "notification"} xalign={0} hexpand />
<button class="notif-close" onClicked={() => { try { notif.dismiss() } catch {} }}>
<label label="✕" />
</button>
</box>
{notif.summary
? <label class="notif-summary" label={notif.summary} xalign={0} wrap maxWidthChars={38} />
: <></>
}
{notif.body
? <label class="notif-body" label={notif.body} xalign={0} wrap maxWidthChars={38} lines={4} ellipsize={Pango.EllipsizeMode.END} />
: <></>
}
</box>
) as unknown as Gtk.Box
box.add_controller(gesture)
return box
}
export default function NotificationPopup(gdkmonitor: Gdk.Monitor) {
const notifd = Notifd.get_default()
const notifs = createBinding(notifd, "notifications")
const { TOP, RIGHT } = Astal.WindowAnchor
notifd.connect("notified", (_self: typeof notifd, id: number) => {
const notif = notifd.get_notification(id)
if (!notif) return
addNotif(notif)
const ms = notif.expire_timeout > 0 ? notif.expire_timeout : 10000
timeout(ms, () => { try { notif.dismiss() } catch {} })
})
return (
<window
name="notification-popup"
class="notification-popup"
gdkmonitor={gdkmonitor}
exclusivity={Astal.Exclusivity.NORMAL}
anchor={TOP | RIGHT}
visible={notifs(n => n.length > 0)}
application={app}
>
<box orientation={Gtk.Orientation.VERTICAL} spacing={6} class="notif-popup-inner">
<For each={notifs(ns => [...ns].slice(-3).reverse())} id={n => n.id}>
{n => <Toast notif={n} />}
</For>
</box>
</window>
)
}

View file

@ -0,0 +1,78 @@
import { Gtk } from "ags/gtk4"
import { execAsync } from "ags/process"
import { createState } from "ags"
import { interval } from "ags/time"
interface BatState {
pct: number
charging: boolean
timeLeft: string
}
function parseBat(out: string): BatState {
const lines = out.split("\n")
let pct = 100, charging = false, timeLeft = ""
for (const line of lines) {
const l = line.trim()
if (l.startsWith("percentage:")) pct = parseInt(l.split(":")[1]) || 100
if (l.startsWith("state:")) charging = l.includes("charging") && !l.includes("discharging")
if (l.startsWith("time to empty:") || l.startsWith("time to full:"))
timeLeft = `~${l.split(":").slice(1).join(":").trim()}`
}
return { pct, charging, timeLeft }
}
export default function Battery() {
const [bat, setBat] = createState<BatState>({ pct: 100, charging: false, timeLeft: "" })
function poll() {
execAsync(["upower", "-i", "/org/freedesktop/UPower/devices/battery_BAT1"])
.then(out => setBat(parseBat(out)))
.catch(() => {})
}
poll()
interval(5000, poll)
const popover = new Gtk.Popover()
popover.set_has_arrow(false)
const content = (
<box orientation={Gtk.Orientation.VERTICAL} spacing={8} widthRequest={160}>
<label label={bat(b => `${b.pct}%`)} xalign={0} class="vpn-status-label" />
<label
label={bat(b => b.charging
? b.timeLeft ? `${b.timeLeft} until full` : "Charging"
: b.timeLeft ? `${b.timeLeft} remaining` : "Discharging"
)}
xalign={0}
class="vpn-detail"
/>
</box>
) as unknown as Gtk.Widget
popover.set_child(content)
const btn = (
<button class="module battery-module" valign={Gtk.Align.CENTER}
onClicked={() => popover.popup()}>
<box spacing={4}>
<label
class={bat(b => `module-icon ${b.charging ? "bat-charging" : b.pct < 20 ? "bat-low" : "bat-icon"}`)}
label={bat(({ pct, charging }) => {
if (charging) return "󰂄"
if (pct > 80) return "󰁹"
if (pct > 60) return "󰂁"
if (pct > 40) return "󰁾"
if (pct > 20) return "󰁼"
return "󰁺"
})}
/>
<label class="bat-label" label={bat(b => `${b.pct}%`)} />
</box>
</button>
) as unknown as Gtk.Button
popover.set_parent(btn)
return btn
}

View file

@ -0,0 +1,52 @@
import { Gtk } from "ags/gtk4"
import { execAsync } from "ags/process"
import { createState } from "ags"
import { interval } from "ags/time"
export default function Brightness() {
const [brightness, setBrightness] = createState({ cur: 0, max: 100 })
function poll() {
execAsync(["brightnessctl", "info"])
.then(out => {
const cur = parseInt(out.match(/Current brightness: (\d+)/)?.[1] ?? "0")
const max = parseInt(out.match(/Max brightness: (\d+)/)?.[1] ?? "100")
setBrightness({ cur, max })
}).catch(() => {})
}
poll()
interval(2000, poll)
const pct = brightness(b => Math.round((b.cur / b.max) * 100))
const icon = pct(p => p > 66 ? "󰃠" : p > 33 ? "󰃟" : "󰃞")
const popover = new Gtk.Popover()
popover.set_has_arrow(false)
const content = (
<box orientation={Gtk.Orientation.VERTICAL} spacing={8} widthRequest={200}>
<label label="Brightness" halign={Gtk.Align.START} />
<slider
min={0} max={100} value={pct}
widthRequest={180}
onNotifyValue={self => execAsync(["brightnessctl", "set", `${Math.round(self.value)}%`]).catch(() => {})}
/>
</box>
) as unknown as Gtk.Widget
popover.set_child(content)
const btn = (
<button class="module brightness-module" valign={Gtk.Align.CENTER} hexpand={false}
onClicked={() => popover.popup()}>
<box spacing={4}>
<label class="module-icon bright-icon" label={icon} />
<label label={pct(p => `${p}%`)} />
</box>
</button>
) as unknown as Gtk.Button
popover.set_parent(btn)
return btn
}

View file

@ -0,0 +1,27 @@
import { createState } from "ags"
import { interval } from "ags/time"
import { execAsync } from "ags/process"
import { Gtk } from "ags/gtk4"
import app from "ags/gtk4/app"
export default function Clock() {
const [time, setTime] = createState("")
const [date, setDate] = createState("")
function pollTime() { execAsync(["date", "+%H:%M:%S"]).then(s => setTime(s.trim())).catch(() => {}) }
function pollDate() { execAsync(["date", "+%a %b %d"]).then(s => setDate(s.trim())).catch(() => {}) }
pollTime(); pollDate()
interval(1000, pollTime)
interval(60000, pollDate)
return (
<button class="module clock-module" halign={Gtk.Align.CENTER} valign={Gtk.Align.CENTER}
hexpand={false} onClicked={() => app.toggle_window("clock-center")}>
<box spacing={6}>
<label class="time" label={time} />
<label class="date" label={date} />
</box>
</button>
)
}

View file

@ -0,0 +1,55 @@
import { Gtk } from "ags/gtk4"
import { execAsync } from "ags/process"
import { createState } from "ags"
import { interval } from "ags/time"
interface MprisInfo {
title: string
artist: string
playing: boolean
player: string
}
const empty: MprisInfo = { title: "", artist: "", playing: false, player: "" }
export default function Media() {
const [media, setMedia] = createState<MprisInfo>(empty)
function poll() {
execAsync("playerctl metadata --format '{{title}}|||{{artist}}|||{{status}}|||{{playerName}}'")
.then(out => {
const [title, artist, status, player] = out.trim().split("|||")
setMedia({ title: title || "", artist: artist || "", playing: status === "Playing", player: player || "" })
})
.catch(() => setMedia(empty))
}
poll()
interval(2000, poll)
return (
<box
class="module media-module"
valign={Gtk.Align.CENTER}
visible={media(m => m.title !== "")}
>
<label
class="media-title"
ellipsize={3}
maxWidthChars={24}
label={media(m => m.title ? `${m.title}${m.artist ? " — " + m.artist : ""}` : "")}
/>
<button class="media-btn" onClicked={() => execAsync("playerctl previous").catch(() => {})}>
<label label="󰒮" />
</button>
<button class="media-btn" onClicked={() => execAsync(
media().playing ? "playerctl pause" : "playerctl play"
).catch(() => {})}>
<label label={media(m => m.playing ? "󰏤" : "󰐊")} />
</button>
<button class="media-btn" onClicked={() => execAsync("playerctl next").catch(() => {})}>
<label label="󰒭" />
</button>
</box>
)
}

View file

@ -0,0 +1,76 @@
import { Gtk } from "ags/gtk4"
import { execAsync } from "ags/process"
import { interval } from "ags/time"
import { createState } from "ags"
const FAVORITES = [
{ label: "Phoenix", cmd: "mullvad relay set location us phx" },
{ label: "Los Angeles", cmd: "mullvad relay set location us lax" },
{ label: "Switzerland", cmd: "mullvad relay set location ch" },
]
export default function Mullvad() {
const [status, setStatus] = createState({ connected: false, location: "", ip: "" })
function poll() {
execAsync("mullvad status").then(out => {
const connected = out.toLowerCase().startsWith("connected")
const locMatch = out.match(/location:\s+(.+?)\./)
const ipMatch = out.match(/IPv4:\s+([\d.]+)/)
setStatus({ connected, location: locMatch?.[1]?.trim() ?? "", ip: ipMatch?.[1] ?? "" })
}).catch(() => {})
}
poll()
interval(5000, poll)
const popover = new Gtk.Popover()
popover.set_has_arrow(false)
const favBtns = FAVORITES.map(({ label, cmd }) => (
<button class="open-mixer-btn" onClicked={() =>
execAsync(cmd).then(() => execAsync("mullvad reconnect")).then(() => poll()).catch(() => poll())
}>
<label label={label} />
</button>
))
const content = (
<box orientation={Gtk.Orientation.VERTICAL} spacing={8} widthRequest={200}>
<label label={status(s => s.connected ? "󰦝 Connected" : "󰛡 Disconnected")} xalign={0} class="vpn-status-label" />
<label label={status(s => s.location || "—")} xalign={0} class="vpn-detail" />
<label label={status(s => s.ip || "—")} xalign={0} class="vpn-detail" />
<box orientation={Gtk.Orientation.VERTICAL} spacing={4}>
{favBtns}
</box>
<button class="open-mixer-btn" onClicked={() => execAsync("mullvad-vpn")}>
<label label="Open Mullvad" />
</button>
</box>
) as unknown as Gtk.Widget
popover.set_child(content)
const icon = new Gtk.Image({ iconName: "mullvad-vpn", pixelSize: 16 })
const btn = (
<button class={status(s => `module mullvad-module${s.connected ? " on" : " off"}`)}
valign={Gtk.Align.CENTER}
onClicked={() => execAsync(
status().connected
? "mullvad disconnect"
: "bash -c 'mullvad lan set allow && mullvad connect'"
).then(() => poll()).catch(() => poll())}>
</button>
) as unknown as Gtk.Button
btn.set_child(icon)
const gesture = new Gtk.GestureClick()
gesture.button = 3
gesture.connect("pressed", () => popover.popup())
btn.add_controller(gesture)
popover.set_parent(btn)
return btn
}

View file

@ -0,0 +1,60 @@
import { Gtk } from "ags/gtk4"
import { execAsync } from "ags/process"
import { createState } from "ags"
import { interval } from "ags/time"
type NetState = { type: "none" | "wifi" | "wired" | "rfkill"; ssid: string; strength: number; ip: string }
export default function Network() {
const [net, setNet] = createState<NetState>({ type: "none", ssid: "", strength: 0, ip: "" })
const [showIp, setShowIp] = createState(false)
function poll() {
execAsync(["bash", "-c", "rfkill list wifi | grep -q 'Hard blocked: yes\\|Soft blocked: yes' && echo rfkill; nmcli -t -f device,type,state dev 2>/dev/null | grep ':ethernet:connected' | head -1; echo '---'; nmcli -t -f active,ssid,signal dev wifi 2>/dev/null | grep '^yes' | head -1; echo '---'; ip -4 route get 1.1.1.1 2>/dev/null | grep -oP '(?<=src )[\\d.]+'"])
.then(out => {
if (out.startsWith("rfkill")) { setNet({ type: "rfkill", ssid: "", strength: 0, ip: "" }); return }
const [eth, wifi, ip] = out.split("---").map((s: string) => s.trim())
if (eth) { setNet({ type: "wired", ssid: "", strength: 0, ip: ip || "" }); return }
const parts = wifi?.split(":") ?? []
if (parts.length >= 3 && parts[0] === "yes")
setNet({ type: "wifi", ssid: parts[1], strength: parseInt(parts[2]) || 0, ip: ip || "" })
else
setNet({ type: "none", ssid: "", strength: 0, ip: "" })
}).catch(() => {})
}
poll()
interval(5000, poll)
const icon = net(n => {
if (n.type === "rfkill") return "󰖪"
if (n.type === "wired") return "󰈀"
if (n.type === "none") return "󰤭"
if (n.strength > 75) return "󰤨"
if (n.strength > 50) return "󰤥"
if (n.strength > 25) return "󰤢"
return "󰤟"
})
const labelText = net(n => {
if (n.type === "rfkill") return "rfkill"
if (showIp()) return n.ip || "no ip"
if (n.type === "wired") return "wired"
if (n.type === "wifi") return n.ssid || "connected"
return "offline"
})
return (
<button class="module network-module" valign={Gtk.Align.CENTER} onClicked={() => setShowIp(v => !v)}>
<box spacing={4}>
<label class={net(n => `module-icon ${n.type !== "none" && n.type !== "rfkill" ? "net-icon" : "net-disconnected"}`)} label={icon} />
<label label={labelText} />
<label
class="net-strength"
label={net(n => `${n.strength}%`)}
visible={net(n => n.type === "wifi" && !showIp())}
/>
</box>
</button>
)
}

View file

@ -0,0 +1,25 @@
import { Gtk } from "ags/gtk4"
import app from "ags/gtk4/app"
import { history } from "../notifStore"
export default function NotifBell() {
return (
<button
class={history(h => `module notif-bell${h.length > 0 ? " has-notifs" : ""}`)}
valign={Gtk.Align.CENTER}
onClicked={() => app.toggle_window("notification-center")}
>
<box spacing={4}>
<label
class="module-icon bell-icon"
label={history(h => h.length > 0 ? "󰂚" : "󰂜")}
/>
<label
class="bell-count"
label={history(h => `${h.length}`)}
visible={history(h => h.length > 0)}
/>
</box>
</button>
)
}

View file

@ -0,0 +1,35 @@
import { Gtk } from "ags/gtk4"
import { createState } from "ags"
import { interval } from "ags/time"
import { execAsync } from "ags/process"
export default function SysStats() {
const [cpu, setCpu] = createState("0")
const [ram, setRam] = createState("0")
function pollCpu() {
execAsync(["bash", "-c", "grep -m1 '^cpu ' /proc/stat | awk '{u=$2+$4; t=$2+$3+$4+$5; if(t>0) print int(u/t*100); else print 0}'"]).then(s => setCpu(s.trim())).catch(() => {})
}
function pollRam() {
execAsync(["bash", "-c", "free | awk '/^Mem:/{printf \"%d\", $3/$2*100}'"]).then(s => setRam(s.trim())).catch(() => {})
}
pollCpu()
pollRam()
interval(2000, pollCpu)
interval(5000, pollRam)
return (
<box class="module sysstat-module" valign={Gtk.Align.CENTER} spacing={8}>
<box spacing={4}>
<label class="module-icon stat-icon" label="󰻠" />
<label class="stat-label" label={cpu(c => `${c}%`)} />
</box>
<box spacing={4}>
<label class="module-icon stat-icon" label="󰍛" />
<label class="stat-label" label={ram(r => `${r}%`)} />
</box>
</box>
)
}

View file

@ -0,0 +1,60 @@
import { Gtk } from "ags/gtk4"
import { execAsync } from "ags/process"
import { interval } from "ags/time"
import { createState } from "ags"
export default function Tailscale() {
const [status, setStatus] = createState({ up: false, ip: "", peers: 0 })
function poll() {
execAsync("tailscale status --json").then(out => {
try {
const j = JSON.parse(out)
setStatus({
up: j.BackendState === "Running",
ip: j.TailscaleIPs?.[0] ?? "",
peers: Object.keys(j.Peer ?? {}).length,
})
} catch {}
}).catch(() => {})
}
poll()
interval(5000, poll)
const popover = new Gtk.Popover()
popover.set_has_arrow(false)
const content = (
<box orientation={Gtk.Orientation.VERTICAL} spacing={8} widthRequest={200}>
<label label={status(s => s.up ? "󰩠 Running" : "󰩠 Stopped")} xalign={0} class="vpn-status-label" />
<label label={status(s => s.ip ? `IP: ${s.ip}` : "No IP")} xalign={0} class="vpn-detail" />
<label label={status(s => `Peers: ${s.peers}`)} xalign={0} class="vpn-detail" />
</box>
) as unknown as Gtk.Widget
popover.set_child(content)
const icon = new Gtk.Image({ iconName: "tailscale", pixelSize: 16 })
const btn = (
<button class={status(s => `module tailscale-module${s.up ? " on" : " off"}`)}
valign={Gtk.Align.CENTER}
onClicked={() => execAsync(
status().up
? "tailscale down"
: `bash -c "tailscale up && sudo ip route add 100.64.0.0/10 dev tailscale0 table main && sudo nft insert rule inet mullvad output ip daddr 100.64.0.0/10 accept && sudo nft insert rule inet mullvad output oif tailscale0 accept"`
).then(poll)}>
</button>
) as unknown as Gtk.Button
btn.set_child(icon)
const gesture = new Gtk.GestureClick()
gesture.button = 3
gesture.connect("pressed", () => popover.popup())
btn.add_controller(gesture)
popover.set_parent(btn)
return btn
}

View file

@ -0,0 +1,36 @@
import { Gtk } from "ags/gtk4"
import AstalTray from "gi://AstalTray"
import { createBinding, For } from "ags"
export default function Tray() {
const tray = AstalTray.get_default()
const items = createBinding(tray, "items")
return (
<box class="tray-module" valign={Gtk.Align.CENTER} spacing={4} visible={items(i => i.length > 0)}>
<For each={items} id={item => item.item_id}>
{item => {
const btn = new Gtk.Button()
btn.add_css_class("tray-item")
btn.valign = Gtk.Align.CENTER
btn.child = new Gtk.Image({ gicon: item.gicon, pixel_size: 16 })
btn.connect("clicked", () => item.activate(0, 0))
if (item.menu_model) {
const pop = new Gtk.PopoverMenu({ menu_model: item.menu_model })
if (item.action_group)
pop.insert_action_group("dbusmenu", item.action_group)
pop.set_parent(btn)
const gesture = new Gtk.GestureClick()
gesture.button = 3
gesture.connect("pressed", () => pop.popup())
btn.add_controller(gesture)
}
return btn
}}
</For>
</box>
)
}

View file

@ -0,0 +1,85 @@
import { Gtk } from "ags/gtk4"
import { execAsync } from "ags/process"
import { createState } from "ags"
import { interval } from "ags/time"
export default function Volume() {
const [spk, setSpk] = createState({ vol: 0, muted: false })
const [mic, setMic] = createState({ vol: 0, muted: false })
function pollSpk() {
execAsync(["wpctl", "get-volume", "@DEFAULT_AUDIO_SINK@"])
.then(out => {
const match = out.match(/Volume: ([\d.]+)/)
setSpk({ vol: match ? Math.round(parseFloat(match[1]) * 100) : 0, muted: out.includes("[MUTED]") })
}).catch(() => {})
}
function pollMic() {
execAsync(["wpctl", "get-volume", "@DEFAULT_AUDIO_SOURCE@"])
.then(out => {
const match = out.match(/Volume: ([\d.]+)/)
setMic({ vol: match ? Math.round(parseFloat(match[1]) * 100) : 0, muted: out.includes("[MUTED]") })
}).catch(() => {})
}
pollSpk(); pollMic()
interval(1000, pollSpk)
interval(1000, pollMic)
const spkIcon = spk(({ vol, muted }) => {
if (muted) return "󰝟"
if (vol === 0) return "󰕿"
if (vol < 50) return "󰖀"
return "󰕾"
})
const popover = new Gtk.Popover()
popover.set_has_arrow(false)
const content = (
<box orientation={Gtk.Orientation.VERTICAL} spacing={8} widthRequest={200}>
<box spacing={8}>
<label class="vol-icon module-icon" label="󰕾" />
<label label="Speaker" hexpand xalign={0} />
<label label={spk(v => `${v.vol}%`)} class="vol-pct" />
</box>
<slider
min={0} max={150} value={spk(v => v.vol)}
widthRequest={180}
onNotifyValue={self => execAsync(["wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", `${self.value / 100}`]).catch(() => {})}
/>
<box spacing={8}>
<label class={mic(m => `module-icon ${m.muted ? "vol-muted" : "mic-icon"}`)} label={mic(m => m.muted ? "󰍭" : "󰍬")} />
<label label="Mic" hexpand xalign={0} />
<label label={mic(v => `${v.vol}%`)} class="vol-pct" />
</box>
<slider
min={0} max={100} value={mic(v => v.vol)}
widthRequest={180}
onNotifyValue={self => execAsync(["wpctl", "set-volume", "@DEFAULT_AUDIO_SOURCE@", `${self.value / 100}`]).catch(() => {})}
/>
<button class="open-mixer-btn" onClicked={() => execAsync("qpwgraph").catch(() => {})}>
<box spacing={6} halign={Gtk.Align.CENTER}>
<label label="󰎈" class="module-icon" />
<label label="Open mixer" />
</box>
</button>
</box>
) as unknown as Gtk.Widget
popover.set_child(content)
const btn = (
<button class="module volume-module" valign={Gtk.Align.CENTER} hexpand={false}
onClicked={() => popover.popup()}>
<box spacing={4}>
<label class={spk(v => `module-icon ${v.muted ? "vol-muted" : "vol-icon"}`)} label={spkIcon} />
<label label={spk(v => `${v.vol}%`)} />
</box>
</button>
) as unknown as Gtk.Button
popover.set_parent(btn)
return btn
}

View file

@ -0,0 +1,49 @@
import { Gtk } from "ags/gtk4"
import GLib from "gi://GLib"
import { execAsync } from "ags/process"
import { interval } from "ags/time"
import { createState, createEffect } from "ags"
const UNIT_FILE = `${GLib.get_home_dir()}/.config/ags/.weather-unit`
const LOCATION = "Phoenix"
function readUnit(): "m" | "u" {
try {
const [ok, contents] = GLib.file_get_contents(UNIT_FILE)
return ok && new TextDecoder().decode(contents).trim() === "u" ? "u" : "m"
} catch { return "m" }
}
export default function Weather() {
const [unit, setUnit] = createState<"m" | "u">(readUnit())
const [text, setText] = createState("")
function fetch() {
execAsync(`curl -sf 'wttr.in/${LOCATION}?format=%c%t&${unit()}'`)
.then(s => setText(s.trim().replace(/\s+/g, " ").replace(/\+(\d)/g, "$1")))
.catch(() => {})
}
createEffect(() => {
unit() // subscribe — re-fetch when unit changes
fetch()
})
interval(1800000, fetch)
return (
<box class="module weather-module" valign={Gtk.Align.CENTER} spacing={4} visible={text(t => t !== "")}>
<label class="weather-text" label={text} />
<button
class="unit-toggle"
onClicked={() => {
const next: "m" | "u" = unit() === "m" ? "u" : "m"
setUnit(next)
execAsync(`bash -c "echo ${next} > ${UNIT_FILE}"`)
}}
>
<label label={unit(u => u === "m" ? "°C" : "°F")} />
</button>
</box>
)
}

View file

@ -0,0 +1,32 @@
import { createState } from "ags"
import { interval } from "ags/time"
import { execAsync } from "ags/process"
import { Gtk } from "ags/gtk4"
interface NiriWindow {
title: string | null
app_id: string | null
}
export default function WindowTitle() {
const [win, setWin] = createState<NiriWindow>({ title: null, app_id: null })
function poll() {
execAsync(["niri", "msg", "--json", "focused-window"])
.then(out => { try { setWin(JSON.parse(out)) } catch {} })
.catch(() => setWin({ title: null, app_id: null }))
}
poll()
interval(1000, poll)
return (
<label
class="window-title"
halign={Gtk.Align.START}
ellipsize={3}
maxWidthChars={40}
label={win(w => w.title ?? w.app_id ?? "")}
/>
)
}

View file

@ -0,0 +1,46 @@
import { createState } from "ags"
import { interval } from "ags/time"
import { execAsync } from "ags/process"
import { Gtk } from "ags/gtk4"
import { For } from "ags"
interface NiriWorkspace {
id: number
idx: number
name: string | null
output: string
is_active: boolean
is_focused: boolean
active_window_id: number | null
}
export default function Workspaces() {
const [workspaces, setWorkspaces] = createState<NiriWorkspace[]>([])
function poll() {
execAsync(["niri", "msg", "--json", "workspaces"])
.then(out => {
try {
const ws = JSON.parse(out).sort((a: NiriWorkspace, b: NiriWorkspace) => a.idx - b.idx)
setWorkspaces(ws)
} catch {}
})
.catch(() => {})
}
poll()
interval(1000, poll)
return (
<box class="workspaces" halign={Gtk.Align.CENTER} valign={Gtk.Align.CENTER} spacing={2}>
<For each={workspaces} id={ws => ws.id}>
{ws => (
<label
class={`ws-dot ${ws.is_focused ? "focused" : ws.is_active ? "active" : ""}`}
label={ws.is_focused ? "●" : ws.active_window_id ? "○" : "·"}
/>
)}
</For>
</box>
)
}

View file

@ -0,0 +1,42 @@
import { createState } from "ags"
import Notifd from "gi://AstalNotifd"
type N = ReturnType<typeof Notifd.get_default>["notifications"][0]
export type NotifEntry = {
id: number
app_name: string
summary: string
body: string
notif: N
}
export const [history, setHistory] = createState<NotifEntry[]>([])
const PRIVATE_APPS = ["signal", "Signal"]
export function addNotif(notif: N) {
const private_ = PRIVATE_APPS.some(a => (notif.app_name || "").toLowerCase().includes(a.toLowerCase()))
setHistory(h => {
if (h.some(e => e.id === notif.id)) return h
return [...h, {
id: notif.id,
app_name: notif.app_name || "",
summary: notif.summary || "",
body: private_ ? "" : notif.body || "",
notif,
}]
})
}
export function removeNotif(id: number) {
setHistory(h => h.filter(e => e.id !== id))
}
export function clearAll() {
const notifd = Notifd.get_default()
for (const n of notifd.get_notifications()) {
try { n.dismiss() } catch {}
}
setHistory([])
}

View file

@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Version=1.0
Name=Hackatime Desktop
Comment=Hackatime Desktopstartup script
Exec=/home/end/Github/hackatime-desktop/src-tauri/target/release/desktop --minimized
StartupNotify=false
Terminal=false

272
apps/.config/btop/btop.conf Normal file
View file

@ -0,0 +1,272 @@
#? Config file for btop v.1.4.6
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
color_theme = "mariana-purple"
#* If the theme set background should be shown, set to False if you want terminal background transparency.
theme_background = false
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
truecolor = true
#* Set to true to force tty mode regardless if a real tty has been detected or not.
#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
force_tty = false
#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
#* Use whitespace " " as separator between different presets.
#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty"
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty"
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
vim_keys = false
#* Rounded corners on boxes, is ignored if TTY mode is ON.
rounded_corners = true
#* Use terminal synchronized output sequences to reduce flickering on supported terminals.
terminal_sync = true
#* Default symbols to use for graph creation, "braille", "block" or "tty".
#* "braille" offers the highest resolution but might not be included in all fonts.
#* "block" has half the resolution of braille but uses more common characters.
#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY.
#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view.
graph_symbol = "braille"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_cpu = "default"
# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty".
graph_symbol_gpu = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_mem = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_net = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_proc = "default"
#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace.
shown_boxes = "cpu mem net proc"
#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
update_ms = 1000
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
proc_sorting = "memory"
#* Reverse sorting order, True or False.
proc_reversed = false
#* Show processes as a tree.
proc_tree = false
#* Use the cpu graph colors in the process list.
proc_colors = true
#* Use a darkening gradient in the process list.
proc_gradient = true
#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
proc_per_core = false
#* Show process memory as bytes instead of percent.
proc_mem_bytes = true
#* Show cpu graph for each process.
proc_cpu_graphs = true
#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
proc_info_smaps = false
#* Show proc box on left side of screen instead of right.
proc_left = false
#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
proc_filter_kernel = false
#* In tree-view, always accumulate child process resources in the parent process.
proc_aggregate = false
#* Should cpu and memory usage display be preserved for dead processes when paused.
keep_dead_proc_usage = false
#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu.
cpu_graph_upper = "Auto"
#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu.
cpu_graph_lower = "Auto"
#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off".
show_gpu_info = "Auto"
#* Toggles if the lower CPU graph should be inverted.
cpu_invert_lower = true
#* Set to True to completely disable the lower CPU graph.
cpu_single_graph = false
#* Show cpu box at bottom of screen instead of top.
cpu_bottom = false
#* Shows the system uptime in the CPU box.
show_uptime = true
#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo.
show_cpu_watts = true
#* Show cpu temperature.
check_temp = true
#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
cpu_sensor = "Auto"
#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
show_coretemp = true
#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.
#* Example: "4:0 5:1 6:3"
cpu_core_map = ""
#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine".
temp_scale = "celsius"
#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
base_10_sizes = false
#* Show CPU frequency.
show_cpu_freq = true
#* How to calculate CPU frequency, available values: "first", "range", "lowest", "highest" and "average".
freq_mode = "first"
#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
#* Special formatting: /host = hostname | /user = username | /uptime = system uptime
clock_format = "%X"
#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
background_update = true
#* Custom cpu model name, empty string to disable.
custom_cpu_name = ""
#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user"
disks_filter = ""
#* Show graphs instead of meters for memory values.
mem_graphs = true
#* Show mem box below net box instead of above.
mem_below_net = false
#* Count ZFS ARC in cached and available memory.
zfs_arc_cached = true
#* If swap memory should be shown in memory box.
show_swap = true
#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
swap_disk = true
#* If mem box should be split to also show disks info.
show_disks = true
#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
only_physical = true
#* Read disks list from /etc/fstab. This also disables only_physical.
use_fstab = true
#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
zfs_hide_datasets = false
#* Set to true to show available disk space for privileged users.
disk_free_priv = false
#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
show_io_stat = true
#* Toggles io mode for disks, showing big graphs for disk read/write speeds.
io_mode = true
#* Set to True to show combined read/write io graphs in io mode.
io_graph_combined = false
#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
#* Example: "/mnt/media:100 /:20 /boot:1".
io_graph_speeds = ""
#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
net_download = 100
net_upload = 100
#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
net_auto = true
#* Sync the auto scaling for download and upload to whichever currently has the highest scale.
net_sync = true
#* Starts with the Network Interface specified here.
net_iface = ""
#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes.
base_10_bitrate = "Auto"
#* Show battery stats in top right if battery is present.
show_battery = true
#* Which battery to use if multiple are present. "Auto" for auto detection.
selected_battery = "Auto"
#* Show power stats of battery next to charge indicator.
show_battery_watts = true
#* Set loglevel for "~/.local/state/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
log_level = "WARNING"
#* Automatically save current settings to config file on exit.
save_config_on_exit = true
#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
nvml_measure_pcie_speeds = true
#* Measure PCIe throughput on AMD cards, may impact performance on certain cards.
rsmi_measure_pcie_speeds = true
#* Horizontally mirror the GPU graph.
gpu_mirror_graph = true
#* Set which GPU vendors to show. Available values are "nvidia amd intel"
shown_gpus = "nvidia amd intel"
#* Custom gpu0 model name, empty string to disable.
custom_gpu_name0 = ""
#* Custom gpu1 model name, empty string to disable.
custom_gpu_name1 = ""
#* Custom gpu2 model name, empty string to disable.
custom_gpu_name2 = ""
#* Custom gpu3 model name, empty string to disable.
custom_gpu_name3 = ""
#* Custom gpu4 model name, empty string to disable.
custom_gpu_name4 = ""
#* Custom gpu5 model name, empty string to disable.
custom_gpu_name5 = ""

View file

@ -0,0 +1,2 @@
[General]
notifications=true

353
apps/.config/mimeapps.list Normal file
View file

@ -0,0 +1,353 @@
[Added Associations]
application/json=vscodium-3.desktop;vscodium-2.desktop;/home/end/.local/share/applications/code-3.desktop;
application/pdf=zen.desktop;helium.desktop;
application/vnd.microsoft.portable-executable=wine-2.desktop;
audio/AMR=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/AMR-WB=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/aac=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/ac3=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/annodex=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/basic=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/flac=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/midi=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/mobile-xmf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/mp2=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/mp4=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/mpeg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/mpegurl=vlc.desktop;
audio/ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/prs.sid=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/usac=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/vnd.audible.aax=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/vnd.audible.aaxc=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/vnd.dts=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/vnd.dts.hd=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/vnd.rn-realaudio=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/vnd.wave=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/vorbis=vlc.desktop;
audio/webm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-adpcm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-aifc=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-aiff=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-amzxml=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-ape=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-dff=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-dsf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-flac=vlc.desktop;
audio/x-flac+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-gsm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-iriver-pla=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-it=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-m4b=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-m4r=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-matroska=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-minipsf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-mo3=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-mod=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-mp3=vlc.desktop;
audio/x-mpegurl=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-ms-asx=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-ms-wma=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-musepack=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-oggflac=vlc.desktop;
audio/x-opus+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-pn-audibleaudio=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-pn-realaudio=vlc.desktop;
audio/x-psf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-psflib=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-riff=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-s3m=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-scpls=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-speex=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-speex+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-stm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-tak=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-tta=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-voc=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-vorbis=vlc.desktop;
audio/x-vorbis+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-wav=vlc.desktop;
audio/x-wavpack=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-wavpack-correction=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-xi=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-xm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
audio/x-xmf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
image/apng=firefox.desktop;
image/gif=firefox.desktop;
image/jpeg=firefox.desktop;
inode/directory=org.gnome.Nautilus.desktop;yazi.desktop;
text/cache-manifest=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/calendar=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;org.mozilla.Thunderbird.desktop;
text/css=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/csv=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;dev.zed.Zed-Dev.desktop;
text/csv-schema=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/enriched=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/htmlh=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/javascript=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/jscript.encode=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/julia=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/lrs=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/markdown=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/org=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/plain=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/rfc822-headers=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/richtext=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/rust=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/sgml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/spreadsheet=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/tab-separated-values=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/tcl=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/troff=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/vbscript=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/vcard=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/vnd.trolltech.linguist=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/vnd.wap.wml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-component=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-google-video-pointer=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-iMelody=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-maven+xml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-mrml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-opml+xml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-patch=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-xmi=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
text/x-xslfo=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
video/3gpp=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/3gpp2=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/annodex=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/dv=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/isivideo=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/mj2=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/mp2t=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/mp4=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/mpeg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/quicktime=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/vnd.avi=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/vnd.mpegurl=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/vnd.radgamettools.bink=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/vnd.radgamettools.smacker=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/vnd.rn-realvideo=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/vnd.vivo=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/vnd.youtube.yt=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/wavelet=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/webm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-anim=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-flic=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-flv=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-javafx=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-matroska=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-matroska-3d=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-mjpeg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-mng=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-ms-wmp=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-ms-wmv=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-nsv=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-ogm+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-sgi-movie=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
video/x-theora+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
x-scheme-handler/about=zen.desktop;
x-scheme-handler/mailto=org.mozilla.Thunderbird.desktop;
x-scheme-handler/sgnl=signal-desktop.desktop;signal.desktop;
x-scheme-handler/signalcaptcha=signal-desktop.desktop;signal.desktop;
x-scheme-handler/slack=slack.desktop;Slack.desktop;
x-scheme-handler/unknown=zen.desktop;
x-scheme-handler/x-github-client=github-desktop.desktop;GitHub Desktop.desktop;
x-scheme-handler/x-github-desktop-auth=github-desktop.desktop;GitHub Desktop.desktop;
[Default Applications]
x-scheme-handler/http=helium.desktop
x-scheme-handler/https=helium.desktop
text/html=helium.desktop
application/json=vscodium-3.desktop;
application/pdf=helium.desktop
application/vnd.microsoft.portable-executable=wine-2.desktop;
audio/AMR=vlc.desktop;
audio/AMR-WB=vlc.desktop;
audio/aac=vlc.desktop;
audio/ac3=vlc.desktop;
audio/annodex=vlc.desktop;
audio/basic=vlc.desktop;
audio/flac=vlc.desktop;
audio/midi=vlc.desktop;
audio/mobile-xmf=vlc.desktop;
audio/mp2=vlc.desktop;
audio/mp4=vlc.desktop;
audio/mpeg=vlc.desktop;
audio/mpegurl=vlc.desktop;
audio/ogg=vlc.desktop;
audio/prs.sid=vlc.desktop;
audio/usac=vlc.desktop;
audio/vnd.audible.aax=vlc.desktop;
audio/vnd.audible.aaxc=vlc.desktop;
audio/vnd.dts=vlc.desktop;
audio/vnd.dts.hd=vlc.desktop;
audio/vnd.rn-realaudio=vlc.desktop;
audio/vnd.wave=vlc.desktop;
audio/vorbis=vlc.desktop;
audio/webm=vlc.desktop;
audio/x-adpcm=vlc.desktop;
audio/x-aifc=vlc.desktop;
audio/x-aiff=vlc.desktop;
audio/x-amzxml=vlc.desktop;
audio/x-ape=vlc.desktop;
audio/x-dff=vlc.desktop;
audio/x-dsf=vlc.desktop;
audio/x-flac=vlc.desktop;
audio/x-flac+ogg=vlc.desktop;
audio/x-gsm=vlc.desktop;
audio/x-iriver-pla=vlc.desktop;
audio/x-it=vlc.desktop;
audio/x-m4b=vlc.desktop;
audio/x-m4r=vlc.desktop;
audio/x-matroska=vlc.desktop;
audio/x-minipsf=vlc.desktop;
audio/x-mo3=vlc.desktop;
audio/x-mod=vlc.desktop;
audio/x-mp3=vlc.desktop;
audio/x-mpegurl=vlc.desktop;
audio/x-ms-asx=vlc.desktop;
audio/x-ms-wma=vlc.desktop;
audio/x-musepack=vlc.desktop;
audio/x-oggflac=vlc.desktop;
audio/x-opus+ogg=vlc.desktop;
audio/x-pn-audibleaudio=vlc.desktop;
audio/x-pn-realaudio=vlc.desktop;
audio/x-psf=vlc.desktop;
audio/x-psflib=vlc.desktop;
audio/x-riff=vlc.desktop;
audio/x-s3m=vlc.desktop;
audio/x-scpls=vlc.desktop;
audio/x-speex=vlc.desktop;
audio/x-speex+ogg=vlc.desktop;
audio/x-stm=vlc.desktop;
audio/x-tak=vlc.desktop;
audio/x-tta=vlc.desktop;
audio/x-voc=vlc.desktop;
audio/x-vorbis=vlc.desktop;
audio/x-vorbis+ogg=vlc.desktop;
audio/x-wav=vlc.desktop;
audio/x-wavpack=vlc.desktop;
audio/x-wavpack-correction=vlc.desktop;
audio/x-xi=vlc.desktop;
audio/x-xm=vlc.desktop;
audio/x-xmf=vlc.desktop;
inode/directory=org.gnome.Nautilus.desktop;
text/cache-manifest=dev.zed.Zed.desktop;
text/calendar=org.mozilla.Thunderbird.desktop
text/css=dev.zed.Zed.desktop;
text/csv=dev.zed.Zed-Dev.desktop
text/csv-schema=dev.zed.Zed.desktop;
text/enriched=dev.zed.Zed.desktop;
text/htmlh=dev.zed.Zed.desktop;
text/javascript=dev.zed.Zed.desktop;
text/jscript.encode=dev.zed.Zed.desktop;
text/julia=dev.zed.Zed.desktop;
text/lrs=dev.zed.Zed.desktop;
text/markdown=dev.zed.Zed.desktop;
text/org=dev.zed.Zed.desktop;
text/plain=dev.zed.Zed.desktop;
text/rfc822-headers=dev.zed.Zed.desktop;
text/richtext=dev.zed.Zed.desktop;
text/rust=dev.zed.Zed.desktop;
text/sgml=dev.zed.Zed.desktop;
text/spreadsheet=dev.zed.Zed.desktop;
text/tab-separated-values=dev.zed.Zed.desktop;
text/tcl=dev.zed.Zed.desktop;
text/troff=dev.zed.Zed.desktop;
text/vbscript=dev.zed.Zed.desktop;
text/vcard=dev.zed.Zed.desktop;
text/vnd.trolltech.linguist=dev.zed.Zed.desktop;
text/vnd.wap.wml=dev.zed.Zed.desktop;
text/x-component=dev.zed.Zed.desktop;
text/x-google-video-pointer=dev.zed.Zed.desktop;
text/x-iMelody=dev.zed.Zed.desktop;
text/x-maven+xml=dev.zed.Zed.desktop;
text/x-mrml=dev.zed.Zed.desktop;
text/x-opml+xml=dev.zed.Zed.desktop;
text/x-patch=dev.zed.Zed.desktop;
text/x-xmi=dev.zed.Zed.desktop;
text/x-xslfo=dev.zed.Zed.desktop;
video/3gpp=vlc.desktop;
video/3gpp2=vlc.desktop;
video/annodex=vlc.desktop;
video/dv=vlc.desktop;
video/isivideo=vlc.desktop;
video/mj2=vlc.desktop;
video/mp2t=vlc.desktop;
video/mp4=vlc.desktop;
video/mpeg=vlc.desktop;
video/ogg=vlc.desktop;
video/quicktime=vlc.desktop;
video/vnd.avi=vlc.desktop;
video/vnd.mpegurl=vlc.desktop;
video/vnd.radgamettools.bink=vlc.desktop;
video/vnd.radgamettools.smacker=vlc.desktop;
video/vnd.rn-realvideo=vlc.desktop;
video/vnd.vivo=vlc.desktop;
video/vnd.youtube.yt=vlc.desktop;
video/wavelet=vlc.desktop;
video/webm=vlc.desktop;
video/x-anim=vlc.desktop;
video/x-flic=vlc.desktop;
video/x-flv=vlc.desktop;
video/x-javafx=vlc.desktop;
video/x-matroska=vlc.desktop;
video/x-matroska-3d=vlc.desktop;
video/x-mjpeg=vlc.desktop;
video/x-mng=vlc.desktop;
video/x-ms-wmp=vlc.desktop;
video/x-ms-wmv=vlc.desktop;
video/x-nsv=vlc.desktop;
video/x-ogm+ogg=vlc.desktop;
video/x-sgi-movie=vlc.desktop;
video/x-theora+ogg=vlc.desktop;
x-scheme-handler/adskidmgr=adskidmgr-opener.desktop;
x-scheme-handler/discord=vesktop.desktop
x-scheme-handler/sgnl=signal.desktop
x-scheme-handler/signalcaptcha=signal.desktop
x-scheme-handler/slack=slack.desktop
x-scheme-handler/x-github-client=github-desktop.desktop
x-scheme-handler/x-github-desktop-auth=github-desktop.desktop
x-scheme-handler/tel=helium.desktop
x-scheme-handler/claude-cli=claude-code-url-handler.desktop
x-scheme-handler/pttp=CiscoPacketTracerPtsa-9.0.0.desktop
application/x-pka=CiscoPacketTracer-9.0.0.desktop
application/x-pkt=CiscoPacketTracer-9.0.0.desktop
application/x-pkz=CiscoPacketTracer-9.0.0.desktop
application/x-pksz=CiscoPacketTracer-9.0.0.desktop
x-scheme-handler/hackatime=desktop-handler.desktop
[Removed Associations]
audio/aac=org.gnome.Decibels.desktop;
audio/flac=org.gnome.Decibels.desktop;
audio/mp2=org.gnome.Decibels.desktop;
audio/mp4=org.gnome.Decibels.desktop;
audio/mpeg=org.gnome.Decibels.desktop;
audio/vnd.wave=org.gnome.Decibels.desktop;
audio/x-aiff=org.gnome.Decibels.desktop;
audio/x-ape=org.gnome.Decibels.desktop;
audio/x-m4b=org.gnome.Decibels.desktop;
audio/x-mpegurl=org.gnome.Decibels.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;dev.zed.Zed.desktop;libreoffice-writer.desktop;vscodium-wayland.desktop;
audio/x-opus+ogg=org.gnome.Decibels.desktop;
audio/x-speex=org.gnome.Decibels.desktop;
audio/x-vorbis+ogg=org.gnome.Decibels.desktop;
audio/x-wavpack=org.gnome.Decibels.desktop;
text/calendar=org.gnome.Calendar.desktop;
text/csv=libreoffice-calc.desktop;
text/spreadsheet=libreoffice-calc.desktop;
text/tab-separated-values=libreoffice-calc.desktop;
text/vbscript=wine-extension-vbs.desktop;
text/vcard=org.mozilla.Thunderbird.desktop;
text/vnd.trolltech.linguist=linguist.desktop;firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
text/vnd.wap.wml=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
text/x-component=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
text/x-google-video-pointer=vlc.desktop;org.gnome.Totem.desktop;
text/x-maven+xml=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
text/x-mrml=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
text/x-opml+xml=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
text/x-patch=org.kde.kompare.desktop;
text/x-xmi=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
text/x-xslfo=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
video/vnd.mpegurl=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
video/vnd.youtube.yt=io.mrarm.mcpelauncher-ui-qt.desktop;org.gnome.Nautilus.desktop;org.prismlauncher.PrismLauncher.desktop;peazip.desktop;
video/x-mjpeg=feh.desktop;com.google.Chrome.desktop;swappy.desktop;google-chrome.desktop;org.gnome.Loupe.desktop;

View file

@ -0,0 +1,653 @@
// This config is in the KDL format: https://kdl.dev
// "/-" comments out the following node.
// Check the wiki for a full description of the configuration:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction
// Input device configuration.
// Find the full list of options on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
input {
keyboard {
xkb {
// You can set rules, model, layout, variant and options.
// For more information, see xkeyboard-config(7).
// For example:
layout "us"
variant "altgr-intl" // or "intl"
options "lv3:ralt_switch" // Enable Right Alt as AltGr
}
// Enable numlock on startup, omitting this setting disables it.
numlock
}
// Next sections include libinput settings.
// Omitting settings disables them, or leaves them at their default values.
touchpad {
// off
tap
// dwt
// dwtp
// drag false
// drag-lock
natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "two-finger"
// disabled-on-external-mouse
}
mouse {
// off
// natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "no-scroll"
}
trackpoint {
// off
// natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "on-button-down"
// scroll-button 273
// middle-emulation
}
// Uncomment this to make the mouse warp to the center of newly focused windows.
// warp-mouse-to-focus
// Focus windows and outputs automatically when moving the mouse into them.
// Setting max-scroll-amount="0%" makes it work only on windows already fully on screen.
// focus-follows-mouse max-scroll-amount="0%"
}
workspace "main"
workspace "comms"
// You can configure outputs by their name, which you can find
// by running `niri msg outputs` while inside a niri instance.
// The built-in laptop monitor is usually called "eDP-1".
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs
// Remember to uncomment the node by removing "/-"!
output "eDP-1" {
// Uncomment this line to disable this output.
// off
// Resolution and, optionally, refresh rate of the output.
// The format is "<width>x<height>" or "<width>x<height>@<refresh rate>".
// If the refresh rate is omitted, niri will pick the highest refresh rate
// for the resolution.
// If the mode is omitted altogether or is invalid, niri will pick one automatically.
// Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
mode "2560x1600@165.000"
// You can use integer or fractional scale, for example use 1.5 for 150% scale.
scale 1.5
// Enable variable refresh rate (VRR / FreeSync / G-Sync).
variable-refresh-rate
// Transform allows to rotate the output counter-clockwise, valid values are:
// normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
transform "normal"
// Position of the output in the global coordinate space.
// This affects directional monitor actions like "focus-monitor-left", and cursor movement.
// The cursor can only move between directly adjacent outputs.
// Output scale and rotation has to be taken into account for positioning:
// outputs are sized in logical, or scaled, pixels.
// For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,
// so to put another output directly adjacent to it on the right, set its x to 1920.
// If the position is unset or results in an overlap, the output is instead placed
// automatically.
position x=0 y=0
}
// Settings that influence how windows are positioned and sized.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
layout {
// Set gaps around windows in logical pixels.
gaps 8
// When to center a column when changing focus, options are:
// - "never", default behavior, focusing an off-screen column will keep at the left
// or right edge of the screen.
// - "always", the focused column will always be centered.
// - "on-overflow", focusing a column will center it if it doesn't fit
// together with the previously focused column.
center-focused-column "never"
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
preset-column-widths {
// Proportion sets the width as a fraction of the output width, taking gaps into account.
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
// The default preset widths are 1/3, 1/2 and 2/3 of the output.
proportion 0.33333
proportion 0.5
proportion 0.66667
// Fixed sets the width in logical pixels exactly.
// fixed 1920
}
// You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
// preset-window-heights { }
// You can change the default width of the new windows.
default-column-width { proportion 0.5; }
// If you leave the brackets empty, the windows themselves will decide their initial width.
// default-column-width {}
// By default focus ring and border are rendered as a solid background rectangle
// behind windows. That is, they will show up through semitransparent windows.
// This is because windows using client-side decorations can have an arbitrary shape.
//
// If you don't like that, you should uncomment `prefer-no-csd` below.
// Niri will draw focus ring and border *around* windows that agree to omit their
// client-side decorations.
//
// Alternatively, you can override it with a window rule called
// `draw-border-with-background`.
// You can change how the focus ring looks.
focus-ring {
// Uncomment this line to disable the focus ring.
// off
// How many logical pixels the ring extends out from the windows.
width 4
// Colors can be set in a variety of ways:
// - CSS named colors: "red"
// - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
// - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
// Color of the ring on the active monitor.
active-color "#0f0a67ff"
// Color of the ring on inactive monitors.
inactive-color "#505050"
// You can also use gradients. They take precedence over solid colors.
// Gradients are rendered the same as CSS linear-gradient(angle, from, to).
// The angle is the same as in linear-gradient, and is optional,
// defaulting to 180 (top-to-bottom gradient).
// You can use any CSS linear-gradient tool on the web to set these up.
// Changing the color space is also supported, check the wiki for more info.
//
active-gradient from="#c792ea" to="#5fb3b3" angle=45
// You can also color the gradient relative to the entire view
// of the workspace, rather than relative to just the window itself.
// To do that, set relative-to="workspace-view".
//
inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can also add a border. It's similar to the focus ring, but always visible.
border {
// The settings are the same as for the focus ring.
// If you enable the border, you probably want to disable the focus ring.
off
width 4
active-color "#ffc87f"
inactive-color "#505050"
// Color of the border around windows that request your attention.
urgent-color "#9b0000"
// active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can enable drop shadows for windows.
shadow {
// Uncomment the next line to enable shadows.
on
// By default, the shadow draws only around its window, and not behind it.
// Uncomment this setting to make the shadow draw behind its window.
//
// Note that niri has no way of knowing about the CSD window corner
// radius. It has to assume that windows have square corners, leading to
// shadow artifacts inside the CSD rounded corners. This setting fixes
// those artifacts.
//
// However, instead you may want to set prefer-no-csd and/or
// geometry-corner-radius. Then, niri will know the corner radius and
// draw the shadow correctly, without having to draw it behind the
// window. These will also remove client-side shadows if the window
// draws any.
//
// draw-behind-window true
// You can change how shadows look. The values below are in logical
// pixels and match the CSS box-shadow properties.
// Softness controls the shadow blur radius.
softness 30
// Spread expands the shadow.
spread 5
// Offset moves the shadow relative to the window.
offset x=0 y=5
// You can also change the shadow color and opacity.
color "#0007"
}
// Struts shrink the area occupied by windows, similarly to layer-shell panels.
// You can think of them as a kind of outer gaps. They are set in logical pixels.
// Left and right struts will cause the next window to the side to always be visible.
// Top and bottom struts will simply add outer gaps in addition to the area occupied by
// layer-shell panels and regular gaps.
struts {
// left 64
// right 64
// top 64
// bottom 64
}
}
// Add lines like this to spawn processes at startup.
// Note that running niri as a session supports xdg-desktop-autostart,
// which may be more convenient to use.
// See the binds section below for more spawn examples.
spawn-at-startup "bash" "-c" "ags run /home/end/.config/ags"
spawn-at-startup "vicinae" "server"
spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1"
spawn-at-startup "wallpaper-init"
spawn-at-startup "signal-desktop"
spawn-at-startup "discord"
spawn-at-startup "zen-browser"
spawn-at-startup "qpwgraph" "--minimized"
spawn-at-startup "wezterm"
// Uncomment this line to ask the clients to omit their client-side decorations if possible.
// If the client will specifically ask for CSD, the request will be honored.
// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
// This option will also fix border/focus ring drawing behind some semitransparent windows.
// After enabling or disabling this, you need to restart the apps for this to take effect.
prefer-no-csd
// You can change the path where screenshots are saved.
// A ~ at the front will be expanded to the home directory.
// The path is formatted with strftime(3) to give you the screenshot date and time.
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
// You can also set this to null to disable saving screenshots to disk.
// screenshot-path null
// Animation settings.
// The wiki explains how to configure individual animations:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations
animations {
// Uncomment to turn off all animations.
// off
// Slow down all animations by this factor. Values below 1 speed them up instead.
// slowdown 3.0
// Window open: springy feel
window-open {
spring damping-ratio=0.8 stiffness=400 epsilon=0.0001
}
// Window close: quick ease out
window-close {
duration-ms 150
curve "ease-out-cubic"
}
// Workspace switch: smooth spring
workspace-switch {
spring damping-ratio=1.0 stiffness=500 epsilon=0.0001
}
// Column movement
horizontal-view-movement {
spring damping-ratio=1.0 stiffness=500 epsilon=0.0001
}
}
// Window rules let you adjust behavior for individual windows.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
// Work around WezTerm's initial configure bug
// by setting an empty default-column-width.
window-rule {
// This regular expression is intentionally made as specific as possible,
// since this is the default config, and we want no false positives.
// You can get away with just app-id="wezterm" if you want.
match app-id=r#"^org\.wezfurlong\.wezterm$"#
default-column-width {}
}
// Open the Firefox picture-in-picture player as floating by default.
window-rule {
// This app-id regular expression will work for both:
// - host Firefox (app-id is "firefox")
// - Flatpak Firefox (app-id is "org.mozilla.firefox")
match app-id=r#"firefox$"# title="^Picture-in-Picture$"
open-floating false
}
// Example: block out two password managers from screen capture.
// (This example rule is commented out with a "/-" in front.)
window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
match app-id=r#"^signal$"#
match app-id=r#"^com\.discordapp\.Discord$"#
/- match app-id=r#"^org\.wezfurlong\.wezterm$"#
match app-id=r#"^Bitwarden$"#
block-out-from "screen-capture"
}
// Example: enable rounded corners for all windows.
// (This example rule is commented out with a "/-" in front.)
window-rule {
geometry-corner-radius 12
clip-to-geometry true
}
// Workspace 1: productivity / personal
window-rule {
match app-id="helium"
match app-id=r#"^org\.wezfurlong\.wezterm$"#
match app-id="obsidian"
match app-id="thunderbird"
open-on-workspace "main"
}
// Workspace 2: comms / social
window-rule {
match app-id="steam"
match app-id=r#"^signal$"#
match app-id=r#"^com\.discordapp\.Discord$"#
match app-id="discord"
match app-id=r#"zen-browser$"#
match app-id="slack"
open-on-workspace "comms"
}
// Float pavucontrol
window-rule {
match app-id="org.pulseaudio.pavucontrol"
open-floating true
}
binds {
// Keys consist of modifiers separated by + signs, followed by an XKB key name
// in the end. To find an XKB name for a particular key, you may use a program
// like wev.
//
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
// when running as a winit window.
//
// Most actions that you can bind here can also be invoked programmatically with
// `niri msg action do-something`.
// Mod-Shift-/, which is usually the same as Mod-?,
// shows a list of important hotkeys.
Mod+Shift+Slash { show-hotkey-overlay; }
// Suggested binds for running programs: terminal, app launcher, screen locker.
Mod+T hotkey-overlay-title="Open a Terminal: fish" { spawn "wezterm"; }
Mod+B hotkey-overlay-title="Open Browser: Helium" { spawn "helium"; }
Mod+D hotkey-overlay-title="Run an Application: vicinae" { spawn "vicinae" "toggle"; }
Super+Alt+L hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "hyprlock"; }
// You can also use a shell. Do this if you need pipes, multiple commands, etc.
// Note: the entire command goes as a single argument in the end.
// Mod+T { spawn "bash" "-c" "notify-send hello && exec wezterm"; }
// Example volume keys mappings for PipeWire & WirePlumber.
// The allow-when-locked=true property makes them work even when the session is locked.
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "set" "5%+"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "set" "5%-"; }
// Open/close the Overview: a zoomed-out view of workspaces and windows.
// You can also move the mouse into the top-left hot corner,
// or do a four-finger swipe up on a touchpad.
Mod+O repeat=false { toggle-overview; }
Mod+Q { close-window; }
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+H { focus-column-left; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+L { focus-column-right; }
Mod+Ctrl+Left { move-column-left; }
Mod+Ctrl+Down { move-window-down; }
Mod+Ctrl+Up { move-window-up; }
Mod+Ctrl+Right { move-column-right; }
Mod+Ctrl+H { move-column-left; }
Mod+Ctrl+J { move-window-down; }
Mod+Ctrl+K { move-window-up; }
Mod+Ctrl+L { move-column-right; }
// Alternative commands that move across workspaces when reaching
// the first or last window in a column.
// Mod+J { focus-window-or-workspace-down; }
// Mod+K { focus-window-or-workspace-up; }
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Shift+Left { focus-monitor-left; }
Mod+Shift+Down { focus-monitor-down; }
Mod+Shift+Up { focus-monitor-up; }
Mod+Shift+Right { focus-monitor-right; }
Mod+Shift+H { focus-monitor-left; }
Mod+Shift+J { focus-monitor-down; }
Mod+Shift+K { focus-monitor-up; }
Mod+Shift+L { focus-monitor-right; }
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
// Alternatively, there are commands to move just a single window:
// Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
// ...
// And you can also move a whole workspace to another monitor:
// Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
// ...
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
Mod+U { focus-workspace-down; }
Mod+I { focus-workspace-up; }
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
Mod+Ctrl+U { move-column-to-workspace-down; }
Mod+Ctrl+I { move-column-to-workspace-up; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
// ...
Mod+Shift+Page_Down { move-workspace-down; }
Mod+Shift+Page_Up { move-workspace-up; }
Mod+Shift+U { move-workspace-down; }
Mod+Shift+I { move-workspace-up; }
// You can bind mouse wheel scroll ticks using the following syntax.
// These binds will change direction based on the natural-scroll setting.
//
// To avoid scrolling through workspaces really fast, you can use
// the cooldown-ms property. The bind will be rate-limited to this value.
// You can set a cooldown on any bind, but it's most useful for the wheel.
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Ctrl+WheelScrollRight { move-column-right; }
Mod+Ctrl+WheelScrollLeft { move-column-left; }
// Usually scrolling up and down with Shift in applications results in
// horizontal scrolling; these binds replicate that.
Mod+Shift+WheelScrollDown { focus-column-right; }
Mod+Shift+WheelScrollUp { focus-column-left; }
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
// Similarly, you can bind touchpad scroll "ticks".
// Touchpad scrolling is continuous, so for these binds it is split into
// discrete intervals.
// These binds are also affected by touchpad's natural-scroll, so these
// example binds are "inverted", since we have natural-scroll enabled for
// touchpads by default.
// Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
// Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
// You can refer to workspaces by index. However, keep in mind that
// niri is a dynamic workspace system, so these commands are kind of
// "best effort". Trying to refer to a workspace index bigger than
// the current workspace count will instead refer to the bottommost
// (empty) workspace.
//
// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
// will all refer to the 3rd workspace.
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Ctrl+1 { move-column-to-workspace 1; }
Mod+Ctrl+2 { move-column-to-workspace 2; }
Mod+Ctrl+3 { move-column-to-workspace 3; }
Mod+Ctrl+4 { move-column-to-workspace 4; }
Mod+Ctrl+5 { move-column-to-workspace 5; }
Mod+Ctrl+6 { move-column-to-workspace 6; }
Mod+Ctrl+7 { move-column-to-workspace 7; }
Mod+Ctrl+8 { move-column-to-workspace 8; }
Mod+Ctrl+9 { move-column-to-workspace 9; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+1 { move-window-to-workspace 1; }
// Switches focus between the current and the previous workspace.
// Mod+Tab { focus-workspace-previous; }
// The following binds move the focused window in and out of a column.
// If the window is alone, they will consume it into the nearby column to the side.
// If the window is already in a column, they will expel it out.
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
// Consume one window from the right to the bottom of the focused column.
Mod+Comma { consume-window-into-column; }
// Expel the bottom window from the focused column to the right.
Mod+Period { expel-window-from-column; }
Mod+R { switch-preset-column-width; }
Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
// Expand the focused column to space not taken up by other fully visible columns.
// Makes the column "fill the rest of the space".
Mod+Ctrl+F { expand-column-to-available-width; }
Mod+C { center-column; }
// Center all fully visible columns on screen.
Mod+Ctrl+C { center-visible-columns; }
// Finer width adjustments.
// This command can also:
// * set width in pixels: "1000"
// * adjust width in pixels: "-5" or "+5"
// * set width as a percentage of screen width: "25%"
// * adjust width as a percentage of screen width: "-10%" or "+10%"
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
// set-column-width "100" will make the column occupy 200 physical screen pixels.
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
// Finer height adjustments when in column with other windows.
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
// Move the focused window between the floating and the tiling layout.
Mod+V { toggle-window-floating; }
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
// Toggle tabbed column display mode.
// Windows in this column will appear as vertical tabs,
// rather than stacked on top of each other.
Mod+W { toggle-column-tabbed-display; }
// Actions to switch layouts.
// Note: if you uncomment these, make sure you do NOT have
// a matching layout switch hotkey configured in xkb options above.
// Having both at once on the same hotkey will break the switching,
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
// Mod+Space { switch-layout "next"; }
// Mod+Shift+Space { switch-layout "prev"; }
Print { screenshot; }
Shift+Print { screenshot-screen; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
// Applications such as remote-desktop clients and software KVM switches may
// request that niri stops processing the keyboard shortcuts defined here
// so they may, for example, forward the key presses as-is to a remote machine.
// It's a good idea to bind an escape hatch to toggle the inhibitor,
// so a buggy application can't hold your session hostage.
//
// The allow-inhibiting=false property can be applied to other binds as well,
// which ensures niri always processes them, even when an inhibitor is active.
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
// The quit action will show a confirmation dialog to avoid accidental exits.
Mod+Shift+E { quit; }
Ctrl+Alt+Delete { quit; }
// Powers off the monitors. To turn them back on, do any input like
// moving the mouse or pressing any other key.
Mod+Shift+P { power-off-monitors; }
}
environment {
ELECTRON_OZONE_PLATFORM_HINT "auto"
}

View file

@ -0,0 +1 @@
{"browser":{"enable_spellchecking":true},"migrated_user_scripts_toggle":true,"partition":{"per_host_zoom_levels":{"100268245138109095":{}}},"spellcheck":{"dictionaries":["en-US"],"dictionary":""}}

View file

@ -0,0 +1,9 @@
[window]
width=744
height=897
sinkInputType=0
sourceOutputType=1
sinkType=0
sourceType=1
showVolumeMeters=1
hideUnavailableCardProfiles=0

124
apps/.config/starship.toml Normal file
View file

@ -0,0 +1,124 @@
format = """
$username\
$hostname\
$directory\
$git_branch\
$git_status\
$python\
$nodejs\
$rust\
$golang\
$java\
$cmd_duration\
$fill\
$status\
$time\
$line_break\
$character"""
palette = "mariana"
[palettes.mariana]
purple = "#c792ea"
cyan = "#4ec9b0"
green = "#99c794"
yellow = "#fac863"
pink = "#ec5f89"
red = "#f97b58"
text = "#d8dee9"
subtext = "#8892a4"
bg = "#16161e"
[username]
style_user = "bold purple"
style_root = "bold red"
format = "[$user]($style)"
show_always = true
[hostname]
style = "bold cyan"
format = "[@$hostname]($style) "
ssh_only = false
[directory]
style = "bold cyan"
format = "[$path]($style)[$read_only]($read_only_style) "
truncation_length = 5
truncate_to_repo = false
home_symbol = "~"
read_only = " 󰌾"
read_only_style = "red"
[git_branch]
symbol = " "
style = "bold purple"
format = "[$symbol$branch]($style) "
[git_status]
style = "yellow"
format = "([$all_status$ahead_behind]($style) )"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
modified = "!${count}"
untracked = "?${count}"
staged = "+${count}"
deleted = "✘${count}"
stashed = "\\$${count}"
[python]
symbol = " "
style = "yellow"
format = "[$symbol$version]($style) "
detect_extensions = ["py"]
detect_files = [".python-version", "Pipfile", "requirements.txt", "setup.py", "pyproject.toml"]
[nodejs]
symbol = " "
style = "green"
format = "[$symbol$version]($style) "
detect_extensions = ["js", "ts", "mjs", "cjs", "mts", "cts"]
detect_files = ["package.json", ".nvmrc"]
[rust]
symbol = " "
style = "red"
format = "[$symbol$version]($style) "
[golang]
symbol = " "
style = "cyan"
format = "[$symbol$version]($style) "
[java]
symbol = " "
style = "red"
format = "[$symbol$version]($style) "
[cmd_duration]
min_time = 2000
style = "yellow"
format = "[󱦟 $duration]($style) "
[fill]
symbol = " "
[status]
disabled = false
style = "bold pink"
format = "[✗ $status]($style) "
success_symbol = ""
[time]
disabled = false
style = "bold subtext"
format = "[$time]($style)"
time_format = "%H:%M"
[character]
success_symbol = "[](bold purple)"
error_symbol = "[](bold pink)"
vimcmd_symbol = "[](bold green)"
[line_break]
disabled = false

View file

@ -0,0 +1,8 @@
[Unit]
StartLimitIntervalSec=60
StartLimitBurst=10
[Service]
ExecStart=
ExecStart=/usr/lib/xdg-desktop-portal-wlr -c %h/.config/xdg-desktop-portal-wlr/config
RestartSec=2

360
apps/.config/topgrade.toml Normal file
View file

@ -0,0 +1,360 @@
# Include any additional configuration file(s)
# [include] sections are processed in the order you write them
# Files in $CONFIG_DIR/topgrade.d/ are automatically included before this file
[include]
# paths = ["/etc/topgrade.toml"]
[misc]
# Run `sudo -v` to cache credentials at the start of the run
# This avoids a blocking password prompt in the middle of an unattended run
# (default: false)
# pre_sudo = false
# Sudo command to be used
# sudo_command = "sudo"
# Disable specific steps - same options as the command line flag
# disable = ["system", "emacs"]
# Ignore failures for these steps
# ignore_failures = ["powershell"]
# List of remote machines with Topgrade installed on them
# remote_topgrades = ["toothless", "pi", "parnas"]
# Path to Topgrade executable on remote machines
# remote_topgrade_path = ".cargo/bin/topgrade"
# Arguments to pass to SSH when upgrading remote systems
# ssh_arguments = "-o ConnectTimeout=2"
# Arguments to pass tmux when pulling Repositories
# tmux_arguments = "-S /var/tmux.sock"
# Do not set the terminal title (default: true)
# set_title = true
# Display the time in step titles (default: true)
# display_time = true
# Don't ask for confirmations (no default value)
# assume_yes = true
# Do not ask to retry failed steps (default: false)
# no_retry = true
# Run inside tmux (default: false)
# run_in_tmux = true
# Changes the way topgrade interacts with
# the tmux session, creating the session
# and only attaching to it if not inside tmux
# (default: "attach_if_not_in_session", allowed values: "attach_if_not_in_session", "attach_always")
# tmux_session_mode = "attach_if_not_in_session"
# Cleanup temporary or old files (default: false)
# cleanup = true
# Send a notification for every step (default: false)
# notify_each_step = false
# Skip sending a notification at the end of a run (default: false)
# skip_notify = true
# The Bash-it branch to update (default: "stable")
# bashit_branch = "stable"
# Run specific steps - same options as the command line flag
# only = ["system", "emacs"]
# Whether to self update
#
# this will be ignored if the binary is built without self update support
#
# available also via setting the environment variable TOPGRADE_NO_SELF_UPGRADE)
# no_self_update = true
# Extra tracing filter directives
# These are prepended to the `--log-filter` argument
# See: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
# log_filters = ["topgrade::command=debug", "warn"]
# Commands to run before anything
[pre_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Commands to run after anything
[post_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Custom commands
[commands]
# "Python Environment" = "~/dev/.env/bin/pip install -i https://pypi.python.org/simple -U --upgrade-strategy eager jupyter"
# "Custom command using interactive shell (unix)" = "-i vim_upgrade"
[python]
# enable_pip_review = true ###disabled by default
# enable_pip_review_local = true ###disabled by default
# enable_pipupgrade = true ###disabled by default
# pipupgrade_arguments = "-y -u --pip-path pip" ###disabled by default
# For the poetry step, by default, Topgrade skips its update if poetry is not
# installed with the official script. This configuration entry forces Topgrade
# to run the update in this case.
#
# (default: false)
# poetry_force_self_update = true
[conda]
# Additional named conda environments to update (`conda env update -n env_name`)
# env_names = [
# "Toolbox",
# "PyTorch"
# ]
# Additional conda environment paths to update (`conda env update -p env_path`)
# env_paths = [
# "~/webserver/.conda/",
# "~/experiments/.conda/"
# ]
[composer]
# self_update = true
[brew]
# For the BrewCask step
# If `Repo Cask Upgrade` exists, then use the `-a` option.
# Otherwise, use the `--greedy` option.
# greedy_cask = true
# For the BrewCask step
# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option.
# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
# both of them, they won't clash with each other.
# greedy_latest = true
# For the BrewCask step
# If `Repo Cask Upgrade` does not exist, then use the `--greedy_auto_updates` option.
# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
# both of them, they won't clash with each other.
# greedy_auto_updates = true
# For the BrewFormula step
# Execute `brew autoremove` after the step.
# autoremove = true
# For the BrewFormula step
# Upgrade formulae built from the HEAD branch; `brew upgrade --fetch-HEAD`
# fetch_head = true
[linux]
# Arch Package Manager to use.
# Allowed values:
# autodetect, aura, garuda_update, pacman, pamac, paru, pikaur, trizen, yay
# arch_package_manager = "pacman"
# Arguments to pass yay (or paru) when updating packages
# yay_arguments = "--nodevel"
# Arguments to pass dnf when updating packages
# dnf_arguments = "--refresh"
# aura_aur_arguments = "-kx"
# aura_pacman_arguments = ""
# garuda_update_arguments = ""
# show_arch_news = true
# trizen_arguments = "--devel"
# pikaur_arguments = ""
# pamac_arguments = "--no-devel"
# enable_tlmgr = true
# emerge_sync_flags = "-q"
# emerge_update_flags = "-uDNa --with-bdeps=y world"
# redhat_distro_sync = false
# suse_dup = false
# rpm_ostree = false
# For Fedora/CentOS/RHEL Atomic variants, if `bootc` is available and this configuration entry is set to true, use
# it to do the update - Will also supersede rpm-ostree if enabled
# (default: false)
# bootc = false
# nix_arguments = "--flake"
# nix_env_arguments = "--prebuilt-only"
# Extra Home Manager arguments
# home_manager_arguments = ["--flake", "file"]
[git]
# How many repos to pull at max in parallel
# max_concurrency = 5
# Additional git repositories to pull
# repos = [
# "~/src/*/",
# "~/.config/something"
# ]
# Don't pull the predefined git repos
# pull_predefined = false
# Arguments to pass Git when pulling Repositories
# arguments = "--rebase --autostash"
[windows]
# Manually select Windows updates
# accept_all_updates = false
# Controls whether to automatically reboot the computer when updates are
# installed that request it. (default: "no", allowed values: "yes", "no", "ask")
# updates_auto_reboot = "yes"
# open_remotes_in_new_terminal = true
# wsl_update_pre_release = true
# wsl_update_use_web_download = true
# The default for winget_install_silently is true,
# this example turns off silent install.
# winget_install_silently = false
# Causes Topgrade to rename itself during the run to allow package managers
# to upgrade it. Use this only if you installed Topgrade by using a package
# manager such as Scoop or Cargo
# self_rename = true
# Use sudo to elevate privileges for the Windows Package Manager (winget)
# Only use this option if you want to run the Winget step in sudo-mode.
# Running winget in sudo-mode is generally not recommended, as not every
# package supports installing / upgrading in sudo-mode and it may cause issues
# with some packages or may even cause the Winget-step to fail.
# If any problems occur, please try running Topgrade without this option first
# before reporting an issue.
# (default: false)
# winget_use_sudo = true
[npm]
# Use sudo if the NPM directory isn't owned by the current user
# use_sudo = true
[yarn]
# Run `yarn global upgrade` with `sudo`
# use_sudo = true
[deno]
# Upgrade deno executable to the given version.
# version = "stable"
[vim]
# For `vim-plug`, execute `PlugUpdate!` instead of `PlugUpdate`
# force_plug_update = true
[firmware]
# Offer to update firmware; if false just check for and display available updates
# upgrade = true
[vagrant]
# Vagrant directories
# directories = []
# power on vagrant boxes if needed
# power_on = true
# Always suspend vagrant boxes instead of powering off
# always_suspend = true
[flatpak]
# Use sudo for updating the system-wide installation
# use_sudo = true
[distrobox]
# use_root = false
# containers = ["archlinux-latest"]
[containers]
# Specify the containers to ignore while updating (Wildcard supported)
# ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest", "docker.io*"]
# Specify the runtime to use for containers (default: "docker", allowed values: "docker", "podman")
# runtime = "podman"
[lensfun]
# If disabled, Topgrade invokes `lensfunupdatedata` without root privilege,
# then the update will be only available to you. Otherwise, `sudo` is required,
# and the update will be installed system-wide, i.e., available to all users.
# (default: false)
# use_sudo = false
[julia]
# If disabled, Topgrade invokes julia with the --startup-file=no CLI option.
#
# This may be desirable to avoid loading outdated packages with "using" directives
# in the startup file, which might cause the update run to fail.
# (default: true)
# startup_file = true
[zigup]
# Version strings passed to zigup.
# These may be pinned versions such as "0.13.0" or branches such as "master".
# Each one will be updated in its own zigup invocation.
# (default: ["master"])
# target_versions = ["master", "0.13.0"]
# Specifies the directory that the zig files will be installed to.
# If defined, passed with the --install-dir command line flag.
# If not defined, zigup will use its default behaviour.
# (default: not defined)
# install_dir = "~/.zig"
# Specifies the path of the symlink which will be set to point at the default compiler version.
# If defined, passed with the --path-link command line flag.
# If not defined, zigup will use its default behaviour.
# This is not meaningful if set_default is not enabled.
# (default: not defined)
# path_link = "~/.bin/zig"
# If enabled, run `zigup clean` after updating all versions.
# If enabled, each updated version above will be marked with `zigup keep`.
# (default: false)
# cleanup = false
[vscode]
# If this is set and is a non-empty string, it specifies the profile the
# extensions should be updated for.
# (default: this won't be set by default)
# profile = ""
[pixi]
# Show the release notes of the latest pixi release
# during the pixi step
# (default: false)
# include_release_notes = false

View file

@ -0,0 +1,138 @@
local wezterm = require("wezterm")
local config = wezterm.config_builder()
-- Font
config.font = wezterm.font("MapleMono NF", { weight = "Regular" })
config.font_size = 13.0
config.line_height = 1.15
-- Enable ligatures (Maple Mono supports them natively)
config.harfbuzz_features = { "calt=1", "liga=1", "clig=1" }
-- Dark navy palette
local bg = "#0b0d1a"
local surface = "#0f1120"
local surface2 = "#141628"
local overlay = "#1a1d35"
local purple = "#c792ea"
local cyan = "#4ec9b0"
local green = "#99c794"
local pink = "#ec5f89"
local yellow = "#fac863"
local red = "#f97b58"
local text = "#cdd6f4"
local subtext = "#7f849c"
config.colors = {
foreground = text,
background = bg,
cursor_bg = purple,
cursor_fg = bg,
cursor_border = purple,
selection_fg = bg,
selection_bg = purple,
scrollbar_thumb = overlay,
split = overlay,
ansi = {
"#1a1b2e", -- black (surface)
red, -- red
green, -- green
yellow, -- yellow
"#82aaff", -- blue
purple, -- magenta
cyan, -- cyan
text, -- white
},
brights = {
subtext, -- bright black
"#ff6e6e", -- bright red
"#c3e88d", -- bright green
"#ffcb6b", -- bright yellow
"#9cc4ff", -- bright blue
"#d9a0ff", -- bright magenta
"#89ddff", -- bright cyan
"#ffffff", -- bright white
},
tab_bar = {
background = surface,
active_tab = {
bg_color = overlay,
fg_color = purple,
intensity = "Bold",
},
inactive_tab = {
bg_color = surface,
fg_color = subtext,
},
inactive_tab_hover = {
bg_color = surface2,
fg_color = text,
},
new_tab = {
bg_color = surface,
fg_color = subtext,
},
new_tab_hover = {
bg_color = surface2,
fg_color = text,
},
},
}
-- Window appearance
config.window_background_opacity = 1.0
config.text_background_opacity = 1.0
config.window_padding = {
left = 14, right = 14, top = 10, bottom = 10,
}
config.window_decorations = "NONE"
config.window_close_confirmation = "NeverPrompt"
-- Tab bar (minimal, top)
config.enable_tab_bar = true
config.use_fancy_tab_bar = false
config.tab_bar_at_bottom = false
config.show_tab_index_in_tab_bar = false
config.hide_tab_bar_if_only_one_tab = true
config.tab_max_width = 32
-- Scrollback
config.scrollback_lines = 5000
-- Cursor
config.default_cursor_style = "BlinkingBar"
config.cursor_blink_rate = 500
-- Performance
config.max_fps = 120
config.animation_fps = 1
config.cursor_blink_ease_in = "Constant"
config.cursor_blink_ease_out = "Constant"
-- Misc
config.audible_bell = "Disabled"
config.check_for_updates = false
-- Key bindings (keep minimal, add a few useful ones)
config.keys = {
-- Split panes
{ key = "e", mods = "CTRL|SHIFT", action = wezterm.action.SplitHorizontal { domain = "CurrentPaneDomain" } },
{ key = "o", mods = "CTRL|SHIFT", action = wezterm.action.SplitVertical { domain = "CurrentPaneDomain" } },
-- Navigate panes
{ key = "h", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection("Left") },
{ key = "l", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection("Right") },
{ key = "k", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection("Up") },
{ key = "j", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection("Down") },
-- New tab
{ key = "t", mods = "CTRL|SHIFT", action = wezterm.action.SpawnTab("CurrentPaneDomain") },
-- Copy/paste
{ key = "c", mods = "CTRL|SHIFT", action = wezterm.action.CopyTo("Clipboard") },
{ key = "v", mods = "CTRL|SHIFT", action = wezterm.action.PasteFrom("Clipboard") },
}
return config

View file

@ -0,0 +1,4 @@
[screencast]
output_name=eDP-1
max_fps=30
chooser_type=none

View file

@ -0,0 +1,6 @@
[preferred]
default=wlr;gtk
org.freedesktop.impl.portal.ScreenCast=wlr
org.freedesktop.impl.portal.Screenshot=wlr
org.freedesktop.impl.portal.Wallpaper=wlr
org.freedesktop.impl.portal.Settings=wlr

11
apps/.config/zed/keymap.json Executable file
View file

@ -0,0 +1,11 @@
[
{
"context": "Terminal",
"bindings": {
"shift-enter": [
"terminal::SendText",
"\u001b\r"
]
}
}
]

View file

@ -0,0 +1,21 @@
// Zed keymap
//
// For information on binding keys, see the Zed
// documentation: https://zed.dev/docs/key-bindings
//
// To see the default key bindings run `zed: open default keymap`
// from the command palette.
[
{
"context": "Workspace",
"bindings": {
// "shift shift": "file_finder::Toggle"
},
},
{
"context": "Editor && vim_mode == insert",
"bindings": {
// "j k": "vim::NormalBefore"
},
},
]

View file

@ -0,0 +1,105 @@
// Zed settings
//
// For information on how to configure Zed, see the Zed
// documentation: https://zed.dev/docs/configuring-zed
//
// To see all of Zed's default settings without changing your
// custom settings, run `zed: open default settings` from the
// command palette (cmd-shift-p / ctrl-shift-p)
{
"project_panel": {
"dock": "left"
},
"outline_panel": {
"dock": "left"
},
"collaboration_panel": {
"dock": "left"
},
"git_panel": {
"dock": "left"
},
"agent": {
"dock": "right",
"favorite_models": [
{
"provider": "copilot_chat",
"model": "claude-sonnet-4.6",
"enable_thinking": false
},
{
"provider": "copilot_chat",
"model": "gpt-5-mini",
"enable_thinking": false
},
{
"provider": "copilot_chat",
"model": "claude-opus-4.6",
"enable_thinking": false
},
{
"provider": "copilot_chat",
"model": "claude-opus-4.5",
"enable_thinking": false
},
{
"provider": "copilot_chat",
"model": "claude-sonnet-4.5",
"enable_thinking": false
}
],
"tool_permissions": {
"tools": {
"fetch": {
"always_allow": [
{
"pattern": "^https?://www\\.better\\-auth\\.com"
}
]
},
"terminal": {
"always_allow": [
{
"pattern": "^git\\s+show(\\s|$)"
},
{
"pattern": "^which\\s+psql(\\s|$)"
},
{
"pattern": "^ls\\b"
},
{
"pattern": "^which\\s+pg_ctl(\\s|$)"
},
{
"pattern": "^cat\\b"
},
{
"pattern": "^diff\\b"
}
]
}
}
},
"default_profile": "write",
"default_model": {
"effort": "high",
"enable_thinking": false,
"provider": "copilot_chat",
"model": "gpt-5-mini"
},
"model_parameters": []
},
"autosave": "on_focus_change",
"base_keymap": "VSCode",
"ui_font_size": 16,
"buffer_font_size": 16,
"theme": {
"mode": "dark",
"light": "One Light",
"dark": "Kleur Dark"
},
"auto_install_extensions": {
"wakatime": true
}
}

View file

@ -0,0 +1,74 @@
// Zed settings
//
// For information on how to configure Zed, see the Zed
// documentation: https://zed.dev/docs/configuring-zed
//
// To see all of Zed's default settings without changing your
// custom settings, run `zed: open default settings` from the
// command palette (cmd-shift-p / ctrl-shift-p)
{
"icon_theme": "JetBrains New UI Icons (Dark)",
"edit_predictions": {
"mode": "subtle",
"copilot": {
"enable_next_edit_suggestions": true
},
"provider": "copilot",
"disabled_globs": [],
},
"agent": {
"favorite_models": [
{
"provider": "copilot_chat",
"model": "claude-opus-4.6"
},
{
"provider": "copilot_chat",
"model": "gpt-5-mini"
},
{
"provider": "copilot_chat",
"model": "gpt-5.2"
},
{
"provider": "copilot_chat",
"model": "gpt-5.3-codex"
}
],
"always_allow_tool_actions": true,
"default_profile": "ask",
"default_model": {
"provider": "copilot_chat",
"model": "gpt-5-mini",
},
"model_parameters": [],
},
"autosave": "on_focus_change",
"base_keymap": "VSCode",
"ui_font_size": 16,
"buffer_font_size": 16,
"theme": {
"mode": "dark",
"light": "One Light",
"dark": "Kleur Dark",
},
"calls": {
"mute_on_join": true
},
"languages": {
"Ruby": {
"formatter": {
"external": {
"command": "rubocop",
"arguments": ["--fix", "--stdin", "ignored", "--stderr"]
}
},
"format_on_save": "on"
}
}
}
"format_on_save": "on",
"formatter": "prettier",
}

View file

@ -0,0 +1,847 @@
{
"$schema": "https://zed.dev/schema/themes/v0.2.0.json",
"name": "Kleur",
"author": "Kleur Contributors",
"themes": [
{
"name": "Kleur Dark",
"appearance": "dark",
"style": {
"background.appearance": "opaque",
"accents": [
"#bcb0ff",
"#27c7ff",
"#00cec5",
"#06d46e",
"#f8aa14",
"#ffa192"
],
"border": "#00000000",
"border.variant": "#00000000",
"border.focused": "#bcb0ff",
"border.selected": "#00000000",
"border.transparent": "#00000000",
"border.disabled": "#00000000",
"elevated_surface.background": "#14112d",
"surface.background": "#0c0823",
"background": "#080715",
"element.background": "#827ace",
"element.active": "#bcb0ff40",
"element.hover": "#827ace60",
"element.selected": "#5e5895",
"element.disabled": "#a2a1a8",
"drop_target.background": "#a2a1a866",
"ghost_element.background": "#00000000",
"ghost_element.hover": "#827ace40",
"ghost_element.active": "#bcb0ff40",
"ghost_element.selected": "#bcb0ff60",
"ghost_element.disabled": "#14112d",
"text": "#ebebed",
"text.accent": "#bcb0ff",
"text.muted": "#cfced2",
"text.placeholder": "#bab9be",
"text.disabled": "#bab9be",
"icon": "#ebebed",
"icon.accent": "#bcb0ff",
"icon.muted": "#cfced2",
"icon.disabled": "#bab9be",
"icon.placeholder": "#cfced2",
"status_bar.background": "#0c0823",
"title_bar.background": "#0c0823",
"title_bar.inactive_background": "#080715",
"toolbar.background": "#0c0823",
"tab_bar.background": "#0c0823",
"tab.inactive_background": "#080715",
"tab.active_background": "#14112d",
"search.match_background": "#bcb0ff66",
"panel.background": "#0c0823",
"panel.focused_border": null,
"pane.focused_border": null,
"scrollbar.thumb.background": "#14112d33",
"scrollbar.thumb.hover_background": "#14112d77",
"scrollbar.thumb.border": "#14112d33",
"scrollbar.track.background": "#0c0823",
"scrollbar.track.border": "#00000000",
"editor.foreground": "#ebebed",
"editor.background": "#080715",
"editor.gutter.background": "#080715",
"editor.subheader.background": "#0c0823",
"editor.active_line.background": "#0c0823",
"editor.highlighted_line.background": "#0c0823",
"editor.line_number": "#cfced2",
"editor.active_line_number": "#ebebed",
"editor.hover_line_number": "#dfdee1",
"editor.invisible": "#bab9be",
"editor.wrap_guide": "#00000000",
"editor.active_wrap_guide": "#00000000",
"editor.document_highlight.read_background": "#bcb0ff1a",
"editor.document_highlight.write_background": "#cfced266",
"terminal.background": "#080715",
"terminal.foreground": "#ebebed",
"terminal.bright_foreground": "#ebebed",
"terminal.dim_foreground": "#080715",
"terminal.ansi.black": "#080715",
"terminal.ansi.dim_black": "#ebebed",
"terminal.ansi.bright_black": "#0c0823",
"terminal.ansi.red": "#ffa192",
"terminal.ansi.dim_red": "#e94740",
"terminal.ansi.bright_red": "#ffbfb3",
"terminal.ansi.green": "#06d46e",
"terminal.ansi.dim_green": "#009749",
"terminal.ansi.bright_green": "#4be986",
"terminal.ansi.yellow": "#f8aa14",
"terminal.ansi.dim_yellow": "#b47700",
"terminal.ansi.bright_yellow": "#ffc554",
"terminal.ansi.blue": "#27c7ff",
"terminal.ansi.dim_blue": "#008cbf",
"terminal.ansi.bright_blue": "#70dcff",
"terminal.ansi.magenta": "#bcb0ff",
"terminal.ansi.dim_magenta": "#827ace",
"terminal.ansi.bright_magenta": "#d3c7ff",
"terminal.ansi.cyan": "#00cec5",
"terminal.ansi.dim_cyan": "#00928b",
"terminal.ansi.bright_cyan": "#30e4da",
"terminal.ansi.white": "#ebebed",
"terminal.ansi.dim_white": "#cfced2",
"terminal.ansi.bright_white": "#bcb0ff",
"link_text.hover": "#00cec5",
"version_control.added": "#06d46e",
"version_control.modified": "#f8aa14",
"version_control.deleted": "#ffa192",
"version_control.word_added": "#06d46e59",
"version_control.word_deleted": "#ffa192cc",
"version_control.conflict_marker.ours": "#06d46e1a",
"version_control.conflict_marker.theirs": "#27c7ff1a",
"conflict": "#f8aa14",
"conflict.background": "#f8aa141a",
"conflict.border": "#b47700",
"created": "#06d46e",
"created.background": "#06d46e1a",
"created.border": "#009749",
"deleted": "#ffa192",
"deleted.background": "#ffa1921a",
"deleted.border": "#e94740",
"error": "#ffa192",
"error.background": "#ffa1921a",
"error.border": "#e94740",
"hidden": "#cfced2",
"hidden.background": "#cfced21a",
"hidden.border": "#bab9be",
"hint": "#cfced2",
"hint.background": "#14112d",
"hint.border": "#5e5895",
"ignored": "#cfced2",
"ignored.background": "#cfced21a",
"ignored.border": "#bab9be",
"info": "#27c7ff",
"info.background": "#27c7ff1a",
"info.border": "#008cbf",
"modified": "#f8aa14",
"modified.background": "#f8aa141a",
"modified.border": "#b47700",
"predictive": "#dfdee1",
"predictive.background": "#dfdee11a",
"predictive.border": "#cfced2",
"renamed": "#27c7ff",
"renamed.background": "#27c7ff1a",
"renamed.border": "#008cbf",
"success": "#06d46e",
"success.background": "#06d46e1a",
"success.border": "#009749",
"unreachable": "#cfced2",
"unreachable.background": "#cfced21a",
"unreachable.border": "#bab9be",
"warning": "#f8aa14",
"warning.background": "#f8aa141a",
"warning.border": "#b47700",
"players": [
{
"cursor": "#bcb0ffff",
"background": "#bcb0ffff",
"selection": "#bcb0ff3d"
},
{
"cursor": "#27c7ffff",
"background": "#27c7ffff",
"selection": "#27c7ff3d"
},
{
"cursor": "#06d46eff",
"background": "#06d46eff",
"selection": "#06d46e3d"
},
{
"cursor": "#bcb0ffff",
"background": "#bcb0ffff",
"selection": "#bcb0ff3d"
},
{
"cursor": "#f8aa14ff",
"background": "#f8aa14ff",
"selection": "#f8aa143d"
},
{
"cursor": "#00cec5ff",
"background": "#00cec5ff",
"selection": "#00cec53d"
},
{
"cursor": "#ffa192ff",
"background": "#ffa192ff",
"selection": "#ffa1923d"
},
{
"cursor": "#27c7ffff",
"background": "#27c7ffff",
"selection": "#27c7ff3d"
}
],
"syntax": {
"namespace": {
"color": "#06d46e"
},
"class": {
"color": "#27c7ff"
},
"class.abstract": {
"color": "#f8aa14"
},
"enum": {
"color": "#06d46e"
},
"interface": {
"color": "#f8aa14"
},
"struct": {
"color": "#27c7ff"
},
"typeParameter": {
"color": "#06d46e"
},
"type": {
"color": "#27c7ff"
},
"parameter": {
"color": "#bcb0ff"
},
"variable": {
"color": "#bcb0ff"
},
"variable.builtin": {
"color": "#06d46e"
},
"property": {
"color": "#bcb0ff"
},
"enumMember": {
"color": "#06d46e"
},
"decorator": {
"color": "#27c7ff"
},
"event": {
"color": "#27c7ff"
},
"punct": {
"color": "#ffa192"
},
"punctuation": {
"color": "#ffa192"
},
"punctuation.bracket": {
"color": "#bcb0ff"
},
"punctuation.delimiter": {
"color": "#bcb0ff"
},
"punctuation.list-marker": {
"color": "#bcb0ff"
},
"punctuation.markup": {
"color": "#bcb0ff"
},
"punctuation.special": {
"color": "#27c7ff"
},
"escapeSequence": {
"color": "#ffa192"
},
"function": {
"color": "#27c7ff",
"font_style": "italic"
},
"method": {
"color": "#27c7ff",
"font_style": "italic"
},
"macro": {
"color": "#27c7ff"
},
"label": {
"color": "#dfdee1"
},
"comment": {
"color": "#a2a1a8",
"font_style": "italic"
},
"comment.doc": {
"color": "#bab9be",
"font_style": "italic"
},
"constructor": {
"color": "#27c7ff"
},
"embedded": {
"color": "#ebebed"
},
"string": { "color": "#06d46e" },
"string.escape": {
"color": "#cfced2"
},
"string.special": {
"color": "#f8aa14"
},
"string.special.symbol": {
"color": "#f8aa14"
},
"keyword": {
"color": "#bcb0ff",
"font_style": "italic"
},
"keyword.control": {
"color": "#bcb0ff",
"font_style": "italic"
},
"number": {
"color": "#f8aa14"
},
"string.regex": {
"color": "#f8aa14"
},
"boolean": {
"color": "#f8aa14"
},
"bool": {
"color": "#f8aa14"
},
"const": {
"color": "#f8aa14"
},
"constant": {
"color": "#f8aa14"
},
"operator": {
"color": "#bcb0ff"
},
"tag": {
"color": "#bcb0ff"
},
"attribute": {
"color": "#27c7ff"
},
"link_uri": {
"color": "#00cec5"
},
"preproc": {
"color": "#ebebed"
},
"primary": {
"color": "#ebebed"
},
"predictive": {
"color": "#dfdee1",
"font_style": "italic"
},
"selector": {
"color": "#06d46e"
},
"selector.pseudo": {
"color": "#27c7ff"
},
"text.literal": {
"color": "#06d46e"
},
"title": {
"color": "#ffa192",
"font_weight": 400
},
"variable.special": {
"color": "#f8aa14"
},
"variant": {
"color": "#27c7ff"
},
"function.declaration": {
"color": "#bcb0ff",
"font_weight": 700
},
"enum.declaration": {
"color": "#06d46e",
"font_weight": 700
},
"class.declaration": {
"color": "#27c7ff",
"font_weight": 700
},
"method.declaration": {
"color": "#27c7ff",
"font_weight": 700
},
"trait.declaration": {
"color": "#f8aa14",
"font_weight": 700
},
"struct.declaration": {
"color": "#27c7ff",
"font_weight": 700
},
"function.async": {
"color": "#f8aa14"
},
"unresolvedReference": {
"color": "#ffa192"
},
"namespace.defaultLibrary": {
"color": "#06d46e"
},
"variable.defaultLibrary": {
"color": "#06d46e"
},
"namespace.builtin": {
"color": "#06d46e"
},
"emphasis": {
"color": "#bcb0ff",
"font_style": "italic"
},
"emphasis.strong": {
"color": "#bcb0ff",
"font_style": "italic",
"font_weight": 700
}
}
}
}
,
{
"name": "Kleur Light",
"appearance": "light",
"style": {
"background.appearance": "opaque",
"accents": [
"#433e68",
"#0f4860",
"#104b47",
"#0f4d28",
"#5c3d06",
"#7b1e1b"
],
"border": "#00000000",
"border.variant": "#00000000",
"border.focused": "#433e68",
"border.selected": "#00000000",
"border.transparent": "#00000000",
"border.disabled": "#00000000",
"elevated_surface.background": "#ecedfc",
"surface.background": "#f0f0ff",
"background": "#f0f0ff",
"element.background": "#b1a5ff",
"element.active": "#433e6840",
"element.hover": "#b1a5ff60",
"element.selected": "#d3c7ff",
"element.disabled": "#93939b",
"drop_target.background": "#93939b66",
"ghost_element.background": "#00000000",
"ghost_element.hover": "#b1a5ff40",
"ghost_element.active": "#433e6840",
"ghost_element.selected": "#433e6860",
"ghost_element.disabled": "#ecedfc",
"text": "#2c2c2e",
"text.accent": "#433e68",
"text.muted": "#5c5c61",
"text.placeholder": "#77777d",
"text.disabled": "#77777d",
"icon": "#2c2c2e",
"icon.accent": "#433e68",
"icon.muted": "#5c5c61",
"icon.disabled": "#77777d",
"icon.placeholder": "#5c5c61",
"status_bar.background": "#f0f0ff",
"title_bar.background": "#f0f0ff",
"title_bar.inactive_background": "#f0f0ff",
"toolbar.background": "#f0f0ff",
"tab_bar.background": "#f0f0ff",
"tab.inactive_background": "#f0f0ff",
"tab.active_background": "#ecedfc",
"search.match_background": "#433e6866",
"panel.background": "#f0f0ff",
"panel.focused_border": null,
"pane.focused_border": null,
"scrollbar.thumb.background": "#ecedfc33",
"scrollbar.thumb.hover_background": "#ecedfc77",
"scrollbar.thumb.border": "#ecedfc33",
"scrollbar.track.background": "#f0f0ff",
"scrollbar.track.border": "#00000000",
"editor.foreground": "#2c2c2e",
"editor.background": "#f0f0ff",
"editor.gutter.background": "#f0f0ff",
"editor.subheader.background": "#f0f0ff",
"editor.active_line.background": "#f0f0ff",
"editor.highlighted_line.background": "#f0f0ff",
"editor.line_number": "#5c5c61",
"editor.active_line_number": "#2c2c2e",
"editor.hover_line_number": "#434346",
"editor.invisible": "#77777d",
"editor.wrap_guide": "#00000000",
"editor.active_wrap_guide": "#00000000",
"editor.document_highlight.read_background": "#433e681a",
"editor.document_highlight.write_background": "#5c5c6166",
"terminal.background": "#f0f0ff",
"terminal.foreground": "#2c2c2e",
"terminal.bright_foreground": "#2c2c2e",
"terminal.dim_foreground": "#f0f0ff",
"terminal.ansi.black": "#f0f0ff",
"terminal.ansi.dim_black": "#2c2c2e",
"terminal.ansi.bright_black": "#f0f0ff",
"terminal.ansi.red": "#7b1e1b",
"terminal.ansi.dim_red": "#ff9181",
"terminal.ansi.bright_red": "#a92624",
"terminal.ansi.green": "#0f4d28",
"terminal.ansi.dim_green": "#00c965",
"terminal.ansi.bright_green": "#046934",
"terminal.ansi.yellow": "#5c3d06",
"terminal.ansi.dim_yellow": "#eda000",
"terminal.ansi.bright_yellow": "#7e5300",
"terminal.ansi.blue": "#0f4860",
"terminal.ansi.dim_blue": "#00bcfb",
"terminal.ansi.bright_blue": "#006285",
"terminal.ansi.magenta": "#433e68",
"terminal.ansi.dim_magenta": "#b1a5ff",
"terminal.ansi.bright_magenta": "#5c5590",
"terminal.ansi.cyan": "#104b47",
"terminal.ansi.dim_cyan": "#00c3ba",
"terminal.ansi.bright_cyan": "#036661",
"terminal.ansi.white": "#2c2c2e",
"terminal.ansi.dim_white": "#5c5c61",
"terminal.ansi.bright_white": "#433e68",
"link_text.hover": "#104b47",
"version_control.added": "#0f4d28",
"version_control.modified": "#5c3d06",
"version_control.deleted": "#7b1e1b",
"version_control.word_added": "#0f4d2859",
"version_control.word_deleted": "#7b1e1bcc",
"version_control.conflict_marker.ours": "#0f4d281a",
"version_control.conflict_marker.theirs": "#0f48601a",
"conflict": "#5c3d06",
"conflict.background": "#5c3d061a",
"conflict.border": "#eda000",
"created": "#0f4d28",
"created.background": "#0f4d281a",
"created.border": "#00c965",
"deleted": "#7b1e1b",
"deleted.background": "#7b1e1b1a",
"deleted.border": "#ff9181",
"error": "#7b1e1b",
"error.background": "#7b1e1b1a",
"error.border": "#ff9181",
"hidden": "#5c5c61",
"hidden.background": "#5c5c611a",
"hidden.border": "#77777d",
"hint": "#5c5c61",
"hint.background": "#ecedfc",
"hint.border": "#d3c7ff",
"ignored": "#5c5c61",
"ignored.background": "#5c5c611a",
"ignored.border": "#77777d",
"info": "#0f4860",
"info.background": "#0f48601a",
"info.border": "#00bcfb",
"modified": "#5c3d06",
"modified.background": "#5c3d061a",
"modified.border": "#eda000",
"predictive": "#434346",
"predictive.background": "#4343461a",
"predictive.border": "#5c5c61",
"renamed": "#0f4860",
"renamed.background": "#0f48601a",
"renamed.border": "#00bcfb",
"success": "#0f4d28",
"success.background": "#0f4d281a",
"success.border": "#00c965",
"unreachable": "#5c5c61",
"unreachable.background": "#5c5c611a",
"unreachable.border": "#77777d",
"warning": "#5c3d06",
"warning.background": "#5c3d061a",
"warning.border": "#eda000",
"players": [
{
"cursor": "#433e68ff",
"background": "#433e68ff",
"selection": "#433e683d"
},
{
"cursor": "#0f4860ff",
"background": "#0f4860ff",
"selection": "#0f48603d"
},
{
"cursor": "#0f4d28ff",
"background": "#0f4d28ff",
"selection": "#0f4d283d"
},
{
"cursor": "#433e68ff",
"background": "#433e68ff",
"selection": "#433e683d"
},
{
"cursor": "#5c3d06ff",
"background": "#5c3d06ff",
"selection": "#5c3d063d"
},
{
"cursor": "#104b47ff",
"background": "#104b47ff",
"selection": "#104b473d"
},
{
"cursor": "#7b1e1bff",
"background": "#7b1e1bff",
"selection": "#7b1e1b3d"
},
{
"cursor": "#0f4860ff",
"background": "#0f4860ff",
"selection": "#0f48603d"
}
],
"syntax": {
"namespace": {
"color": "#0f4d28"
},
"class": {
"color": "#0f4860"
},
"class.abstract": {
"color": "#5c3d06"
},
"enum": {
"color": "#0f4d28"
},
"interface": {
"color": "#5c3d06"
},
"struct": {
"color": "#0f4860"
},
"typeParameter": {
"color": "#0f4d28"
},
"type": {
"color": "#0f4860"
},
"parameter": {
"color": "#433e68"
},
"variable": {
"color": "#433e68"
},
"variable.builtin": {
"color": "#0f4d28"
},
"property": {
"color": "#433e68"
},
"enumMember": {
"color": "#0f4d28"
},
"decorator": {
"color": "#0f4860"
},
"event": {
"color": "#0f4860"
},
"punct": {
"color": "#7b1e1b"
},
"punctuation": {
"color": "#7b1e1b"
},
"punctuation.bracket": {
"color": "#433e68"
},
"punctuation.delimiter": {
"color": "#433e68"
},
"punctuation.list-marker": {
"color": "#433e68"
},
"punctuation.markup": {
"color": "#433e68"
},
"punctuation.special": {
"color": "#0f4860"
},
"escapeSequence": {
"color": "#7b1e1b"
},
"function": {
"color": "#0f4860",
"font_style": "italic"
},
"method": {
"color": "#0f4860",
"font_style": "italic"
},
"macro": {
"color": "#0f4860"
},
"label": {
"color": "#434346"
},
"comment": {
"color": "#93939b",
"font_style": "italic"
},
"comment.doc": {
"color": "#77777d",
"font_style": "italic"
},
"constructor": {
"color": "#0f4860"
},
"embedded": {
"color": "#2c2c2e"
},
"string": { "color": "#0f4d28" },
"string.escape": {
"color": "#5c5c61"
},
"string.special": {
"color": "#5c3d06"
},
"string.special.symbol": {
"color": "#5c3d06"
},
"keyword": {
"color": "#433e68",
"font_style": "italic"
},
"keyword.control": {
"color": "#433e68",
"font_style": "italic"
},
"number": {
"color": "#5c3d06"
},
"string.regex": {
"color": "#5c3d06"
},
"boolean": {
"color": "#5c3d06"
},
"bool": {
"color": "#5c3d06"
},
"const": {
"color": "#5c3d06"
},
"constant": {
"color": "#5c3d06"
},
"operator": {
"color": "#433e68"
},
"tag": {
"color": "#433e68"
},
"attribute": {
"color": "#0f4860"
},
"link_uri": {
"color": "#104b47"
},
"preproc": {
"color": "#2c2c2e"
},
"primary": {
"color": "#2c2c2e"
},
"predictive": {
"color": "#434346",
"font_style": "italic"
},
"selector": {
"color": "#0f4d28"
},
"selector.pseudo": {
"color": "#0f4860"
},
"text.literal": {
"color": "#0f4d28"
},
"title": {
"color": "#7b1e1b",
"font_weight": 400
},
"variable.special": {
"color": "#5c3d06"
},
"variant": {
"color": "#0f4860"
},
"function.declaration": {
"color": "#433e68",
"font_weight": 700
},
"enum.declaration": {
"color": "#0f4d28",
"font_weight": 700
},
"class.declaration": {
"color": "#0f4860",
"font_weight": 700
},
"method.declaration": {
"color": "#0f4860",
"font_weight": 700
},
"trait.declaration": {
"color": "#5c3d06",
"font_weight": 700
},
"struct.declaration": {
"color": "#0f4860",
"font_weight": 700
},
"function.async": {
"color": "#5c3d06"
},
"unresolvedReference": {
"color": "#7b1e1b"
},
"namespace.defaultLibrary": {
"color": "#0f4d28"
},
"variable.defaultLibrary": {
"color": "#0f4d28"
},
"namespace.builtin": {
"color": "#0f4d28"
},
"emphasis": {
"color": "#433e68",
"font_style": "italic"
},
"emphasis.strong": {
"color": "#433e68",
"font_style": "italic",
"font_weight": 700
}
}
}
}
]
}

29
apps/.local/bin/wallpaper Executable file
View file

@ -0,0 +1,29 @@
#!/usr/bin/env bash
# Usage: wallpaper ~/Pictures/wall.jpg
# wallpaper "#16161e" (solid color)
set -e
TARGET="${1:-}"
if [[ -z "$TARGET" ]]; then
echo "Usage: wallpaper <path-to-image|#rrggbb>"
exit 1
fi
STATE="$HOME/.config/wallpaper"
# Save for next login
echo "$TARGET" > "$STATE"
# Kill existing swaybg
pkill -x swaybg 2>/dev/null || true
sleep 0.1
# Apply
if [[ "$TARGET" == \#* ]]; then
swaybg -c "$TARGET" &
else
swaybg -i "$TARGET" -m fill &
fi
disown

13
apps/.local/bin/wallpaper-init Executable file
View file

@ -0,0 +1,13 @@
#!/usr/bin/env bash
STATE="$HOME/.config/wallpaper"
if [[ -f "$STATE" ]]; then
TARGET="$(cat "$STATE")"
if [[ "$TARGET" == \#* ]]; then
swaybg -c "$TARGET" &
else
swaybg -i "$TARGET" -m fill &
fi
else
swaybg -c "#16161e" &
fi
disown

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

View file

@ -0,0 +1,27 @@
# Fish syntax highlighting — Mariana×Purple palette
# Explicit hex values so terminal ANSI remapping doesn't break them
set -g fish_color_command 89DDFF # cyan — commands
set -g fish_color_builtin C3A6FF # purple — builtins
set -g fish_color_keyword C3A6FF # purple — keywords (if, for, etc.)
set -g fish_color_param D4D4D4 # text — args
set -g fish_color_option A6ACCD # subtext — flags (--foo)
set -g fish_color_quote BAE67E # green — strings
set -g fish_color_redirection FFD580 # yellow — > >> | etc.
set -g fish_color_end FFD580 # yellow — ; &
set -g fish_color_error F28779 # pink — errors / bad commands
set -g fish_color_comment 626880 # muted — # comments
set -g fish_color_operator C3A6FF # purple — operators
set -g fish_color_escape FFD580 # yellow — \n \t etc.
set -g fish_color_autosuggestion 4A4F6A # dim — ghost text
set -g fish_color_selection --background=3A3F5C # visual selection bg
set -g fish_color_search_match --background=3A3F5C
set -g fish_color_valid_path --underline
set -g fish_color_cancel F28779
# Pager (tab completion menu)
set -g fish_pager_color_prefix C3A6FF --bold --underline
set -g fish_pager_color_completion D4D4D4
set -g fish_pager_color_description A6ACCD
set -g fish_pager_color_progress A6ACCD --background=1E2030
set -g fish_pager_color_selected_background --background=3A3F5C

27
fish/.config/fish/config.fish Executable file
View file

@ -0,0 +1,27 @@
if status is-interactive
# Commands to run in interactive sessions can go here
starship init fish | source
end
fish_add_path /home/end/.spicetify
# pnpm
set -gx PNPM_HOME "/home/end/.local/share/pnpm"
if not string match -q -- $PNPM_HOME $PATH
set -gx PATH "$PNPM_HOME" $PATH
end
# pnpm end
# terminal-wakatime setup
set -gx PATH "$HOME/.wakatime" $PATH
terminal-wakatime init fish | source
status --is-interactive; and . (fnm env --use-on-cd | psub)
# opencode
fish_add_path /home/end/.opencode/bin
status --is-interactive; and rbenv init - fish | source
~/.local/bin/mise activate fish | source
alias packettracer="QT_QPA_PLATFORM=xcb /usr/lib/packettracer/packettracer.AppImage"

View file

@ -0,0 +1,7 @@
# This file contains fish universal variable definitions.
# VERSION: 3.0
SETUVAR __fish_initialized:4300
SETUVAR _fisher_jorgebucaran_2F_fisher_files:\x7e/\x2econfig/fish/functions/fisher\x2efish\x1e\x7e/\x2econfig/fish/completions/fisher\x2efish
SETUVAR _fisher_plugins:jorgebucaran/fisher
SETUVAR _fisher_upgraded_to_4_4:\x1d
SETUVAR fish_user_paths:/home/end/\x2elocal/bin\x1e/home/end/\x2eopencode/bin\x1e/home/end/\x2espicetify

15
mullvad-tailscale.service Normal file
View file

@ -0,0 +1,15 @@
[Unit]
Description=Mullvad + Tailscale coexistence rules
After=tailscaled.service
Wants=tailscaled.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/nft -f /home/end/Github/dotfiles/mullvad_tailscale.conf
ExecStart=/usr/sbin/ip route add 100.64.0.0/10 dev tailscale0 table main
ExecStop=/usr/sbin/nft delete table inet mullvad_tailscale
ExecStop=/usr/sbin/ip route del 100.64.0.0/10 dev tailscale0 table main
[Install]
WantedBy=multi-user.target

8
mullvad_tailscale.conf Normal file → Executable file
View file

@ -1,9 +1,15 @@
# Mullvad + Tailscale coexistence
# Apply with:
# sudo nft -f /home/end/Github/dotfiles/mullvad_tailscale.conf
# sudo ip route add 100.64.0.0/10 dev tailscale0 table main
# sudo systemctl restart tailscaled
table inet mullvad_tailscale {
chain output {
type route hook output priority 0; policy accept;
ip daddr 100.64.0.0/10 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
}
chain input {
chain input {
type filter hook input priority -100; policy accept;
ip saddr 100.64.0.0/10 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
}

View file

@ -1 +0,0 @@
/etc/nftables.conf

8
plasma/.config/QtProject.conf Executable file
View file

@ -0,0 +1,8 @@
[FileDialog]
history=file:///home/end/Downloads, file:///home/end, file:///home/end/Pictures/Screenshots
lastVisited=file:///home/end/Pictures/Screenshots
qtVersion=5.15.18
shortcuts=file:, file:///home/end
sidebarWidth=102
treeViewHeader=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x3\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2\x45\0\0\0\x4\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0}\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x4\0\0\x1\x32\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\0\x80\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\xff\xff\xff\xff)
viewMode=Detail

17
plasma/.config/Trolltech.conf Executable file
View file

@ -0,0 +1,17 @@
[qt]
GUIEffects=none
KDE\contrast=7
KWinPalette\activeBackground=#272c31
KWinPalette\activeBlend=#fcfcfc
KWinPalette\activeForeground=#fcfcfc
KWinPalette\activeTitleBtnBg=#202326
KWinPalette\frame=#202326
KWinPalette\inactiveBackground=#202428
KWinPalette\inactiveBlend=#a1a9b1
KWinPalette\inactiveForeground=#a1a9b1
KWinPalette\inactiveFrame=#202326
KWinPalette\inactiveTitleBtnBg=#202326
Palette\active=#fcfcfc, #292c30, #40464c, #33383c, #101112, #1c1e21, #fcfcfc, #ffffff, #fcfcfc, #141618, #202326, #0b0c0d, #6c53a6, #ffffff, #926ee4, #9b59b6, #1d1f22, #000000, #292c30, #fcfcfc, #a1a9b1, #6c53a6
Palette\disabled=#686a6c, #272a2e, #3f454b, #32363b, #0f1012, #1a1d1f, #606263, #ffffff, #6d6f72, #131517, #1f2124, #0b0c0d, #1f2124, #686a6c, #3d325b, #402b4c, #1c1e20, #000000, #292c30, #fcfcfc, #42464a, #1f2124
Palette\inactive=#fcfcfc, #292c30, #40464c, #33383c, #101112, #1c1e21, #fcfcfc, #ffffff, #fcfcfc, #141618, #202326, #0b0c0d, #362c50, #fcfcfc, #926ee4, #9b59b6, #1d1f22, #000000, #292c30, #fcfcfc, #a1a9b1, #362c50
font="Noto Sans,10,-1,0,400,0,0,0,0,0,0,0,0,0,0,1"

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#6d2229" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#272c31" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="5,5 13,13 " />
<polyline fill="none" vector-effect="none" points="13,5 5,13 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#6d2229" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#202428" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="5,5 13,13 " />
<polyline fill="none" vector-effect="none" points="13,5 5,13 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#da4453" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#202428" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="5,5 13,13 " />
<polyline fill="none" vector-effect="none" points="13,5 5,13 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="none" stroke="#a1a9b1" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="5,5 13,13 " />
<polyline fill="none" vector-effect="none" points="13,5 5,13 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#ff98a2" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#272c31" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="5,5 13,13 " />
<polyline fill="none" vector-effect="none" points="13,5 5,13 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="none" stroke="#fcfcfc" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="5,5 13,13 " />
<polyline fill="none" vector-effect="none" points="13,5 5,13 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#676a6e" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#272c31" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,11 9,6 14,11 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#474c51" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#202428" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,11 9,6 14,11 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#a1a9b1" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#202428" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,11 9,6 14,11 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="none" stroke="#a1a9b1" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,11 9,6 14,11 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 970 B

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#fcfcfc" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#272c31" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,11 9,6 14,11 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="none" stroke="#fcfcfc" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,11 9,6 14,11 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 970 B

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#676a6e" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#272c31" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="round" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<path vector-effect="none" fill-rule="evenodd" d="M4,9 L9,4 L14,9 L9,14 L4,9"/>
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#474c51" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#202428" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="round" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<path vector-effect="none" fill-rule="evenodd" d="M4,9 L9,4 L14,9 L9,14 L4,9"/>
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#a1a9b1" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#202428" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="round" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<path vector-effect="none" fill-rule="evenodd" d="M4,9 L9,4 L14,9 L9,14 L4,9"/>
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="none" stroke="#a1a9b1" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="round" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<path vector-effect="none" fill-rule="evenodd" d="M4,9 L9,4 L14,9 L9,14 L4,9"/>
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 957 B

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#fcfcfc" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#272c31" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="round" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<path vector-effect="none" fill-rule="evenodd" d="M4,9 L9,4 L14,9 L9,14 L4,9"/>
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="none" stroke="#fcfcfc" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="round" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<path vector-effect="none" fill-rule="evenodd" d="M4,9 L9,4 L14,9 L9,14 L4,9"/>
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 957 B

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#676a6e" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#272c31" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,7 9,12 14,7 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#474c51" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#202428" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,7 9,12 14,7 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#a1a9b1" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#202428" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,7 9,12 14,7 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="none" stroke="#a1a9b1" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,7 9,12 14,7 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 969 B

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#fcfcfc" fill-opacity="1" stroke="none" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<circle cx="9" cy="9" r="9"/>
</g>
<g fill="none" stroke="#272c31" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,7 9,12 14,7 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg viewBox="0 0 50 50"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="none" stroke="#fcfcfc" stroke-opacity="1" stroke-width="1.01" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="2" transform="matrix(2.5,0,0,2.5,2.5,2.5)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
<polyline fill="none" vector-effect="none" points="4,7 9,12 14,7 " />
</g>
<g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="Noto Sans" font-size="10" font-weight="400" font-style="normal"
>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 969 B

View file

@ -0,0 +1,84 @@
@define-color borders_breeze #57595c;
@define-color content_view_bg_breeze #141618;
@define-color error_color_backdrop_breeze #da4453;
@define-color error_color_breeze #da4453;
@define-color error_color_insensitive_backdrop_breeze #55242b;
@define-color error_color_insensitive_breeze #55242b;
@define-color insensitive_base_color_breeze #131517;
@define-color insensitive_base_fg_color_breeze #606263;
@define-color insensitive_bg_color_breeze #1f2124;
@define-color insensitive_borders_breeze #313336;
@define-color insensitive_fg_color_breeze #686a6c;
@define-color insensitive_selected_bg_color_breeze #1f2124;
@define-color insensitive_selected_fg_color_breeze #686a6c;
@define-color insensitive_unfocused_bg_color_breeze #1f2124;
@define-color insensitive_unfocused_fg_color_breeze #686a6c;
@define-color insensitive_unfocused_selected_bg_color_breeze #1f2124;
@define-color insensitive_unfocused_selected_fg_color_breeze #686a6c;
@define-color link_color_breeze #926ee4;
@define-color link_visited_color_breeze #9b59b6;
@define-color success_color_backdrop_breeze #27ae60;
@define-color success_color_breeze #27ae60;
@define-color success_color_insensitive_backdrop_breeze #19482f;
@define-color success_color_insensitive_breeze #19482f;
@define-color theme_base_color_breeze #141618;
@define-color theme_bg_color_breeze #202326;
@define-color theme_button_background_backdrop_breeze #292c30;
@define-color theme_button_background_backdrop_insensitive_breeze #272a2e;
@define-color theme_button_background_insensitive_breeze #272a2e;
@define-color theme_button_background_normal_breeze #292c30;
@define-color theme_button_decoration_focus_backdrop_breeze #926ee4;
@define-color theme_button_decoration_focus_backdrop_insensitive_breeze #4a406a;
@define-color theme_button_decoration_focus_breeze #926ee4;
@define-color theme_button_decoration_focus_insensitive_breeze #4a406a;
@define-color theme_button_decoration_hover_backdrop_breeze #926ee4;
@define-color theme_button_decoration_hover_backdrop_insensitive_breeze #4a406a;
@define-color theme_button_decoration_hover_breeze #926ee4;
@define-color theme_button_decoration_hover_insensitive_breeze #4a406a;
@define-color theme_button_foreground_active_backdrop_breeze #fcfcfc;
@define-color theme_button_foreground_active_backdrop_insensitive_breeze #686a6c;
@define-color theme_button_foreground_active_breeze #ffffff;
@define-color theme_button_foreground_active_insensitive_breeze #686a6c;
@define-color theme_button_foreground_backdrop_breeze #fcfcfc;
@define-color theme_button_foreground_backdrop_insensitive_breeze #6d6f72;
@define-color theme_button_foreground_insensitive_breeze #6d6f72;
@define-color theme_button_foreground_normal_breeze #fcfcfc;
@define-color theme_fg_color_breeze #fcfcfc;
@define-color theme_header_background_backdrop_breeze #202326;
@define-color theme_header_background_breeze #292c30;
@define-color theme_header_background_light_breeze #202326;
@define-color theme_header_foreground_backdrop_breeze #fcfcfc;
@define-color theme_header_foreground_breeze #fcfcfc;
@define-color theme_header_foreground_insensitive_backdrop_breeze #fcfcfc;
@define-color theme_header_foreground_insensitive_breeze #fcfcfc;
@define-color theme_hovering_selected_bg_color_breeze #926ee4;
@define-color theme_selected_bg_color_breeze #6c53a6;
@define-color theme_selected_fg_color_breeze #ffffff;
@define-color theme_text_color_breeze #fcfcfc;
@define-color theme_titlebar_background_backdrop_breeze #202326;
@define-color theme_titlebar_background_breeze #292c30;
@define-color theme_titlebar_background_light_breeze #202326;
@define-color theme_titlebar_foreground_backdrop_breeze #fcfcfc;
@define-color theme_titlebar_foreground_breeze #fcfcfc;
@define-color theme_titlebar_foreground_insensitive_backdrop_breeze #fcfcfc;
@define-color theme_titlebar_foreground_insensitive_breeze #fcfcfc;
@define-color theme_unfocused_base_color_breeze #141618;
@define-color theme_unfocused_bg_color_breeze #202326;
@define-color theme_unfocused_fg_color_breeze #fcfcfc;
@define-color theme_unfocused_selected_bg_color_alt_breeze #362c50;
@define-color theme_unfocused_selected_bg_color_breeze #362c50;
@define-color theme_unfocused_selected_fg_color_breeze #fcfcfc;
@define-color theme_unfocused_text_color_breeze #fcfcfc;
@define-color theme_unfocused_view_bg_color_breeze #131517;
@define-color theme_unfocused_view_text_color_breeze #606263;
@define-color theme_view_active_decoration_color_breeze #926ee4;
@define-color theme_view_hover_decoration_color_breeze #926ee4;
@define-color tooltip_background_breeze #292c30;
@define-color tooltip_border_breeze #5e6063;
@define-color tooltip_text_breeze #fcfcfc;
@define-color unfocused_borders_breeze #57595c;
@define-color unfocused_insensitive_borders_breeze #313336;
@define-color warning_color_backdrop_breeze #f67400;
@define-color warning_color_breeze #f67400;
@define-color warning_color_insensitive_backdrop_breeze #5e340f;
@define-color warning_color_insensitive_breeze #5e340f;

1
plasma/.config/gtk-3.0/gtk.css Executable file
View file

@ -0,0 +1 @@
@import 'colors.css';

View file

@ -0,0 +1,18 @@
[Settings]
gtk-application-prefer-dark-theme=true
gtk-button-images=true
gtk-cursor-blink=true
gtk-cursor-blink-time=1000
gtk-cursor-theme-name=breeze_cursors
gtk-cursor-theme-size=24
gtk-decoration-layout=icon:minimize,maximize,close
gtk-enable-animations=true
gtk-font-name=Noto Sans, 10
gtk-icon-theme-name=breeze-dark
gtk-menu-images=true
gtk-modules=colorreload-gtk-module:window-decorations-gtk-module
gtk-primary-button-warps-slider=true
gtk-sound-theme-name=ocean
gtk-theme-name=Breeze
gtk-toolbar-style=3
gtk-xft-dpi=98304

View file

@ -0,0 +1,71 @@
headerbar button.titlebutton.close, .titlebar button.titlebutton.close {
background-image: url("assets/close-normal.svg"); }
headerbar button.titlebutton.close:hover, .titlebar button.titlebutton.close:hover {
background-image: url("assets/close-hover.svg"); }
headerbar button.titlebutton.close:active, .titlebar button.titlebutton.close:active {
background-image: url("assets/close-active.svg"); }
headerbar button.titlebutton.close:backdrop, .titlebar button.titlebutton.close:backdrop {
background-image: url("assets/close-backdrop-normal.svg"); }
headerbar button.titlebutton.close:backdrop:hover, .titlebar button.titlebutton.close:backdrop:hover {
background-image: url("assets/close-backdrop-hover.svg"); }
headerbar button.titlebutton.close:backdrop:active, .titlebar button.titlebutton.close:backdrop:active {
background-image: url("assets/close-backdrop-active.svg"); }
headerbar button.titlebutton.maximize, .titlebar button.titlebutton.maximize {
background-image: url("assets/maximize-normal.svg"); }
headerbar button.titlebutton.maximize:hover, .titlebar button.titlebutton.maximize:hover {
background-image: url("assets/maximize-hover.svg"); }
headerbar button.titlebutton.maximize:active, .titlebar button.titlebutton.maximize:active {
background-image: url("assets/maximize-active.svg"); }
headerbar button.titlebutton.maximize:backdrop, .titlebar button.titlebutton.maximize:backdrop {
background-image: url("assets/maximize-backdrop-normal.svg"); }
headerbar button.titlebutton.maximize:backdrop:hover, .titlebar button.titlebutton.maximize:backdrop:hover {
background-image: url("assets/maximize-backdrop-hover.svg"); }
headerbar button.titlebutton.maximize:backdrop:active, .titlebar button.titlebutton.maximize:backdrop:active {
background-image: url("assets/maximize-backdrop-active.svg"); }
headerbar button.titlebutton.minimize, .titlebar button.titlebutton.minimize {
background-image: url("assets/minimize-normal.svg"); }
headerbar button.titlebutton.minimize:hover, .titlebar button.titlebutton.minimize:hover {
background-image: url("assets/minimize-hover.svg"); }
headerbar button.titlebutton.minimize:active, .titlebar button.titlebutton.minimize:active {
background-image: url("assets/minimize-active.svg"); }
headerbar button.titlebutton.minimize:backdrop, .titlebar button.titlebutton.minimize:backdrop {
background-image: url("assets/minimize-backdrop-normal.svg"); }
headerbar button.titlebutton.minimize:backdrop:hover, .titlebar button.titlebutton.minimize:backdrop:hover {
background-image: url("assets/minimize-backdrop-hover.svg"); }
headerbar button.titlebutton.minimize:backdrop:active, .titlebar button.titlebutton.minimize:backdrop:active {
background-image: url("assets/minimize-backdrop-active.svg"); }
.maximized headerbar button.titlebutton.maximize, .maximized .titlebar button.titlebutton.maximize {
background-image: url("assets/maximized-normal.svg"); }
.maximized headerbar button.titlebutton.maximize:hover, .maximized .titlebar button.titlebutton.maximize:hover {
background-image: url("assets/maximized-hover.svg"); }
.maximized headerbar button.titlebutton.maximize:active, .maximized .titlebar button.titlebutton.maximize:active {
background-image: url("assets/maximized-active.svg"); }
.maximized headerbar button.titlebutton.maximize:backdrop, .maximized .titlebar button.titlebutton.maximize:backdrop {
background-image: url("assets/maximized-backdrop-normal.svg"); }
.maximized headerbar button.titlebutton.maximize:backdrop:hover, .maximized .titlebar button.titlebutton.maximize:backdrop:hover {
background-image: url("assets/maximized-backdrop-hover.svg"); }
.maximized headerbar button.titlebutton.maximize:backdrop:active, .maximized .titlebar button.titlebutton.maximize:backdrop:active {
background-image: url("assets/maximized-backdrop-active.svg"); }

View file

@ -0,0 +1,84 @@
@define-color borders_breeze #57595c;
@define-color content_view_bg_breeze #141618;
@define-color error_color_backdrop_breeze #da4453;
@define-color error_color_breeze #da4453;
@define-color error_color_insensitive_backdrop_breeze #55242b;
@define-color error_color_insensitive_breeze #55242b;
@define-color insensitive_base_color_breeze #131517;
@define-color insensitive_base_fg_color_breeze #606263;
@define-color insensitive_bg_color_breeze #1f2124;
@define-color insensitive_borders_breeze #313336;
@define-color insensitive_fg_color_breeze #686a6c;
@define-color insensitive_selected_bg_color_breeze #1f2124;
@define-color insensitive_selected_fg_color_breeze #686a6c;
@define-color insensitive_unfocused_bg_color_breeze #1f2124;
@define-color insensitive_unfocused_fg_color_breeze #686a6c;
@define-color insensitive_unfocused_selected_bg_color_breeze #1f2124;
@define-color insensitive_unfocused_selected_fg_color_breeze #686a6c;
@define-color link_color_breeze #926ee4;
@define-color link_visited_color_breeze #9b59b6;
@define-color success_color_backdrop_breeze #27ae60;
@define-color success_color_breeze #27ae60;
@define-color success_color_insensitive_backdrop_breeze #19482f;
@define-color success_color_insensitive_breeze #19482f;
@define-color theme_base_color_breeze #141618;
@define-color theme_bg_color_breeze #202326;
@define-color theme_button_background_backdrop_breeze #292c30;
@define-color theme_button_background_backdrop_insensitive_breeze #272a2e;
@define-color theme_button_background_insensitive_breeze #272a2e;
@define-color theme_button_background_normal_breeze #292c30;
@define-color theme_button_decoration_focus_backdrop_breeze #926ee4;
@define-color theme_button_decoration_focus_backdrop_insensitive_breeze #4a406a;
@define-color theme_button_decoration_focus_breeze #926ee4;
@define-color theme_button_decoration_focus_insensitive_breeze #4a406a;
@define-color theme_button_decoration_hover_backdrop_breeze #926ee4;
@define-color theme_button_decoration_hover_backdrop_insensitive_breeze #4a406a;
@define-color theme_button_decoration_hover_breeze #926ee4;
@define-color theme_button_decoration_hover_insensitive_breeze #4a406a;
@define-color theme_button_foreground_active_backdrop_breeze #fcfcfc;
@define-color theme_button_foreground_active_backdrop_insensitive_breeze #686a6c;
@define-color theme_button_foreground_active_breeze #ffffff;
@define-color theme_button_foreground_active_insensitive_breeze #686a6c;
@define-color theme_button_foreground_backdrop_breeze #fcfcfc;
@define-color theme_button_foreground_backdrop_insensitive_breeze #6d6f72;
@define-color theme_button_foreground_insensitive_breeze #6d6f72;
@define-color theme_button_foreground_normal_breeze #fcfcfc;
@define-color theme_fg_color_breeze #fcfcfc;
@define-color theme_header_background_backdrop_breeze #202326;
@define-color theme_header_background_breeze #292c30;
@define-color theme_header_background_light_breeze #202326;
@define-color theme_header_foreground_backdrop_breeze #fcfcfc;
@define-color theme_header_foreground_breeze #fcfcfc;
@define-color theme_header_foreground_insensitive_backdrop_breeze #fcfcfc;
@define-color theme_header_foreground_insensitive_breeze #fcfcfc;
@define-color theme_hovering_selected_bg_color_breeze #926ee4;
@define-color theme_selected_bg_color_breeze #6c53a6;
@define-color theme_selected_fg_color_breeze #ffffff;
@define-color theme_text_color_breeze #fcfcfc;
@define-color theme_titlebar_background_backdrop_breeze #202326;
@define-color theme_titlebar_background_breeze #292c30;
@define-color theme_titlebar_background_light_breeze #202326;
@define-color theme_titlebar_foreground_backdrop_breeze #fcfcfc;
@define-color theme_titlebar_foreground_breeze #fcfcfc;
@define-color theme_titlebar_foreground_insensitive_backdrop_breeze #fcfcfc;
@define-color theme_titlebar_foreground_insensitive_breeze #fcfcfc;
@define-color theme_unfocused_base_color_breeze #141618;
@define-color theme_unfocused_bg_color_breeze #202326;
@define-color theme_unfocused_fg_color_breeze #fcfcfc;
@define-color theme_unfocused_selected_bg_color_alt_breeze #362c50;
@define-color theme_unfocused_selected_bg_color_breeze #362c50;
@define-color theme_unfocused_selected_fg_color_breeze #fcfcfc;
@define-color theme_unfocused_text_color_breeze #fcfcfc;
@define-color theme_unfocused_view_bg_color_breeze #131517;
@define-color theme_unfocused_view_text_color_breeze #606263;
@define-color theme_view_active_decoration_color_breeze #926ee4;
@define-color theme_view_hover_decoration_color_breeze #926ee4;
@define-color tooltip_background_breeze #292c30;
@define-color tooltip_border_breeze #5e6063;
@define-color tooltip_text_breeze #fcfcfc;
@define-color unfocused_borders_breeze #57595c;
@define-color unfocused_insensitive_borders_breeze #313336;
@define-color warning_color_backdrop_breeze #f67400;
@define-color warning_color_breeze #f67400;
@define-color warning_color_insensitive_backdrop_breeze #5e340f;
@define-color warning_color_insensitive_breeze #5e340f;

2
plasma/.config/gtk-4.0/gtk.css Executable file
View file

@ -0,0 +1,2 @@
@import 'colors.css';

View file

@ -0,0 +1,13 @@
[Settings]
gtk-application-prefer-dark-theme=true
gtk-cursor-blink=true
gtk-cursor-blink-time=1000
gtk-cursor-theme-name=breeze_cursors
gtk-cursor-theme-size=24
gtk-decoration-layout=icon:minimize,maximize,close
gtk-enable-animations=true
gtk-font-name=Noto Sans, 10
gtk-icon-theme-name=breeze-dark
gtk-primary-button-warps-slider=true
gtk-sound-theme-name=ocean
gtk-xft-dpi=98304

View file

@ -0,0 +1,71 @@
headerbar button.titlebutton.close, .titlebar button.titlebutton.close {
background-image: url("assets/close-normal.svg"); }
headerbar button.titlebutton.close:hover, .titlebar button.titlebutton.close:hover {
background-image: url("assets/close-hover.svg"); }
headerbar button.titlebutton.close:active, .titlebar button.titlebutton.close:active {
background-image: url("assets/close-active.svg"); }
headerbar button.titlebutton.close:backdrop, .titlebar button.titlebutton.close:backdrop {
background-image: url("assets/close-backdrop-normal.svg"); }
headerbar button.titlebutton.close:backdrop:hover, .titlebar button.titlebutton.close:backdrop:hover {
background-image: url("assets/close-backdrop-hover.svg"); }
headerbar button.titlebutton.close:backdrop:active, .titlebar button.titlebutton.close:backdrop:active {
background-image: url("assets/close-backdrop-active.svg"); }
headerbar button.titlebutton.maximize, .titlebar button.titlebutton.maximize {
background-image: url("assets/maximize-normal.svg"); }
headerbar button.titlebutton.maximize:hover, .titlebar button.titlebutton.maximize:hover {
background-image: url("assets/maximize-hover.svg"); }
headerbar button.titlebutton.maximize:active, .titlebar button.titlebutton.maximize:active {
background-image: url("assets/maximize-active.svg"); }
headerbar button.titlebutton.maximize:backdrop, .titlebar button.titlebutton.maximize:backdrop {
background-image: url("assets/maximize-backdrop-normal.svg"); }
headerbar button.titlebutton.maximize:backdrop:hover, .titlebar button.titlebutton.maximize:backdrop:hover {
background-image: url("assets/maximize-backdrop-hover.svg"); }
headerbar button.titlebutton.maximize:backdrop:active, .titlebar button.titlebutton.maximize:backdrop:active {
background-image: url("assets/maximize-backdrop-active.svg"); }
headerbar button.titlebutton.minimize, .titlebar button.titlebutton.minimize {
background-image: url("assets/minimize-normal.svg"); }
headerbar button.titlebutton.minimize:hover, .titlebar button.titlebutton.minimize:hover {
background-image: url("assets/minimize-hover.svg"); }
headerbar button.titlebutton.minimize:active, .titlebar button.titlebutton.minimize:active {
background-image: url("assets/minimize-active.svg"); }
headerbar button.titlebutton.minimize:backdrop, .titlebar button.titlebutton.minimize:backdrop {
background-image: url("assets/minimize-backdrop-normal.svg"); }
headerbar button.titlebutton.minimize:backdrop:hover, .titlebar button.titlebutton.minimize:backdrop:hover {
background-image: url("assets/minimize-backdrop-hover.svg"); }
headerbar button.titlebutton.minimize:backdrop:active, .titlebar button.titlebutton.minimize:backdrop:active {
background-image: url("assets/minimize-backdrop-active.svg"); }
.maximized headerbar button.titlebutton.maximize, .maximized .titlebar button.titlebutton.maximize {
background-image: url("assets/maximized-normal.svg"); }
.maximized headerbar button.titlebutton.maximize:hover, .maximized .titlebar button.titlebutton.maximize:hover {
background-image: url("assets/maximized-hover.svg"); }
.maximized headerbar button.titlebutton.maximize:active, .maximized .titlebar button.titlebutton.maximize:active {
background-image: url("assets/maximized-active.svg"); }
.maximized headerbar button.titlebutton.maximize:backdrop, .maximized .titlebar button.titlebutton.maximize:backdrop {
background-image: url("assets/maximized-backdrop-normal.svg"); }
.maximized headerbar button.titlebutton.maximize:backdrop:hover, .maximized .titlebar button.titlebutton.maximize:backdrop:hover {
background-image: url("assets/maximized-backdrop-hover.svg"); }
.maximized headerbar button.titlebutton.maximize:backdrop:active, .maximized .titlebar button.titlebutton.maximize:backdrop:active {
background-image: url("assets/maximized-backdrop-active.svg"); }

2
plasma/.config/gtkrc Executable file
View file

@ -0,0 +1,2 @@
# created by KDE Plasma, Wed Feb 4 22:16:45 2026
#

5
plasma/.config/gtkrc-2.0 Executable file
View file

@ -0,0 +1,5 @@
# created by KDE Plasma, Wed Feb 4 22:16:45 2026
#
gtk-alternative-button-order = 1

86
plasma/.config/kconf_updaterc Executable file
View file

@ -0,0 +1,86 @@
updateInfoAdded=true
[dolphin_detailsmodesettings.upd]
ctime=1770326744
done=rename-leading-padding,rename-side-padding,move-content-display
mtime=1770139556
[dolphin_replace_view_mode_with_view_settings_in_toolbar.upd]
ctime=1770326744
done=move-content-display,replace-view-mode-with-view-settings-in-toolbar
mtime=1770139556
[dolphin_statusandlocationbarssettings.upd]
ctime=1770326744
done=replace-view-mode-with-view-settings-in-toolbar,25.04-convert-bool-showstatusbar-to-enum-showstatusbar
mtime=1770139556
[gtkconfig.upd]
ctime=1769692356
done=25.04-convert-bool-showstatusbar-to-enum-showstatusbar,gtk_theme,dont_use_gtk_css_for_window_decorations,remove_deprecated_gtk4_option_v2
mtime=1768334489
[kcalcrc.upd]
ctime=1770326747
done=remove_deprecated_gtk4_option_v2
mtime=1770149900
[kwin-x11.upd]
ctime=1769887677
done=remove_deprecated_gtk4_option_v2,kwin-6.0-reset-active-mouse-screen-x11,kwin-6.0-delete-desktop-switching-shortcuts-x11,kwin-6.0-remove-breeze-tabbox-default-x11,kwin-6.1-remove-gridview-expose-shortcuts-x11,kwin-6.5-showpaint-changes-x11
mtime=1769684280
[kwin.upd]
ctime=1769887677
done=kwin-6.5-showpaint-changes-x11,kwin-6.0-reset-active-mouse-screen,kwin-6.0-delete-desktop-switching-shortcuts,kwin-6.0-remove-breeze-tabbox-default,kwin-6.1-remove-gridview-expose-shortcuts,kwin-6.5-showpaint-changes
mtime=1769683918
[migrate-calendar-to-plugin-id.upd]
ctime=1769692355
done=kwin-6.5-showpaint-changes,migrate-calendar-plugins
mtime=1768333784
[plasma-systemmonitor.upd]
ctime=1769692356
done=migrate-calendar-plugins,memory-column
mtime=1768335525
[plasma6.0-remove-dpi-settings.upd]
ctime=1769692355
done=memory-column,plasma6.0-remove-dpi-settings
mtime=1768333784
[plasma6.0-remove-old-shortcuts.upd]
ctime=1769692355
done=plasma6.0-remove-dpi-settings,plasma6.0-remove-old-shortcuts
mtime=1768333784
[plasma6.3-update-clipboard-database-2-to-3.upd]
ctime=1769692355
done=plasma6.0-remove-old-shortcuts,plasma6.3-update-clipboard-database-2-to-3
mtime=1768333784
[plasma6.4-migrate-fullscreen-notifications-to-dnd.upd]
ctime=1769692355
done=plasma6.3-update-clipboard-database-2-to-3,plasma6.4-migrate-fullscreen-notifications-to-dnd
mtime=1768333784
[plasmashell-6.0-keep-custom-position-of-panels.upd]
ctime=1769692355
done=plasma6.4-migrate-fullscreen-notifications-to-dnd,plasmashell-6.0-keep-custom-position-of-panels
mtime=1768333784
[plasmashell-6.0-keep-default-floating-setting-for-plasma-5-panels.upd]
ctime=1769692355
done=plasmashell-6.0-keep-custom-position-of-panels,plasmashell-6.0-keep-default-floating-setting-for-plasma-5-panels
mtime=1768333784
[plasmashell-6.5-remove-stop-activity-shortcut.upd]
ctime=1769692355
done=plasmashell-6.0-keep-default-floating-setting-for-plasma-5-panels,plasmashell-6.5-remove-stop-activity-shortcut
mtime=1768333784
[spectacle.upd]
ctime=1769692357
done=plasmashell-6.5-remove-stop-activity-shortcut,24.02.0-video_format,24.02.0-keep_old_save_location,24.02.0-rename_settings,24.02.0-keep_old_filename_templates,24.05.2-change_placeholder_format
mtime=1768335930

3
plasma/.config/kdeconnect/.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
*.pem
privateKey.pem
certificate.pem

View file

@ -0,0 +1,3 @@
[General]
keyAlgorithm=EC
name=endtop

2
plasma/.config/kded5rc Executable file
View file

@ -0,0 +1,2 @@
[Module-device_automounter]
autoload=false

View file

@ -0,0 +1,2 @@
[Mouse]
cursorTheme=breeze_cursors

View file

@ -0,0 +1,8 @@
[General]
ColorScheme=BreezeDark
[Icons]
Theme=breeze-dark
[KDE]
widgetStyle=Breeze

View file

@ -0,0 +1,3 @@
[KSplash]
Engine=KSplashQML
Theme=com.endeavouros.breezedarkeos.desktop

View file

@ -0,0 +1,4 @@
[org.kde.kdecoration2]
NoPlugin=false
library=org.kde.breeze
theme=Breeze

View file

@ -0,0 +1 @@
com.endeavouros.breezedarkeos.desktop

Some files were not shown because too many files have changed in this diff Show more