commit 4529a3c4724cde63adc5b44cbfca3fb27ea63b55 Author: tobias Date: Thu Jul 2 15:56:21 2026 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c030bc8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# build output +/out/ + +# secrets payload — only README.md and run.sh are tracked +/04-secrets/* +!/04-secrets/README.md +!/04-secrets/run.sh diff --git a/01-install/00-partition.sh b/01-install/00-partition.sh new file mode 100644 index 0000000..6c042e7 --- /dev/null +++ b/01-install/00-partition.sh @@ -0,0 +1,17 @@ +# Partition DISK: GPT, 512M EFI + rest ext4 root. Mounts root at /mnt, ESP at /mnt/boot. +# Sourced by run.sh (DISK comes from system.conf). + +part() { case "$DISK" in *nvme*|*mmcblk*) echo "${DISK}p$1" ;; *) echo "${DISK}$1" ;; esac; } +EFI="$(part 1)"; ROOT="$(part 2)" + +info "partitioning $DISK" +sgdisk --zap-all "$DISK" +sgdisk -n1:0:+512M -t1:ef00 -c1:EFI "$DISK" +sgdisk -n2:0:0 -t2:8300 -c2:root "$DISK" +partprobe "$DISK"; sleep 1 + +mkfs.fat -F32 "$EFI" +mkfs.ext4 -F "$ROOT" + +mount "$ROOT" /mnt +mount --mkdir "$EFI" /mnt/boot # ESP at /boot so the kernel + initramfs land on it diff --git a/01-install/10-pacstrap.sh b/01-install/10-pacstrap.sh new file mode 100644 index 0000000..9197df8 --- /dev/null +++ b/01-install/10-pacstrap.sh @@ -0,0 +1,12 @@ +# Install a minimal base system, generate fstab, copy this repo into the new root. +# Sourced by run.sh. The FULL package set is installed later by 02-system/run.sh. + +pacstrap -K /mnt \ + base linux linux-firmware intel-ucode amd-ucode \ + mkinitcpio networkmanager sudo git base-devel vim efibootmgr terminus-font + +genfstab -U /mnt >> /mnt/etc/fstab + +# carry the repo into the installed system so provisioning can run after reboot +mkdir -p /mnt/root +cp -a "$REPO_ROOT" /mnt/root/arch-system-th diff --git a/01-install/20-boot.sh b/01-install/20-boot.sh new file mode 100644 index 0000000..efe7aff --- /dev/null +++ b/01-install/20-boot.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# Runs INSIDE arch-chroot. systemd-boot + mkinitcpio with STATIC loader entries. +# mkinitcpio already built /boot/initramfs-linux*.img during pacstrap, and its +# pacman hooks rebuild them on every kernel update — nothing to regenerate here +# or later. The kernel cmdline lives in the loader entry's `options` line. +set -euo pipefail + +bootctl install # ESP is mounted at /boot + +ROOT_UUID="$(findmnt -no UUID /)" + +# microcode image matching this CPU (both packages are installed) +case "$(grep -m1 -oE 'Intel|AMD' /proc/cpuinfo)" in + Intel) UCODE="initrd /intel-ucode.img" ;; + AMD) UCODE="initrd /amd-ucode.img" ;; + *) UCODE="" ;; +esac + +mkdir -p /boot/loader/entries + +cat > /boot/loader/loader.conf < /boot/loader/entries/arch.conf < /boot/loader/entries/arch-fallback.conf < /etc/locale.conf +echo "KEYMAP=$KEYMAP" > /etc/vconsole.conf + +# hostname +echo "$HOSTNAME" > /etc/hostname + +# user + sudo (wheel) +useradd -m -G wheel -s /bin/bash "$USERNAME" 2>/dev/null || true +echo "%wheel ALL=(ALL:ALL) ALL" > /etc/sudoers.d/10-wheel +chmod 440 /etc/sudoers.d/10-wheel +echo "Set passwords for root and $USERNAME:" +passwd root +passwd "$USERNAME" + +# move the repo into the user's home so provisioning runs as them after reboot +cp -a /root/arch-system-th "/home/$USERNAME/arch-system-th" +chown -R "$USERNAME:$USERNAME" "/home/$USERNAME/arch-system-th" + +# network up on first boot +systemctl enable NetworkManager.service diff --git a/01-install/run.sh b/01-install/run.sh new file mode 100755 index 0000000..cd72ca9 --- /dev/null +++ b/01-install/run.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Base Arch install, run from the live ISO (as root, UEFI). +# Partitions DISK, installs a minimal base, sets up systemd-boot + mkinitcpio, then +# hands off to the system + user provisioning layers after first boot. +# +# ./run.sh # reads ../system.conf +set -euo pipefail +cd "$(dirname "$0")" +source ../02-system/lib.sh +source ../system.conf +REPO_ROOT="$(cd .. && pwd)" + +# Safety net: if the repo arrived without exec bits (USB on exFAT, or the optional +# custom ISO which strips modes), restore +x so the copies we propagate to the +# installed system are runnable. Harmless when git already preserved them. +find "$REPO_ROOT" -name '*.sh' -exec chmod +x {} + 2>/dev/null || true + +[ "$(id -u)" -eq 0 ] || die "run as root from the live ISO" +[ -d /sys/firmware/efi ] || die "not booted in UEFI mode" +[ -b "$DISK" ] || die "DISK '$DISK' is not a block device — edit system.conf" + +echo "About to ERASE $DISK and install Arch (host=$HOSTNAME user=$USERNAME)." +read -rp "Type ERASE to continue: " ans +[ "$ans" = ERASE ] || die "aborted" + +source ./00-partition.sh # partitions + mounts /mnt, /mnt/boot +source ./10-pacstrap.sh # base system + fstab + copy repo to /mnt/root + +# in-chroot steps (the whole repo, incl. system.conf, was copied by 10-pacstrap) +arch-chroot /mnt bash /root/arch-system-th/01-install/20-boot.sh +arch-chroot /mnt bash /root/arch-system-th/01-install/30-finalize.sh + +info "Base install done. Reboot, remove the ISO, then as your user run:" +info " sudo ~/arch-system-th/02-system/run.sh" +info " ~/arch-system-th/03-user/run.sh" diff --git a/02-system/10-packages.sh b/02-system/10-packages.sh new file mode 100644 index 0000000..3df05cd --- /dev/null +++ b/02-system/10-packages.sh @@ -0,0 +1,16 @@ +# Enable the [multilib] repo (needed for lib32-* and steam) — disabled by default +# on a fresh Arch install. Idempotent. +if ! grep -q '^\[multilib\]' /etc/pacman.conf; then + info "enabling [multilib] repo" + sed -i '/^#\[multilib\]/,/^#Include/ s/^#//' /etc/pacman.conf + pacman -Sy +fi + +# Install the base package set + the GPU vendor group for this host. +pac_file packages/pacman.txt + +case "$GPU" in + amd) pac_file packages/graphics-amd.txt ;; + intel) pac_file packages/graphics-intel.txt ;; + *) info "no GPU group for GPU='$GPU'" ;; +esac diff --git a/02-system/20-config.sh b/02-system/20-config.sh new file mode 100644 index 0000000..c4968d0 --- /dev/null +++ b/02-system/20-config.sh @@ -0,0 +1,47 @@ +# Deploy /etc + /usr/local/bin config files (see 02-system/files/). + +# v4l2loopback virtual camera (for OBS virtual webcam) +deploy etc/modprobe.d/v4l2loopback.conf +deploy etc/modules-load.d/v4l2loopback.conf + +# Logitech mice (logiops) — config + udev restart rule +deploy etc/logid.cfg +deploy etc/udev/rules.d/90-logid-start-restart.rules + +# AirPlay receiver +deploy etc/shairport-sync.conf + +# No autologin: plain tty1 password prompt, then ~/.zprofile exec's Hyprland. +# Drop any autologin override left by earlier provisioning. +DROPIN=/etc/systemd/system/getty@tty1.service.d/autologin.conf +if [ -f "$DROPIN" ]; then + rm -f "$DROPIN" + rmdir --ignore-fail-on-non-empty "$(dirname "$DROPIN")" 2>/dev/null || true + systemctl daemon-reload + info "removed stale autologin drop-in" +fi + +# Desktop only: never sleep/suspend +if [ "$IS_DESKTOP" = 1 ]; then + deploy etc/sleep.conf.d/disable-sleep.conf +fi + +# Unlock the keyring at login (what GDM normally does). Idempotent; 'optional' +# so a missing module never blocks login. pam_gnome_keyring.so ships with gnome-keyring. +PAM=/etc/pam.d/login +if ! grep -q pam_gnome_keyring.so "$PAM"; then + sed -i '/^auth[[:space:]]\+include[[:space:]]\+system-local-login/a auth optional pam_gnome_keyring.so' "$PAM" + sed -i '/^session[[:space:]]\+include[[:space:]]\+system-local-login/a session optional pam_gnome_keyring.so auto_start' "$PAM" + info "wired pam_gnome_keyring into $PAM" +fi + +# Keep the login keyring's password in sync when you change your Unix password. +PAM_PW=/etc/pam.d/passwd +if ! grep -q pam_gnome_keyring.so "$PAM_PW"; then + sed -i '/^password[[:space:]]\+include[[:space:]]\+system-auth/a password optional pam_gnome_keyring.so' "$PAM_PW" + info "wired pam_gnome_keyring into $PAM_PW" +fi + +# One-time: pam unlocks the "login" keyring (password = your login password). +# Fresh install creates it automatically; on an existing box, make the login keyring +# the default with that password in Seahorse, or wipe ~/.local/share/keyrings/* and re-login. diff --git a/02-system/30-services.sh b/02-system/30-services.sh new file mode 100644 index 0000000..9ac4619 --- /dev/null +++ b/02-system/30-services.sh @@ -0,0 +1,19 @@ +# Enable system services. enable_unit skips any unit that isn't installed yet +# (e.g. logid.service comes from the AUR logiops package, installed in the user layer). + +enable_unit NetworkManager.service +enable_unit bluetooth.service +enable_unit avahi-daemon.service +enable_unit cups.socket # socket-activated: cups runs only on demand +enable_unit systemd-timesyncd.service +enable_unit fstrim.timer +enable_unit logid.service # logitech mice (AUR) + +# Laptop: battery/power profiles. Desktop: not useful. +[ "$IS_DESKTOP" = 0 ] && enable_unit power-profiles-daemon.service + +# libvirt / KVM (modular daemons + their sockets) +for drv in qemu interface network nodedev nwfilter secret storage; do + enable_unit "virt${drv}d.service" + enable_unit "virt${drv}d.socket" "virt${drv}d-ro.socket" "virt${drv}d-admin.socket" +done diff --git a/02-system/40-amd-gpu.sh b/02-system/40-amd-gpu.sh new file mode 100644 index 0000000..ecffe3b --- /dev/null +++ b/02-system/40-amd-gpu.sh @@ -0,0 +1,16 @@ +# AMD GPU tuning — desktop only (high perf level + custom fan curve). +# Skipped on laptops or non-AMD GPUs. +if [ "$IS_DESKTOP" != 1 ] || [ "$GPU" != amd ]; then + info "skipping AMD GPU tuning (IS_DESKTOP=$IS_DESKTOP GPU=$GPU)" + return 0 2>/dev/null || exit 0 +fi + +deploy usr/local/bin/gpuprofile.sh 755 +deploy usr/local/bin/amdgpu-fancontrol.sh 755 +deploy etc/systemd/system/gpuprofile.service +deploy etc/systemd/system/amdgpu-fancontrol.service +deploy etc/systemd/system/amdgpu-fancontrol.timer + +systemctl daemon-reload +enable_unit gpuprofile.service +enable_unit amdgpu-fancontrol.timer diff --git a/02-system/50-boot.sh b/02-system/50-boot.sh new file mode 100644 index 0000000..ba2f2b7 --- /dev/null +++ b/02-system/50-boot.sh @@ -0,0 +1,19 @@ +# Add kernel cmdline tuning to the systemd-boot loader entries, idempotently. +# systemd-boot reads `options` at boot — no initramfs/entry regeneration needed. +# (intel_iommu is harmless on AMD CPUs; both target machines are Intel.) + +toks="intel_iommu=on iommu=pt" # VFIO / PCI passthrough +[ "$GPU" = amd ] && toks="$toks amdgpu.mcbp=0 amdgpu.ppfeaturemask=0xfff7ffff" + +shopt -s nullglob +entries=(/boot/loader/entries/arch*.conf) +[ "${#entries[@]}" -gt 0 ] || die "no loader entries in /boot/loader/entries (run base install first)" + +for f in "${entries[@]}"; do + opts="$(sed -n 's/^options //p' "$f")" + for t in $toks; do + case " $opts " in *" $t "*) ;; *) opts="$opts $t" ;; esac + done + sed -i "s|^options .*|options $opts|" "$f" + info "$(basename "$f"): options $opts" +done diff --git a/02-system/60-shares.sh b/02-system/60-shares.sh new file mode 100644 index 0000000..9b8b8cc --- /dev/null +++ b/02-system/60-shares.sh @@ -0,0 +1,33 @@ +# Network shares + ramdisk. Mount points, fstab entries and the "reachable" gate +# services live here (no secrets). Only the credential FILES the CIFS/davfs mounts +# reference (/etc/nase.meow.credentials, /etc/davfs2/secrets) are secret — enter +# them via 04-secrets/run.sh. The mounts just fail until those files exist. + +# mount points +for d in /mnt/nase.meow /mnt/files.70b1.de /mnt/ramdisk; do + [ -d "$d" ] || { mkdir -p "$d" && info "created $d"; } +done + +# fstab entries owned by the provisioning user (numeric uid/gid, rebuild-safe). +u="${SUDO_USER:-$(id -un 1000 2>/dev/null || echo root)}" +uid="$(id -u "$u")"; gid="$(id -g "$u")" + +add_fstab() { # add_fstab + grep -qE "[[:space:]]$1[[:space:]]" /etc/fstab && return 0 + printf '%s\n' "$2" >> /etc/fstab && info "fstab += $1" +} +add_fstab /mnt/ramdisk \ + "tmpfs /mnt/ramdisk tmpfs rw,uid=$uid,gid=$gid,nodev,nosuid,size=16G,comment=x-gvfs-show 0 0" +add_fstab /mnt/nase.meow \ + "//nase.meow/data /mnt/nase.meow cifs rw,exec,uid=$uid,gid=$gid,credentials=/etc/nase.meow.credentials,_netdev,x-systemd.requires=nase.meow-ready.service,comment=x-gvfs-show 0 0" +add_fstab /mnt/files.70b1.de \ + "https://files.70b1.de /mnt/files.70b1.de davfs rw,uid=$uid,gid=$gid,_netdev,x-systemd.requires=files.70b1.de-ready.service,comment=x-gvfs-show 0 0" + +# "share reachable" gate services (wait until host is up before mounting) +deploy etc/systemd/system/nase.meow-ready.service +deploy etc/systemd/system/files.70b1.de-ready.service +systemctl daemon-reload +enable_unit nase.meow-ready.service +enable_unit files.70b1.de-ready.service + +info "NOTE: enter share credentials via 04-secrets/run.sh (mounts fail until then)" diff --git a/02-system/files/etc/logid.cfg b/02-system/files/etc/logid.cfg new file mode 100644 index 0000000..38d7861 --- /dev/null +++ b/02-system/files/etc/logid.cfg @@ -0,0 +1,19 @@ +devices: ( +{ + name: "MX Anywhere 3S"; + smartshift: + { + on: false; + threshold: 15; + torque: 50; + }; + hiresscroll: + { + hires: true; + invert: false; + target: false; + }; + dpi: 1000; + +} +); diff --git a/02-system/files/etc/modprobe.d/v4l2loopback.conf b/02-system/files/etc/modprobe.d/v4l2loopback.conf new file mode 100644 index 0000000..4370da2 --- /dev/null +++ b/02-system/files/etc/modprobe.d/v4l2loopback.conf @@ -0,0 +1 @@ +options v4l2loopback devices=1 video_nr=10 card_label="Virtual Cam" exclusive_caps=1 diff --git a/02-system/files/etc/modules-load.d/v4l2loopback.conf b/02-system/files/etc/modules-load.d/v4l2loopback.conf new file mode 100644 index 0000000..d394e47 --- /dev/null +++ b/02-system/files/etc/modules-load.d/v4l2loopback.conf @@ -0,0 +1 @@ +v4l2loopback diff --git a/02-system/files/etc/shairport-sync.conf b/02-system/files/etc/shairport-sync.conf new file mode 100644 index 0000000..cfef511 --- /dev/null +++ b/02-system/files/etc/shairport-sync.conf @@ -0,0 +1,304 @@ +// Sample Configuration File for Shairport Sync +// Commented out settings are generally the defaults, except where noted. +// Some sections are operative only if Shairport Sync has been built with the right configuration flags. +// See the individual sections for details. + +// General Settings +general = +{ + name = "%h"; // This means "Hostname" -- see below. This is the name the service will advertise to iTunes. +// The default is "Hostname" -- i.e. the machine's hostname with the first letter capitalised (ASCII only.) +// You can use the following substitutions: +// %h for the hostname, +// %H for the Hostname (i.e. with first letter capitalised (ASCII only)), +// %v for the version number, e.g. 3.0 and +// %V for the full version string, e.g. 3.3-OpenSSL-Avahi-ALSA-soxr-metadata-sysconfdir:/etc +// Overall length can not exceed 50 characters. Example: "Shairport Sync %v on %H". +// password = "secret"; // (AirPlay 1 only) leave this commented out if you don't want to require a password +// interpolation = "auto"; // aka "stuffing". Default is "auto". Alternatives are "basic" or "soxr". Choose "soxr" only if you have a reasonably fast processor and Shairport Sync has been built with "soxr" support. + output_backend = "pa"; // Run "shairport-sync -h" to get a list of all output_backends, e.g. "alsa", "pipe", "stdout". The default is the first one. +// mdns_backend = "avahi"; // Run "shairport-sync -h" to get a list of all mdns_backends. The default is the first one. +// interface = "name"; // Use this advanced setting to specify the interface on which Shairport Sync should provide its service. Leave it commented out to get the default, which is to select the interface(s) automatically. +// port = ; // Listen for service requests on this port. 5000 for AirPlay 1, 7000 for AirPlay 2 +// udp_port_base = 6001; // (AirPlay 1 only) start allocating UDP ports from this port number when needed +// udp_port_range = 10; // (AirPlay 1 only) look for free ports in this number of places, starting at the UDP port base. Allow at least 10, though only three are needed in a steady state. +// airplay_device_id_offset = 0; // (AirPlay 2 only) add this to the default airplay_device_id calculated from one of the device's MAC address +// airplay_device_id = 0xL; // (AirPlay 2 only) use this as the airplay_device_id e.g. 0xDCA632D4E8F3L -- remember the "L" at the end as it's a 64-bit quantity! +// regtype = ""; // Use this advanced setting to set the service type and transport to be advertised by Zeroconf/Bonjour. Default is "_raop._tcp" for AirPlay 1, "_airplay._tcp" for AirPlay 2. + +// drift_tolerance_in_seconds = 0.002; // allow a timing error of this number of seconds of drift away from exact synchronisation before attempting to correct it +// resync_threshold_in_seconds = 0.050; // a synchronisation error greater than this number of seconds will cause resynchronisation; 0 disables it +// resync_recovery_time_in_seconds = 0.100; // allow this extra time to recover after a late resync. Increase the value, possibly to 0.5, in a virtual machine. +// playback_mode = "stereo"; // This can be "stereo", "mono", "reverse stereo", "both left" or "both right". Default is "stereo". +// alac_decoder = "hammerton"; // This can be "hammerton" or "apple". This advanced setting allows you to choose +// the original Shairport decoder by David Hammerton or the Apple Lossless Audio Codec (ALAC) decoder written by Apple. +// If you build Shairport Sync with the flag --with-apple-alac, the Apple ALAC decoder will be chosen by default. + +// ignore_volume_control = "no"; // set this to "yes" if you want the volume to be at 100% no matter what the source's volume control is set to. +// volume_range_db = 60 ; // use this advanced setting to set the range, in dB, you want between the maximum volume and the minimum volume. Range is 30 to 150 dB. Leave it commented out to use mixer's native range. +// volume_max_db = 0.0 ; // use this advanced setting, which must have a decimal point in it, to set the maximum volume, in dB, you wish to use. +// The setting is for the hardware mixer, if chosen, or the software mixer otherwise. The value must be in the mixer's range (0.0 to -96.2 for the software mixer). +// Leave it commented out to use mixer's maximum volume. +// volume_control_profile = "standard" ; // use this advanced setting to specify how the airplay volume is transferred to the mixer volume. +// "standard" makes the volume change more quickly at lower volumes and slower at higher volumes. +// "flat" makes the volume change at the same rate at all volumes. +// "dasl_tapered" is similar to "standard" - it makes the volume change more quickly at lower volumes and slower at higher volumes. +// The intention behind dasl_tapered is that a given percentage change in volume should result in the same percentage change in +// perceived loudness. For instance, doubling the volume level should result in doubling the perceived loudness. +// With the range of AirPlay volume being from -30 to 0, doubling the volume from -22.5 to -15 results in an increase of 10 dB. +// Similarly, doubling the volume from -15 to 0 results in an increase of 10 dB. +// For compatibility with mixers having a restricted attenuation range (e.g. 30 dB), "dasl_tapered" will switch to a flat profile at low AirPlay volumes. + +// volume_control_combined_hardware_priority = "no"; // when extending the volume range by combining the built-in software attenuator with the hardware mixer attenuator, set this to "yes" to reduce volume by using the hardware mixer first, then the built-in software attenuator. + +// default_airplay_volume = -24.0; // this is the suggested volume after a reset or after the high_volume_threshold has been exceed and the high_volume_idle_timeout_in_minutes has passed + +// The following settings are for dealing with potentially surprising high ("very loud") volume levels. +// When a new play session starts, it usually requests a suggested volume level from Shairport Sync. This is normally the volume level of the last session. +// This can cause unpleasant surprises if the last session was (a) very loud and (b) a long time ago. +// Thus, the user could be unpleasantly surprised by the volume level of the new session. + +// To deal with this, when the last session volume is "very loud", the following two settings will lower the suggested volume after a period of idleness: + +// high_threshold_airplay_volume = -16.0; // airplay volume greater or equal to this is "very loud" +// high_volume_idle_timeout_in_minutes = 0; // if the current volume is "very loud" and the device is not playing for more than this time, suggest the default volume for new connections instead of the current volume. +// Note 1: This timeout is set to 0 by default to disable this feature. Set it to some positive number, e.g. 180 to activate the feature. +// Note 2: Not all applications use the suggested volume: MacOS Music and Mac OS System Sounds use their own settings. + +// run_this_when_volume_is_set = "/full/path/to/application/and/args"; // Run the specified application whenever the volume control is set or changed. +// The desired AirPlay volume is appended to the end of the command line – leave a space if you want it treated as an extra argument. +// AirPlay volume goes from 0.0 to -30.0 and -144.0 means "mute". + +// audio_backend_latency_offset_in_seconds = 0.0; // This is added to the latency requested by the player to delay or advance the output by a fixed amount. +// Use it, for example, to compensate for a fixed delay in the audio back end. +// E.g. if the output device, e.g. a soundbar, takes 100 ms to process audio, set this to -0.1 to deliver the audio +// to the output device 100 ms early, allowing it time to process the audio and output it perfectly in sync. +// audio_backend_buffer_desired_length_in_seconds = 0.2; // If set too small, buffer underflow occurs on low-powered machines. +// Too long and the response time to volume changes becomes annoying. +// Default is 0.2 seconds in the alsa backend, 0.35 seconds in the pa backend and 1.0 seconds otherwise. +// audio_backend_buffer_interpolation_threshold_in_seconds = 0.075; // Advanced feature. If the buffer size drops below this, stop using time-consuming interpolation like soxr to avoid dropouts due to underrun. +// audio_backend_silent_lead_in_time = "auto"; // This optional advanced setting, either "auto" or a positive number, sets the length of the period of silence that precedes the start of the audio. +// The default is "auto" -- the silent lead-in starts as soon as the player starts sending packets. +// Values greater than the latency are ignored. Values that are too low will affect initial synchronisation. + +// dbus_service_bus = "system"; // The Shairport Sync dbus interface, if selected at compilation, will appear +// as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session". +// mpris_service_bus = "system"; // The Shairport Sync mpris interface, if selected at compilation, will appear +// as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session". + +// resend_control_first_check_time = 0.10; // Use this optional advanced setting to set the wait time in seconds before deciding a packet is missing. +// resend_control_check_interval_time = 0.25; // Use this optional advanced setting to set the time in seconds between requests for a missing packet. +// resend_control_last_check_time = 0.10; // Use this optional advanced setting to set the latest time, in seconds, by which the last check should be done before the estimated time of a missing packet's transfer to the output buffer. +// missing_port_dacp_scan_interval_seconds = 2.0; // Use this optional advanced setting to set the time interval between scans for a DACP port number if no port number has been provided by the player for remote control commands +}; + +// Advanced parameters for controlling how Shairport Sync stays active and how it runs a session +sessioncontrol = +{ +// "active" state starts when play begins and ends when the active_state_timeout has elapsed after play ends, unless another play session starts before the timeout has fully elapsed. +// run_this_before_entering_active_state = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line +// run_this_after_exiting_active_state = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line +// active_state_timeout = 10.0; // wait for this number of seconds after play ends before leaving the active state, unless another play session begins. + +// run_this_before_play_begins = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line +// run_this_after_play_ends = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line + +// run_this_if_an_unfixable_error_is_detected = "/full/path/to/application and args"; // if a problem occurs that can't be cleared by Shairport Sync itself, hook a program on here to deal with it. +// An error code-string is passed as the last argument. +// Many of these "unfixable" problems are caused by malfunctioning output devices, and sometimes it is necessary to restart the whole device to clear the problem. +// You could hook on a program to do this automatically, but beware -- the device may then power off and restart without warning! +// wait_for_completion = "no"; // set to "yes" to get Shairport Sync to wait until the "run_this..." applications have terminated before continuing + +// allow_session_interruption = "no"; // set to "yes" to allow another device to interrupt Shairport Sync while it's playing from an existing audio source +// session_timeout = 120; // wait for this number of seconds after a source disappears before terminating the session and becoming available again. +}; + +// Back End Settings + +// These are parameters for the "alsa" audio back end. +// For this section to be operative, Shairport Sync must be built with the following configuration flag: +// --with-alsa +alsa = +{ +// output_device = "default"; // the name of the alsa output device. Use "shairport-sync -h" to discover the names of ALSA hardware devices. Use "alsamixer" or "aplay" to find out the names of devices, mixers, etc. +// mixer_control_name = "PCM"; // the name of the mixer to use to adjust output volume. No default. If not specified, no mixer is used and volume in adjusted in software. +// mixer_control_index = 0; // the index of the mixer to use to adjust output volume. Default is 0. The mixer is fully identified by the combination of the mixer_control_name and the mixer_control_index, e.g. "PCM",0 would be such a specification. +// mixer_device = "default"; // the mixer_device default is whatever the output_device is. Normally you wouldn't have to use this. + +// output_rate = "auto"; // can be "auto", 44100, 88200, 176400 or 352800, but the device must have the capability. +// output_format = "auto"; // can be "auto", "U8", "S8", "S16", "S16_LE", "S16_BE", "S24", "S24_LE", "S24_BE", "S24_3LE", "S24_3BE", "S32", "S32_LE" or "S32_BE" but the device must have the capability. Except where stated using (*LE or *BE), endianness matches that of the processor. + +// disable_synchronization = "no"; // Set to "yes" to disable synchronization. Default is "no" This is really meant for troubleshootingG. + +// period_size = ; // Use this optional advanced setting to set the alsa period size near to this value +// buffer_size = ; // Use this optional advanced setting to set the alsa buffer size near to this value +// use_mmap_if_available = "yes"; // Use this optional advanced setting to control whether MMAP-based output is used to communicate with the DAC. Default is "yes" +// use_hardware_mute_if_available = "no"; // Use this optional advanced setting to control whether the hardware in the DAC is used for muting. Default is "no", for compatibility with other audio players. +// maximum_stall_time = 0.200; // Use this optional advanced setting to control how long to wait for data to be consumed by the output device before considering it an error. It should never approach 200 ms. +// use_precision_timing = "auto"; // Use this optional advanced setting to control how Shairport Sync gathers timing information. When set to "auto", if the output device is a real hardware device, precision timing will be used. Choose "no" for more compatible standard timing, choose "yes" to force the use of precision timing, which may cause problems. + +// disable_standby_mode = "never"; // This setting prevents the DAC from entering the standby mode. Some DACs make small "popping" noises when they go in and out of standby mode. Settings can be: "always", "auto" or "never". Default is "never", but only for backwards compatibility. The "auto" setting prevents entry to standby mode while Shairport Sync is in the "active" mode. You can use "yes" instead of "always" and "no" instead of "never". +// disable_standby_mode_silence_threshold = 0.040; // Use this optional advanced setting to control how little audio should remain in the output buffer before the disable_standby code should start sending silence to the output device. +// disable_standby_mode_silence_scan_interval = 0.004; // Use this optional advanced setting to control how often the amount of audio remaining in the output buffer should be checked. +}; + +// Parameters for the "pw" PipeWire backend. +// For this section to be operative, Shairport Sync must be built with the following configuration flag: +// --with-pw +pw = +{ +// application_name = "Shairport Sync"; // Set this to the name that should appear in the Sounds "Applications" or "Volume Levels". +// node_name = "Shairport Sync"; // This appears in some PipeWire CLI tool outputs. +// sink_target = ""; // Leave this commented out to get the sink target already chosen by the PipeWire system. +}; + +// Parameters for the "sndio" audio back end. All are optional. +// For this section to be operative, Shairport Sync must be built with the following configuration flag: +// --with-sndio +sndio = +{ +// device = "snd/0"; // optional setting to set the name of the output device. Default is the sndio system default. +// rate = 44100; // optional setting which can be 44100, 88200, 176400 or 352800, but the device must have the capability. Default is 44100. +// format = "S16"; // optional setting which can be "U8", "S8", "S16", "S24", "S24_3LE", "S24_3BE" or "S32", but the device must have the capability. Except where stated using (*LE or *BE), endianness matches that of the processor. +// round = ; // advanced optional setting to set the period size near to this value +// bufsz = ; // advanced optional setting to set the buffer size near to this value +}; + +// Parameters for the "pa" PulseAudio backend. +// For this section to be operative, Shairport Sync must be built with the following configuration flag: +// --with-pa +pa = +{ +// server = "host"; // Set this to override the default pulseaudio server that should be used. +// sink = "Sink Name"; // Set this to override the default pulseaudio sink that should be used. (Untested) +// application_name = "Shairport Sync"; //Set this to the name that should appear in the Sounds "Applications" tab when Shairport Sync is active. +}; + +// Parameters for the "jack" JACK Audio Connection Kit backend. +// For this section to be operative, Shairport Sync must be built with the following configuration flag: +// --with-jack +jack = +{ +// client_name = "shairport-sync"; // Set this to the name of the client that should appear in "Connections" when Shairport Sync is active. +// autoconnect_pattern = ""; // Set this to a POSIX regular expression pattern that describes the ports you would like to connect to +// automatically. Examples: +// "system:playback_[12]" +// "some_app_[0-9]*:in-[LR]" +// "jack_mixer:in_2[78]" +// Beware: if you make a syntax error, libjack might crash. In that case, fix it and start over. +// For a good overview, look here: https://www.ibm.com/support/knowledgecenter/SS8NLW_11.0.1/com.ibm.swg.im.infosphere.dataexpl.engine.doc/c_posix-regex-examples.html +// soxr_resample_quality = "none"; // Enable resampling by setting this to "very high", "high", "medium", "low" or "quick" +// bufsz = ; // advanced optional setting to set the buffer size to this value +}; + +// Parameters for the "pipe" audio back end, a back end that directs raw CD-format audio output to a pipe. No interpolation is done. +// For this section to be operative, Shairport Sync must have been built with the following configuration flag: +// --with-pipe +pipe = +{ +// name = "/tmp/shairport-sync-audio"; // this is the default +}; + +// There are no configuration file parameters for the "stdout" audio back end. No interpolation is done. +// To include support for the "stdout" backend, Shairport Sync must be built with the following configuration flag: +// --with-stdout + +// There are no configuration file parameters for the "ao" audio back end. No interpolation is done. +// To include support for the "ao" backend, Shairport Sync must be built with the following configuration flag: +// --with-ao + +// For this section to be operative, Shairport Sync must be built with the following configuration flag: +// --with-convolution +dsp = +{ + +////////////////////////////////////////// +// This convolution filter can be used to apply almost any correction to the audio signal, like frequency and phase correction. +// For example you could measure (with a good microphone and a sweep-sine) the frequency response of your speakers + room, +// and apply a correction to get a flat response curve. +////////////////////////////////////////// +// +// convolution = "no"; // Set this to "yes" to activate the convolution filter. +// convolution_ir_file = "impulse.wav"; // Impulse Response file to be convolved to the audio stream +// convolution_gain = -4.0; // Static gain applied to prevent clipping during the convolution process +// convolution_max_length = 44100; // Truncate the input file to this length in order to save CPU. + + +////////////////////////////////////////// +// This loudness filter is used to compensate for human ear non linearity. +// When the volume decreases, our ears loose more sentisitivity in the low range frequencies than in the mid range ones. +// This filter aims at compensating for this loss, applying a variable gain to low frequencies depending on the volume. +// More info can be found here: https://en.wikipedia.org/wiki/Equal-loudness_contour +// For this filter to work properly, you should disable (or set to a fix value) all other volume control and only let shairport-sync control your volume. +// The setting "loudness_reference_volume_db" should be set at the volume reported by shairport-sync when listening to music at a normal listening volume. +////////////////////////////////////////// +// +// loudness = "no"; // Set this to "yes" to activate the loudness filter +// loudness_reference_volume_db = -20.0; // Above this level the filter will have no effect anymore. Below this level it will gradually boost the low frequencies. + +}; + +// How to deal with metadata, including artwork +// For this section to be operative, Shairport Sync must be built with at one (or more) of the following configuration flags: +// --with-metadata, --with-dbus-interface, --with-mpris-interface or --with-mqtt-client. +// In those cases, "enabled" and "include_cover_art" will both be "yes" by default +metadata = +{ +// enabled = "yes"; // set this to yes to get Shairport Sync to solicit metadata from the source and to pass it on via a pipe +// include_cover_art = "yes"; // set to "yes" to get Shairport Sync to solicit cover art from the source and pass it via the pipe. You must also set "enabled" to "yes". +// cover_art_cache_directory = "/tmp/shairport-sync/.cache/coverart"; // artwork will be stored in this directory if the dbus or MPRIS interfaces are enabled or if the MQTT client is in use. Set it to "" to prevent caching, which may be useful on some systems +// pipe_name = "/tmp/shairport-sync-metadata"; +// pipe_timeout = 5000; // wait for this number of milliseconds for a blocked pipe to unblock before giving up +// progress_interval = 0.0; // if non-zero, progress 'phbt' messages will be sent at the interval specified in seconds. A 'phb0' message will also be sent when the first audio frame of a play session is about to be played. +// Each message consists of the RTPtime of a a frame of audio and the exact system time when it is to be played. The system time, in nanoseconds, is based the CLOCK_MONOTONIC_RAW of the machine -- if available -- or CLOCK_MONOTONIC otherwise. +// Messages are sent when the frame is placed in the output device's buffer, thus, they will be _approximately_ 'audio_backend_buffer_desired_length_in_seconds' (default 0.2 seconds) ahead of time. +// socket_address = "226.0.0.1"; // if set to a host name or IP address, UDP packets containing metadata will be sent to this address. May be a multicast address. "socket-port" must be non-zero and "enabled" must be set to yes" +// socket_port = 5555; // if socket_address is set, the port to send UDP packets to +// socket_msglength = 65000; // the maximum packet size for any UDP metadata. This will be clipped to be between 500 or 65000. The default is 500. +}; + +// How to enable the MQTT-metadata/remote-service +// For this section to be operative, Shairport Sync must be built with the following configuration flag: +// --with-mqtt-client + +// Note that, for compatability with many MQTT brokers and applications, +// every message that has no extra data is given a +// payload consisting of the string "--". +// You can change this or you can enable empty payloads -- see below. + +mqtt = +{ +// enabled = "no"; // set this to yes to enable the mqtt-metadata-service +// hostname = "iot.eclipse.org"; // Hostname of the MQTT Broker +// port = 1883; // Port on the MQTT Broker to connect to +// username = NULL; //set this to a string to your username in order to enable username authentication +// password = NULL; //set this to a string you your password in order to enable username & password authentication +// capath = NULL; //set this to the folder with the CA-Certificates to be accepted for the server certificate. If not set, TLS is not used +// cafile = NULL; //this may be used as an (exclusive) alternative to capath with a single file for all ca-certificates +// certfile = NULL; //set this to a string to a user certificate to enable MQTT Client certificates. keyfile must also be set! +// keyfile = NULL; //private key for MQTT Client authentication +// topic = NULL; //MQTT topic where this instance of shairport-sync should publish. If not set, the general.name value is used. +// publish_raw = "no"; //whether to publish all available metadata under the codes given in the 'metadata' docs. +// publish_parsed = "no"; //whether to publish a small (but useful) subset of metadata under human-understandable topics +// empty_payload_substitute = "--"; // MQTT messages with empty payloads often are invisible or have special significance to MQTT brokers and readers. +// To avoid empty payload problems, the string here is used instead of any empty payload. Set it to the empty string -- "" -- to leave the payload empty. +// Currently published topics:artist,album,title,genre,format,songalbum,volume,client_ip, +// Additionally, messages at the topics play_start,play_end,play_flush,play_resume are published +// publish_cover = "no"; //whether to publish the cover over mqtt in binary form. This may lead to a bit of load on the broker +// enable_remote = "no"; //whether to remote control via MQTT. RC is available under `topic`/remote. +// Available commands are "command", "beginff", "beginrew", "mutetoggle", "nextitem", "previtem", "pause", "playpause", "play", "stop", "playresume", "shuffle_songs", "volumedown", "volumeup" +}; + +// Diagnostic settings. These are for diagnostic and debugging only. Normally you should leave them commented out +diagnostics = +{ +// disable_resend_requests = "no"; // set this to yes to stop Shairport Sync from requesting the retransmission of missing packets. Default is "no". +// log_output_to = "syslog"; // set this to "syslog" (default), "stderr" or "stdout" or a file or pipe path to specify were all logs, statistics and diagnostic messages are written to. If there's anything wrong with the file spec, output will be to "stderr". +// statistics = "no"; // set to "yes" to print statistics in the log +// log_verbosity = 0; // "0" means no debug verbosity, "3" is most verbose. +// log_show_file_and_line = "yes"; // set this to yes if you want the file and line number of the message source in the log file +// log_show_time_since_startup = "no"; // set this to yes if you want the time since startup in the debug message -- seconds down to nanoseconds +// log_show_time_since_last_message = "yes"; // set this to yes if you want the time since the last debug message in the debug message -- seconds down to nanoseconds +// drop_this_fraction_of_audio_packets = 0.0; // use this to simulate a noisy network where this fraction of UDP packets are lost in transmission. E.g. a value of 0.001 would mean an average of 0.1% of packets are lost, which is actually quite a high figure. +// retain_cover_art = "no"; // artwork is deleted when its corresponding track has been played. Set this to "yes" to retain all artwork permanently. Warning -- your directory might fill up. +}; diff --git a/02-system/files/etc/sleep.conf.d/disable-sleep.conf b/02-system/files/etc/sleep.conf.d/disable-sleep.conf new file mode 100644 index 0000000..02b3548 --- /dev/null +++ b/02-system/files/etc/sleep.conf.d/disable-sleep.conf @@ -0,0 +1,5 @@ +[Sleep] +AllowSuspend=no +AllowHibernation=no +AllowHybridSleep=no +AllowSuspendThenHibernate=no diff --git a/02-system/files/etc/systemd/system/amdgpu-fancontrol.service b/02-system/files/etc/systemd/system/amdgpu-fancontrol.service new file mode 100644 index 0000000..344cf17 --- /dev/null +++ b/02-system/files/etc/systemd/system/amdgpu-fancontrol.service @@ -0,0 +1,7 @@ +[Unit] +Description=AMDGPU fan control +After=multi-user.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/amdgpu-fancontrol.sh diff --git a/02-system/files/etc/systemd/system/amdgpu-fancontrol.timer b/02-system/files/etc/systemd/system/amdgpu-fancontrol.timer new file mode 100644 index 0000000..615efac --- /dev/null +++ b/02-system/files/etc/systemd/system/amdgpu-fancontrol.timer @@ -0,0 +1,9 @@ +[Unit] +Description=Run AMDGPU fan control periodically + +[Timer] +OnBootSec=20s +OnUnitActiveSec=20s + +[Install] +WantedBy=timers.target diff --git a/02-system/files/etc/systemd/system/files.70b1.de-ready.service b/02-system/files/etc/systemd/system/files.70b1.de-ready.service new file mode 100644 index 0000000..c371cb3 --- /dev/null +++ b/02-system/files/etc/systemd/system/files.70b1.de-ready.service @@ -0,0 +1,11 @@ +[Unit] +Description=Wait for nase.meow to be reachable +After=network-online.target + +[Service] +Type=oneshot +ExecStart=/bin/bash -c 'until host files.70b1.de; do sleep 1; done' +TimeoutSec=30 + +[Install] +WantedBy=multi-user.target diff --git a/02-system/files/etc/systemd/system/gpuprofile.service b/02-system/files/etc/systemd/system/gpuprofile.service new file mode 100644 index 0000000..6fa7d1c --- /dev/null +++ b/02-system/files/etc/systemd/system/gpuprofile.service @@ -0,0 +1,11 @@ +[Unit] +Description=Increase GPU core and memory clocks +After=multi-user.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/gpuprofile.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/02-system/files/etc/systemd/system/nase.meow-ready.service b/02-system/files/etc/systemd/system/nase.meow-ready.service new file mode 100644 index 0000000..b95f430 --- /dev/null +++ b/02-system/files/etc/systemd/system/nase.meow-ready.service @@ -0,0 +1,11 @@ +[Unit] +Description=Wait for nase.meow to be reachable +After=network-online.target + +[Service] +Type=oneshot +ExecStart=/bin/bash -c 'until host nase.meow; do sleep 1; done' +TimeoutSec=30 + +[Install] +WantedBy=multi-user.target diff --git a/02-system/files/etc/udev/rules.d/90-logid-start-restart.rules b/02-system/files/etc/udev/rules.d/90-logid-start-restart.rules new file mode 100644 index 0000000..7c225c6 --- /dev/null +++ b/02-system/files/etc/udev/rules.d/90-logid-start-restart.rules @@ -0,0 +1,3 @@ +# Logitech via Bluetooth (BlueZ UHID path 0005:046D:...) +ACTION=="add|change", SUBSYSTEM=="hidraw", KERNELS=="0005:046D:*", \ + RUN+="/usr/bin/systemctl restart --no-block logid.service" diff --git a/02-system/files/usr/local/bin/amdgpu-fancontrol.sh b/02-system/files/usr/local/bin/amdgpu-fancontrol.sh new file mode 100644 index 0000000..0c51d09 --- /dev/null +++ b/02-system/files/usr/local/bin/amdgpu-fancontrol.sh @@ -0,0 +1,42 @@ +#!/bin/sh +# ---------------- CONFIG ---------------- +# Temperature threshold in millidegrees Celsius +# 55000 = 55°C +TEMP_THRESHOLD=55000 + +# PWM values (0–255) +PWM_IDLE=25 # fan speed below threshold +PWM_HOT=90 # fan speed above threshold + +# --------------------------------------- + +# Find the AMD card (vendor 0x1002), then its hwmon — no hardcoded cardN. +HWMON="" +for c in /sys/class/drm/card[0-9]*; do + [ "$(cat "$c/device/vendor" 2>/dev/null)" = "0x1002" ] || continue + HWMON="$(ls -d "$c"/device/hwmon/hwmon* 2>/dev/null | head -n1)" + break +done +[ -z "$HWMON" ] && exit 0 + +TEMP_FILE="$HWMON/temp1_input" +PWM_ENABLE="$HWMON/pwm1_enable" +PWM_FILE="$HWMON/pwm1" + +# Enable manual fan control (always) +echo 1 > "$PWM_ENABLE" + +# Read temperature +TEMP="$(cat "$TEMP_FILE")" + +# Decide PWM +if [ "$TEMP" -ge "$TEMP_THRESHOLD" ]; then + PWM="$PWM_HOT" +else + PWM="$PWM_IDLE" +fi + +# Always write PWM +echo "$PWM" > "$PWM_FILE" + +exit 0 diff --git a/02-system/files/usr/local/bin/gpuprofile.sh b/02-system/files/usr/local/bin/gpuprofile.sh new file mode 100644 index 0000000..a4d8bca --- /dev/null +++ b/02-system/files/usr/local/bin/gpuprofile.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# Force the AMD GPU to "high" performance level. +# Pins memory clock to 100% — raises idle draw (~20W) but fixes stuttering. +# Run as root (systemd oneshot). Finds the AMD card by vendor id; no hardcoded cardN. +for c in /sys/class/drm/card[0-9]*; do + [ "$(cat "$c/device/vendor" 2>/dev/null)" = "0x1002" ] || continue + echo high > "$c/device/power_dpm_force_performance_level" + exit 0 +done +exit 0 diff --git a/02-system/lib.sh b/02-system/lib.sh new file mode 100644 index 0000000..b588e9c --- /dev/null +++ b/02-system/lib.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# Tiny shared helpers. Source this; don't execute. + +info() { echo ">> $*"; } +die() { echo "ERROR: $*" >&2; exit 1; } + +# deploy [mode] : copy 02-system/files/ to / +# e.g. deploy etc/logid.cfg | deploy usr/local/bin/gpuprofile.sh 755 +deploy() { install -Dm"${2:-644}" "files/$1" "/$1" && info "deployed /$1"; } + +# enable a systemd unit only if it exists (some come from AUR, installed later) +enable_unit() { systemctl enable "$@" 2>/dev/null && info "enabled $*" || echo " skip (no unit): $*"; } + +# install every package named in a file (ignores # comments and blank lines) +pac_file() { pacman -S --needed --noconfirm $(grep -vE '^\s*#|^\s*$' "$1"); } \ No newline at end of file diff --git a/02-system/optional/kvm-bridge.sh b/02-system/optional/kvm-bridge.sh new file mode 100755 index 0000000..8db25c7 --- /dev/null +++ b/02-system/optional/kvm-bridge.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# OPT-IN: create a NetworkManager bridge (br0) that enslaves a physical NIC, so +# libvirt/qemu VMs get real LAN IPs (DHCP from your router) instead of NAT. +# +# Host-specific (NIC name differs per machine) and briefly drops the wired link, +# so this is NOT part of run.sh. Run once per machine, locally (not over the +# very link you're bridging): +# sudo ./kvm-bridge.sh [iface] # iface defaults to the connected ethernet +# +# For a STATIC bridge IP instead of DHCP, after running this: +# nmcli connection modify br0 ipv4.method manual \ +# ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8 +# nmcli connection up br0 +set -euo pipefail +[ "$(id -u)" -eq 0 ] || { echo "run as root"; exit 1; } + +IFACE="${1:-$(nmcli -t -f DEVICE,TYPE,STATE device status \ + | awk -F: '$2=="ethernet" && $3=="connected"{print $1; exit}')}" +[ -n "$IFACE" ] || { echo "no connected ethernet found — pass the interface name"; exit 1; } +echo "Bridging $IFACE into br0 (the wired connection will blip)." + +# let qemu's bridge helper use br0 +install -d /etc/qemu +grep -qxF 'allow br0' /etc/qemu/bridge.conf 2>/dev/null || echo 'allow br0' >> /etc/qemu/bridge.conf + +# bridge + slave (DHCP on the bridge by default); idempotent +nmcli connection show br0 >/dev/null 2>&1 \ + || nmcli connection add type bridge con-name br0 ifname br0 +nmcli connection show "bridge-slave-$IFACE" >/dev/null 2>&1 \ + || nmcli connection add type ethernet con-name "bridge-slave-$IFACE" ifname "$IFACE" master br0 + +nmcli connection up br0 +echo "Done. Point VMs at bridge 'br0' (virt-manager: Bridge device → br0)." diff --git a/02-system/packages/graphics-amd.txt b/02-system/packages/graphics-amd.txt new file mode 100644 index 0000000..fd15bbe --- /dev/null +++ b/02-system/packages/graphics-amd.txt @@ -0,0 +1,10 @@ +# AMD GPU packages — installed only when a host profile sets GPU=amd. +# Generic mesa/vulkan-icd-loader stay in the base pacman.txt; these are AMD-only. +vulkan-radeon +lib32-vulkan-radeon +xf86-video-amdgpu +libva-utils +gst-plugin-va +rocm-hip-runtime +rocm-opencl-runtime +amdgpu_top diff --git a/02-system/packages/graphics-intel.txt b/02-system/packages/graphics-intel.txt new file mode 100644 index 0000000..b2c4051 --- /dev/null +++ b/02-system/packages/graphics-intel.txt @@ -0,0 +1,7 @@ +# Intel GPU packages — installed only when a host profile sets GPU=intel +# (e.g. the laptop). Not present on the AMD desktop harvest; net-new additions. +vulkan-intel +lib32-vulkan-intel +intel-media-driver +libva-utils +gst-plugin-va diff --git a/02-system/packages/pacman.txt b/02-system/packages/pacman.txt new file mode 100644 index 0000000..ed2aabc --- /dev/null +++ b/02-system/packages/pacman.txt @@ -0,0 +1,323 @@ +# Native explicit packages. Refresh on the running system: pacman -Qqen > pacman.txt +7zip +accountsservice +adwaita-icon-theme +adw-gtk-theme +alsa-firmware +alsa-plugins +alsa-utils +ant +arduino-cli +argyllcms +asar +assimp +b43-fwcutter +base +base-devel +bash-completion +bind +blender +blueman +bluez +bluez-utils +bmon +broadcom-wl-dkms +btrfs-progs +cantarell-fonts +cava +cdrtools +chromium +clinfo +cmake +code +composer +cosmic-session +cryptsetup +cups +darktable +davfs2 +dconf-editor +device-mapper +diffutils +dmidecode +dmraid +dnsmasq +docker +docker-buildx +docker-compose +dosfstools +e2fsprogs +easytag +edk2-ovmf +efibootmgr +efitools +element-desktop +esptool +ethtool +evince +evolution +evolution-ews +evtest +exfatprogs +f2fs-tools +feishin +ffmpegthumbnailer +file-roller +firefox +foliate +fractal +freecad +freerdp +gamescope +gendesk +ghidra +gimp +gnome-calculator +gnome-calendar +gnome-clocks +gnome-console +gnome-contacts +gnome-disk-utility +gnome-keyring +gnome-maps +gnome-nettool +gnome-terminal +gnome-text-editor +gnome-themes-extra +gnome-weather +go +godot +gst-libav +gst-plugin-pipewire +gst-plugins-bad +gst-plugins-ugly +gtk3-demos +guestfs-tools +gvfs +gvfs-afc +gvfs-gphoto2 +gvfs-mtp +gvfs-nfs +gvfs-smb +haveged +hdparm +hexedit +htop +httpie +hwdetect +hyprland +hyprland-protocols +hyprlang +hyprpaper +hyprpicker +hyprshot +hyprsunset +hyprwayland-scanner +iftop +inetutils +inkscape +intel-ucode +inter-font +iotop +iperf +iptables +iwd +jdk17-openjdk +jdk8-openjdk +jfsutils +kdenlive +keepassxc +kicad +kid3 +kid3-common +kismet +kitty +krita +less +lib32-mesa +lib32-vulkan-icd-loader +libcurl-gnutls +libdvdcss +libgsf +libopenraw +libreoffice-fresh +libvirt +libvncserver +libwnck3 +linssid +linux +linux-firmware +linux-headers +logrotate +loupe +lsb-release +lsof +lsscsi +lvm2 +man-db +man-pages +mdadm +mediainfo +mesa +mesa-utils +mitmproxy +mixxx +mkinitcpio +modemmanager +monolith +moreutils +mpv +mtools +musescore +nano +nautilus +ncdu +neovim +netctl +nethogs +networkmanager +network-manager-applet +networkmanager-openconnect +networkmanager-opecd pn +nfs-utils +nilfs-utils +nmap +nodejs +noto-fonts +noto-fonts-cjk +noto-fonts-emoji +noto-fonts-extra +npm +nss-mdns +ntfs-3g +ntp +nvtop +openbsd-netcat +openssh +otf-font-awesome +pacman-contrib +pavucontrol +pd +perl +perl-image-exiftool +pipewire-alsa +pipewire-jack +pipewire-pulse +pipewire-roc +pipewire-zeroconf +pkgfile +plocate +po4a +poco +poppler-glib +power-profiles-daemon +prusa-slicer +python +python-pyqt6 +python-rtmidi +python-tinycss2 +python-virtualenv +qemu-full +qemu-img +qpwgraph +radeontop +rclone +read-edid +reaper +rebuild-detector +reflector +remmina +rocm-smi-lib +rpi-imager +rsync +rtaudio +rtkit +rtl_433 +rust +samba +sassc +sg3_utils +shairport-sync +smartmontools +s-nail +socat +sof-firmware +solaar +sonic-visualiser +sqlitebrowser +steam +sudo +supercollider +sushi +swaync +swtpm +sysbench +sysfsutils +sysstat +systemd-sysvcompat +tenacity +testdisk +texinfo +thunderbird +tmux +totem +ttf-bitstream-vera +ttf-dejavu +ttf-liberation +ttf-opensans +unrar +unzip +upower +uriparser +usb_modeswitch +usbutils +v4l2loopback-dkms +vdpauinfo +vim +virt-install +virt-manager +virt-viewer +vlc +vlc-plugins-all +vulkan-icd-loader +waybar +wayvnc +webapp-manager +wf-recorder +wget +which +wimlib +wine +wine-gecko +wine-mono +winetricks +wireguard-tools +wireplumber +wireshark-cli +wireshark-qt +wofi +wpa_supplicant +xcb-util-wm +xdg-desktop-portal +xdg-desktop-portal-gtk +xdg-desktop-portal-hyprland +xdg-user-dirs +xdg-user-dirs-gtk +xdg-utils +xf86-input-libinput +xf86-video-ati +xfsprogs +xl2tpd +xorg-server +xorg-xdpyinfo +xorg-xinit +xorg-xinput +xorg-xkill +xorg-xrandr +xterm +yabridge +yabridgectl +yt-dlp +zsh +zsh-autosuggestions +zsh-syntax-highlighting diff --git a/02-system/run.sh b/02-system/run.sh new file mode 100755 index 0000000..baf8d9f --- /dev/null +++ b/02-system/run.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# Root-level provisioning. Run on the installed system as root: +# sudo ./run.sh +set -euo pipefail +cd "$(dirname "$0")" +source lib.sh +source ../system.conf # GPU, IS_DESKTOP, … + +[ "$(id -u)" -eq 0 ] || die "run as root" +[ -n "${GPU:-}" ] && [ -n "${IS_DESKTOP:-}" ] || die "set GPU and IS_DESKTOP in system.conf" +info "provisioning (GPU=$GPU, desktop=$IS_DESKTOP)" + +# run every numbered step in order; each is independently re-runnable +for step in [0-9][0-9]-*.sh; do + info "--- $step ---" + source "$step" +done + +info "system provisioning done. Next: run 03-user/run.sh as your user." diff --git a/03-user/10-yay.sh b/03-user/10-yay.sh new file mode 100644 index 0000000..d0b3206 --- /dev/null +++ b/03-user/10-yay.sh @@ -0,0 +1,11 @@ +# Ensure the yay AUR helper is present (build yay-bin from the AUR if not). +if command -v yay >/dev/null; then + info "yay already installed" + return 0 2>/dev/null || exit 0 +fi + +sudo pacman -S --needed --noconfirm git base-devel +tmp="$(mktemp -d)" +git clone https://aur.archlinux.org/yay-bin.git "$tmp/yay-bin" +( cd "$tmp/yay-bin" && makepkg -si --noconfirm ) +rm -rf "$tmp" diff --git a/03-user/20-aur.sh b/03-user/20-aur.sh new file mode 100644 index 0000000..465766e --- /dev/null +++ b/03-user/20-aur.sh @@ -0,0 +1,21 @@ +# Install AUR packages one at a time, so a single build failure (common with the +# AUR — removed packages, broken builds) doesn't abort the rest. yay still pulls +# each package's AUR dependencies automatically. Failures are collected and +# reported at the end, and logged to ~/aur-failed.log for retrying. +LOG="$HOME/aur-failed.log" +: > "$LOG" + +while read -r pkg; do + yay -S --needed --noconfirm "$pkg" || echo "$pkg" >> "$LOG" +done < <(grep -vE '^\s*#|^\s*$' "$REPO_ROOT/03-user/packages/aur.txt") + +if [ -s "$LOG" ]; then + echo "" + echo "!! $(wc -l < "$LOG") AUR package(s) FAILED — retry later with:" + echo " yay -S \$(cat $LOG)" + echo " failed:" + sed 's/^/ - /' "$LOG" +else + rm -f "$LOG" + info "all AUR packages installed" +fi diff --git a/03-user/30-dotfiles.sh b/03-user/30-dotfiles.sh new file mode 100644 index 0000000..a5ec8bd --- /dev/null +++ b/03-user/30-dotfiles.sh @@ -0,0 +1,13 @@ +# Apply dotfiles: copy the plain tree in 03-user/dotfiles/ into $HOME. +DOTS="$REPO_ROOT/03-user/dotfiles" +if [ -z "$(ls -A "$DOTS" 2>/dev/null)" ]; then + echo " 03-user/dotfiles empty — nothing to deploy" + return 0 2>/dev/null || exit 0 +fi + +cp -a "$DOTS/." "$HOME/" + +# If exec bits were lost in transit (USB exFAT / optional custom ISO), restore them +# on the deployed scripts. They're all shebang scripts (no binaries) → detect by shebang. +grep -rlI '^#!' "$HOME/scripts" "$HOME/.config/waybar/scripts" 2>/dev/null \ + | xargs -r chmod +x diff --git a/03-user/35-colorprofiles.sh b/03-user/35-colorprofiles.sh new file mode 100644 index 0000000..0ef7ffd --- /dev/null +++ b/03-user/35-colorprofiles.sh @@ -0,0 +1,9 @@ +# Deploy display colour profiles (ICC) to ~/.local/share/icc/. +# Monitor calibration; the compositor / colord matches them to a display. +found=0 +for icc in "$REPO_ROOT/03-user/colorprofiles"/*.icc; do + [ -e "$icc" ] || continue # no matches -> skip (glob left literal) + install -Dm644 "$icc" "$HOME/.local/share/icc/$(basename "$icc")" && info "icc: $(basename "$icc")" + found=1 +done +[ "$found" = 1 ] || echo " no colour profiles in 03-user/colorprofiles" diff --git a/03-user/40-defaults.sh b/03-user/40-defaults.sh new file mode 100644 index 0000000..8b3499e --- /dev/null +++ b/03-user/40-defaults.sh @@ -0,0 +1,22 @@ +# User defaults: login shell, file manager, mime handlers, user services. + +# Login shell = zsh. The Hyprland autostart lives in ~/.zprofile, which only zsh +# reads at login; with the default bash shell you'd just land on a prompt. +if [ "$(getent passwd "$USER" | cut -d: -f7)" != /usr/bin/zsh ]; then + sudo chsh -s /usr/bin/zsh "$USER" && info "login shell set to zsh" +fi + +# Default file manager = GNOME Files (Nautilus). Set explicitly so no other app +# that claims inode/directory (e.g. easytag) wins. (arch_notes.md) +xdg-mime default org.gnome.Nautilus.desktop inode/directory + +# User services that ship as ~/.config/systemd/user units (from dotfiles). +systemctl --user daemon-reload +systemctl --user enable shairport-sync.service 2>/dev/null \ + && info "enabled shairport-sync (user)" || echo " skip: shairport-sync user unit" + +# Let PAM own gnome-keyring-daemon (see 02-system/20-config.sh); disable the user +# socket so it isn't also started here — avoids a double instance / double prompt. +systemctl --user disable --now gnome-keyring-daemon.socket 2>/dev/null \ + && info "disabled gnome-keyring-daemon.socket (PAM starts the daemon)" \ + || echo " skip: gnome-keyring-daemon.socket already off" diff --git a/03-user/45-vscode.sh b/03-user/45-vscode.sh new file mode 100644 index 0000000..a65bba9 --- /dev/null +++ b/03-user/45-vscode.sh @@ -0,0 +1,19 @@ +# Install VS Code extensions (edit the list below to add/remove). +# code is the native OSS build (pacman 'code'), installed by the system layer. +# It resolves extensions against the Open VSX registry (not the MS Marketplace). +# `code --install-extension` is idempotent: it skips anything already present. +if ! command -v code >/dev/null; then + echo " skip: code not installed — no VS Code extensions" + return 0 2>/dev/null || exit 0 +fi + +exts=( + anthropic.claude-code + esbenp.prettier-vscode +) + +for ext in "${exts[@]}"; do + code --install-extension "$ext" >/dev/null 2>&1 \ + && info "extension: $ext" \ + || echo " FAILED extension: $ext" +done diff --git a/03-user/50-localsend.sh b/03-user/50-localsend.sh new file mode 100644 index 0000000..eae21a4 --- /dev/null +++ b/03-user/50-localsend.sh @@ -0,0 +1,12 @@ +# Seed localsend settings ONCE. Kept out of the dotfiles tree: localsend rewrites +# this file at runtime (it regenerates the SSL keys we stripped from the seed), so +# re-applying dotfiles would clobber them. Deploy only if no config exists yet. +SEED="$REPO_ROOT/03-user/seed/localsend-shared_preferences.json" +DST="$HOME/.local/share/org.localsend.localsend_app/shared_preferences.json" + +if [ -f "$DST" ]; then + info "localsend config already present — leaving it untouched" +elif [ -f "$SEED" ]; then + install -Dm644 "$SEED" "$DST" + info "seeded localsend settings (SSL keys regenerate on first launch)" +fi diff --git a/03-user/colorprofiles/LG_1_2020_D6500_sRGB.icc b/03-user/colorprofiles/LG_1_2020_D6500_sRGB.icc new file mode 100644 index 0000000..8234473 Binary files /dev/null and b/03-user/colorprofiles/LG_1_2020_D6500_sRGB.icc differ diff --git a/03-user/colorprofiles/LG_2_2020_D6500_sRGB.icc b/03-user/colorprofiles/LG_2_2020_D6500_sRGB.icc new file mode 100644 index 0000000..becf4de Binary files /dev/null and b/03-user/colorprofiles/LG_2_2020_D6500_sRGB.icc differ diff --git a/03-user/dotfiles/.config/Code - OSS/User/keybindings.json b/03-user/dotfiles/.config/Code - OSS/User/keybindings.json new file mode 100644 index 0000000..e69de29 diff --git a/03-user/dotfiles/.config/Code - OSS/User/settings.json b/03-user/dotfiles/.config/Code - OSS/User/settings.json new file mode 100644 index 0000000..016e3eb --- /dev/null +++ b/03-user/dotfiles/.config/Code - OSS/User/settings.json @@ -0,0 +1,14 @@ +{ + "window.menuBarVisibility": "toggle", + "security.workspace.trust.untrustedFiles": "open", + "diffEditor.ignoreTrimWhitespace": false, + "extensions.ignoreRecommendations": true, + "chat.commandCenter.enabled": false, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "workbench.editor.enablePreview": false, + "diffEditor.maxComputationTime": 0, + "diffEditor.hideUnchangedRegions.enabled": true, + "claudeCode.preferredLocation": "panel", +} \ No newline at end of file diff --git a/03-user/dotfiles/.config/code-flags.conf b/03-user/dotfiles/.config/code-flags.conf new file mode 100644 index 0000000..6dd7fd5 --- /dev/null +++ b/03-user/dotfiles/.config/code-flags.conf @@ -0,0 +1,3 @@ +--enable-features=UseOzonePlatform +--ozone-platform=wayland +--enable-wayland-ime diff --git a/03-user/dotfiles/.config/electron-flags.conf b/03-user/dotfiles/.config/electron-flags.conf new file mode 100644 index 0000000..6dd7fd5 --- /dev/null +++ b/03-user/dotfiles/.config/electron-flags.conf @@ -0,0 +1,3 @@ +--enable-features=UseOzonePlatform +--ozone-platform=wayland +--enable-wayland-ime diff --git a/03-user/dotfiles/.config/gtk-3.0/bookmarks b/03-user/dotfiles/.config/gtk-3.0/bookmarks new file mode 100644 index 0000000..120972c --- /dev/null +++ b/03-user/dotfiles/.config/gtk-3.0/bookmarks @@ -0,0 +1,7 @@ +file:///mnt/nase.meow/Data/Projects/Static/das_buero/lightcontrol lightcontrol +file:///mnt/nase.meow/Data/Projects/Static/huttinger_web huttinger_web +file:///mnt/nase.meow/Data/Projects/Static/tobiashuttinger tobiashuttinger +file:///mnt/nase.meow/Data +file:///mnt/nase.meow/Download +file:///mnt/nase.meow/Media +file:///mnt/nase.meow/Data/Projects diff --git a/03-user/dotfiles/.config/hypr/hyprland.conf b/03-user/dotfiles/.config/hypr/hyprland.conf new file mode 100644 index 0000000..c0ebe9e --- /dev/null +++ b/03-user/dotfiles/.config/hypr/hyprland.conf @@ -0,0 +1,461 @@ +# https://wiki.hypr.land/Configuring/ + +# You can split this configuration into multiple files +# Create your files separately and then link them to this file like this: +# source = ~/.config/hypr/myColors.conf + +################ +### MONITORS ### +################ + +# See https://wiki.hypr.land/Configuring/Monitors/ +monitorv2 { + output = DP-1 + mode = 3840x2160@60 + position = auto-left + scale = 1.5 + bitdepth = 10 + icc = /home/tobias/scripts/set_gamma/LG_1_2020_D6500_sRGB.icm +} + +monitorv2 { + output = DP-2 + mode = 3840x2160@60 + position = auto-right + scale = 1.5 + bitdepth = 10 + icc = /home/tobias/scripts/set_gamma/LG_1_2020_D6500_sRGB.icm +} + +# Assign Workspace 1 to correct monitor and set cursor to that workspace on start +#workspace=name:1, monitor:DP-2 +#exec-once = hyprctl dispatch workspace 1 + +debug { + disable_logs = true + +} + + +# unscale XWayland +xwayland { + force_zero_scaling = true +} + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hypr.land/Configuring/Keywords/ + +# Set programs that you use +$terminal = kitty +$fileManager = nautilus +$menu = wofi --show drun + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +# Or execute your favorite apps at launch like this: + +exec-once = hyprpaper & waybar & swaync & hyprsunset +exec-once = blueman-applet & nm-applet & pasystray +exec-once = localsend --hidden +exec-once = [workspace 1 silent] firefox +exec-once = [workspace 2 silent] evolution + +# Screen sharing conf +exec-once=dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hypr.land/Configuring/Environment-variables/ + +# Cursor +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 +env = XCURSOR_THEME,default + +# Theme options +env = ADWAITA_THEME,dark +env = COLOR_SCHEME,prefer-dark + +env = GDK_BACKEND,wayland,x11,* + +env = XDG_CURRENT_DESKTOP,Hyprland +env = XDG_SESSION_TYPE,wayland +env = XDG_SESSION_DESKTOP,Hyprland + +env = QT_AUTO_SCREEN_SCALE_FACTOR,1 +env = QT_QPA_PLATFORM,wayland;xcb +env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1 + +# Setting wayland for var toolkits +env = MOZ_ENABLE_WAYLAND,1 +env = ELECTRON_OZONE_PLATFORM_HINT,wayland +env = CLUTTER_BACKEND,wayland +env = SDL_VIDEODRIVER,wayland + +#env = QT_STYLE_OVERRIDE,Adwaita-Dark + +# This makes qt apps get dark mode preference via xdg portal, however no dark icon theme is set at least in kid3 +# disabled it for now because of a regression/bug in qt6 where dark theme isn't applied because prob. of this: https://bugreports.qt.io/browse/QTBUG-130884 +# env = QT_QPA_PLATFORMTHEME,xdgdesktopportal +# as temp. fix, dont make qt apps ask xdg portal what theme/color scheme to use: +env = QT_QPA_PLATFORMTHEME,gtk3 + +################### +### PERMISSIONS ### +################### + +# See https://wiki.hypr.land/Configuring/Permissions/ +# Please note permission changes here require a Hyprland restart and are not applied on-the-fly +# for security reasons + +# ecosystem { +# enforce_permissions = 1 +# } + +# permission = /usr/(bin|local/bin)/grim, screencopy, allow +# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow +# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow + + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hypr.land/Configuring/Variables/ + +# https://wiki.hypr.land/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 13 + + border_size = 2 + + # https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors + col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg + #col.active_border = rgba(29dbffee) + col.inactive_border = rgba(595959aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hypr.land/Configuring/Variables/#decoration +decoration { + rounding = 10 + rounding_power = 2 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 1.0 + + #shadow { + # enabled = true + # range = 4 + # render_power = 3 + # color = rgba(1a1a1aee) + #} + + shadow { + enabled = true + range = 100 + render_power = 3 + color = rgba(00000050) + scale = 0.99 + offset = 0 9 + + } + + # https://wiki.hypr.land/Configuring/Variables/#blur + blur { + enabled = true + size = 8 + passes = 2 + vibrancy = 0.1696 + } + + layerrule = blur on, match:namespace waybar + layerrule = ignore_alpha 0, blur on, match:namespace wofi + layerrule = ignore_alpha .3, blur on, match:namespace swaync-control-center + layerrule = ignore_alpha .3, blur on, match:namespace swaync-notification-window +} + +# https://wiki.hypr.land/Configuring/Variables/#animations +animations { + + enabled = yes, please :) + #enabled = no + # Default animations, see https://wiki.hypr.land/Configuring/Animations/ for more + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + bezier = smoothQuick,0.08,0.93,0,1 + + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 3, smoothQuick, slide + animation = workspacesIn, 1, 3, smoothQuick, slide + animation = workspacesOut, 1, 3, smoothQuick, slide +} + +# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrule = bordersize 0, floating:0, onworkspace:w[tv1] +# windowrule = rounding 0, floating:0, onworkspace:w[tv1] +# windowrule = bordersize 0, floating:0, onworkspace:f[1] +# windowrule = rounding 0, floating:0, onworkspace:f[1] + +# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more +dwindle { + preserve_split = true # You probably want this +} + +# See https://wiki.hypr.land/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hypr.land/Configuring/Variables/#misc +misc { + force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :( + anr_missed_pings = 3 +} + +ecosystem { + no_update_news = true + no_donation_nag = true +} + +#cursor { +# no_hardware_cursors = true +# min_refresh_rate = 60 +#} + + + +############# +### INPUT ### +############# + +# https://wiki.hypr.land/Configuring/Variables/#input +input { + kb_layout = de + kb_variant = + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + scroll_factor = 0.04 + emulate_discrete_scroll = 1 + + touchpad { + natural_scroll = true + } +} + +# For configuring gestures, see: +# https://wiki.hypr.land/Configuring/Gestures/ + +# Example per-device config +# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more +#device { +# name = mx-anywhere-3s-mouse +# scroll_factor = 0.08 +#} + + +################### +### KEYBINDINGS ### +################### + +# See https://wiki.hypr.land/Configuring/Keywords/ +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more +bind = $mainMod, T, exec, $terminal +bind = $mainMod, Q, killactive, +bind = $mainMod, M, exit, +bind = $mainMod, F, exec, $fileManager +bind = $mainMod, V, togglefloating, +bind = $mainMod, Y, exec, $menu +#bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, J, layoutmsg, togglesplit # dwindle +bind = $mainMod, N, exec,~/scripts/joplin.sh +bind = $mainMod, B, exec, firefox + +bind = $mainMod, E, exec,~/scripts/display_sleep.sh + +# Move focus with mainMod + arrow keys +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d + +# Switch workspaces with mainMod + [0-9] +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + + +# Resize windows with arrow keys +binde = $mainMod SHIFT, left, resizeactive, -40 0 +binde = $mainMod SHIFT, right, resizeactive, 40 0 +binde = $mainMod SHIFT, up, resizeactive, 0 -40 +binde = $mainMod SHIFT, down, resizeactive, 0 40 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +#bind = $mainMod, mouse_down, workspace, e+1 +#bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Laptop multimedia keys for volume and LCD brightness +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%- +bindel = , code:238, exec, brightnessctl -d smc::kbd_backlight s +20 +bindel = , code:237, exec, brightnessctl -d smc::kbd_backlight s 20- + +# Requires playerctl +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +# Screenshots with hyprshot +# Screenshot a window +bind = $mainMod, PRINT, exec, hyprshot -m window +# Screenshot a monitor +bind = , PRINT, exec, hyprshot -m region +# Screenshot a region +bind = $shiftMod, PRINT, exec, hyprshot -m output + +# Hyprpicker +bind = $mainMod,P,exec,hyprpicker -a + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# See https://wiki.hypr.land/Configuring/Window-Rules/ for more +# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules + +# workspacerules +workspace = name:1, monitor:DP-1, default:false +workspace = name:2, monitor:DP-1, default:false +workspace = name:3, monitor:DP-1, default:false +workspace = name:4, monitor:DP-1, default:false +workspace = name:5, monitor:DP-1, default:false + +workspace = name:6, monitor:DP-2, default:false +workspace = name:7, monitor:DP-2, default:false +workspace = name:8, monitor:DP-2, default:false +workspace = name:9, monitor:DP-2, default:false +workspace = name:0, monitor:DP-2, default:false + +# windowrules +windowrule = float on, size 1100 700, match:class ^(org.gnome.Nautilus)$ +windowrule = float on, pin on, match:class ^(org.gnome.NautilusPreviewer)$ +windowrule = float on, match:class ^(org.gnome.Loupe)$ + +windowrule = float on, match:class ^(org.rncbc.qpwgraph)$ + +windowrule = float on, scroll_mouse 0.2, match:class ^(org.keepassxc.KeePassXC)$ + +windowrule = float on, size 1400 900, scroll_mouse 0.05, match:class ^(@joplin/app-desktop)$ + +windowrule = float on, size 1200 750, scroll_mouse 0.2, match:class ^(ferdium)$ + +windowrule = float on, size 1200 750, match:class ^(Element)$ + +windowrule = float on, size 1200 750, match:class ^(org.gnome.Fractal)$ + +#windowrule = suppressevent[activatefocus activate],initialClass:^(photoshop.exe)$ + +windowrule = no_initial_focus on, match:initial_class ^(photoshop.exe)$ + +#windowrule = noblur,initialClass:^(photoshop.exe)$ +#windowrule = noshadow,initialClass:^(photoshop.exe)$ +#windowrule = noanim,initialClass:^(photoshop.exe)$ +#windowrule = nodim,initialClass:^(photoshop.exe)$ +#windowrule = nomaxsize,initialClass:^(photoshop.exe)$ + + +# Per app scroll factor +windowrule = scroll_mouse 0.3, match:class ^(code)$ +windowrule = scroll_mouse 0.2, match:class ^(org.gnome.Evolution)$ +windowrule = scroll_mouse 0.4, match:class ^(libreoffice-.*)$ +windowrule = scroll_mouse 0.2, match:class ^(virt-viewer)$ +windowrule = scroll_mouse 0.2, match:class ^(RapidRAW)$ + +# Ignore maximize requests from apps. You'll probably like this. +windowrule = suppress_event maximize, match:class .* + +# Fix some dragging issues with XWayland +windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0 + +# Shadow only for floating windows +windowrule = no_shadow on, match:float 0 diff --git a/03-user/dotfiles/.config/hypr/hyprpaper.conf b/03-user/dotfiles/.config/hypr/hyprpaper.conf new file mode 100644 index 0000000..a786ee5 --- /dev/null +++ b/03-user/dotfiles/.config/hypr/hyprpaper.conf @@ -0,0 +1,12 @@ +preload = /home/tobias/wall2.jpg +ipc = false +splash = false +wallpaper { + monitor = DP-1 + path = /home/tobias/wall2.jpg +} + +wallpaper { + monitor = DP-2 + path = /home/tobias/wall2.jpg +} diff --git a/03-user/dotfiles/.config/hypr/hyprsunset.conf b/03-user/dotfiles/.config/hypr/hyprsunset.conf new file mode 100644 index 0000000..7e24722 --- /dev/null +++ b/03-user/dotfiles/.config/hypr/hyprsunset.conf @@ -0,0 +1,12 @@ +max-gamma = 150 + +profile { + time = 8:00 + identity = true +} + +profile { + time = 22:00 + temperature = 3500 + gamma = 1.0 +} diff --git a/03-user/dotfiles/.config/joplin-desktop/settings.json b/03-user/dotfiles/.config/joplin-desktop/settings.json new file mode 100644 index 0000000..0b76918 --- /dev/null +++ b/03-user/dotfiles/.config/joplin-desktop/settings.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://joplinapp.org/schema/settings.json", + "altInstanceId": "", + "editor.codeView": true, + "sync.target": 6, + "sync.6.path": "https://files.70b1.de/joplin", + "sync.6.username": "tobias", + "richTextBannerDismissed": true, + "locale": "de_DE", + "ocr.enabled": false, + "theme": 2, + "themeAutoDetect": false, + "layoutButtonSequence": 1, + "notes.sortOrder.field": "user_updated_time", + "notes.sortOrder.reverse": true, + "notes.perFieldReverse": { + "user_updated_time": true, + "user_created_time": true, + "title": false, + "order": false, + "todo_due": true, + "todo_completed": true + }, + "notes.listRendererId": "compact", + "markdown.plugin.softbreaks": false, + "markdown.plugin.typographer": false, + "showTrayIcon": true, + "style.editor.fontSize": 15, + "style.editor.fontFamily": "SF Mono", + "style.editor.monospaceFontFamily": "SF Mono", + "style.editor.contentMaxWidth": 0, + "ui.layout": { + "key": "root", + "children": [ + { + "key": "sideBar", + "width": 224, + "visible": true + }, + { + "key": "noteList", + "width": 297, + "visible": true + }, + { + "key": "editor", + "visible": true + } + ], + "visible": true + }, + "noteVisiblePanes": [ + "editor" + ], + "editor.inlineRendering": true, + "editor.imageRendering": true, + "api.token": "51dcd22d8da20ca9f2d709e9660c03893fbabc387b19d904c10bd1d5d2f77211bc9477baffbe500ac1eaa77aaaf1005280fce282bd72de36ef7a43626bacad4e", + "spellChecker.languages": [ + "de" + ], + "windowContentZoomFactor": 100 +} diff --git a/03-user/dotfiles/.config/joplin-desktop/userchrome.css b/03-user/dotfiles/.config/joplin-desktop/userchrome.css new file mode 100644 index 0000000..b2b7ecc --- /dev/null +++ b/03-user/dotfiles/.config/joplin-desktop/userchrome.css @@ -0,0 +1,3895 @@ +/* For styling the entire Joplin app (except the rendered Markdown, which is defined in `userstyle.css`) */ +@charset "UTF-8"; +@media screen { + :root { + --s-accentColor--h: var(--u-accentColor--h, var(--g-systemBlue--h)); + --s-accentColor--s: var(--u-accentColor--s, var(--g-systemBlue--s)); + --s-accentColor--l: var(--u-accentColor--l, var(--g-systemBlue--l)); + --s-accentColor--s: var(--u-accentColor--s, var(--g-systemBlue--s)); + --s-accentColor--l: var(--u-accentColor--l, var(--g-systemBlue--l)); + --s-accentColor--hs: var(--s-accentColor--h), var(--s-accentColor--s); + --s-accentColor--hsl: var(--s-accentColor--hs), var(--s-accentColor--l); + --s-accentColor: hsl(var(--s-accentColor--hsl)); + --s-font-family-system: var(--u-font-family-system, var(--g-font-family-system)); + --s-font-family-system-rounded: var(--u-font-family-system-rounded, var(--g-font-family-system-rounded)); + --s-selectedContentBackgroundColor--h: var( + --u-accentColor--h, + var(--g-selectedContentBackgroundColor--h) + ); + --s-selectedContentBackgroundColor--s: var( + --u-accentColor--s, + var(--g-selectedContentBackgroundColor--s) + ); + --s-selectedContentBackgroundColor--l: var( + --u-accentColor--l, + var(--g-selectedContentBackgroundColor--l) + ); + --s-selectedContentBackgroundColor: hsl( + var(--s-selectedContentBackgroundColor--h), + var(--s-selectedContentBackgroundColor--s), + var(--s-selectedContentBackgroundColor--l) + ); + --s-accentColor--selected: var(--s-selectedContentBackgroundColor); + --s-controlAccentColor--h: var( + --u-accentColor--h, + var(--g-controlAccentColor--h) + ); + --s-controlAccentColor--s: var( + --u-accentColor--s, + var(--g-controlAccentColor--s) + ); + --s-controlAccentColor--l: var( + --u-accentColor--l, + var(--g-controlAccentColor--l) + ); + --s-controlAccentColor--hsl: var(--s-controlAccentColor--h), + var(--s-controlAccentColor--s), var(--s-controlAccentColor--l); + --s-controlAccentColor: hsl(var(--s-controlAccentColor--hsl)); + --s-controlAccentColor--selected: var(--s-controlAccentColor); + --s-sidebar__BackgroundColor: var( + --u-sidebar-background-color, + var(--g-windowBackgroundColor) + ); + --s-sidebar__label-FontSize: var( + --u-sidebar-label-font-size, + var(--g-font-size--1) + ); + --s-sidebar__label-Color: var( + --u-sidebar-label-color, + var(--g-tertiaryLabelColor) + ); + --s-sidebar__item-Color: var(--u-sidebar-item-color, var(--g-labelColor)); + --s-sidebar__item--selected-BackgroundColor: var( + --u-sidebar-selected-item-color, + var(var(--g-unemphasizedSelectedTextBackgroundColor)) + ); + --s-sidebar__icon-Color: var(--u-sidebar-icon-color, var(--s-accentColor)); + --s-sidebar__chevron-Color: var( + --u-sidebar-chevron-color, + var(--g-secondaryLabelColor) + ); + --s-sidebar__synchronise-Color: var( + --u-sidebar-synchronise-color, + var(--g-secondaryLabelColor) + ); + --s-sidebar__synchronise-label-Color: var( + --u-sidebar-synchronise-label-color, + var(--g-secondaryLabelColor) + ); + --s-font-family-icons: var(--u-font-family-icons, var(--g-font-family-icons)); + --s-icon-size-factor: var(--u-icon-size-factor, var(--g-icon-size-factor)); + --g-icon-alarm: "􀐭"; + --s-icon-alarm: var(--u-icon-alarm, var(--g-icon-alarm)); + --g-icon-arrow-down-circle-fill: "􀁹"; + --s-icon-arrow-down-circle-fill: var(--u-icon-arrow-down-circle-fill, var(--g-icon-arrow-down-circle-fill)); + --g-icon-arrow-triangle-2-circlepath: "􀊯"; + --s-icon-arrow-triangle-2-circlepath: var(--u-icon-arrow-triangle-2-circlepath, var(--g-icon-arrow-triangle-2-circlepath)); + --g-icon-arrow-up-arrow-down: "􀄬"; + --s-icon-arrow-up-arrow-down: var(--u-icon-arrow-up-arrow-down, var(--g-icon-arrow-up-arrow-down)); + --g-icon-arrow-up-circle-fill: "􀁷"; + --s-icon-arrow-up-circle-fill: var(--u-icon-arrow-up-circle-fill, var(--g-icon-arrow-up-circle-fill)); + --g-icon-arrow-up-forward-app: "􀮵"; + --s-icon-arrow-up-forward-app: var(--u-icon-arrow-up-forward-app, var(--g-icon-arrow-up-forward-app)); + --g-icon-arrow-up-right-square-fill: "􀄕"; + --s-icon-arrow-up-right-square-fill: var(--u-icon-arrow-up-right-square-fill, var(--g-icon-arrow-up-right-square-fill)); + --g-icon-bold: "􀅓"; + --s-icon-bold: var(--u-icon-bold, var(--g-icon-bold)); + --g-icon-calendar: "􀉉"; + --s-icon-calendar: var(--u-icon-calendar, var(--g-icon-calendar)); + --g-icon-character: "􀀄"; + --s-icon-character: var(--u-icon-character, var(--g-icon-character)); + --g-icon-checkmark: "􀆅"; + --s-icon-checkmark: var(--u-icon-checkmark, var(--g-icon-checkmark)); + --g-icon-checkmark-circle: "􀁢"; + --s-icon-checkmark-circle: var(--u-icon-checkmark-circle, var(--g-icon-checkmark-circle)); + --g-icon-checkmark-diamond: "􁁚"; + --s-icon-checkmark-diamond: var(--u-icon-checkmark-diamond, var(--g-icon-checkmark-diamond)); + --g-icon-checkmark-square: "􀃲"; + --s-icon-checkmark-square: var(--u-icon-checkmark-square, var(--g-icon-checkmark-square)); + --g-icon-chevron-backward: "􀯶"; + --s-icon-chevron-backward: var(--u-icon-chevron-backward, var(--g-icon-chevron-backward)); + --g-icon-chevron-down: "􀆈"; + --s-icon-chevron-down: var(--u-icon-chevron-down, var(--g-icon-chevron-down)); + --g-icon-chevron-forward: "􀯻"; + --s-icon-chevron-forward: var(--u-icon-chevron-forward, var(--g-icon-chevron-forward)); + --g-icon-chevron-left-slash-chevron-right: "􀙚"; + --s-icon-chevron-left-slash-chevron-right: var(--u-icon-chevron-left-slash-chevron-right, var(--g-icon-chevron-left-slash-chevron-right)); + --g-icon-chevron-right: "􀆊"; + --s-icon-chevron-right: var(--u-icon-chevron-right, var(--g-icon-chevron-right)); + --g-icon-chevron-up-chevron-down: "􀆏"; + --s-icon-chevron-up-chevron-down: var(--u-icon-chevron-up-chevron-down, var(--g-icon-chevron-up-chevron-down)); + --g-icon-chevron-up: "􀆇"; + --s-icon-chevron-up: var(--u-icon-chevron-up, var(--g-icon-chevron-up)); + --g-icon-clock: "􀐫"; + --s-icon-clock: var(--u-icon-clock, var(--g-icon-clock)); + --g-icon-curlybraces: "􀡅"; + --s-icon-curlybraces: var(--u-icon-curlybraces, var(--g-icon-curlybraces)); + --g-icon-doc-on-clipboard: "􀉃"; + --s-icon-doc-on-clipboard: var(--u-icon-doc-on-clipboard, var(--g-icon-doc-on-clipboard)); + --g-icon-doc-richtext: "􀉅"; + --s-icon-doc-richtext: var(--u-icon-doc-richtext, var(--g-icon-doc-richtext)); + --g-icon-ellipsis: "􀍠"; + --s-icon-ellipsis: var(--u-icon-ellipsis, var(--g-icon-ellipsis)); + --g-icon-folder: "􀈕"; + --s-icon-folder: var(--u-icon-folder, var(--g-icon-folder)); + --g-icon-highlighter: "􀦇"; + --s-icon-highlighter: var(--u-icon-highlighter, var(--g-icon-highlighter)); + --g-icon-info-circle: "􀅴"; + --s-icon-info-circle: var(--u-icon-info-circle, var(--g-icon-info-circle)); + --g-icon-italic: "􀅔"; + --s-icon-italic: var(--u-icon-italic, var(--g-icon-italic)); + --g-icon-link: "􀉣"; + --s-icon-link: var(--u-icon-link, var(--g-icon-link)); + --g-icon-link-circle: "􀒠"; + --s-icon-link-circle: var(--u-icon-link-circle, var(--g-icon-link-circle)); + --g-icon-list-bullet-indent: "􀋳"; + --s-icon-list-bullet-indent: var(--u-icon-list-bullet-indent, var(--g-icon-list-bullet-indent)); + --g-icon-list-bullet-rectangle: "􀹆"; + --s-icon-list-bullet-rectangle: var(--u-icon-list-bullet-rectangle, var(--g-icon-list-bullet-rectangle)); + --g-icon-list-bullet: "􀋲"; + --s-icon-list-bullet: var(--u-icon-list-bullet, var(--g-icon-list-bullet)); + --g-icon-list-number: "􀋴"; + --s-icon-list-number: var(--u-icon-list-number, var(--g-icon-list-number)); + --g-icon-magnifyingglass: "􀊫"; + --s-icon-magnifyingglass: var(--u-icon-magnifyingglass, var(--g-icon-magnifyingglass)); + --g-icon-minus: "􀅽"; + --s-icon-minus: var(--u-icon-minus, var(--g-icon-minus)); + --g-icon-paperclip: "􀉢"; + --s-icon-paperclip: var(--u-icon-paperclip, var(--g-icon-paperclip)); + --g-icon-person-2: "􀉫"; + --s-icon-person-2: var(--u-icon-person-2, var(--g-icon-person-2)); + --g-icon-plus-circle: "􀁌"; + --s-icon-plus-circle: var(--u-icon-plus-circle, var(--g-icon-plus-circle)); + --g-icon-sidebar-left: "􀏚"; + --s-icon-sidebar-left: var(--u-icon-sidebar-left, var(--g-icon-sidebar-left)); + --g-icon-square-and-arrow-down: "􀈄"; + --s-icon-square-and-arrow-down: var(--u-icon-square-and-arrow-down, var(--g-icon-square-and-arrow-down)); + --g-icon-square-and-pencil: "􀈎"; + --s-icon-square-and-pencil: var(--u-icon-square-and-pencil, var(--g-icon-square-and-pencil)); + --g-icon-square-split-2x1: "􀏠"; + --s-icon-square-split-2x1: var(--u-icon-square-split-2x1, var(--g-icon-square-split-2x1)); + --g-icon-strikethrough: "􀅖"; + --s-icon-strikethrough: var(--u-icon-strikethrough, var(--g-icon-strikethrough)); + --g-icon-tablecells-badge-ellipsis: "􀏥"; + --s-icon-tablecells-badge-ellipsis: var(--u-icon-tablecells-badge-ellipsis, var(--g-icon-tablecells-badge-ellipsis)); + --g-icon-tag: "􀋡"; + --s-icon-tag: var(--u-icon-tag, var(--g-icon-tag)); + --g-icon-text-badge-checkmark: "􀋺"; + --s-icon-text-badge-checkmark: var(--u-icon-text-badge-checkmark, var(--g-icon-text-badge-checkmark)); + --g-icon-text-below-photo: "􀲱"; + --s-icon-text-below-photo: var(--u-icon-text-below-photo, var(--g-icon-text-below-photo)); + --g-icon-text-quote: "􀋿"; + --s-icon-text-quote: var(--u-icon-text-quote, var(--g-icon-text-quote)); + --g-icon-textformat-abc-dottedunderline: "􀅰"; + --s-icon-textformat-abc-dottedunderline: var(--u-icon-textformat-abc-dottedunderline, var(--g-icon-textformat-abc-dottedunderline)); + --g-icon-textformat-subscript: "􀓡"; + --s-icon-textformat-subscript: var(--u-icon-textformat-subscript, var(--g-icon-textformat-subscript)); + --g-icon-textformat-superscript: "􀓢"; + --s-icon-textformat-superscript: var(--u-icon-textformat-superscript, var(--g-icon-textformat-superscript)); + --g-icon-trash: "􀈑"; + --s-icon-trash: var(--u-icon-trash, var(--g-icon-trash)); + --g-icon-underline: "􀅕"; + --s-icon-underline: var(--u-icon-underline, var(--g-icon-underline)); + --g-icon-xmark-circle-fill: "􀁡"; + --s-icon-xmark-circle-fill: var(--u-icon-xmark-circle-fill, var(--g-icon-xmark-circle-fill)); + --g-icon-xmark: "􀆄"; + --s-icon-xmark: var(--u-icon-xmark, var(--g-icon-xmark)); + } + + :root { + --g-systemBlue: rgba(0, 122, 255, 1); + --g-systemBlue--h: 211; + --g-systemBlue--s: 100%; + --g-systemBlue--l: 50%; + --g-systemBrown: rgba(162, 132, 94, 1); + --g-systemGray: rgba(142, 142, 147, 1); + --g-systemGreen: rgba(40, 205, 65, 1); + --g-systemIndigo: rgba(88, 86, 214, 1); + --g-systemOrange: rgba(255, 149, 0, 1); + --g-systemPink: rgba(255, 45, 85, 1); + --g-systemPurple: rgba(175, 82, 222, 1); + --g-systemRed: rgba(255, 59, 48, 1); + --g-systemTeal: rgba(85, 190, 240, 1); + --g-systemYellow: rgba(255, 204, 0, 1); + /* Labels */ + --g-labelColor: rgba(0, 0, 0, 0.847); + --g-secondaryLabelColor: rgba(0, 0, 0, 0.498); + --g-tertiaryLabelColor: rgba(0, 0, 0, 0.259); + --g-quaternaryLabelColor: rgba(0, 0, 0, 0.098); + /* Text */ + --g-textColor: rgba(0, 0, 0, 1); + --g-textColorDark: rgba(0, 0, 0, 1); + --g-placeholderTextColor: rgba(0, 0, 0, 0.247); + --g-selectedTextColor: rgba(0, 0, 0, 1); + --g-textBackgroundColor: rgba(255, 255, 255, 1); + --g-selectedTextBackgroundColor: rgba(179, 215, 255, 1); + --g-keyboardFocusIndicatorColor: rgba(0, 103, 244, 0.247); + --g-unemphasizedSelectedTextColor: rgba(0, 0, 0, 1); + --g-unemphasizedSelectedTextBackgroundColor: rgba(220, 220, 220, 1); + /* Content */ + --g-alternatingContentBackgroundColorsEven: rgba(255, 255, 255, 1); + --g-alternatingContentBackgroundColorsOdd: rgba(244, 245, 245, 1); + --g-linkColor: rgba(0, 104, 218, 1); + --g-separatorColor: rgba(0, 0, 0, 0.098); + --g-selectedContentBackgroundColor: rgba(0, 99, 225, 1); + --g-selectedContentBackgroundColor--h: 214; + --g-selectedContentBackgroundColor--s: 100%; + --g-selectedContentBackgroundColor--l: 44%; + --g-unemphasizedSelectedContentBackgroundColor: rgba(220, 220, 220, 1); + /* Menus */ + --g-selectedMenuItemTextColor: rgba(255, 255, 255, 1); + /* Tables */ + --g-gridColor: rgba(230, 230, 230, 1); + --g-headerTextColor: rgba(0, 0, 0, 0.847); + /* Controls */ + --g-controlAccentColor--h: 211; + --g-controlAccentColor--s: 100%; + --g-controlAccentColor--l: 50%; + --g-controlAccentColor--hsl: var(--g-controlAccentColor--h), var(--g-controlAccentColor--s), var(--g-controlAccentColor--l); + --g-controlAccentColor: hsla(var(--g-controlAccentColor--hsl), 1); + --g-controlColor--rgb: 255, 255, 255; + --g-controlColor: rgba(var(--g-controlColor--rgb), 1); + --g-controlColor--hsl: 0, 0%, 100%; + --g-controlBackgroundColor: rgba(255, 255, 255, 1); + --g-controlTextColor: rgba(0, 0, 0, 0.847); + --g-disabledControlTextColor: rgba(0, 0, 0, 0.247); + --g-scrubberTexturedBackground: rgba(255, 255, 255, 1); + --g-selectedControlColor: rgba(179, 215, 255, 1); + --g-selectedControlTextColor: rgba(0, 0, 0, 0.847); + --g-alternateSelectedControlTextColor--rgb: 255, 255, 255; + --g-alternateSelectedControlTextColor: rgba( + var(--g-alternateSelectedControlTextColor--rgb), + 1 + ); + /* Windows */ + --g-windowBackgroundColor: rgba(236, 236, 236, 1); + --g-windowFrameTextColor: rgba(0, 0, 0, 0.847); + --g-underPageBackgroundColor: rgba(150, 150, 150, 0.898); + --g-underPageBackgroundColor--rgb: 150, 150, 150; + /* Highlights & Shadows */ + --g-findHighlightColor: rgba(255, 255, 0, 1); + --g-highlightColor: rgba(255, 255, 255, 1); + --g-shadowColor: rgba(0, 0, 0, 1); + --g-shadowColor--rgb: 0, 0, 0; + --g-primary-Background: var(--g-textBackgroundColor); + --g-primary-Color: var(--g-textColor); + --g-icon-size-factor: 1; + --g-font-family-system-rounded: "SF Pro Rounded", var(--s-font-family-system); + --g-font-family-system: "SF Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; + --g-font-family-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; + --g-font-family-icons: "SF Pro"; + --g-font-size--1: 1.1rem; + --g-font-size-0: 1.2rem; + --g-font-size-1: 1.4rem; + --g-font-size-2: 1.6rem; + } + + .fa-caret-right::before { + content: var(--s-icon-chevron-right) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + + .fa-caret-down::before { + content: var(--s-icon-chevron-down) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + + .fa-plus::before { + content: var(--s-icon-plus-circle) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + + .fa-book::before { + content: var(--s-icon-folder) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + + /* 1rem = 10px */ + html { + font-size: calc(62.5 * (var(--u-base-font-size, 100%) / 100)); + } + + html, +body { + background: var(--g-primary-Background) !important; + } + + body { + font-family: var(--s-font-family-system); + /* set default font-size back to 16px */ + font-size: 1.6rem; + } + body input, +body button { + color: var(--g-primary-Color); + font-family: var(--s-font-family-system); + } + body a { + cursor: default; + } + + #react-root > div:nth-child(2) > div { + background: transparent !important; + } + + *[style*=Roboto] { + font-family: var(--s-font-family-system) !important; + } + + .rli-editor { + overflow: hidden; + } + .rli-editor .tox .tox-edit-area__iframe, +.rli-editor .tox .tox-toolbar, +.rli-editor .tox .tox-toolbar__overflow, +.rli-editor .tox .tox-toolbar__primary, +.rli-editor .tox-editor-header .tox-toolbar__primary, +.rli-editor .tox .tox-toolbar-overlord, +.rli-editor .tox.tox-tinymce-aux .tox-toolbar__overflow, +.rli-editor .tox .tox-statusbar, +.rli-editor .tox .tox-dialog__header, +.rli-editor .tox .tox-dialog, +.rli-editor .tox textarea, +.rli-editor .tox input, +.rli-editor .tox .tox-dialog__footer, +.rli-editor *[style*=background] { + background-color: transparent !important; + } +} +@media screen and (prefers-color-scheme: dark) { + .rli-editor { + background-color: #1f1f1f; + } +} +@media screen { + .rli-editor > div > div { + background-color: transparent !important; + } +} +@media screen { + .rli-editor > div > div > div > div > div:first-child .title-input { + color: var(--g-headerTextColor) !important; + margin: 0.5rem 1rem 0; + padding-top: 0 !important; + font-weight: 700 !important; + font-size: 2rem !important; + max-width: calc(100% - 40px); + } + .rli-editor > div > div > div > div > div:first-child .updated-time-label { + color: var(--g-secondaryLabelColor) !important; + font-family: var(--s-font-family-system) !important; + font-size: 1.1rem; + margin-top: 0rem; + margin-right: 1rem; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) button { + color: var(--g-secondaryLabelColor); + margin: 0 0.2rem; + font-family: var(--s-font-family-system); + line-height: 1; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) button > * { + color: var(--g-secondaryLabelColor); + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) button:hover { + background: var(--g-quaternaryLabelColor); + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) button::before { + font-size: 1.4rem; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(1) > *, +.rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(2) > *, +.rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(3) > *, +.rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(4) > *, +.rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a[title="Toggle outline"] > *, +.rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a[title="Toggle sidebar"] > *, +.rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a[title="Toggle note list"] > * { + display: none; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(1) { + font-size: 0; + overflow: hidden; + width: 2.6rem; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(1) i { + display: block; + color: var(--g-secondaryLabelColor); + margin: var(--s-font-family-icons, 0.2rem 0.2rem 0); + font-family: var(--s-font-family-system); + line-height: 1; + font-size: 1.4rem; + font-weight: 400; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(1) i::before { + content: var(--s-icon-textformat-abc-dottedunderline) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + text-transform: uppercase; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(1) i[title]:not([title=""])::before { + content: attr(title); + font-family: var(--s-font-family-system-rounded); + font-size: 1.4rem !important; + font-weight: 400; + line-height: 2.6rem; + letter-spacing: -0.05rem; + margin-top: 0; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(2):before { + content: var(--s-icon-alarm) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(3).disabled { + display: none; + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(3):before { + content: var(--s-icon-square-split-2x1) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(4):before { + content: var(--s-icon-info-circle) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a[title="Toggle outline"]:before { + content: var(--s-icon-list-bullet-indent) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a[title="Toggle sidebar"]:before { + content: var(--s-icon-sidebar-left) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a[title="Toggle note list"]:before { + content: var(--s-icon-list-bullet-rectangle) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div .tox-tbtn--enabled { + background-color: var(--g-quaternaryLabelColor); + } + .rli-editor > div > div > div > div > div :has(.fa-markdown).tox-tbtn { + display: flex; + align-items: center; + margin: 0 0.25rem; + line-height: 1; + padding: 0 !important; + height: 2.6rem; + width: 2.6rem !important; + min-width: 2.6rem !important; + line-height: 2.6rem !important; + border-radius: 0.5rem; + } + .rli-editor > div > div > div > div > div :has(.fa-markdown).tox-tbtn:focus, .rli-editor > div > div > div > div > div :has(.fa-markdown).tox-tbtn:hover { + background: var(--g-quaternaryLabelColor) !important; + } + .rli-editor > div > div > div > div > div :has(.fa-markdown).tox-tbtn::after { + font-size: var(--g-font-size-1) !important; + font-weight: normal !important; + -webkit-font-smoothing: antialiased; + color: var(--g-secondaryLabelColor); + vertical-align: bottom; + color: var(--g-secondaryLabelColor); + width: 2.6rem; + } + .rli-editor > div > div > div > div > div :has(.fa-markdown).tox-tbtn.markdown-active::after { + content: "MD"; + font-family: var(--s-font-family-system-rounded); + font-size: 1.2rem !important; + line-height: 2.6rem; + font-weight: 500 !important; + } + .rli-editor > div > div > div > div > div :has(.fa-markdown).tox-tbtn.richText-active::after { + content: var(--s-icon-text-below-photo) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div :has(.fa-markdown).tox-tbtn * { + display: none !important; + } + .rli-editor > div > div > div > div > div:nth-child(2)[style*=padding-top] { + padding: 0 !important; + } + .rli-editor > div > div > div > div > div:nth-child(2)[style*=padding-top] button { + min-height: 0; + height: auto; + align-items: baseline; + background: transparent; + font-size: 1.3rem; + margin-top: 0.6rem; + margin-bottom: 0.4rem; + margin-left: var(--joplin-editor-padding-left) !important; + min-width: 0 !important; + padding: 0; + } + .rli-editor > div > div > div > div > div:nth-child(2)[style*=padding-top] button span { + color: var(--g-textColor); + } + .rli-editor > div > div > div > div > div:nth-child(2)[style*=padding-top] button .icon-notebooks::before { + content: var(--s-icon-folder) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--s-accentColor); + font-family: var(--s-font-family-system); + font-size: 1.3rem; + font-weight: 400; + } + .rli-editor > div > div > div > div > div [style*="border-left: 1px"] { + border-color: var(--g-gridColor) !important; + } + .rli-editor > div > div > div > div > div [style*="border-left: 1px"] [style*="width: 1px; max-width: 1px;"] { + border-left: none; + } +} +@media screen { + .rli-editor .joplin-tinymce > div, +.rli-editor .editor-toolbar, +.rli-editor .tox .tox-toolbar__group, +.rli-editor .joplin-tinymce .tox .tox-toolbar__primary { + background-color: transparent !important; + border: none !important; + } +} +@media screen { + .rli-editor .joplin-tinymce > div:first-child { + padding-top: 0.4rem !important; + margin-top: 0.2rem; + } +} +@media screen { + .rli-editor .joplin-tinymce > div:first-child, +.rli-editor .editor-toolbar > div:first-child { + margin-left: -0.6rem; + } + .rli-editor .joplin-tinymce > div:first-child > button, +.rli-editor .editor-toolbar > div:first-child > button { + display: flex; + align-items: center; + margin: 0 0.25rem; + line-height: 1; + padding: 0 !important; + height: 2.6rem; + width: 2.6rem !important; + min-width: 2.6rem !important; + line-height: 2.6rem !important; + border-radius: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + } + .rli-editor .joplin-tinymce > div:first-child > button:focus, .rli-editor .joplin-tinymce > div:first-child > button:hover, +.rli-editor .editor-toolbar > div:first-child > button:focus, +.rli-editor .editor-toolbar > div:first-child > button:hover { + background: var(--g-quaternaryLabelColor) !important; + } + .rli-editor .joplin-tinymce > div:first-child > button span, +.rli-editor .editor-toolbar > div:first-child > button span { + display: block; + font-size: 1.4rem; + } + .rli-editor .joplin-tinymce > div:first-child > button span:before, +.rli-editor .editor-toolbar > div:first-child > button span:before { + font-size: var(--g-font-size-1) !important; + font-weight: normal !important; + -webkit-font-smoothing: antialiased; + color: var(--g-secondaryLabelColor); + vertical-align: bottom; + } + .rli-editor .joplin-tinymce > div:first-child > button:nth-of-type(3):nth-of-type(3), +.rli-editor .editor-toolbar > div:first-child > button:nth-of-type(3):nth-of-type(3) { + min-width: 2.6rem !important; + font-size: 0 !important; + } + .rli-editor .joplin-tinymce > div:first-child > button:nth-of-type(3):nth-of-type(3) span, +.rli-editor .editor-toolbar > div:first-child > button:nth-of-type(3):nth-of-type(3) span { + margin-right: 0 !important; + } + .rli-editor .joplin-tinymce > div:first-child > button:nth-of-type(3):nth-of-type(3) span[title]:not([title=""])::before, +.rli-editor .editor-toolbar > div:first-child > button:nth-of-type(3):nth-of-type(3) span[title]:not([title=""])::before { + color: var(--s-accentColor) !important; + content: var(--s-icon-arrow-up-right-square-fill) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .joplin-tinymce > div:first-child > button:nth-of-type(3):nth-of-type(3) span::before, +.rli-editor .editor-toolbar > div:first-child > button:nth-of-type(3):nth-of-type(3) span::before { + content: var(--s-icon-arrow-up-forward-app) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .joplin-tinymce > div:first-child > button:nth-of-type(3):nth-of-type(3) span:not(:first-child), +.rli-editor .editor-toolbar > div:first-child > button:nth-of-type(3):nth-of-type(3) span:not(:first-child) { + display: none; + } +} +@media screen { + .rli-editor .tox-toolbar__group { + padding-left: 0; + padding-right: 0; + position: relative; + padding-left: 0 !important; + padding-right: 0 !important; + } + .rli-editor .tox-toolbar__group::before { + content: ""; + background-color: var(--g-separatorColor); + height: 100%; + width: 0.1rem; + margin: 0 0.65rem; + } + .rli-editor .tox-toolbar__group button, +.rli-editor .tox-toolbar__group button[aria-haspopup=true] { + display: flex; + align-items: center; + margin: 0 0.25rem; + line-height: 1; + padding: 0 !important; + height: 2.6rem; + width: 2.6rem !important; + min-width: 2.6rem !important; + line-height: 2.6rem !important; + border-radius: 0.5rem; + } + .rli-editor .tox-toolbar__group button:focus, .rli-editor .tox-toolbar__group button:hover, +.rli-editor .tox-toolbar__group button[aria-haspopup=true]:focus, +.rli-editor .tox-toolbar__group button[aria-haspopup=true]:hover { + background: var(--g-quaternaryLabelColor) !important; + } + .rli-editor .tox-toolbar__group button:before, +.rli-editor .tox-toolbar__group button[aria-haspopup=true]:before { + font-size: var(--g-font-size-1) !important; + font-weight: normal !important; + -webkit-font-smoothing: antialiased; + color: var(--g-secondaryLabelColor); + vertical-align: bottom; + } + .rli-editor .tox-toolbar__group svg { + display: none !important; + } +} +@media screen { + .rli-editor .tox-toolbar__group:nth-child(1) button:nth-child(1):before { + content: var(--s-icon-bold) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(1) button:nth-child(2):before { + content: var(--s-icon-italic) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(1) button:nth-child(3):before { + content: var(--s-icon-highlighter) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(1) button:nth-child(4):before { + content: var(--s-icon-strikethrough) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(1) button:nth-child(5) { + width: 2.6rem !important; + min-width: 0; + } + .rli-editor .tox-toolbar__group:nth-child(1) button:nth-child(5):before { + content: var(--s-icon-ellipsis) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + .rli-editor .tox-toolbar__group:nth-child(2) button:nth-child(1):before { + content: var(--s-icon-link) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(2) button:nth-child(2):before { + content: var(--s-icon-chevron-left-slash-chevron-right) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(2) button:nth-child(3):before { + content: var(--s-icon-curlybraces) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(2) button:nth-child(4):before { + content: var(--s-icon-paperclip) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + .rli-editor .tox-toolbar__group:nth-child(3) button:nth-child(1):before { + content: var(--s-icon-list-bullet) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(3) button:nth-child(2):before { + content: var(--s-icon-list-number) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor .tox-toolbar__group:nth-child(3) button:nth-child(3):before { + content: var(--s-icon-text-badge-checkmark) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + .rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(1):before, +.rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(2):before, +.rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(3):before { + font-family: var(--s-font-family-system); + } + .rli-editor .tox-toolbar__group:nth-child(4) .tox-tbtn__select-label { + display: none; + } + .rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(1):before, +.rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(2):before, +.rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(3):before { + font-family: var(--s-font-family-system-rounded); + } + .rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(1):before { + content: "H1"; + } + .rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(2):before { + content: "H2"; + } + .rli-editor .tox-toolbar__group:nth-child(4) button:nth-child(3):before { + content: "H3"; + } +} +@media screen { + .rli-editor .tox-toolbar__group:nth-child(5) button:nth-child(1):before { + content: var(--s-icon-minus) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + .rli-editor .tox-toolbar__group:nth-child(6) button:nth-child(1):before { + content: var(--s-icon-text-quote) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + .rli-editor .tox-toolbar__group:nth-child(7) button:nth-child(1):before { + content: var(--s-icon-tablecells-badge-ellipsis) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + .rli-editor .tox-toolbar__group:nth-child(8) button:nth-child(1):before { + content: var(--s-icon-clock) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + .rli-editor .tox-editor-header { + margin-left: 0px; + padding-left: 9.35rem; + padding-right: 6rem; + } + .rli-editor .tox-editor-header:after { + content: ""; + background-color: var(--g-separatorColor); + height: 0.1rem; + position: absolute; + left: -0.7rem; + right: 0; + } +} +@media screen { + .rli-editor .tox-tinymce { + overflow: unset; + } +} +@media screen { + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar:after { + content: ""; + background-color: var(--g-separatorColor); + height: 0.1rem; + position: absolute; + left: -0.7rem; + right: 0; + bottom: 0; + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar div > span { + position: relative; + padding-left: 0 !important; + padding-right: 0 !important; + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar div > span::before { + content: ""; + background-color: var(--g-separatorColor); + height: 100%; + width: 0.1rem; + margin: 0 0.65rem; + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button { + display: flex; + align-items: center; + margin: 0 0.25rem; + line-height: 1; + padding: 0 !important; + height: 2.6rem; + width: 2.6rem !important; + min-width: 2.6rem !important; + line-height: 2.6rem !important; + border-radius: 0.5rem; + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button:focus, .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button:hover { + background: var(--g-quaternaryLabelColor) !important; + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button span { + font-size: 0; + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button span::before, +.rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button i::before { + font-size: var(--g-font-size-1) !important; + font-weight: normal !important; + -webkit-font-smoothing: antialiased; + color: var(--g-secondaryLabelColor); + vertical-align: bottom; + font-weight: inherit !important; + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-bold::before { + content: var(--s-icon-bold) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-italic::before { + content: var(--s-icon-italic) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-link::before { + content: var(--s-icon-link) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-code::before { + content: var(--s-icon-chevron-left-slash-chevron-right) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-attachment::before { + content: var(--s-icon-paperclip) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-bulleted-list::before { + content: var(--s-icon-list-bullet) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-numbered-list::before { + content: var(--s-icon-list-number) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-to-do-list::before { + content: var(--s-icon-text-badge-checkmark) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-heading::before { + content: "H2"; + font-family: var(--s-font-family-system-rounded); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-ellipsis-h::before { + content: var(--s-icon-minus) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .icon-add-date::before { + content: var(--s-icon-clock) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-ellipsis-h::before, +.rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-highlighter::before, +.rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-strikethrough::before, +.rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-underline::before, +.rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-superscript::before, +.rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-subscript::before, +.rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-hand-point-left::before { + font-weight: 500 !important; + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-highlighter::before { + content: var(--s-icon-highlighter) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-strikethrough::before { + content: var(--s-icon-strikethrough) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-underline::before { + content: var(--s-icon-underline) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-subscript::before { + content: var(--s-icon-textformat-subscript) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-superscript::before { + content: var(--s-icon-textformat-superscript) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-editor > div > div > div > div > div:not(:first-child) .editor-toolbar button .fa-hand-point-left::before { + content: var(--s-icon-link-circle) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow { + background: var(--g-windowBackgroundColor) !important; + box-shadow: 0 0 1px rgba(var(--g-shadowColor--rgb), 0.4), 0 2px 8px rgba(var(--g-shadowColor--rgb), 0.2) !important; + max-width: none !important; + padding: 0.5rem !important; + border-color: transparent !important; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group { + align-items: flex-start; + display: flex; + flex-direction: column; + justify-content: stretch; + padding: 0; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group:focus-within:hover:not(:hover), +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group:focus-within:hover .tox-split-button:not(:hover) { + background-color: transparent !important; + border-radius: 0.4rem; + color: var(--g-controlTextColor) !important; + line-height: 1; + min-height: 2.2rem; + height: 2.2rem; + padding: 0 1rem !important; + font-size: 1.3rem !important; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group:focus-within:hover:not(:hover) *, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group:focus-within:hover .tox-split-button:not(:hover) * { + font-size: 1.3rem !important; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group:focus-within:hover:not(:hover) svg, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group:focus-within:hover .tox-split-button:not(:hover) svg { + fill: var(--g-controlTextColor) !important; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group button, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group .tox-split-button { + background-color: transparent !important; + border-radius: 0.4rem; + color: var(--g-controlTextColor) !important; + line-height: 1; + min-height: 2.2rem; + height: 2.2rem; + padding: 0 1rem !important; + font-size: 1.3rem !important; + justify-content: flex-start; + flex: 1; + text-align: left; + width: 100%; + box-sizing: border-box; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group button *, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group .tox-split-button * { + font-size: 1.3rem !important; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group button svg, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group .tox-split-button svg { + fill: var(--g-controlTextColor) !important; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group button:focus, .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group button:hover, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group .tox-split-button:focus, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group .tox-split-button:hover { + background: var(--s-accentColor) !important; + color: #fff !important; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group button:focus svg, .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group button:hover svg, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group .tox-split-button:focus svg, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group .tox-split-button:hover svg { + fill: #fff !important; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group button:after, +.tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group .tox-split-button:after { + padding: 0.5rem 0; + color: inherit; + content: attr(aria-label); + text-align: left; + } + .tox .tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow.tox-toolbar__overflow .tox-toolbar__group span { + display: none; + } +} +@media screen { + .tox .tox-menu.tox-swatches-menu { + background: var(--g-windowBackgroundColor) !important; + box-shadow: 0 0 1px rgba(var(--g-shadowColor--rgb), 0.4), 0 2px 8px rgba(var(--g-shadowColor--rgb), 0.2) !important; + max-width: none !important; + padding: 0.5rem !important; + border-color: transparent !important; + } +} +@media screen { + .tox-menu { + background: var(--g-windowBackgroundColor) !important; + box-shadow: 0 0 1px rgba(var(--g-shadowColor--rgb), 0.4), 0 2px 8px rgba(var(--g-shadowColor--rgb), 0.2) !important; + max-width: none !important; + padding: 0.5rem !important; + border-color: transparent !important; + } + .tox-menu .tox-collection__group { + border: none !important; + padding: 0 !important; + } + .tox-menu .tox-collection__group + *:before { + content: ""; + display: block; + height: 0.1rem; + margin: 0.5rem 0.8rem !important; + background-color: var(--g-separatorColor); + } + .tox-menu .tox-collection:focus-within:hover__item:focus:not(:hover) { + background-color: transparent !important; + border-radius: 0.4rem; + color: var(--g-controlTextColor) !important; + line-height: 1; + min-height: 2.2rem; + height: 2.2rem; + padding: 0 1rem !important; + font-size: 1.3rem !important; + } + .tox-menu .tox-collection:focus-within:hover__item:focus:not(:hover) * { + font-size: 1.3rem !important; + } + .tox-menu .tox-collection:focus-within:hover__item:focus:not(:hover) svg { + fill: var(--g-controlTextColor) !important; + } + .tox-menu .tox-collection__item { + background-color: transparent !important; + border-radius: 0.4rem; + color: var(--g-controlTextColor) !important; + line-height: 1; + min-height: 2.2rem; + height: 2.2rem; + padding: 0 1rem !important; + font-size: 1.3rem !important; + } + .tox-menu .tox-collection__item * { + font-size: 1.3rem !important; + } + .tox-menu .tox-collection__item svg { + fill: var(--g-controlTextColor) !important; + } + .tox-menu .tox-collection__item:focus, .tox-menu .tox-collection__item:hover { + background: var(--s-accentColor) !important; + color: #fff !important; + } + .tox-menu .tox-collection__item:focus svg, .tox-menu .tox-collection__item:hover svg { + fill: #fff !important; + } + .tox-menu .tox-collection__item-icon { + display: none !important; + } + .tox-menu .tox-collection__item-label { + font-size: inherit; + margin-left: 0 !important; + } +} +@media screen { + .tox-insert-table-picker { + color: var(--g-textColor) !important; + } + .tox-insert-table-picker > div { + background: var(--g-windowBackgroundColor) !important; + border-color: var(--g-separatorColor) !important; + } + .tox-insert-table-picker > div.tox-insert-table-picker__selected { + background-color: var(--s-accentColor) !important; + } + .tox-insert-table-picker .tox-insert-table-picker__label { + background: var(--g-windowBackgroundColor) !important; + color: inherit !important; + } +} +@media screen { + .tag-bar { + padding-bottom: 0.6rem !important; + } + + .tag-bar > div { + position: relative; + align-items: baseline !important; + } + .tag-bar button { + padding: 0 !important; + width: 1.8rem; + margin-top: 0.2rem; + } + .tag-bar button:hover { + background-color: transparent !important; + } + .tag-bar div > span { + color: var(--g-secondaryLabelColor) !important; + } + .tag-bar div > span::after { + content: ""; + position: absolute; + left: 0; + right: 0; + height: 100%; + } + .tag-bar .icon-tags { + font-size: var(--g-font-size-1) !important; + font-weight: normal !important; + -webkit-font-smoothing: antialiased; + color: var(--g-secondaryLabelColor); + vertical-align: bottom; + height: 1.8rem; + } + .tag-bar .icon-tags::before { + font-family: "SF Pro"; + content: var(--s-icon-tag) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .tag-bar .tag-list span { + background-color: var(--g-gridColor) !important; + border-radius: 0.2rem !important; + color: var(--g-textColor) !important; + font-size: 1.1rem !important; + line-height: 1.4rem !important; + margin-right: 0.4rem !important; + padding: 0 0.4rem !important; + } + .tag-bar .tag-list span:last-child { + margin-right: 0.8rem !important; + } + .tag-bar .tag-list button { + color: var(--g-secondaryLabelColor) !important; + display: contents !important; + } + .tag-bar .tag-list button::after { + content: ", "; + white-space: pre; + } + .tag-bar .tag-list button:last-child::after { + padding-right: 1rem; + content: ""; + } +} +@media screen { + .note-search-bar { + border-top-color: var(--g-gridColor) !important; + padding-left: 0.8rem; + position: relative; + width: 100%; + } + .note-search-bar input { + border: none !important; + background-color: var(--g-controlBackgroundColor) !important; + border-radius: 0.5rem; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 16px hsla(var(--s-controlAccentColor--hsl), 0) !important; + color: var(--g-textColor) !important; + height: 2rem; + padding: 0 0 0 1rem; + } + .note-search-bar input:focus-within, .note-search-bar input:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 0.35rem hsla(var(--s-controlAccentColor--hsl), 0.5) !important; + } + .note-search-bar a { + padding: 0 !important; + } + .note-search-bar a .fas { + color: var(--g-secondaryLabelColor) !important; + font-size: 1.4rem !important; + } + .note-search-bar .fa-chevron-down::before { + content: var(--s-icon-chevron-down) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + font-weight: 500; + } + .note-search-bar .fa-chevron-up::before { + content: var(--s-icon-chevron-up) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + font-weight: 500; + } + .note-search-bar > div > a:first-child { + position: absolute; + right: 0.7rem; + top: 50%; + } + .note-search-bar > div > a:first-child .fa-times { + font-size: 13px; + font-weight: normal; + } + .note-search-bar > div > a:first-child .fa-times::after { + content: var(--s-icon-xmark) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--g-secondaryLabelColor); + font-weight: 500; + transform: translateY(-50%) scale(var(--s-icon-size-factor, 1)); + } + .note-search-bar > div > div { + color: var(--g-secondaryLabelColor) !important; + padding-left: 1rem; + } +} +@media screen { + .rli-noteList { + --notelist--Background: var(--g-primary-Background); + --notelist--item--Line-height: 3.6rem; + } + .rli-noteList > div > div { + background-color: var(--notelist--Background); + } + .rli-noteList > div > div > div:first-child { + background-color: transparent; + height: auto; + width: 100%; + padding: 1.2rem 0.6rem 1.2rem 1.2rem; + } + .rli-noteList .search-and-sort, +.rli-noteList .new-note-todo-buttons { + align-items: center; + } + .rli-noteList .search-bar { + position: relative; + } + .rli-noteList .search-bar input[type=search] { + box-shadow: 0 0 0 16px hsla(var(--g-controlAccentColor--hsl), 0); + border: 1px solid var(--g-separatorColor); + background: var(--g-controlBackgroundColor); + border-radius: 0.6rem; + color: var(--g-controlTextColor); + font-size: 1.3rem; + height: 3.2rem; + max-height: none; + padding: 0 0 0 3rem !important; + width: 100%; + flex: 1 0 100%; + } + .rli-noteList .search-bar input[type=search]:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0 0 0 0.35rem hsla(var(--g-controlAccentColor--hsl), 0.5); + } + .rli-noteList .search-bar input[type=search]:not([value=""]) { + padding-right: 2.5rem !important; + } + .rli-noteList .search-bar input[type=search]::placeholder { + color: var(--g-tertiaryLabelColor); + } + .rli-noteList .search-bar::after { + content: var(--s-icon-magnifyingglass) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + transform: translateY(-50%) scale(var(--s-icon-size-factor, 1)); + position: absolute; + left: 0; + color: var(--g-secondaryLabelColor); + font-size: calc(var(--u-font-family-icons, 1) * 1.7rem); + font-weight: normal !important; + top: 50%; + left: 0.8rem; + pointer-events: none; + } + .rli-noteList .search-bar .icon-search { + display: none; + } + .rli-noteList .search-bar .fa-times { + font-size: 13px; + font-weight: normal; + } + .rli-noteList .search-bar .fa-times::after { + content: var(--s-icon-xmark-circle-fill) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--g-secondaryLabelColor); + display: block; + position: absolute; + right: 0.7rem; + top: 50%; + transform: translateY(-50%) scale(var(--s-icon-size-factor, 1)); + } + .rli-noteList .search-bar + div { + position: absolute; + right: 1rem; + } + .rli-noteList .search-bar > div > button > span::before { + display: none !important; + } + .rli-noteList :has(> .new-note-todo-buttons) { + flex-direction: row !important; + } + .rli-noteList .new-note-todo-buttons { + display: flex; + order: 1; + padding-right: 3.5rem; + } + .rli-noteList .new-note-todo-buttons .new-todo-button, +.rli-noteList .new-note-todo-buttons .new-note-button { + background: none; + border-radius: 0.6rem; + border: none; + cursor: default; + margin-left: 0; + min-height: 0; + min-width: 0; + padding: 0; + max-height: none; + max-width: none; + height: 3.2rem; + width: 3.2rem; + } + .rli-noteList .new-note-todo-buttons .new-todo-button:focus-visible, .rli-noteList .new-note-todo-buttons .new-todo-button:hover, +.rli-noteList .new-note-todo-buttons .new-note-button:focus-visible, +.rli-noteList .new-note-todo-buttons .new-note-button:hover { + background: var(--g-quaternaryLabelColor); + } + .rli-noteList .new-note-todo-buttons .new-todo-button:before, +.rli-noteList .new-note-todo-buttons .new-note-button:before { + color: var(--g-secondaryLabelColor) !important; + display: block; + font-size: var(--g-font-size-2); + font-weight: 500; + -webkit-font-smoothing: antialiased; + transform: translateY(0.05rem); + } + .rli-noteList .new-note-todo-buttons .new-todo-button span, +.rli-noteList .new-note-todo-buttons .new-note-button span { + display: none; + } + .rli-noteList .new-note-todo-buttons .new-note-button { + margin-left: 0.1rem; + } + .rli-noteList .new-note-todo-buttons .new-todo-button:before { + content: var(--s-icon-checkmark-circle) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .new-note-todo-buttons .new-note-button:before { + content: var(--s-icon-square-and-pencil) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .sort-order-field-button { + border: none; + cursor: default; + border-radius: 0.6rem; + background-color: transparent; + } + .rli-noteList .sort-order-field-button .fas, +.rli-noteList .sort-order-field-button .far { + font-size: var(--g-font-size-2); + font-weight: 500; + color: var(--g-secondaryLabelColor); + } + .rli-noteList .sort-order-field-button .fa-calendar-alt::before { + content: var(--s-icon-clock) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .sort-order-field-button .fa-calendar-plus::before { + content: var(--s-icon-calendar) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .sort-order-field-button .fa-font::before { + content: var(--s-icon-character) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .sort-order-field-button .fa-calendar-check::before { + content: var(--s-icon-checkmark-square) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .sort-order-field-button .fa-check::before { + content: var(--s-icon-checkmark-square) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .sort-order-field-button .fa-wrench::before { + content: var(--s-icon-arrow-up-arrow-down) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .sort-order-field-button:focus-visible, .rli-noteList .sort-order-field-button:hover { + background: var(--g-quaternaryLabelColor); + } + .rli-noteList .sort-order-reverse-button { + background: var(--notelist--Background) !important; + border: none; + border-radius: 50%; + height: 1.2rem !important; + margin-left: -11px !important; + min-height: 0; + padding: 0; + position: relative; + top: 13px !important; + width: 1.2rem; + cursor: default; + } + .rli-noteList .sort-order-reverse-button .fa-long-arrow-alt-down::before, +.rli-noteList .sort-order-reverse-button .fa-long-arrow-alt-up::before { + color: var(--g-secondaryLabelColor); + font-weight: 700; + font-size: 10px; + } + .rli-noteList .sort-order-reverse-button .fa-long-arrow-alt-up::before { + content: var(--s-icon-arrow-up-circle-fill) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .sort-order-reverse-button .fa-long-arrow-alt-down::before { + content: var(--s-icon-arrow-down-circle-fill) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .rli-noteList .note-list { + padding: 0 1rem 1rem; + width: auto !important; + overflow: hidden overlay !important; + } + .rli-noteList .note-list .title { + color: var(--g-textColor) !important; + font-size: 1.2rem !important; + } + .rli-noteList .note-list div:nth-last-of-type(2):not(:empty):before { + content: none; + } + .rli-noteList :has(.note-list-header) { + color: var(--g-labelColor) !important; + font-size: 1.2rem !important; + font-family: "Courier New", Courier, monospace !important; + } + .rli-noteList :has(.note-list-header) .note-list-header { + font-weight: 500; + border-bottom: 0.1rem solid var(--g-separatorColor); + margin: 0 1rem 0 1.5rem; + } + .rli-noteList :has(.note-list-header) .note-list-header .-first .inner { + padding: 0; + } + .rli-noteList :has(.note-list-header) .note-list-header [data-name="note.is_todo"] .inner { + display: none; + } + .rli-noteList :has(.note-list-header) .row { + gap: 1rem !important; + } + .rli-noteList :has(.note-list-header) .row:hover { + background: transparent; + } + .rli-noteList :has(.note-list-header) .row .item { + opacity: 1 !important; + padding-right: 0.5rem !important; + } + .rli-noteList :has(.note-list-header) .row .item:not(:first-child) { + padding-left: 0 !important; + } + .rli-noteList :has(.note-list-header) .row.-selected { + background: var(--s-accentColor--selected) !important; + border-radius: 0.4rem; + color: var(--g-alternateSelectedControlTextColor) !important; + } + .rli-noteList .todo-list-item, +.rli-noteList .note-list-item { + border-radius: 0.4rem; + height: auto; + line-height: var(--notelist--item--Line-height); + } + .rli-noteList .todo-list-item.odd::before, .rli-noteList .todo-list-item.even::before, +.rli-noteList .note-list-item.odd::before, +.rli-noteList .note-list-item.even::before { + content: var(--u-note-list-dividers, ""); + } + .rli-noteList .todo-list-item.odd, +.rli-noteList .note-list-item.odd { + background: var(--u-note-list-zebra-color-odd, var(--g-alternatingContentBackgroundColorsOdd)); + } + .rli-noteList .todo-list-item.even, +.rli-noteList .note-list-item.even { + background: var(--u-note-list-zebra-color-even, var(--g-alternatingContentBackgroundColorsEven)); + } + .rli-noteList .todo-list-item:hover, +.rli-noteList .note-list-item:hover { + background-color: transparent; + } + .rli-noteList .todo-list-item a, +.rli-noteList .note-list-item a { + padding: 0 1rem !important; + font-size: 1.2rem !important; + color: var(--g-labelColor) !important; + } + .rli-noteList .todo-list-item .fa-share-square, +.rli-noteList .note-list-item .fa-share-square { + order: 1; + margin-left: auto; + } + .rli-noteList .todo-list-item .fa-share-square::before, +.rli-noteList .note-list-item .fa-share-square::before { + content: var(--s-icon-arrow-up-right-square-fill) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--s-accentColor); + font-weight: 400; + } + .rli-noteList .todo-list-item mark, +.rli-noteList .note-list-item mark { + background: var(--g-systemYellow); + color: var(--g-textColorDark) !important; + border-radius: 0.2rem; + } + .rli-noteList .todo-list-item > .content.-selected, +.rli-noteList .note-list-item > .content.-selected { + background: var(--s-accentColor--selected) !important; + border-radius: 0.4rem; + } + .rli-noteList .todo-list-item > .content.-selected a, +.rli-noteList .todo-list-item > .content.-selected span, +.rli-noteList .note-list-item > .content.-selected a, +.rli-noteList .note-list-item > .content.-selected span { + color: var(--g-alternateSelectedControlTextColor) !important; + } + .rli-noteList .todo-list-item > .content.-selected mark, +.rli-noteList .note-list-item > .content.-selected mark { + background: var(--g-systemYellow); + color: var(--g-textColorDark) !important; + } + .rli-noteList .todo-list-item > .content.-selected:before, +.rli-noteList .note-list-item > .content.-selected:before { + top: -1px; + bottom: auto; + border-color: var(--notelist--Background); + } + .rli-noteList .todo-list-item > .content.-selected .fa-share-square::before, +.rli-noteList .note-list-item > .content.-selected .fa-share-square::before { + color: var(--g-alternateSelectedControlTextColor); + } + .rli-noteList .todo-list-item > .content.-selected + .-selected:before, +.rli-noteList .note-list-item > .content.-selected + .-selected:before { + border-color: transparent; + } + .rli-noteList .todo-list-item > .content.-selected + .-selected:after, +.rli-noteList .note-list-item > .content.-selected + .-selected:after { + content: ""; + background-color: var(--g-separatorColor); + position: absolute; + height: 0.1rem; + top: 0.4rem; + left: 1rem; + right: 1rem; + } + .rli-noteList .todo-list-item::before, +.rli-noteList .note-list-item::before { + border-color: var(--g-separatorColor); + left: 10px; + right: 0px; + width: auto; + } + .rli-noteList .todo-list-item > a > span, +.rli-noteList .note-list-item > a > span { + color: inherit; + font-family: var(--s-font-family-system); + overflow: hidden; + text-overflow: ellipsis; + } + .rli-noteList .todo-list-item > div { + padding-left: 1rem !important; + } + .rli-noteList .todo-list-item input { + align-items: center; + appearance: none; + border-radius: 50%; + border: 0.1rem solid var(--g-tertiaryLabelColor); + display: flex; + height: 1.5rem; + justify-content: center; + margin: 0 -0.3rem -0.2rem 0 !important; + position: relative; + width: 1.5rem; + } + .rli-noteList .todo-list-item input:checked { + background-color: var(--s-controlAccentColor); + border-color: transparent; + } + .rli-noteList .todo-list-item input:checked:after { + content: var(--s-icon-checkmark) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + position: absolute; + color: var(--g-alternateSelectedControlTextColor); + font-size: 0.9rem; + } + .rli-noteList .todo-list-item.-selected input { + border-color: hsla(var(--g-controlColor--hsl), 0.5); + } + .rli-noteList .todo-list-item.-selected input:checked { + border-color: transparent; + background-color: rgba(var(--g-alternateSelectedControlTextColor--rgb), 0.898); + } + .rli-noteList .todo-list-item.-selected input:checked:after { + color: var(--s-accentColor); + } + .rli-noteList > div > div > div:last-child { + background-color: transparent !important; + } + .rli-noteList > div > div > div:last-child { + border-right: none; + } + + .rli-noteList .note-list .checkbox > input { + accent-color: var(--g-controlBackgroundColor) !important; + appearance: none !important; + background-color: transparent !important; + height: 1em !important; + width: 1em !important; + border-radius: 1em !important; + border: 0.1em solid var(--g-controlTextColor) !important; + opacity: .7; + /*border: 0.1em solid #b9b9b9 !important;*/ + } + + .rli-noteList .note-list .content.-selected .checkbox > input { + opacity: 1; + } + + .rli-noteList .note-list .checkbox > input:checked::after { + content: ''; + position: absolute; + top: 0.94em; + left: 1.3em; + width: 0.25em; + height: 0.45em; + border: solid var(--g-controlTextColor); + + border-width: 0 0.15em 0.15em 0; + transform: rotate(45deg); + pointer-events: none; + } + +} +/* @media screen { + .dialog-modal-layer { + background: rgba(var(--g-underPageBackgroundColor--rgb), 0.5) !important; + height: 100% !important; + } + .dialog-modal-layer *[style*="color:"] { + color: var(--g-textColor) !important; + } +} */ + +@media screen { + .modal-layer { + background: rgba(var(--g-underPageBackgroundColor--rgb), 0.5) !important; + height: 100% !important; + align-items: center !important; + } +} +@media screen { + .modal-dialog { + backdrop-filter: blur(10px) saturate(100%) contrast(45%) brightness(130%); + background-color: var(--g-windowBackgroundColor) !important; + padding: 2rem !important; + border-radius: 1.2rem !important; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.8), 0px 0px 20px rgba(0, 0, 0, 0.15), 0px 25px 30px rgba(0, 0, 0, 0.35) !important; + } + .modal-dialog > div:first-child input[type=text], +.modal-dialog .datetime-picker input[type=text] { + border: none !important; + background-color: var(--g-controlBackgroundColor) !important; + border-radius: 0.5rem; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 16px hsla(var(--s-controlAccentColor--hsl), 0) !important; + color: var(--g-textColor) !important; + height: 2rem; + padding: 0 0 0 1rem; + } + .modal-dialog > div:first-child input[type=text]:focus-within, .modal-dialog > div:first-child input[type=text]:focus, +.modal-dialog .datetime-picker input[type=text]:focus-within, +.modal-dialog .datetime-picker input[type=text]:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 0.35rem hsla(var(--s-controlAccentColor--hsl), 0.5) !important; + } + .modal-dialog input[type=text] { + border: none !important; + background-color: var(--g-controlBackgroundColor) !important; + border-radius: 0.5rem; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 16px hsla(var(--s-controlAccentColor--hsl), 0) !important; + color: var(--g-textColor) !important; + height: 2rem; + padding: 0 0 0 1rem; + } + .modal-dialog input[type=text]:focus-within, .modal-dialog input[type=text]:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 0.35rem hsla(var(--s-controlAccentColor--hsl), 0.5) !important; + } + .modal-dialog input + a { + font-size: 1.5rem; + right: 2.7rem; + position: absolute; + } + .modal-dialog input + a .fa-question-circle { + display: block; + height: auto !important; + } + .modal-dialog input + a .fa-question-circle::before { + content: var(--s-icon-info-circle) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--g-secondaryLabelColor) !important; + font-weight: 400; + transform-origin: 50% 60%; + -webkit-font-smoothing: antialiased; + } + .modal-dialog label + div[style] { + background: none !important; + display: block !important; + } + .modal-dialog button { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + } + .modal-dialog button:active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } + .modal-dialog button + button { + margin-left: 7px; + } + .modal-dialog button:nth-child(1) { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + color: var(--g-alternateSelectedControlTextColor) !important; + background-color: hsl(var(--s-accentColor--hsl)); + background-image: linear-gradient(hsl(var(--s-accentColor--hsl)), hsl(var(--s-accentColor--hs), calc(var(--s-accentColor--l) - 5%))); + box-shadow: 0px 0px 1px hsla(var(--s-accentColor--hsl), 0.3), 0px 1px 1.5px hsla(var(--s-accentColor--hsl), 0.15); + } + .modal-dialog button:nth-child(1):active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } + .modal-dialog button:nth-child(2) { + margin-left: auto !important; + } + .modal-dialog button:nth-child(3):not(:active) { + color: var(--g-systemRed) !important; + } + .modal-dialog > div:last-child:not([style*="height: 0px"]) { + display: flex; + justify-content: space-between; + flex-direction: row-reverse; + gap: 0.7rem; + position: relative; + margin-top: 2rem !important; + padding-top: 2rem !important; + } + .modal-dialog > div:last-child:not([style*="height: 0px"]):before { + content: ""; + top: 0; + left: -2rem; + right: -2rem; + background: var(--g-separatorColor); + height: 0.1rem; + position: absolute; + } + .modal-dialog .item-list.item-list { + display: block !important; + padding-top: 0 !important; + margin-left: -0.5rem; + margin-right: -0.5rem; + } + .modal-dialog .item-list.item-list:before { + content: none; + } + .modal-dialog .item-list.item-list > div:not(:empty) { + border-bottom: none !important; + padding: 1.5rem 1.5rem !important; + position: relative; + } + .modal-dialog .item-list.item-list > div:not(:empty)::before { + content: ""; + top: 0; + left: 1rem; + right: 1rem; + background: var(--g-separatorColor); + height: 0.1rem; + position: absolute; + } + .modal-dialog .item-list.item-list > div:not(:empty):nth-child(2)::before { + content: none !important; + } + .modal-dialog .item-list.item-list > div:not(:empty) * { + opacity: 1 !important; + } + .modal-dialog .item-list.item-list > div:not(:empty) > div { + color: var(--g-secondaryLabelColor) !important; + } + .modal-dialog .item-list.item-list > div:not(:empty) > div:first-child[style] { + margin-bottom: 0 !important; + } + .modal-dialog .item-list.item-list > div:not(:empty) > div:first-child:not(:last-child) { + font-size: 1.5rem !important; + margin-bottom: 0.4rem !important; + } + .modal-dialog .item-list.item-list > div:not(:empty) > div span { + color: var(--g-textColor) !important; + font-weight: normal !important; + } + .modal-dialog .item-list.item-list > div:not(:empty).selected { + background: var(--s-accentColor) !important; + border-radius: 0.5rem; + } + .modal-dialog .item-list.item-list > div:not(:empty).selected > div { + color: rgba(255, 255, 255, 0.75) !important; + } + .modal-dialog .item-list.item-list > div:not(:empty).selected > div span { + color: var(--g-selectedMenuItemTextColor) !important; + } + .modal-dialog .item-list.item-list > div:not(:empty).selected i.fa:before { + color: rgba(255, 255, 255, 0.75); + } + .modal-dialog .item-list.item-list > div:not(:empty):not(.selected) > div:last-child { + color: var(--g-secondaryLabelColor) !important; + } + .modal-dialog .item-list.item-list > div:not(:empty) i.fa:before { + color: var(--s-accentColor); + font-weight: 400; + -webkit-font-smoothing: antialiased; + } + .modal-dialog .item-list.item-list > div:not(:empty) .fa-book:before { + content: var(--s-icon-folder) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } +} +@media screen { + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) { + background: rgba(var(--g-underPageBackgroundColor--rgb), 0.5) !important; + height: 100% !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div { + backdrop-filter: blur(10px) saturate(100%) contrast(45%) brightness(130%); + background-color: var(--g-windowBackgroundColor) !important; + padding: 2rem !important; + border-radius: 1.2rem !important; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.8), 0px 0px 20px rgba(0, 0, 0, 0.15), 0px 25px 30px rgba(0, 0, 0, 0.35) !important; + max-height: none !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div *[style*="color:"] { + color: var(--g-textColor) !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div > div:first-child { + color: var(--g-labelColor) !important; + font-size: 1.3rem !important; + text-align: center; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div > div:last-child { + display: flex; + flex-direction: row-reverse; + gap: 0.8rem; + position: relative; + margin-top: 2rem !important; + padding-top: 2rem !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div > div:last-child:before { + content: ""; + top: 0; + left: -2rem; + right: -2rem; + background: var(--g-separatorColor); + height: 0.1rem; + position: absolute; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div > div:last-child button:first-child { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + color: var(--g-alternateSelectedControlTextColor) !important; + background-color: hsl(var(--s-accentColor--hsl)); + background-image: linear-gradient(hsl(var(--s-accentColor--hsl)), hsl(var(--s-accentColor--hs), calc(var(--s-accentColor--l) - 5%))); + box-shadow: 0px 0px 1px hsla(var(--s-accentColor--hsl), 0.3), 0px 1px 1.5px hsla(var(--s-accentColor--hsl), 0.15); + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div > div:last-child button:first-child:active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div > div:last-child button:last-child:not(:first-child) { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) > div > div:last-child button:last-child:not(:first-child):active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box { + margin-bottom: 1rem !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box input[type=text] { + border: none !important; + background-color: var(--g-controlBackgroundColor) !important; + border-radius: 0.5rem; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 16px hsla(var(--s-controlAccentColor--hsl), 0) !important; + color: var(--g-textColor) !important; + height: 2rem; + padding: 0 0 0 1rem; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box input[type=text]:focus-within, div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box input[type=text]:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 0.35rem hsla(var(--s-controlAccentColor--hsl), 0.5) !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box a:not(:empty) { + background-color: transparent !important; + color: var(--s-controlAccentColor); + text-decoration: none !important; + margin-left: 0 !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box a:not(:empty) .fas { + color: var(--s-controlAccentColor) !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box a:not(:empty) .fas::before { + font-weight: 400; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box a:not(:empty) .fas.fa-edit::before { + content: var(--s-icon-square-and-pencil) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box a:not(:empty) .fas.fa-copy::before { + content: var(--s-icon-doc-on-clipboard) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box a:not(:empty) .fas.fa-save::before { + content: var(--s-icon-square-and-arrow-down) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box div + a[style] { + margin-left: 1rem !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box label { + color: var(--g-secondaryLabelColor) !important; + font-weight: 400 !important; + text-align: right !important; + margin-right: 0.8rem !important; + } + div[style*="z-index: 9999;"][style*="background-color: rgba(0, 0, 0, 0.6);"][style*="align-items: flex-start;"]:not(.dialog-modal-layer) .note-property-box label::after { + content: ":"; + } +} +@media screen { + .tag-selector [class*=control], +.item-selector [class*=control] { + border: none !important; + background-color: var(--g-controlBackgroundColor) !important; + border-radius: 0.5rem; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 16px hsla(var(--s-controlAccentColor--hsl), 0) !important; + color: var(--g-textColor) !important; + height: 2rem; + padding: 0 0 0 1rem; + top: 0.6rem; + height: 1.8rem !important; + min-height: 0; + padding: 0 0 0 0.4rem; + } + .tag-selector [class*=control]:focus-within, .tag-selector [class*=control]:focus, +.item-selector [class*=control]:focus-within, +.item-selector [class*=control]:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 0.35rem hsla(var(--s-controlAccentColor--hsl), 0.5) !important; + } + .tag-selector [class*=control] > div, +.item-selector [class*=control] > div { + padding: 0; + height: 1.8rem; + } + .tag-selector input[type=text], +.tag-selector input[type=text]:focus, +.item-selector input[type=text], +.item-selector input[type=text]:focus { + box-shadow: none !important; + font-size: var(--g-font-size--1) !important; + } + .tag-selector [class*=indicatorSeparator], +.item-selector [class*=indicatorSeparator] { + display: none; + } + .tag-selector [class*=indicatorContainer], +.item-selector [class*=indicatorContainer] { + padding: 0 0.2rem; + } + .tag-selector [class*=indicatorContainer]:after, +.item-selector [class*=indicatorContainer]:after { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + color: var(--g-alternateSelectedControlTextColor) !important; + background-color: hsl(var(--s-accentColor--hsl)); + background-image: linear-gradient(hsl(var(--s-accentColor--hsl)), hsl(var(--s-accentColor--hs), calc(var(--s-accentColor--l) - 5%))); + box-shadow: 0px 0px 1px hsla(var(--s-accentColor--hsl), 0.3), 0px 1px 1.5px hsla(var(--s-accentColor--hsl), 0.15); + content: var(--s-icon-chevron-up-chevron-down) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + font-size: var(--g-font-size--1) !important; + min-width: 0 !important; + height: 1.6rem !important; + padding: 0 !important; + min-width: 0; + text-align: center; + line-height: 1.8rem !important; + width: 1.6rem !important; + } + .tag-selector [class*=indicatorContainer]:after:active, +.item-selector [class*=indicatorContainer]:after:active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } + .tag-selector [class*=indicatorContainer] *, +.item-selector [class*=indicatorContainer] * { + display: none; + } +} +@media screen { + .tag-selector > div > div:first-child > div + div { + margin-left: 0rem; + } + .tag-selector > div > div:first-child input { + background: transparent !important; + line-height: 1.2rem; + } + .tag-selector [class*=multiValue] { + background-color: var(--g-gridColor) !important; + border-radius: 0.2rem !important; + margin: 0 0.4rem 0 0 !important; + padding: 0 0.4rem !important; + } + .tag-selector [class*=multiValue] * { + color: var(--g-textColor) !important; + font-size: 1.1rem !important; + font-family: var(--s-font-family-system); + line-height: 1.2rem !important; + height: 1.2rem !important; + padding: 0; + } + .tag-selector [class*=multiValue] > div:first-child { + flex: 1 0 auto; + } + .tag-selector [class*=multiValue] > div:last-child { + flex: 1 0 auto; + margin: 0 0 0 0.4rem !important; + line-height: 22px; + background-color: transparent !important; + } + .tag-selector [class*=multiValue] > div:last-child::after { + content: var(--s-icon-xmark) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--g-controlTextColor); + font-size: 0.8rem; + font-weight: 600; + } + .tag-selector [class*=multiValue] > div:last-child:hover { + background-color: transparent; + } + .tag-selector [class*=multiValue] > div:last-child svg { + display: none; + } +} +@media screen { + .item-selector > div[class*=control] > div:first-child { + font-size: 1.1rem; + line-height: 1.8; + } + .item-selector > div[class*=control] > div:first-child > div:last-child { + min-width: 0; + position: absolute; + } + .item-selector > div[class*=control] > div:first-child > div:last-child input { + background: transparent !important; + } +} +@media screen { + .rdtPicker { + background: var(--g-windowBackgroundColor) !important; + box-shadow: 0 0 1px rgba(var(--g-shadowColor--rgb), 0.4), 0 2px 8px rgba(var(--g-shadowColor--rgb), 0.2) !important; + max-width: none !important; + padding: 0.5rem !important; + border-color: transparent !important; + border-radius: 0.4rem; + color: var(--g-textColor); + min-width: 0; + padding: 0.6rem 0.2rem 0 0.2rem !important; + min-width: 16rem; + } + .rdtPicker *, +.rdtPicker *:hover { + background-color: transparent !important; + cursor: default !important; + user-select: none; + } + .rdtPicker thead .rdtSwitch { + order: -1; + flex: 1; + text-align: left; + width: auto; + } + .rdtPicker thead .rdtPrev, +.rdtPicker thead .rdtNext { + flex: 0 0 auto; + margin: 0 0.2rem; + } + .rdtPicker thead tr th { + border-bottom: transparent; + } + .rdtPicker thead tr:first-child th { + margin-left: 0.4rem; + font-size: 1.2rem; + color: var(--g-textColor); + } + .rdtPicker thead tr:last-child { + border-bottom: 0.1rem solid var(--g-separatorColor); + margin-bottom: 0.4rem; + padding: 0 0 0.4rem; + } + .rdtPicker thead tr:last-child th { + border-bottom: transparent; + color: var(--g-secondaryLabelColor); + font-size: 1rem; + height: auto; + } + .rdtPicker tfoot { + border-top-color: var(--g-separatorColor); + } + .rdtPicker tfoot .rdtTimeToggle { + font-size: 1.4rem; + display: flex; + align-items: center; + justify-content: center; + } + .rdtPicker tr { + display: flex; + justify-content: space-between; + align-items: center; + } + .rdtPicker tr th, +.rdtPicker tr td { + padding: 0; + flex: 1; + height: auto; + } + .rdtPicker td[data-value] { + padding: 0 0.5rem !important; + font-size: 1rem !important; + height: 1.6rem; + min-height: 0; + min-width: 2.5rem; + } + .rdtPicker td[data-value].rdtToday { + color: var(--g-systemRed) !important; + } + .rdtPicker td[data-value].rdtToday:before { + border-color: transparent; + } + .rdtPicker td[data-value].rdtActive { + color: var(--g-textColor); + background-color: var(--g-quaternaryLabelColor) !important; + border-radius: 0.2rem; + bottom: 0; + left: 0; + right: 0; + text-shadow: none; + top: 0; + z-index: -1; + } + .rdtPicker * { + border-color: transparent; + } +} +@media screen { + .smalltalk { + background: rgba(var(--g-underPageBackgroundColor--rgb), 0.5) !important; + height: 100% !important; + } + .smalltalk * { + font-family: var(--s-font-family-system); + } + .smalltalk .page { + backdrop-filter: blur(10px) saturate(100%) contrast(45%) brightness(130%); + background-color: var(--g-windowBackgroundColor) !important; + padding: 2rem !important; + border-radius: 1.2rem !important; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.8), 0px 0px 20px rgba(0, 0, 0, 0.15), 0px 25px 30px rgba(0, 0, 0, 0.35) !important; + } + .smalltalk .page header, +.smalltalk .page .close-button { + display: none; + } + .smalltalk .page .content-area { + align-items: center; + color: var(--g-secondaryLabelColor) !important; + display: flex; + gap: 0.8rem; + font-size: 1.2rem; + overflow: initial; + padding: 0; + } + .smalltalk .page .content-area input[type=text] { + border: none !important; + background-color: var(--g-controlBackgroundColor) !important; + border-radius: 0.5rem; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 16px hsla(var(--s-controlAccentColor--hsl), 0) !important; + color: var(--g-textColor) !important; + height: 2rem; + padding: 0 0 0 1rem; + color: var(--g-textColor); + flex: 1 0; + margin-top: 0; + } + .smalltalk .page .content-area input[type=text]:focus-within, .smalltalk .page .content-area input[type=text]:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 0.35rem hsla(var(--s-controlAccentColor--hsl), 0.5) !important; + } + .smalltalk .page .action-area { + padding: 0; + } + .smalltalk .page .button-strip { + display: flex; + flex-direction: row-reverse; + gap: 0.8rem; + position: relative; + margin-top: 2rem !important; + padding-top: 2rem !important; + } + .smalltalk .page .button-strip:before { + content: ""; + top: 0; + left: -2rem; + right: -2rem; + background: var(--g-separatorColor); + height: 0.1rem; + position: absolute; + } + .smalltalk .page .button-strip button { + text-shadow: none; + box-shadow: 0 0 0 16px hsla(var(--g-controlAccentColor--hsl), 0); + } + .smalltalk .page .button-strip button:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0 0 0 0.35rem hsla(var(--g-controlAccentColor--hsl), 0.5); + } + .smalltalk .page .button-strip button:first-child { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + color: var(--g-alternateSelectedControlTextColor) !important; + background-color: hsl(var(--s-accentColor--hsl)); + background-image: linear-gradient(hsl(var(--s-accentColor--hsl)), hsl(var(--s-accentColor--hs), calc(var(--s-accentColor--l) - 5%))); + box-shadow: 0px 0px 1px hsla(var(--s-accentColor--hsl), 0.3), 0px 1px 1.5px hsla(var(--s-accentColor--hsl), 0.15); + } + .smalltalk .page .button-strip button:first-child:active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } + .smalltalk .page .button-strip button:last-child:not(:first-child) { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + background-image: none; + margin-left: auto !important; + } + .smalltalk .page .button-strip button:last-child:not(:first-child):active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } +} +@media screen { + .tox .tox-dialog-wrap .tox-dialog-wrap__backdrop { + background: rgba(var(--g-underPageBackgroundColor--rgb), 0.5) !important; + height: 100% !important; + } + .tox .tox-dialog-wrap .tox-dialog { + backdrop-filter: blur(10px) saturate(100%) contrast(45%) brightness(130%); + background-color: var(--g-windowBackgroundColor) !important; + padding: 2rem !important; + border-radius: 1.2rem !important; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.8), 0px 0px 20px rgba(0, 0, 0, 0.15), 0px 25px 30px rgba(0, 0, 0, 0.35) !important; + border: none; + } + .tox .tox-dialog-wrap .tox-dialog__body { + flex-direction: column; + } + .tox .tox-dialog-wrap .tox-dialog__body-nav { + flex-direction: row; + justify-content: center; + gap: 4px; + padding-top: 0; + } + .tox .tox-dialog-wrap .tox-dialog__body-nav-item { + font-size: 1.2rem; + background-color: transparent; + color: var(--g-labelColor); + border-bottom: none; + border-radius: 0.5rem; + margin: 0; + padding: 4px; + } + .tox .tox-dialog-wrap .tox-dialog__body-nav-item--active { + background-color: var(--g-controlColor); + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + } + .tox .tox-dialog-wrap .tox-form__group { + align-items: center; + display: flex; + gap: 0.8rem; + margin-bottom: 0; + overflow: initial; + padding: 0; + } + .tox .tox-dialog-wrap .tox-form__group + .tox-form__group { + margin-top: 0.8rem; + } + .tox .tox-dialog-wrap .tox-form__group .tox-label { + color: var(--g-secondaryLabelColor) !important; + font-size: 1.2rem; + width: 10rem; + text-align: right; + padding: 0; + } + .tox .tox-dialog-wrap .tox-form__group input { + border: none !important; + background-color: var(--g-controlBackgroundColor) !important; + border-radius: 0.5rem; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 16px hsla(var(--s-controlAccentColor--hsl), 0) !important; + color: var(--g-textColor) !important; + height: 2rem; + padding: 0 0 0 1rem; + flex: 1; + font-size: 1.2rem; + min-height: unset; + } + .tox .tox-dialog-wrap .tox-form__group input:focus-within, .tox .tox-dialog-wrap .tox-form__group input:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 0.35rem hsla(var(--s-controlAccentColor--hsl), 0.5) !important; + } + .tox .tox-dialog-wrap .tox-form__group .tox-checkbox .tox-checkbox__label { + color: var(--g-secondaryLabelColor) !important; + font-size: 1.2rem; + width: 10rem; + padding: 0; + } + .tox .tox-dialog-wrap .tox-form__group .tox-checkbox svg { + fill: var(--g-disabledControlTextColor); + } + .tox .tox-dialog-wrap .tox-form__group .tox-listboxfield button { + border: none !important; + background-color: var(--g-controlBackgroundColor) !important; + border-radius: 0.5rem; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 16px hsla(var(--s-controlAccentColor--hsl), 0) !important; + color: var(--g-textColor) !important; + height: 2rem; + padding: 0 0 0 1rem; + min-height: 0; + font-size: var(--g-font-size--1) !important; + padding: 0; + } + .tox .tox-dialog-wrap .tox-form__group .tox-listboxfield button:focus-within, .tox .tox-dialog-wrap .tox-form__group .tox-listboxfield button:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 0px 1px rgba(0, 0, 0, 0.15), 0 0 0 0.35rem hsla(var(--s-controlAccentColor--hsl), 0.5) !important; + } + .tox .tox-dialog-wrap .tox-form__group .tox-color-input input { + padding-left: 24px; + } + .tox .tox-dialog-wrap .tox-form__group .tox-color-input span { + top: 3px; + left: 3px; + } + .tox .tox-dialog-wrap .tox-form__group .tox-color-input span, +.tox .tox-dialog-wrap .tox-form__group .tox-color-input span::before { + cursor: default; + height: 14px !important; + width: 14px !important; + } + .tox .tox-dialog-wrap .tox-dialog__body-content { + overflow: initial; + padding: 0; + } + .tox .tox-dialog-wrap .tox-dialog__header { + background-color: transparent !important; + display: flex; + justify-content: center; + padding: 0 0 2rem; + } + .tox .tox-dialog-wrap .tox-dialog__header .tox-dialog__title { + color: var(--g-labelColor) !important; + font-size: 1.3rem !important; + font-weight: bold; + } + .tox .tox-dialog-wrap .tox-dialog__header button { + display: none; + } + .tox .tox-dialog-wrap .tox-dialog__footer { + position: relative; + margin-top: 2rem !important; + padding-top: 2rem !important; + background-color: transparent !important; + padding: 0; + } + .tox .tox-dialog-wrap .tox-dialog__footer:before { + content: ""; + top: 0; + left: -2rem; + right: -2rem; + background: var(--g-separatorColor); + height: 0.1rem; + position: absolute; + } + .tox .tox-dialog-wrap .tox-dialog__footer-end { + display: flex; + gap: 0.8rem; + } + .tox .tox-dialog-wrap .tox-dialog__footer button:first-child { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + background-image: none; + margin-left: auto !important; + } + .tox .tox-dialog-wrap .tox-dialog__footer button:first-child:active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } + .tox .tox-dialog-wrap .tox-dialog__footer button:last-child:not(:first-child) { + color: var(--g-controlTextColor) !important; + border: none !important; + border-radius: 0.5rem !important; + box-shadow: 0px 0px 1px rgba(var(--g-shadowColor--rgb), 0.3), 0px 1px 1.5px rgba(var(--g-shadowColor--rgb), 0.15); + background-color: var(--g-controlColor) !important; + cursor: default !important; + margin: revert !important; + height: 1.9rem !important; + line-height: 1.9rem !important; + min-width: 7.2rem !important; + min-height: 0 !important; + font-size: 1.4rem !important; + font-weight: 400 !important; + padding: 0 2rem !important; + text-decoration: none !important; + color: var(--g-alternateSelectedControlTextColor) !important; + background-color: hsl(var(--s-accentColor--hsl)); + background-image: linear-gradient(hsl(var(--s-accentColor--hsl)), hsl(var(--s-accentColor--hs), calc(var(--s-accentColor--l) - 5%))); + box-shadow: 0px 0px 1px hsla(var(--s-accentColor--hsl), 0.3), 0px 1px 1.5px hsla(var(--s-accentColor--hsl), 0.15); + } + .tox .tox-dialog-wrap .tox-dialog__footer button:last-child:not(:first-child):active { + color: rgba(255, 255, 255, 0.75) !important; + background-image: linear-gradient(hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 5%)), hsl(var(--s-accentColor--h), var(--s-accentColor--s), calc(var(--s-accentColor--l) - 10%))); + } +} +@media screen { + .rli-sideBar { + background: var(--s-sidebar__BackgroundColor); + } + .rli-sideBar > span > div { + z-index: 1; + } +} +@media screen { + .sidebar.sidebar { + background-color: transparent; + padding-top: 1rem; + } + .sidebar.sidebar * { + font-family: var(--s-font-family-system) !important; + } + .sidebar.sidebar > div > div button { + display: none; + margin-right: 0; + position: absolute; + right: 0; + } + .sidebar.sidebar > div > div button span::before { + content: var(--s-icon-plus-circle) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .sidebar.sidebar > div > div:hover button { + display: block; + } + + .sidebar-header-button.-collapseall { + display: none !important; + } + + .sidebar-header-button.-newfolder { + height: unset !important; + margin-top: -.45rem !important; + } + + + .sidebar.sidebar > div > div:first-child span, +.sidebar.sidebar > div .folder-and-tag-list + div span, +.sidebar.sidebar > div .folders + div span { + text-transform: none; + color: var(--s-sidebar__label-Color); + font-size: var(--s-sidebar__label-FontSize); + font-weight: 700; + } + .sidebar.sidebar > div .all-notes { + background: none; + color: var(--s-sidebar__item-Color); + } + .sidebar.sidebar > div .all-notes a { + font-size: 1.35rem !important; + color: inherit; + } + .sidebar.sidebar > div .list-item-container { + border-radius: 4px; + height: 2.8rem; + margin: 0 10px; + padding: 0; + transition: none; + } + .sidebar.sidebar > div .list-item-container:hover { + background: transparent; + } + .sidebar.sidebar > div .list-item-container.selected { + background: var(--u-sidebar-selected-item-color, var(--g-unemphasizedSelectedTextBackgroundColor)); + } + /* All notes selected */ + .sidebar .item-list:not(:has(.list-item-container.selected)) .all-notes { + background: var(--u-sidebar-selected-item-color, var(--g-unemphasizedSelectedTextBackgroundColor)) !important; + + } + .sidebar.sidebar > div .list-item-container.selected .emoji-box, +.sidebar.sidebar > div .list-item-container.selected img { + background-color: var(--u-sidebar-selected-item-color, var(--g-unemphasizedSelectedTextBackgroundColor)) !important; + } + .sidebar.sidebar > div .list-item-container a:first-of-type { + opacity: 1; + padding-right: 0; + } + .sidebar.sidebar > div .list-item { + opacity: 1; + display: flex; + line-height: 2.8rem; + overflow: hidden; + width: 100%; + } + .sidebar.sidebar > div .list-item .title, +.sidebar.sidebar > div .list-item .tag-label { + color: var(--s-sidebar__item-Color); + font-size: 1.35rem; + font-weight: normal; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; + } + .sidebar.sidebar > div .list-item .note-count-label { + display: block; + padding-left: 0; + margin-left: 5px; + padding-right: 8px; + color: var(--u-sidebar-note-count-label-color, var(--g-secondaryLabelColor)); + opacity: 0.5; + font-size: 1.1rem; + line-height: 1; + font-weight: 500; + } + .sidebar.sidebar > div .list-item .fa-share-alt::before { + content: var(--s-icon-person-2) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--u-sidebar-note-count-label-color, var(--g-secondaryLabelColor)); + font-size: 11px; + font-weight: 500; + } + .sidebar.sidebar > div .list-item .fa-share-alt:last-child { + margin-right: 8px; + } + .sidebar.sidebar > div .list-item span[style*="font-size: 20px;"] { + font-size: 16px !important; + } + .sidebar.sidebar > div .folders .list-item::before, +.sidebar.sidebar > div .tags .list-item::before, +.sidebar.sidebar > div .folder-and-tag-list .list-item::before { + color: var(--s-sidebar__icon-Color); + margin-right: 0.7rem; + font-weight: 400; + font-size: 13px; + -webkit-font-smoothing: antialiased; + } + .sidebar.sidebar > div .folders .list-item, +.sidebar.sidebar > div .folder-and-tag-list .list-item { + position: relative; + } + .sidebar.sidebar > div .folders .list-item div:first-child:first-of-type, +.sidebar.sidebar > div .folder-and-tag-list .list-item div:first-child:first-of-type { + margin-right: 0 !important; + } + .sidebar.sidebar > div .folders .list-item div:first-child:first-of-type .fa-folder, +.sidebar.sidebar > div .folders .list-item div:first-child:first-of-type .fa-trash, +.sidebar.sidebar > div .folder-and-tag-list .list-item div:first-child:first-of-type .fa-folder, +.sidebar.sidebar > div .folder-and-tag-list .list-item div:first-child:first-of-type .fa-trash { + display: none; + } + .sidebar.sidebar > div .folders .list-item .emoji-box, +.sidebar.sidebar > div .folders .list-item img, +.sidebar.sidebar > div .folder-and-tag-list .list-item .emoji-box, +.sidebar.sidebar > div .folder-and-tag-list .list-item img { + align-items: center; + background-color: var(--s-sidebar__BackgroundColor); + display: block; + font-size: 18px !important; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); + } + .sidebar.sidebar > div .folders .list-item img, +.sidebar.sidebar > div .folder-and-tag-list .list-item img { + height: 16px !important; + width: 16px !important; + } + .sidebar.sidebar > div .folders .list-item .emoji-box, +.sidebar.sidebar > div .folder-and-tag-list .list-item .emoji-box { + height: 18px !important; + width: 18px !important; + } + .sidebar.sidebar > div .folders .list-item::before, +.sidebar.sidebar > div .folder-and-tag-list .list-item::before { + content: var(--s-icon-folder) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .sidebar.sidebar > div .folders .list-item:has(.fa-trash)::before, +.sidebar.sidebar > div .folder-and-tag-list .list-item:has(.fa-trash)::before { + content: var(--s-icon-trash) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .sidebar.sidebar > div .folders .list-item:has(.tag-label)::before, +.sidebar.sidebar > div .folder-and-tag-list .list-item:has(.tag-label)::before { + content: var(--s-icon-tag) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + } + .sidebar.sidebar > div .list-item-depth-0 { + padding-left: 0rem; + } + .sidebar.sidebar > div .list-item-depth-1 { + padding-left: 0rem; + } + .sidebar.sidebar > div .list-item-depth-1 .sidebar-expand-link { + padding-right: 0; + } + .sidebar.sidebar > div .list-item-depth-2 { + padding-left: 3.4rem; + } + .sidebar.sidebar > div .list-item-depth-3 { + padding-left: 5rem; + } + .sidebar.sidebar > div .list-item-depth-4 { + padding-left: 6.6rem; + } + .sidebar.sidebar > div .list-item-depth-5 { + padding-left: 8.2rem; + } + .sidebar.sidebar > div .list-item-depth-6 { + padding-left: 9.8rem; + } + .sidebar.sidebar > div .list-item-depth-7 { + padding-left: 11.4rem; + } + .sidebar.sidebar > div .list-item-depth-8 { + padding-left: 13rem; + } + .sidebar.sidebar > div .list-item-depth-9 { + padding-left: 14.6rem; + } + .sidebar.sidebar .fas { + opacity: 1 !important; + } + .sidebar.sidebar .fas::before { + font-size: 9px; + font-weight: 700; + -webkit-font-smoothing: antialiased; + } + .sidebar.sidebar .fas.fa-caret-right::before { + content: var(--s-icon-chevron-forward) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--s-sidebar__chevron-Color); + } + .sidebar.sidebar .fas.fa-caret-down::before { + content: var(--s-icon-chevron-down) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + color: var(--s-sidebar__chevron-Color); + } + .sidebar.sidebar .fas.fa-plus::before { + color: var(--g-tertiaryLabelColor); + font-weight: 500; + font-size: 14px; + -webkit-font-smoothing: unset; + } + .sidebar.sidebar button:has(.fas.fa-plus) { + padding-top: 0 !important; + } + .sidebar.sidebar .icon-notebooks, +.sidebar.sidebar .icon-tags, +.sidebar.sidebar .icon-notes { + display: none; + } + @keyframes tooltipTimeout { + 0% { + opacity: 0; + } + 99% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + .sidebar.sidebar > div:last-child > div:first-child { + opacity: var(--u-sidebar-synchronise-label, 0); + pointer-events: none; + background-color: var(--u-sidebar-synchronise-label, var(--g-unemphasizedSelectedContentBackgroundColor)); + padding: var(--u-sidebar-synchronise-label, 0.4rem); + position: var(--u-sidebar-synchronise-label, absolute); + width: auto; + bottom: 20px; + box-shadow: var(--u-sidebar-synchronise-label, 0 0 1px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2)); + } + .sidebar.sidebar > div:last-child > div:first-child div { + color: var(--s-sidebar__synchronise-label-Color); + } + .sidebar.sidebar > div:last-child:hover > div:first-child { + animation: var(--u-sidebar-synchronise-label, tooltipTimeout 1s); + opacity: 1; + } + .sidebar.sidebar > div:last-child button { + border: none; + justify-content: flex-start; + padding: 0; + text-align: left; + font-size: 1.3rem; + height: unset !important; + min-height: unset !important; + max-height: unset !important; + padding-top: .6rem !important; + margin-bottom: .5rem !important; + } + .sidebar.sidebar > div:last-child button span { + color: var(--s-sidebar__synchronise-Color); + } + .sidebar.sidebar > div:last-child button:hover span { + color: var(--s-sidebar__synchronise-Color); + } + .sidebar.sidebar > div:last-child button .icon-sync { + font-size: inherit; + transform-origin: 50% 48%; + } + .sidebar.sidebar > div:last-child button .icon-sync::before { + content: var(--s-icon-arrow-triangle-2-circlepath) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + font-size: 1.2rem; + -webkit-font-smoothing: antialiased; + } +} +@media screen { + .CodeMirror.CodeMirror { + line-height: 1.6 !important; + background-color: transparent !important; + color: var(--g-textColor) !important; + } + .CodeMirror.CodeMirror * { + -webkit-font-smoothing: antialiased; + } + .CodeMirror.CodeMirror .cm-header-1, +.CodeMirror.CodeMirror .cm-header-2, +.CodeMirror.CodeMirror .cm-header-3, +.CodeMirror.CodeMirror .cm-header-4, +.CodeMirror.CodeMirror .cm-header-5, +.CodeMirror.CodeMirror .cm-header-6, +.CodeMirror.CodeMirror .cm-strong { + color: inherit; + } +} +@media screen { + .rli-root .resizableLayoutItem { + position: relative; + } + .rli-root .resizableLayoutItem > span > div[style*="cursor: row-resize;"], +.rli-root .resizableLayoutItem > span > div[style*="cursor: col-resize;"] { + z-index: 100; + } + .rli-root > .resizableLayoutItem:not(:first-child):after { + content: ""; + background-color: var(--g-gridColor); + bottom: 0; + pointer-events: none; + position: absolute; + left: 0; + top: 0; + width: 0.1rem; + z-index: 100; + } + .rli-root > .resizableLayoutItem .resizableLayoutItem:not(:first-child):after { + content: ""; + background-color: var(--g-gridColor); + bottom: auto; + height: 0.1rem; + left: 0; + pointer-events: none; + position: absolute; + right: 0; + top: 0.1rem; + width: 100%; + } +} +@media screen { + #plugin-view-outline-outline\.panel { + border-bottom: none; + padding: 1.2rem 0.5rem; + } +} +@media screen { + body#tinymce, +#joplin-container-content { + background: var(--g-primary-Background); + font-size: 1.4rem; + font-family: var(--s-font-family-system); + line-height: 1.6; + padding: 2.8rem; + color: var(--g-textColor); + -webkit-font-smoothing: antialiased; + margin-left: var(--u-editor-margin-left, auto); + margin-right: var(--u-editor-margin-right, auto); + } + body#tinymce a, +#joplin-container-content a { + color: var(--g-linkColor); + cursor: pointer; + } + body#tinymce > *, +#joplin-container-content > * { + margin: 0 0 1.4rem; + } + body#tinymce h1, +body#tinymce h2, +body#tinymce h3, +body#tinymce h4, +body#tinymce h5, +#joplin-container-content h1, +#joplin-container-content h2, +#joplin-container-content h3, +#joplin-container-content h4, +#joplin-container-content h5 { + color: var(--g-headerTextColor); + padding: 0; + line-height: 1.25; + margin: 0 !important; + padding: calc(var(--u-editor-paragraph-spacing, 1.5rem) / 2) 0 !important; + } + body#tinymce h1, +#joplin-container-content h1 { + font-size: 2.4rem; + border-bottom: none; + margin-bottom: 0; + line-height: 1; + } + body#tinymce strong, +#joplin-container-content strong { + color: var(--g-textColor); + } + body#tinymce img, +#joplin-container-content img { + margin-top: 1.4rem; + } + body#tinymce ul, +body#tinymce ol, +#joplin-container-content ul, +#joplin-container-content ol { + margin-left: 1.8rem; + margin-bottom: var(--u-editor-paragraph-spacing, 1.5rem); + } + body#tinymce ul li, +body#tinymce ol li, +#joplin-container-content ul li, +#joplin-container-content ol li { + margin-bottom: 0.35rem; + } + body#tinymce ul p, +body#tinymce ol p, +#joplin-container-content ul p, +#joplin-container-content ol p { + margin-bottom: 0; + } + body#tinymce p, +#joplin-container-content p { + margin-bottom: var(--u-editor-paragraph-spacing, 1.5rem); + } + body#tinymce table, +#joplin-container-content table { + background: var(--g-alternatingContentBackgroundColorsEven); + } + body#tinymce table th, +#joplin-container-content table th { + background: var(--g-alternatingContentBackgroundColorsOdd); + border-bottom-width: 0.1rem; + } + body#tinymce table tr:nth-child(even), +#joplin-container-content table tr:nth-child(even) { + background: var(--g-alternatingContentBackgroundColorsOdd); + } + body#tinymce table tr:nth-child(odd), +#joplin-container-content table tr:nth-child(odd) { + background: var(--g-alternatingContentBackgroundColorsEven); + } + body#tinymce table th, +body#tinymce table td, +#joplin-container-content table th, +#joplin-container-content table td { + font-family: var(--g-global-font-family-system); + border-color: var(--g-gridColor); + color: var(--g-textColor); + } + body#tinymce pre:not(.mermaid), +body#tinymce .inline-code, +#joplin-container-content pre:not(.mermaid), +#joplin-container-content .inline-code { + background-color: var(--g-alternatingContentBackgroundColorsOdd); + color: var(--g-textColor); + border-radius: 0.4rem; + font-family: var(--g-font-family-mono); + font-size: 1.4rem; + } +} +@media screen and (prefers-color-scheme: dark) { + body#tinymce pre:not(.mermaid), +body#tinymce .inline-code, +#joplin-container-content pre:not(.mermaid), +#joplin-container-content .inline-code { + background-color: rgba(var(--g-shadowColor--rgb), 0.2); + } +} +@media screen { + body#tinymce pre:not(.mermaid) *, +body#tinymce .inline-code *, +#joplin-container-content pre:not(.mermaid) *, +#joplin-container-content .inline-code * { + font-family: inherit !important; + } +} +@media screen { + body#tinymce pre.mermaid, +#joplin-container-content pre.mermaid { + background: none; + } +} +@media screen { + body#tinymce ul.joplin-checklist, +#joplin-container-content ul.joplin-checklist { + margin-left: 2.2rem; + } + body#tinymce ul.joplin-checklist li:not(.checked), +#joplin-container-content ul.joplin-checklist li:not(.checked) { + position: relative; + } + body#tinymce ul.joplin-checklist li:not(.checked):before, +#joplin-container-content ul.joplin-checklist li:not(.checked):before { + content: ""; + border-radius: 50%; + border: 0.1rem solid var(--g-tertiaryLabelColor); + display: flex; + height: 1.4rem; + justify-content: center; + margin-left: -2.4rem; + width: 1.4rem; + left: 0; + position: absolute; + top: 0; + } + body#tinymce ul.joplin-checklist li:not(.checked):before, +#joplin-container-content ul.joplin-checklist li:not(.checked):before { + top: 0.3rem; + } + body#tinymce ul.joplin-checklist li.checked, +#joplin-container-content ul.joplin-checklist li.checked { + position: relative; + opacity: 1; + } + body#tinymce ul.joplin-checklist li.checked:before, +#joplin-container-content ul.joplin-checklist li.checked:before { + content: var(--s-icon-checkmark) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + background-color: var(--s-controlAccentColor); + border: 0.1rem solid var(--s-controlAccentColor); + border-radius: 50%; + color: var(--g-alternateSelectedControlTextColor); + display: block; + font-size: 1rem; + top: 0; + margin-left: -2.4rem; + height: 1.4rem; + line-height: 1.5rem; + position: absolute; + text-align: center; + transform: scale(1); + width: 1.4rem; + } + body#tinymce ul.joplin-checklist li.checked:before, +#joplin-container-content ul.joplin-checklist li.checked:before { + font-weight: 600; + top: 0.3rem; + } +} +@media screen { + body#tinymce li.joplin-checkbox, +#joplin-container-content li.joplin-checkbox { + margin-left: 0.6rem; + } + body#tinymce li.joplin-checkbox input, +#joplin-container-content li.joplin-checkbox input { + display: none; + } + body#tinymce li.joplin-checkbox .checkbox-wrapper, +#joplin-container-content li.joplin-checkbox .checkbox-wrapper { + position: relative; + } + body#tinymce li.joplin-checkbox .checkbox-label-unchecked, +#joplin-container-content li.joplin-checkbox .checkbox-label-unchecked { + position: relative; + } + body#tinymce li.joplin-checkbox .checkbox-label-unchecked:before, +#joplin-container-content li.joplin-checkbox .checkbox-label-unchecked:before { + content: ""; + border-radius: 50%; + border: 0.1rem solid var(--g-tertiaryLabelColor); + display: flex; + height: 1.4rem; + justify-content: center; + margin-left: -2.4rem; + width: 1.4rem; + left: 0; + position: absolute; + top: 0; + } + body#tinymce li.joplin-checkbox .checkbox-label-checked, +#joplin-container-content li.joplin-checkbox .checkbox-label-checked { + opacity: 1; + position: relative; + position: relative; + } + body#tinymce li.joplin-checkbox .checkbox-label-checked:before, +#joplin-container-content li.joplin-checkbox .checkbox-label-checked:before { + content: var(--s-icon-checkmark) !important; + font-family: var(--s-font-family-icons) !important; + vertical-align: middle; + display: block; + transform: scale(var(--s-icon-size-factor)); + background-color: var(--s-controlAccentColor); + border: 0.1rem solid var(--s-controlAccentColor); + border-radius: 50%; + color: var(--g-alternateSelectedControlTextColor); + display: block; + font-size: 1rem; + top: 0; + margin-left: -2.4rem; + height: 1.4rem; + line-height: 1.5rem; + position: absolute; + text-align: center; + transform: scale(1); + width: 1.4rem; + } +} +@media screen { + body#tinymce [data-mce-selected=inline-boundary].inline-code, +#joplin-container-content [data-mce-selected=inline-boundary].inline-code { + background-color: #f3f3f3; + } +} +@media screen { + body#tinymce .mermaid div, +#joplin-container-content .mermaid div { + color: var(--g-textColorDark); + } +} + + +/* Macos Theme Settings */ + + + :root { + /* General --------------------------------- */ + --u-base-font-size: 100%; + + + + /* Icons -------------------------------- */ + + + /* Sidebar --------------------------------- */ + --u-sidebar-synchronise-label: ''; + + /* Note list ----------------------------- */ + + + --u-note-list-zebra-color-odd: transparent; + --u-note-list-zebra-color-even: transparent; + + + /* Editor -------------------------------- */ + --u-editor-paragraph-spacing: 1.5rem; + --u-editor-margin-right: auto ; + --u-editor-margin-left: 0 ; + + /* + properties that currently can't be selected via the UI, but maybe should... + + --u-font-family-system: 'Segoe UI', sans-serif; + --u-font-family-system-rounded: 'Segoe UI', sans-serif; + --u-sidebar-label-font-size: 1.5rem; + --u-sidebar-synchronise-label-color: hsl(0, 0%, 50%); + */ + } + + + + + @media(prefers-color-scheme: dark) { + :root { + + --g-systemBlue: rgba(10, 132, 255, 1); + --g-systemBrown: rgba(172, 142, 104, 1); + --g-systemGray: rgba(152, 152, 157, 1); + --g-systemGreen: rgba(50, 215, 75, 1); + --g-systemIndigo: rgba(94, 92, 230, 1); + --g-systemOrange: rgba(255, 159, 10, 1); + --g-systemPink: rgba(255, 55, 95, 1); + --g-systemPurple: rgba(191, 90, 242, 1); + --g-systemRed: rgba(255, 69, 58, 1); + --g-systemTeal: rgba(90, 200, 245, 1); + --g-systemYellow: rgba(255, 214, 10, 1); + + /* Labels */ + --g-labelColor: rgba(255, 255, 255, 0.847); + --g-secondaryLabelColor: rgba(255, 255, 255, 0.549); + --g-tertiaryLabelColor: rgba(255, 255, 255, 0.247); + --g-quaternaryLabelColor: rgba(255, 255, 255, 0.098); + + /* Text */ + --g-textColor: rgba(255, 255, 255, 1); + --g-textColorDark: rgba(0, 0, 0, 1); + --g-placeholderTextColor: rgba(255, 255, 255, 0.247); + --g-selectedTextColor: rgba(255, 255, 255, 1); + --g-textBackgroundColor: rgba(30, 30, 30, 1); + --g-selectedTextBackgroundColor: rgba(63, 99, 139, 1); + --g-keyboardFocusIndicatorColor: rgba(26, 169, 255, 0.298); + --g-unemphasizedSelectedTextColor: rgba(255, 255, 255, 1); + --g-unemphasizedSelectedTextBackgroundColor: rgba(70, 70, 70, 1); + + /* Content */ + --g-alternatingContentBackgroundColorsEven: rgba(30, 30, 30, 1); + --g-alternatingContentBackgroundColorsOdd: rgba(255, 255, 255, 0.047); + --g-linkColor: rgba(65, 156, 255, 1); + --g-separatorColor: rgba(255, 255, 255, 0.098); + --g-selectedContentBackgroundColor: rgba(0, 88, 208, 1); + --g-selectedContentBackgroundColor--h: 215; + --g-selectedContentBackgroundColor--s: 100%; + --g-selectedContentBackgroundColor--l: 41%; + --g-unemphasizedSelectedContentBackgroundColor: rgba(70, 70, 70, 1); + + /* Menus */ + --g-selectedMenuItemTextColor: rgba(255, 255, 255, 1); + + /* Tables */ + --g-gridColor: rgba(26, 26, 26, 1); + --g-headerTextColor: rgba(255, 255, 255, 1); + + /* Controls */ + --g-controlAccentColor--h: 211; + --g-controlAccentColor--s: 100%; + --g-controlAccentColor--l: 50%; + --g-controlAccentColor--hsl: var(--g-controlAccentColor--h), var(--g-controlAccentColor--s), var(--g-controlAccentColor--l); + --g-controlAccentColor: hsla(var(--g-controlAccentColor--hsl), 1); + --g-controlColor: rgba(255, 255, 255, 0.247); + --g-controlColor--rgb: 255, 255, 255; + --g-controlColor--hsl: 0, 0%, 100%; + --g-controlBackgroundColor: rgba(30, 30, 30, 1); + --g-controlTextColor: rgba(255, 255, 255, 0.847); + --g-disabledControlTextColor: rgba(255, 255, 255, 0.247); + --g-scrubberTexturedBackground: rgba(255, 255, 255, 1); + --g-selectedControlColor: rgba(63, 99, 139, 1); + --g-selectedControlTextColor: rgba(255, 255, 255, 0.847); + --g-alternateSelectedControlTextColor: rgba(255, 255, 255, 1); + --g-alternateSelectedControlTextColor--rgb: 255, 255, 255; + + /* Windows */ + --g-windowBackgroundColor: rgba(50, 50, 50, 1); + --g-windowFrameTextColor: rgba(255, 255, 255, 0.847); + --g-underPageBackgroundColor: rgba(40, 40, 40, 1); + --g-underPageBackgroundColor--rgb: 40, 40, 40; + + /* Highlights & Shadows */ + --g-findHighlightColor: rgba(255, 255, 0, 1); + --g-highlightColor: rgba(180, 180, 180, 1); + --g-highlightColor--rgb: 180, 180, 180; + --g-shadowColor: rgba(0, 0, 0, 1); + --g-shadowColor--rgb: 0, 0, 0; + + + +} + + + + + + +/* TH STYLES BEGIN HERE */ +/* TH STYLES BEGIN HERE */ +/* TH STYLES BEGIN HERE */ +/* TH STYLES BEGIN HERE */ +/* TH STYLES BEGIN HERE */ +/* TH STYLES BEGIN HERE */ +/* TH STYLES BEGIN HERE */ + + + +:root { + --s-font-family-system: "SF Pro Display" !important; + --u-font-family-system: "SF Pro Display" !important; + font-family: "SF Pro Display" !important; +} + +.rli-noteList div, .rli-noteList span, .rli-noteList a { + font-family: "SF Pro Display" !important; + font-size: 1.35rem !important; +} + +.rli-editor button span { + /*font-family: "SF Pro Display" !important;*/ +} + +.new-note-todo-buttons { + padding-right: 0 !important; + gap: 3px !important; +} + +.new-note-todo-buttons > button::before { + font-size: 1.4rem !important; +} + +.rli-noteList .search-bar + div { + display: none !important; +} + +.rli-editor > div > div > div > div:first-child .editor-toolbar div:nth-child(2) a:nth-child(1) i[title]:not([title=""])::before { + line-height: unset !important; +} + + + +.resizableLayoutItem { + height: auto !important; +} + + +.rli-editor > div > div:first-child, .rli-noteList > div > div:first-child, .rli-sideBar > div > div:first-child { + padding-top: 1.5rem !important; +} + +.rli-editor, .rli-noteList, .rli-sideBar { +} + +.rli-noteList > div > div > div:first-child { + margin-top: 0 !important; + padding: 0rem 1rem 1.2rem 1.5rem !important; +} + +.rli-noteList > div > div:first-child { + background-color: #252525 !important; +} + +.editor-toolbar .fa-globe::before { + font-size: 15px !important; + vertical-align: 2px !important; +} + +.editor-toolbar { + opacity: .3; + transition: opacity .2s ease-in-out; +} + +.editor-toolbar:hover { + opacity: 1; +} + + +.rli-editor .updated-time-label { + margin-right: 1.8rem; +} + +.note-title-info-group .editor-toolbar { + padding-right: 0 !important; +} + +.note-title-info-group .editor-toolbar .spacer { + width: 0 !important; + min-width: 0 !important; +} + +.rli-editor .title-input { + margin:0 !important; + padding-top: 0 !important; + font-size: 3rem !important; +} + +/* Content Editor horizontal paddings */ +.rli-editor > div > div:first-child { + padding-left: 3rem !important; + padding-right: 3rem !important; +} + +.CodeMirror-scroll { + padding-top: 1.5rem !important; +} + +.note-editor-viewer-row { + padding-top: 0 !important; +} + +.rli-sideBar .sidebar { + margin-top: 0 !important; + height: unset !important; + padding-left: 0.5rem !important; + padding-right: 0.1rem !important; +} + +.rli-sideBar .sidebar-header-container > div:first-child { + padding-top:0 !important; + margin-top: 0 !important; +} + +.rli-sideBar .sidebar-header-container { + margin-top: 1.5rem; +} + +.sidebar-list-items-wrapper > div:nth-child(2) { + margin-top: 0 !important; +} + +.rli-editor > div > div > div > div:first-child { + margin-bottom: 0.7rem +} + + +.rli-editor > div > div > div > div:nth-child(2):has(> button) { + display: none !important; +} + +.rli-editor > div > div > div > div:nth-child(2) > button > span:first-child { + display: none; +} + +.rli-editor > div > div > div > div:nth-child(2) > button > * { + color: white !important; +} + + + + + +.note-list-item, .note-list-item-wrapper { + height: 38px !important; +} +.note-list-item +&:before { + display: none; +} + +.note-list-item > .content { + padding-left: 12px !important; + padding-right: 12px !important; +} + +.note-list { + padding: 0 0.4rem 3rem 1.6rem !important; +} + + + + + + +/* Sidebar Styling */ + +.sidebar.sidebar > div .list-item-container { + height: 3.2rem !important; +} + +.list-item-wrapper { + height: unset !important; +} + + + + + + + + +/* For styling the entire Joplin app (except the rendered Markdown, which is defined in `userstyle.css`) */ + +div.CodeMirror span.cm-header { color: #bb86fc; } +div.CodeMirror span.cm-quote { color: #80cbc4; } +div.CodeMirror .cm-blockQuote { + padding-left: 1rem !important; +} +div.CodeMirror span.cm-negative { color: #ef5350; } +div.CodeMirror span.cm-positive { color: #66bb6a; } + +div.CodeMirror span.cm-header, +div.CodeMirror span.cm-strong { font-weight: bold; } +div.CodeMirror span.cm-em { font-style: italic; } + +div.CodeMirror span.cm-link { + text-decoration: underline; + color: #82aaff; +} +div.CodeMirror span.cm-strikethrough { text-decoration: line-through; } + +div.CodeMirror span.cm-keyword { color: #c792ea; } +div.CodeMirror span.cm-atom { color: #f78c6c; } +div.CodeMirror span.cm-number { color: #f78c6c; } +div.CodeMirror span.cm-def { color: #82aaff; } + +div.CodeMirror span.cm-variable { color: #ffffffcc; } +div.CodeMirror span.cm-property { color: #addb67; } +div.CodeMirror span.cm-operator { color: #89ddff; } +div.CodeMirror span.cm-punctuation { color: #89ddff; } + +div.CodeMirror span.cm-variable-2 { color: #ffcb6b; } +div.CodeMirror span.cm-variable-3, +div.CodeMirror span.cm-type { color: #f07178; } + +div.CodeMirror span.cm-comment { color: #616161; font-style: italic; } +div.CodeMirror span.cm-string { color: #c3e88d; } +div.CodeMirror span.cm-string-2 { color: #ff5370; } + +div.CodeMirror span.cm-meta, +div.CodeMirror span.cm-qualifier { color: #999999; } + +div.CodeMirror span.cm-builtin { color: #d7aefb; } +div.CodeMirror span.cm-bracket { color: #aabfc9; } +div.CodeMirror span.cm-tag { color: #f07178; } +div.CodeMirror span.cm-attribute { color: #c792ea; } +div.CodeMirror span.cm-hr { color: #444444; } + +div.CodeMirror span.cm-inlineCode { + background-color: #363636; + border: 1px solid #595959; +} + +div.CodeMirror .cm-codeBlock { + border-color: transparent !important; +} + +div.CodeMirror .cm-codeBlock.cm-regionFirstLine .tok-labelName { + font-family: sans-serif; + color: #747474; +} + + +div.CodeMirror span.cm-error, +span.cm-invalidchar { color: #ff5370; font-weight: bold; } + + + + + + + + +/* START New in document search panel fix */ + + +.ͼ1 .cm-panel.cm-search { + padding: 1rem !important; +} + + +.ͼ1 .cm-panel.cm-search > input { + box-shadow: 0 0 0 16px hsla(var(--g-controlAccentColor--hsl), 0); + border: 1px solid var(--g-separatorColor); + background: var(--g-controlBackgroundColor); + border-radius: 0.6rem; + color: var(--g-controlTextColor); + font-size: 1.3rem !important; + height: 2.8rem; + max-height: none; + padding: 0 0 0 1rem !important; + min-width: 20rem; +} + +.ͼ1 .cm-panel.cm-search > input:focus { + transition: 0.25s box-shadow cubic-bezier(0.61, 1, 0.88, 1); + transition-delay: 0.125s; + box-shadow: 0 0 0 0.35rem hsla(var(--g-controlAccentColor--hsl), 0.5); + +} + +.ͼ1 .cm-panel.cm-search > label { + display: none !important; +} + +.ͼ1 .cm-panel.cm-search > input[name="replace"], +.ͼ1 .cm-panel.cm-search > button[name="select"], + .ͼ1 .cm-panel.cm-search > button[name="replace"], + .ͼ1 .cm-panel.cm-search > button[name="replaceAll"] { + display: none !important; +} + + +.ͼ1 .cm-panel.cm-search > button[name="next"], +.ͼ1 .cm-panel.cm-search > button[name="prev"] { + font-size: 0 !important; + border: none; + background: none; + margin-left: .8rem !important; +} + +.ͼ1 .cm-panel.cm-search > button[name="next"]::before, +.ͼ1 .cm-panel.cm-search > button[name="prev"]::before { + content: var(--s-icon-chevron-up) !important; +font-family: var(--s-font-family-icons) !important; +vertical-align: middle; +display: block; +transform: scale(var(--s-icon-size-factor)); +font-weight: 500; +font-size: 1.4rem; +} + +.ͼ1 .cm-panel.cm-search > button[name="next"]::before { + content: var(--s-icon-chevron-down) !important; +} + + + +.ͼ1 .cm-panel.cm-search > button[name="close"] { + font-size: 2.3rem !important; + padding-right: 1rem !important; + top: .8rem !important; +} + + +.cm-panels-bottom { + background-color: rgba(40, 40, 40) !important; +} + +/* END New in document search panel fix */ + + +/* Editor Status Bar */ + +.editor-status-bar { + padding-bottom: 1.3rem; +} \ No newline at end of file diff --git a/03-user/dotfiles/.config/keepassxc/keepassxc.ini b/03-user/dotfiles/.config/keepassxc/keepassxc.ini new file mode 100644 index 0000000..067d984 --- /dev/null +++ b/03-user/dotfiles/.config/keepassxc/keepassxc.ini @@ -0,0 +1,33 @@ +[General] +ConfigVersion=2 +UpdateCheckMessageShown=true + +[Browser] +CustomProxyLocation= +Enabled=true + +[GUI] +ApplicationTheme=dark +CheckForUpdates=false +CompactMode=false +HidePreviewPanel=true +MinimizeOnClose=true +ShowTrayIcon=true +TrayIconAppearance=monochrome-light + +[KeeShare] +Active="\n" +Own="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCqbx6OoGAa2vC/qTRfKeu4TG0fVZTiiVZe3QsGgUYrHoexwLgqOr0bysWr2fMi5v2FVEeEs7zGRAXYtZJXscVRjK62BdIg8rJfg+bCD3Mzwf+FtNniT4eQOczR1csNNJ4ZvtVRO5znJ9ZGrOZIi+lEIsvEqFpDUcIE3YieYCx8/rsc2hdo8aksjs58yFv5xdfnSmcN3sL4mGGHOS+DHFCpWDqYORgRwBVJIo53zo4/ZDj3Ng8Kbi2KcaMS+yRqbSiLsOy0FCh9xTis0ZLIzsonT80rUBxMchs2rKFKXvoF0RGvCns3y6EsfLijdTQhQLAhgtvKTlBkPdoPfCdf3VidAgMBAAECggEACrw1EIbJhueDgo8F3XimgFVQCkk5t4svBYqmxyIdaVni8i9RaleI0ddT3B8+UVR7Y4qLdrBbk6F1PNEzBpML+rcByjVTpv+ifKGyR0bx2rC9h458quSXhV4eqJju0UYfLz/178fxeh3oQUtite8aIlCOxTRVeygLMINDt7YXF0hZ74f7LmjANYGIGTkzAdMfQdF4jZBrBZlsFdCFUeo7HfxQscSr89XwIDcvOSxawoexatiRzUtuMJjITM6lAtCVwO2Ldke6MBkkvZF6+RX0qp1a3P95K78ZEBof69LQ9/4LFDhVM2Xc7u4SZklk032m3wajHM4Bx56fHhO8o+brgQKBgQDNefwDmWxMdww/lgg/RBdSz6a/iIzdseAVSYUQj/2yFldfjOMQEpCHBd5tZz6h2hfFAlmvRnDmAJIEPAeXj5/bgbu08sGSCPAnhGtwJ+6dw0toNLoS3dAheK9wafpwm1WZDuVNCmXZHxXLayAVhg+Z4oA9JLKToOqbZJWyak8vhwKBgQDUV1Z3oaI5GKB5Za1+QjNp/sm1eNtJHsEfox+V3k9sc8hhHdsiQoqYy7414TViitoZgSQGGX6NPgfAOrzdIuOXXRonpFmBIkTkFyUcBQj+tj+W7QPLN4vZDC3PRHCkh1GbNsFfD++u8uvOMKfHe0lAIGeyR0Z95wVugA55cluXuwKBgB9HCk2h9RJOrNahB/BZdRNt+Hv/VTIJ+YpD/rVetcd+Dx7EW2v+53EmO417wdTxVdzvVqePmW/pdlCesqkne7X2MZSBv2VzZtsdFR2ldnUdXUUngYuNqDjwHgSGnVC21HjQA6eOhaJfUPn9/IxKM+XAzLSB+YzvWcb9sKvP8u3RAoGBALcNJ6Rv+bpA6a5dogfTKCF7HQZNTrUlRxVv+X2oLU3wLlDSfSN2u6ZnFe263Nu7mbMc6iI7/iXi0Km9uSzls8+72h1MiEBTe5IqBbq2+H8kO4NvhbK9itissB0bAgREB2zH8kFyKozmK7QPq8PDG22lwd8lpLZK3xrYWCIIHL+bAoGBAKVogLExSXSFHuIDqZGRKYQmMX3ta2eEHNSzVOn26+o3okkj1a9gZnOYC2gfvhSNrCLVtmC+2N/yOOhRqSZVfTaCNCWE//+l60aQD/N/RskDMB8WcnrrE3kQGmv1LSg0iiO5mQJeSoUO33/hr+A8FikOHnn7oj2yPYcOvkpYWhbQtobiasMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCqbx6OoGAa2vC/qTRfKeu4TG0fVZTiiVZe3QsGgUYrHoexwLgqOr0bysWr2fMi5v2FVEeEs7zGRAXYtZJXscVRjK62BdIg8rJfg+bCD3Mzwf+FtNniT4eQOczR1csNNJ4ZvtVRO5znJ9ZGrOZIi+lEIsvEqFpDUcIE3YieYCx8/rsc2hdo8aksjs58yFv5xdfnSmcN3sL4mGGHOS+DHFCpWDqYORgRwBVJIo53zo4/ZDj3Ng8Kbi2KcaMS+yRqbSiLsOy0FCh9xTis0ZLIzsonT80rUBxMchs2rKFKXvoF0RGvCns3y6EsfLijdTQhQLAhgtvKTlBkPdoPfCdf3VidAgMBAAECggEACrw1EIbJhueDgo8F3XimgFVQCkk5t4svBYqmxyIdaVni8i9RaleI0ddT3B8+UVR7Y4qLdrBbk6F1PNEzBpML+rcByjVTpv+ifKGyR0bx2rC9h458quSXhV4eqJju0UYfLz/178fxeh3oQUtite8aIlCOxTRVeygLMINDt7YXF0hZ74f7LmjANYGIGTkzAdMfQdF4jZBrBZlsFdCFUeo7HfxQscSr89XwIDcvOSxawoexatiRzUtuMJjITM6lAtCVwO2Ldke6MBkkvZF6+RX0qp1a3P95K78ZEBof69LQ9/4LFDhVM2Xc7u4SZklk032m3wajHM4Bx56fHhO8o+brgQKBgQDNefwDmWxMdww/lgg/RBdSz6a/iIzdseAVSYUQj/2yFldfjOMQEpCHBd5tZz6h2hfFAlmvRnDmAJIEPAeXj5/bgbu08sGSCPAnhGtwJ+6dw0toNLoS3dAheK9wafpwm1WZDuVNCmXZHxXLayAVhg+Z4oA9JLKToOqbZJWyak8vhwKBgQDUV1Z3oaI5GKB5Za1+QjNp/sm1eNtJHsEfox+V3k9sc8hhHdsiQoqYy7414TViitoZgSQGGX6NPgfAOrzdIuOXXRonpFmBIkTkFyUcBQj+tj+W7QPLN4vZDC3PRHCkh1GbNsFfD++u8uvOMKfHe0lAIGeyR0Z95wVugA55cluXuwKBgB9HCk2h9RJOrNahB/BZdRNt+Hv/VTIJ+YpD/rVetcd+Dx7EW2v+53EmO417wdTxVdzvVqePmW/pdlCesqkne7X2MZSBv2VzZtsdFR2ldnUdXUUngYuNqDjwHgSGnVC21HjQA6eOhaJfUPn9/IxKM+XAzLSB+YzvWcb9sKvP8u3RAoGBALcNJ6Rv+bpA6a5dogfTKCF7HQZNTrUlRxVv+X2oLU3wLlDSfSN2u6ZnFe263Nu7mbMc6iI7/iXi0Km9uSzls8+72h1MiEBTe5IqBbq2+H8kO4NvhbK9itissB0bAgREB2zH8kFyKozmK7QPq8PDG22lwd8lpLZK3xrYWCIIHL+bAoGBAKVogLExSXSFHuIDqZGRKYQmMX3ta2eEHNSzVOn26+o3okkj1a9gZnOYC2gfvhSNrCLVtmC+2N/yOOhRqSZVfTaCNCWE//+l60aQD/N/RskDMB8WcnrrE3kQGmv1LSg0iiO5mQJeSoUO33/hr+A8FikOHnn7oj2yPYcOvkpYWhbQ\n" +QuietSuccess=true + +[PasswordGenerator] +AdditionalChars= +ExcludedChars= +Length=20 +LowerCase=true +SpecialChars=false +UpperCase=true + +[Security] +ClearClipboard=false +LockDatabaseIdle=false diff --git a/03-user/dotfiles/.config/kitty/kitty.conf b/03-user/dotfiles/.config/kitty/kitty.conf new file mode 100644 index 0000000..46f9b88 --- /dev/null +++ b/03-user/dotfiles/.config/kitty/kitty.conf @@ -0,0 +1,2 @@ +background_opacity .7 +window_margin_width 5 diff --git a/03-user/dotfiles/.config/mimeapps.list b/03-user/dotfiles/.config/mimeapps.list new file mode 100644 index 0000000..85795d6 --- /dev/null +++ b/03-user/dotfiles/.config/mimeapps.list @@ -0,0 +1,39 @@ +[Default Applications] +image/jpeg=org.gnome.Loupe.desktop +image/png=org.gnome.Loupe.desktop +x-scheme-handler/tonsite=org.telegram.desktop._bed96f4b363d7710ea902a60dee70952.desktop +hoppscotch=hoppscotch-handler.desktop +x-scheme-handler/http=firefox.desktop +application/xhtml+xml=firefox.desktop +text/html=firefox.desktop +x-scheme-handler/https=firefox.desktop +application/x-desktop=code.desktop +inode/directory=org.gnome.Nautilus.desktop +text/plain=code.desktop +audio/flac=mpv.desktop +image/heif=org.gnome.Loupe.desktop +image/webp=org.gnome.Loupe.desktop +text/csv=libreoffice-calc.desktop +audio/x-opus+ogg=mpv.desktop +text/markdown=code.desktop + +[Added Associations] +image/jpeg=org.gnome.Loupe.desktop; +image/png=org.gnome.Loupe.desktop; +x-scheme-handler/tonsite=org.telegram.desktop._bed96f4b363d7710ea902a60dee70952.desktop; +x-scheme-handler/http=firefox.desktop; +application/xhtml+xml=firefox.desktop; +text/html=firefox.desktop; +x-scheme-handler/https=firefox.desktop; +application/x-desktop=code.desktop; +text/plain=code.desktop; +audio/flac=mpv.desktop; +image/heif=org.gnome.Loupe.desktop; +application/octet-stream=code.desktop; +image/webp=org.gnome.Loupe.desktop; +text/csv=libreoffice-calc.desktop; +application/sketch=lunacy.desktop; +audio/x-opus+ogg=mpv.desktop; +application/lunacy=lunacy.desktop; +application/gzip=org.gnome.FileRoller.desktop; +text/markdown=code.desktop; diff --git a/03-user/dotfiles/.config/mpv/mpv.conf b/03-user/dotfiles/.config/mpv/mpv.conf new file mode 100644 index 0000000..9efc272 --- /dev/null +++ b/03-user/dotfiles/.config/mpv/mpv.conf @@ -0,0 +1 @@ +hwdec=auto diff --git a/03-user/dotfiles/.config/pipewire/pipewire.conf.d/raop-discover.conf b/03-user/dotfiles/.config/pipewire/pipewire.conf.d/raop-discover.conf new file mode 100644 index 0000000..e5030ef --- /dev/null +++ b/03-user/dotfiles/.config/pipewire/pipewire.conf.d/raop-discover.conf @@ -0,0 +1,6 @@ +context.modules = [ + { + name = libpipewire-module-raop-discover + args = { } + } +] diff --git a/03-user/dotfiles/.config/pipewire/pipewire.conf.d/roc-sink.conf b/03-user/dotfiles/.config/pipewire/pipewire.conf.d/roc-sink.conf new file mode 100644 index 0000000..6b5eea9 --- /dev/null +++ b/03-user/dotfiles/.config/pipewire/pipewire.conf.d/roc-sink.conf @@ -0,0 +1,17 @@ +context.modules = [ + { name = libpipewire-module-roc-sink + args = { + fec.code = rs8m + #fec.code = disable + remote.ip = 192.168.1.235 + remote.source.port = 10001 + remote.repair.port = 10002 + remote.control.port = 10003 + sink.name = "Studio Raspi" + sink.props = { + node.name = "studio-raspi-roc-sink" + node.description = "Studio Raspi" + } + } + } +] diff --git a/03-user/dotfiles/.config/swaync/style.css b/03-user/dotfiles/.config/swaync/style.css new file mode 100644 index 0000000..534a504 --- /dev/null +++ b/03-user/dotfiles/.config/swaync/style.css @@ -0,0 +1,349 @@ +* { + all: unset; + font-size: 14px; + font-family: "SF Pro Display"; + transition: 200ms; +} + +trough highlight { + background: #cdd6f4; +} + +scale trough { + margin: 0rem 1rem; + background-color: #313244; + min-height: 8px; + min-width: 70px; +} + +slider { + background-color: #89b4fa; +} + +.floating-notifications.background .notification-row .notification-background { + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.8), inset 0 0 0 1px #313244; + border-radius: 10px; + margin: 18px; + background-color: rgba(21, 18, 27, .6); + color: #cdd6f4; + padding: 0; +} + +.floating-notifications.background .notification-row .notification-background .notification { + padding: 7px; + border-radius: 10px; +} + +.floating-notifications.background .notification-row .notification-background .notification.critical { + box-shadow: inset 0 0 7px 0 #f38ba8; +} + +.floating-notifications.background .notification-row .notification-background .notification .notification-content { + margin: 7px; +} + +.floating-notifications.background .notification-row .notification-background .notification .notification-content .summary { + color: #cdd6f4; + font-weight: bold; + margin-left: 5px; +} + +.floating-notifications.background .notification-row .notification-background .notification .notification-content .time { + color: #a6adc8; +} + +.floating-notifications.background .notification-row .notification-background .notification .notification-content .body { + color: #cdd6f4; + margin-left: 5px; +} + +.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * { + min-height: 3.4em; +} + +.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action { + border-radius: 10px; + color: #cdd6f4; + background-color: #313244; + box-shadow: inset 0 0 0 1px #45475a; + margin: 7px; +} + +.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action:hover { + box-shadow: inset 0 0 0 1px #45475a; + background-color: #313244; + color: #cdd6f4; +} + +.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action:active { + box-shadow: inset 0 0 0 1px #45475a; + background-color: #74c7ec; + color: #cdd6f4; +} + +.floating-notifications.background .notification-row .notification-background .close-button { + margin: 7px; + padding: 2px; + border-radius: 6px; + color: #1e1e2e; + background-color: #f38ba8; +} + +.floating-notifications.background .notification-row .notification-background .close-button:hover { + background-color: #eba0ac; + color: #1e1e2e; +} + +.floating-notifications.background .notification-row .notification-background .close-button:active { + background-color: #f38ba8; + color: #1e1e2e; +} + +.control-center { + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.8), inset 0 0 0 1px #313244; + border-radius: 10px; + margin: 18px; + background-color: rgba(21, 18, 27, .6); + color: #cdd6f4; + padding: 14px; +} + +.control-center .widget-title > label { + color: #cdd6f4; + font-size: 1.3em; + font-weight: bold; +} + +.control-center .widget-title button { + border-radius: 10px; + color: #cdd6f4; + background-color: #313244; + box-shadow: inset 0 0 0 1px #45475a; + padding: 8px; +} + +.control-center .widget-title button:hover { + box-shadow: inset 0 0 0 1px #45475a; + background-color: #585b70; + color: #cdd6f4; +} + +.control-center .widget-title button:active { + box-shadow: inset 0 0 0 1px #45475a; + background-color: #74c7ec; + color: #1e1e2e; +} + +.control-center .notification-row .notification-background { + border-radius: 10px; + color: #cdd6f4; + background-color: #313244; + box-shadow: inset 0 0 0 1px #45475a; + margin-top: 14px; +} + +.control-center .notification-row .notification-background .notification { + padding: 7px; + border-radius: 10px; +} + +.control-center .notification-row .notification-background .notification.critical { + box-shadow: inset 0 0 7px 0 #f38ba8; +} + +.control-center .notification-row .notification-background .notification .notification-content { + margin: 7px; +} + +.control-center .notification-row .notification-background .notification .notification-content .summary { + color: #cdd6f4; + font-weight: bold; + margin-left: 5px; +} + +.control-center .notification-row .notification-background .notification .notification-content .time { + color: #a6adc8; +} + +.control-center .notification-row .notification-background .notification .notification-content .body { + color: #cdd6f4; + margin-left: 5px; +} + +.control-center .notification-row .notification-background .notification > *:last-child > * { + min-height: 3.4em; +} + +.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action { + border-radius: 10px; + color: #cdd6f4; + background-color: #11111b; + box-shadow: inset 0 0 0 1px #45475a; + margin: 7px; +} + +.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action:hover { + box-shadow: inset 0 0 0 1px #45475a; + background-color: #313244; + color: #cdd6f4; +} + +.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action:active { + box-shadow: inset 0 0 0 1px #45475a; + background-color: #74c7ec; + color: #cdd6f4; +} + +.control-center .notification-row .notification-background .close-button { + margin: 7px; + padding: 2px; + border-radius: 6.3px; + color: #1e1e2e; + background-color: #eba0ac; +} + +.close-button { + border-radius: 6.3px; +} + +.control-center .notification-row .notification-background .close-button:hover { + background-color: #f38ba8; + color: #1e1e2e; +} + +.control-center .notification-row .notification-background .close-button:active { + background-color: #f38ba8; + color: #1e1e2e; +} + +.control-center .notification-row .notification-background:hover { + box-shadow: inset 0 0 0 1px #45475a; + background-color: #3f4054; + color: #cdd6f4; +} + +.control-center .notification-row .notification-background:active { + box-shadow: inset 0 0 0 1px #45475a; + background-color: #74c7ec; + color: #cdd6f4; +} + +.notification.critical progress { + background-color: #f38ba8; +} + +.notification.low progress, +.notification.normal progress { + background-color: #89b4fa; +} + +.control-center-dnd { + margin-top: 5px; + border-radius: 10px; + background: #313244; + border: 1px solid #45475a; + box-shadow: none; +} + +.control-center-dnd:checked { + background: #313244; +} + +.control-center-dnd slider { + background: #45475a; + border-radius: 8px; +} + +.widget-dnd { + margin: 0px; + font-size: 1.1rem; +} + +.widget-dnd > switch { + font-size: initial; + border-radius: 8px; + background: #313244; + border: 1px solid #45475a; + box-shadow: none; +} + +.widget-dnd > switch:checked { + background: #313244; +} + +.widget-dnd > switch slider { + background: #45475a; + border-radius: 8px; + border: 1px solid #6c7086; +} + +.widget-mpris .widget-mpris-player { + background: #313244; + padding: 7px; +} + +.widget-mpris .widget-mpris-title { + font-size: 1.2rem; +} + +.widget-mpris .widget-mpris-subtitle { + font-size: 0.8rem; +} + +.widget-menubar > box > .menu-button-bar > button > label { + font-size: 3rem; + padding: 0.5rem 2rem; +} + +.widget-menubar > box > .menu-button-bar > :last-child { + color: #f38ba8; +} + +.power-buttons button:hover, +.powermode-buttons button:hover, +.screenshot-buttons button:hover { + background: #313244; +} + +.control-center .widget-label > label { + color: #cdd6f4; + font-size: 2rem; +} + +.widget-buttons-grid { + padding-top: 1rem; +} + +.widget-buttons-grid > flowbox > flowboxchild > button label { + font-size: 2.5rem; +} + +.widget-volume { + padding-top: 1rem; +} + +.widget-volume label { + font-size: 1.5rem; + color: #74c7ec; +} + +.widget-volume trough highlight { + background: #74c7ec; +} + +.widget-backlight trough highlight { + background: #f9e2af; +} + +.widget-backlight label { + font-size: 1.5rem; + color: #f9e2af; +} + +.widget-backlight .KB { + padding-bottom: 1rem; +} + +.image { + padding-right: 0.5rem; +} diff --git a/03-user/dotfiles/.config/systemd/user/shairport-sync.service b/03-user/dotfiles/.config/systemd/user/shairport-sync.service new file mode 100644 index 0000000..f1f8f3b --- /dev/null +++ b/03-user/dotfiles/.config/systemd/user/shairport-sync.service @@ -0,0 +1,15 @@ +[Unit] +Description=Shairport Sync - AirPlay Audio Receiver +After=sound.target +#Requires=avahi-daemon.service +#After=avahi-daemon.service +Wants=network-online.target +After=network.target network-online.target + +[Service] +ExecStart=/usr/bin/shairport-sync --log-to-syslog +#User=shairport-sync +#Group=shairport-sync + +[Install] +WantedBy=default.target diff --git a/03-user/dotfiles/.config/vlc/vlcrc b/03-user/dotfiles/.config/vlc/vlcrc new file mode 100644 index 0000000..f4f1dd8 --- /dev/null +++ b/03-user/dotfiles/.config/vlc/vlcrc @@ -0,0 +1,5093 @@ +### +### vlc 3.0.23 +### + +### +### lines beginning with a '#' character are comments +### + +[udp] # UDP input + +# UDP Source timeout (sec) (integer) +#udp-timeout=-1 + +[nfs] # NFS input + +# Set NFS uid/guid automatically (boolean) +#nfs-auto-guid=1 + +[satip] # SAT>IP Receiver Plugin + +# Receive buffer (integer) +#satip-buffer=4194304 + +# Request multicast stream (boolean) +#satip-multicast=0 + +# Host (string) +#satip-host= + +[dvdnav] # DVDnav Input + +# DVD angle (integer) +#dvdnav-angle=1 + +# Start directly in menu (boolean) +#dvdnav-menu=1 + +[concat] # Concatenated inputs + +# Inputs list (string) +#concat-list= + +[libbluray] # Blu-ray Disc support (libbluray) + +# Blu-ray menus (boolean) +#bluray-menu=1 + +# Region code (string) +#bluray-region=B + +[filesystem] # File input + +# List special files (boolean) +#list-special-files=0 + +[cdda] # Audio CD input + +# Audio CD device (string) +#cd-audio=/dev/sr0 + +# Musicbrainz Server (string) +#musicbrainz-server=musicbrainz.org + +# CDDB Server (string) +#cddb-server=freedb.videolan.org + +# CDDB port (integer) +#cddb-port=80 + +[http] # HTTP input + +# Auto re-connect (boolean) +#http-reconnect=0 + +[v4l2] # Video4Linux input + +# Video capture device (string) +#v4l2-dev=/dev/video0 + +# VBI capture device (string) +#v4l2-vbidev= + +# Standard (string) +#v4l2-standard= + +# Video input chroma format (string) +#v4l2-chroma= + +# Input (integer) +#v4l2-input=0 + +# Audio input (integer) +#v4l2-audio-input=-1 + +# Width (integer) +#v4l2-width=0 + +# Height (integer) +#v4l2-height=0 + +# Picture aspect-ratio n:m (string) +#v4l2-aspect-ratio=4:3 + +# Frame rate (string) +#v4l2-fps=60 + +# Radio device (string) +#v4l2-radio-dev=/dev/radio0 + +# Frequency (integer) +#v4l2-tuner-frequency=-1 + +# Audio mode (integer) +#v4l2-tuner-audio-mode=3 + +# Reset controls (boolean) +#v4l2-controls-reset=0 + +# Brightness (integer) +#v4l2-brightness=-1 + +# Automatic brightness (integer) +#v4l2-brightness-auto=-1 + +# Contrast (integer) +#v4l2-contrast=-1 + +# Saturation (integer) +#v4l2-saturation=-1 + +# Hue (integer) +#v4l2-hue=-1 + +# Automatic hue (integer) +#v4l2-hue-auto=-1 + +# White balance temperature (K) (integer) +#v4l2-white-balance-temperature=-1 + +# Automatic white balance (integer) +#v4l2-auto-white-balance=-1 + +# Red balance (integer) +#v4l2-red-balance=-1 + +# Blue balance (integer) +#v4l2-blue-balance=-1 + +# Gamma (integer) +#v4l2-gamma=-1 + +# Automatic gain (integer) +#v4l2-autogain=-1 + +# Gain (integer) +#v4l2-gain=-1 + +# Sharpness (integer) +#v4l2-sharpness=-1 + +# Chroma gain (integer) +#v4l2-chroma-gain=-1 + +# Automatic chroma gain (integer) +#v4l2-chroma-gain-auto=-1 + +# Power line frequency (integer) +#v4l2-power-line-frequency=-1 + +# Backlight compensation (integer) +#v4l2-backlight-compensation=-1 + +# Band-stop filter (integer) +#v4l2-band-stop-filter=-1 + +# Horizontal flip (boolean) +#v4l2-hflip=0 + +# Vertical flip (boolean) +#v4l2-vflip=0 + +# Rotate (degrees) (integer) +#v4l2-rotate=-1 + +# Color killer (integer) +#v4l2-color-killer=-1 + +# Color effect (integer) +#v4l2-color-effect=-1 + +# Audio volume (integer) +#v4l2-audio-volume=-1 + +# Audio balance (integer) +#v4l2-audio-balance=-1 + +# Mute (boolean) +#v4l2-audio-mute=0 + +# Bass level (integer) +#v4l2-audio-bass=-1 + +# Treble level (integer) +#v4l2-audio-treble=-1 + +# Loudness mode (boolean) +#v4l2-audio-loudness=0 + +# v4l2 driver controls (string) +#v4l2-set-ctrls= + +[rist] # RIST input + +# RIST maximum packet size (bytes) (integer) +#packet-size=1472 + +# RIST demux/decode maximum jitter (default is 5ms) (integer) +#maximum-jitter=5 + +# RIST latency (ms) (integer) +#latency=1000 + +# RIST nack retry interval (ms) (integer) +#retry-interval=132 + +# RIST reorder buffer (ms) (integer) +#reorder-buffer=70 + +# RIST maximum retry count (integer) +#max-retries=10 + +# RIST nack type, 0 = range, 1 = bitmask. Default is range (integer) +#nack-type=0 + +# Disable NACK output packets (boolean) +#disable-nacks=0 + +# Do not check for a valid rtcp message from the encoder (boolean) +#mcast-blind-nacks=0 + +[access_srt] # SRT input + +# Return poll wait after timeout milliseconds (-1 = infinite) (integer) +#poll-timeout=-1 + +# SRT latency (ms) (integer) +#latency=120 + +# Password for stream encryption (string) +#passphrase= + +# Crypto key length in bytes (integer) +#key-length=16 + +# SRT Stream ID (string) +#streamid= + +[vdr] # VDR recordings + +# Chapter offset in ms (integer) +#vdr-chapter-offset=0 + +# Frame rate (float) +#vdr-fps=25.000000 + +[access] # HTTPS input + +# Cookies forwarding (boolean) +#http-forward-cookies=1 + +# User agent (string) +#http-user-agent= + +[smb] # SMB input + +# Username (string) +#smb-user= + +# Password (string) +#smb-pwd= + +# SMB domain (string) +#smb-domain= + +[linsys_sdi] # SDI Input + +# Link # (integer) +#linsys-sdi-link=0 + +# Video ID (integer) +#linsys-sdi-id-video=0 + +# Aspect ratio (string) +#linsys-sdi-aspect-ratio= + +# Audio configuration (string) +#linsys-sdi-audio=0=1,1 + +# Teletext configuration (string) +#linsys-sdi-telx= + +# Teletext language (string) +#linsys-sdi-telx-lang= + +[live555] # RTP/RTSP/SDP demuxer (using Live555) + +# Use RTP over RTSP (TCP) (boolean) +#rtsp-tcp=0 + +# Client port (integer) +#rtp-client-port=-1 + +# Force multicast RTP via RTSP (boolean) +#rtsp-mcast=0 + +# Tunnel RTSP and RTP over HTTP (boolean) +#rtsp-http=0 + +# HTTP tunnel port (integer) +#rtsp-http-port=80 + +# Kasenna RTSP dialect (boolean) +#rtsp-kasenna=0 + +# WMServer RTSP dialect (boolean) +#rtsp-wmserver=0 + +# Username (string) +#rtsp-user= + +# Password (string) +#rtsp-pwd= + +# RTSP frame buffer size (integer) +#rtsp-frame-buffer-size=250000 + +[access_jack] # JACK audio input + +# Pace (boolean) +#jack-input-use-vlc-pace=0 + +# Auto connection (boolean) +#jack-input-auto-connect=0 + +[linsys_hdsdi] # HD-SDI Input + +# Link # (integer) +#linsys-hdsdi-link=0 + +# Video ID (integer) +#linsys-hdsdi-id-video=0 + +# Aspect ratio (string) +#linsys-hdsdi-aspect-ratio= + +# Audio configuration (string) +#linsys-hdsdi-audio=0=1,1 + +[shm] # Shared memory framebuffer + +# Frame rate (float) +#shm-fps=10.000000 + +# Frame buffer depth (integer) +#shm-depth=0 + +# Frame buffer width (integer) +#shm-width=800 + +# Frame buffer height (integer) +#shm-height=480 + +[ftp] # FTP input + +# Username (string) +#ftp-user= + +# Password (string) +#ftp-pwd= + +# FTP account (string) +#ftp-account=anonymous + +[dtv] # Digital Television and Radio + +# DVB adapter (integer) +#dvb-adapter=0 + +# DVB device (integer) +#dvb-device=0 + +# Do not demultiplex (boolean) +#dvb-budget-mode=0 + +# Frequency (Hz) (integer) +#dvb-frequency=0 + +# Spectrum inversion (integer) +#dvb-inversion=-1 + +# Bandwidth (MHz) (integer) +#dvb-bandwidth=0 + +# Transmission mode (integer) +#dvb-transmission=0 + +# Guard interval (string) +#dvb-guard= + +# High-priority code rate (string) +#dvb-code-rate-hp= + +# Low-priority code rate (string) +#dvb-code-rate-lp= + +# Hierarchy mode (integer) +#dvb-hierarchy=-1 + +# DVB-T2 Physical Layer Pipe (integer) +#dvb-plp-id=0 + +# Layer A modulation (string) +#dvb-a-modulation= + +# Layer A code rate (string) +#dvb-a-fec= + +# Layer A segments count (integer) +#dvb-a-count=0 + +# Layer A time interleaving (integer) +#dvb-a-interleaving=0 + +# Layer B modulation (string) +#dvb-b-modulation= + +# Layer B code rate (string) +#dvb-b-fec= + +# Layer B segments count (integer) +#dvb-b-count=0 + +# Layer B time interleaving (integer) +#dvb-b-interleaving=0 + +# Layer C modulation (string) +#dvb-c-modulation= + +# Layer C code rate (string) +#dvb-c-fec= + +# Layer C segments count (integer) +#dvb-c-count=0 + +# Layer C time interleaving (integer) +#dvb-c-interleaving=0 + +# Modulation / Constellation (string) +#dvb-modulation= + +# Symbol rate (bauds) (integer) +#dvb-srate=0 + +# FEC code rate (string) +#dvb-fec= + +# Stream identifier (integer) +#dvb-stream=0 + +# Pilot (integer) +#dvb-pilot=-1 + +# Roll-off factor (integer) +#dvb-rolloff=-1 + +# Transport stream ID (integer) +#dvb-ts-id=0 + +# Polarization (Voltage) (string) +#dvb-polarization= + +# (integer) +#dvb-voltage=13 + +# High LNB voltage (boolean) +#dvb-high-voltage=0 + +# Local oscillator low frequency (kHz) (integer) +#dvb-lnb-low=0 + +# Local oscillator high frequency (kHz) (integer) +#dvb-lnb-high=0 + +# Universal LNB switch frequency (kHz) (integer) +#dvb-lnb-switch=11700000 + +# DiSEqC LNB number (integer) +#dvb-satno=0 + +# Uncommitted DiSEqC LNB number (integer) +#dvb-uncommitted=0 + +# Continuous 22kHz tone (integer) +#dvb-tone=-1 + +[access_mms] # Microsoft Media Server (MMS) input + +# TCP/UDP timeout (ms) (integer) +#mms-timeout=5000 + +# Force selection of all streams (boolean) +#mms-all=0 + +# Maximum bitrate (integer) +#mms-maxbitrate=0 + +[rtp] # Real-Time Protocol (RTP) input + +# RTCP (local) port (integer) +#rtcp-port=0 + +# Maximum RTP sources (integer) +#rtp-max-src=1 + +# RTP source timeout (sec) (integer) +#rtp-timeout=5 + +# Maximum RTP sequence number dropout (integer) +#rtp-max-dropout=3000 + +# Maximum RTP sequence number misordering (integer) +#rtp-max-misorder=100 + +# RTP payload format assumed for dynamic payloads (string) +#rtp-dynamic-pt= + +[dvdread] # DVDRead Input (no menu support) + +# DVD angle (integer) +#dvdread-angle=1 + +[timecode] # Time code subpicture elementary stream generator + +# Frame rate (string) +#timecode-fps=25/1 + +[xcb_screen] # Screen capture (with X11/XCB) + +# Frame rate (float) +#screen-fps=2.000000 + +# Region left column (integer) +#screen-left=0 + +# Region top row (integer) +#screen-top=0 + +# Capture region width (integer) +#screen-width=0 + +# Capture region height (integer) +#screen-height=0 + +# Follow the mouse (boolean) +#screen-follow-mouse=0 + +[dvb] # DVB input with v4l2 support + +# Probe DVB card for capabilities (boolean) +#dvb-probe=1 + +# Satellite scanning config (string) +#dvb-satellite= + +# Scan tuning list (string) +#dvb-scanlist= + +# Use NIT for scanning services (boolean) +#dvb-scan-nit=1 + +[sftp] # SFTP input + +# SFTP port (integer) +#sftp-port=22 + +# Username (string) +#sftp-user= + +# Password (string) +#sftp-pwd= + +[avio] # libavformat AVIO access + +# Advanced options (string) +#avio-options= + +# Advanced options (string) +#sout-avio-options= + +[imem] # Memory input + +# ID (integer) +#imem-id=-1 + +# Group (integer) +#imem-group=0 + +# Category (integer) +#imem-cat=0 + +# Codec (string) +#imem-codec= + +# Language (string) +#imem-language= + +# Sample rate (integer) +#imem-samplerate=0 + +# Channels count (integer) +#imem-channels=0 + +# Width (integer) +#imem-width=0 + +# Height (integer) +#imem-height=0 + +# Display aspect ratio (string) +#imem-dar= + +# Frame rate (string) +#imem-fps= + +# Size (integer) +#imem-size=0 + +[access_alsa] # ALSA audio capture + +# Stereo (boolean) +#alsa-stereo=1 + +# Sample rate (integer) +#alsa-samplerate=48000 + +[notify] # LibNotify Notification Plugin + +# Timeout (ms) (integer) +#notify-timeout=4000 + +[logger] # File logging + +[rtsp] # Legacy RTSP VoD server + +# MUX for RAW RTSP transport (string) +#rtsp-raw-mux=ts + +# Maximum number of connections (integer) +#rtsp-throttle-users=0 + +# Sets the timeout option in the RTSP session string (integer) +#rtsp-session-timeout=5 + +[audioscrobbler] # Submission of played songs to last.fm + +# Username (string) +#lastfm-username= + +# Password (string) +#lastfm-password= + +# Scrobbler URL (string) +#scrobbler-url=post.audioscrobbler.com + +[gnutls] # GNU TLS transport layer security + +# Use system trust database (boolean) +#gnutls-system-trust=1 + +# Trust directory (string) +#gnutls-dir-trust= + +# TLS cipher priorities (string) +#gnutls-priorities=NORMAL + +[lirc] # Infrared remote control interface + +# Change the lirc configuration file (string) +#lirc-file= + +[gestures] # Mouse gestures control interface + +# Motion threshold (10-100) (integer) +#gestures-threshold=30 + +# Trigger button (string) +#gestures-button=left + +[motion] # motion control interface + +[oldrc] # Remote control interface + +# Show stream position (boolean) +#rc-show-pos=0 + +# Fake TTY (boolean) +#rc-fake-tty=0 + +# UNIX socket command input (string) +#rc-unix= + +# TCP command input (string) +#rc-host= + +[netsync] # Network synchronization + +# Network master clock (boolean) +#netsync-master=0 + +# Master server IP address (string) +#netsync-master-ip= + +# UDP timeout (in ms) (integer) +#netsync-timeout=500 + +[afile] # File audio output + +# Output file (string) +#audiofile-file=audiofile.wav + +# Output format (string) +#audiofile-format=s16 + +# Number of output channels (integer) +#audiofile-channels=0 + +# Add WAVE header (boolean) +#audiofile-wav=1 + +[alsa] # ALSA audio output + +# Audio output device (string) +#alsa-audio-device=default + +# Audio output channels (integer) +#alsa-audio-channels=6 + +# Software gain (float) +#alsa-gain=1.000000 + +[jack] # JACK audio output + +# Automatically connect to writable clients (boolean) +#jack-auto-connect=1 + +# Connect to clients matching (string) +#jack-connect-regex=system + +# JACK client name (string) +#jack-name= + +# Software gain (float) +#jack-gain=1.000000 + +[amem] # Audio memory output + +# Sample format (string) +#amem-format=S16N + +# Sample rate (integer) +#amem-rate=44100 + +# Channels count (integer) +#amem-channels=2 + +[folder] # Folder meta data + +# Album art filename (string) +#album-art-filename= + +[udp] # UDP stream output + +# Caching value (ms) (integer) +#sout-udp-caching=300 + +# Group packets (integer) +#sout-udp-group=1 + +[access_output_srt] # SRT stream output + +# Return poll wait after timeout milliseconds (-1 = infinite) (integer) +#poll-timeout=-1 + +# SRT latency (ms) (integer) +#latency=120 + +# Password for stream encryption (string) +#passphrase= + +# SRT maximum payload size (bytes) (integer) +#payload-size=1316 + +# SRT maximum bandwidth ceiling (bytes) (integer) +#bandwidth-overhead-limit=25 + +# Crypto key length in bytes (integer) +#key-length=16 + +# SRT Stream ID (string) +#streamid= + +[access_output_rist] # RIST stream output + +# RIST target packet size (bytes) (integer) +#sout-rist-packet-size=1328 + +# RIST data output caching size (ms) (integer) +#sout-rist-caching=50 + +# RIST retry-buffer queue size (ms) (integer) +#sout-rist-buffer-size=0 + +# SSRC used in RTP output (default is random, i.e. 0) (integer) +#sout-rist-ssrc=0 + +# Stream name (string) +#sout-rist-stream-name= + +[file] # File stream output + +# Overwrite existing file (boolean) +#sout-file-overwrite=1 + +# Append to file (boolean) +#sout-file-append=0 + +# Format time and date (boolean) +#sout-file-format=0 + +# Synchronous writing (boolean) +#sout-file-sync=0 + +[http] # HTTP stream output + +# Username (string) +#sout-http-user= + +# Password (string) +#sout-http-pwd= + +# Mime (string) +#sout-http-mime= + +# Metacube (boolean) +#sout-http-metacube=0 + +[access_output_shout] # IceCAST output + +# Stream name (string) +#sout-shout-name=VLC media player - Live stream + +# Stream description (string) +#sout-shout-description=Live stream from VLC media player + +# Stream MP3 (boolean) +#sout-shout-mp3=0 + +# Genre description (string) +#sout-shout-genre=Alternative + +# URL description (string) +#sout-shout-url=http://www.videolan.org/vlc + +# Bitrate (string) +#sout-shout-bitrate= + +# Samplerate (string) +#sout-shout-samplerate= + +# Number of channels (string) +#sout-shout-channels= + +# Ogg Vorbis Quality (string) +#sout-shout-quality= + +# Stream public (boolean) +#sout-shout-public=0 + +[swscale] # Video scaling filter + +# Scaling mode (integer) +#swscale-mode=2 + +[transform] # Video transformation filter + +# Transform type (string) +#transform-type=90 + +[fps] # FPS conversion video filter + +# Frame rate (string) +#fps-fps= + +[grain] # Grain video filter + +# Variance (float) +#grain-variance=2.000000 + +# Minimal period (integer) +#grain-period-min=1 + +# Maximal period (integer) +#grain-period-max=48 + +[scene] # Scene video filter + +# Image format (string) +#scene-format=png + +# Image width (integer) +#scene-width=-1 + +# Image height (integer) +#scene-height=-1 + +# Filename prefix (string) +#scene-prefix=scene + +# Directory path prefix (string) +#scene-path= + +# Always write to the same file (boolean) +#scene-replace=0 + +# Recording ratio (integer) +#scene-ratio=50 + +[hqdn3d] # High Quality 3D Denoiser filter + +# Spatial luma strength (0-254) (float) +#hqdn3d-luma-spat=4.000000 + +# Spatial chroma strength (0-254) (float) +#hqdn3d-chroma-spat=3.000000 + +# Temporal luma strength (0-254) (float) +#hqdn3d-luma-temp=6.000000 + +# Temporal chroma strength (0-254) (float) +#hqdn3d-chroma-temp=4.500000 + +[colorthres] # Color threshold filter + +# Color (integer) +#colorthres-color=16711680 + +# Saturation threshold (integer) +#colorthres-saturationthres=20 + +# Similarity threshold (integer) +#colorthres-similaritythres=15 + +[rotate] # Rotate video filter + +# Angle in degrees (float) +#rotate-angle=30.000000 + +# Use motion sensors (boolean) +#rotate-use-motion=0 + +[adjust] # Image properties filter + +# Image contrast (0-2) (float) +contrast=0.970000 + +# Image brightness (0-2) (float) +#brightness=1.000000 + +# Image hue (-180..180) (float) +#hue=0.000000 + +# Image saturation (0-3) (float) +#saturation=1.000000 + +# Image gamma (0-10) (float) +gamma=1.990000 + +# Brightness threshold (boolean) +#brightness-threshold=0 + +[blendbench] # Blending benchmark filter + +# Number of time to blend (integer) +#blendbench-loops=1000 + +# Alpha of the blended image (integer) +#blendbench-alpha=128 + +# Image to be blended onto (string) +#blendbench-base-image= + +# Chroma for the base image (string) +#blendbench-base-chroma=I420 + +# Image which will be blended (string) +#blendbench-blend-image= + +# Chroma for the blend image (string) +#blendbench-blend-chroma=YUVA + +[antiflicker] # antiflicker video filter + +# Window size (integer) +#antiflicker-window-size=10 + +# Softening value (integer) +#antiflicker-softening-size=10 + +[sepia] # Sepia video filter + +# Sepia intensity (integer) +#sepia-intensity=120 + +[bluescreen] # Bluescreen video filter + +# Bluescreen U value (integer) +#bluescreen-u=120 + +# Bluescreen V value (integer) +#bluescreen-v=90 + +# Bluescreen U tolerance (integer) +#bluescreen-ut=17 + +# Bluescreen V tolerance (integer) +#bluescreen-vt=17 + +[motionblur] # Motion blur filter + +# Blur factor (1-127) (integer) +#blur-factor=80 + +[anaglyph] # Convert 3D picture to anaglyph image video filter + +# Color scheme (string) +#anaglyph-scheme=red-cyan + +[deinterlace] # Deinterlacing video filter + +# Streaming deinterlace mode (string) +#sout-deinterlace-mode=blend + +# Phosphor chroma mode for 4:2:0 input (integer) +#sout-deinterlace-phosphor-chroma=2 + +# Phosphor old field dimmer strength (integer) +#sout-deinterlace-phosphor-dimmer=2 + +[gaussianblur] # Gaussian blur video filter + +# Gaussian's std deviation (float) +#gaussianblur-sigma=2.000000 + +[canvas] # Canvas video filter + +# Output width (integer) +#canvas-width=0 + +# Output height (integer) +#canvas-height=0 + +# Output picture aspect ratio (string) +#canvas-aspect= + +# Pad video (boolean) +#canvas-padd=1 + +[gradfun] # Gradfun video filter + +# Radius (integer) +#gradfun-radius=16 + +# Strength (float) +#gradfun-strength=1.200000 + +[erase] # Erase video filter + +# Image mask (string) +#erase-mask= + +# X coordinate (integer) +#erase-x=0 + +# Y coordinate (integer) +#erase-y=0 + +[croppadd] # Video cropping filter + +# Pixels to crop from top (integer) +#croppadd-croptop=0 + +# Pixels to crop from bottom (integer) +#croppadd-cropbottom=0 + +# Pixels to crop from left (integer) +#croppadd-cropleft=0 + +# Pixels to crop from right (integer) +#croppadd-cropright=0 + +# Pixels to padd to top (integer) +#croppadd-paddtop=0 + +# Pixels to padd to bottom (integer) +#croppadd-paddbottom=0 + +# Pixels to padd to left (integer) +#croppadd-paddleft=0 + +# Pixels to padd to right (integer) +#croppadd-paddright=0 + +[alphamask] # Alpha mask video filter + +# Transparency mask (string) +#alphamask-mask= + +[posterize] # Posterize video filter + +# Posterize level (integer) +#posterize-level=6 + +[mirror] # Mirror video filter + +# Mirror orientation (integer) +#mirror-split=0 + +# Direction (integer) +#mirror-direction=0 + +[extract] # Extract RGB component video filter + +# RGB component to extract (integer) +#extract-component=16711680 + +[gradient] # Gradient video filter + +# Distort mode (string) +#gradient-mode=gradient + +# Gradient image type (integer) +#gradient-type=0 + +# Apply cartoon effect (boolean) +#gradient-cartoon=1 + +[sharpen] # Sharpen video filter + +# Sharpen strength (0-2) (float) +#sharpen-sigma=0.050000 + +[ball] # Ball video filter + +# Ball color (string) +#ball-color=red + +# Ball speed (integer) +#ball-speed=4 + +# Ball size (integer) +#ball-size=10 + +# Gradient threshold (integer) +#ball-gradient-threshold=40 + +# Edge visible (boolean) +#ball-edge-visible=1 + +[puzzle] # Puzzle interactive game video filter + +# Number of puzzle rows (integer) +#puzzle-rows=4 + +# Number of puzzle columns (integer) +#puzzle-cols=4 + +# Border (integer) +#puzzle-border=3 + +# Small preview (boolean) +#puzzle-preview=0 + +# Small preview size (integer) +#puzzle-preview-size=15 + +# Piece edge shape size (integer) +#puzzle-shape-size=90 + +# Auto shuffle (integer) +#puzzle-auto-shuffle=0 + +# Auto solve (integer) +#puzzle-auto-solve=0 + +# Rotation (integer) +#puzzle-rotation=0 + +# Game mode (integer) +#puzzle-mode=0 + +[qt] # Qt interface + +# Start in minimal view (without menus) (boolean) +#qt-minimal-view=0 + +# Systray icon (boolean) +#qt-system-tray=1 + +# Show notification popup on track change (integer) +#qt-notification=1 + +# Start VLC with only a systray icon (boolean) +#qt-start-minimized=0 + +# Pause the video playback when minimized (boolean) +#qt-pause-minimized=0 + +# Windows opacity between 0.1 and 1 (float) +#qt-opacity=1.000000 + +# Fullscreen controller opacity between 0.1 and 1 (float) +#qt-fs-opacity=0.800000 + +# Resize interface to the native video size (boolean) +qt-video-autoresize=0 + +# Show playing item name in window title (boolean) +#qt-name-in-title=1 + +# Show a controller in fullscreen mode (boolean) +#qt-fs-controller=1 + +# Save the recently played items in the menu (boolean) +#qt-recentplay=1 + +# List of words separated by | to filter (string) +#qt-recentplay-filter= + +# Continue playback? (integer) +#qt-continue=1 + +# Enable Dark Mode (boolean) +#qt-dark-palette=0 + +# Embed the file browser in open dialog (boolean) +#qt-embedded-open=0 + +# Show advanced preferences over simple ones (boolean) +#qt-advanced-pref=0 + +# Show unimportant error and warnings dialogs (boolean) +#qt-error-dialogs=1 + +# Define the colors of the volume slider (string) +#qt-slider-colours=153;210;153;20;210;20;255;199;15;245;39;29 + +# Ask for network policy at start (boolean) +qt-privacy-ask=0 + +# Define which screen fullscreen goes (integer) +#qt-fullscreen-screennumber=-1 + +# Load extensions on startup (boolean) +#qt-autoload-extensions=1 + +# Display background cone or art (boolean) +#qt-bgcone=1 + +# Expanding background cone or art (boolean) +#qt-bgcone-expands=0 + +# Allow automatic icon changes (boolean) +#qt-icon-change=1 + +# Maximum Volume displayed (integer) +qt-max-volume=100 + +# Fullscreen controller mouse sensitivity (integer) +#qt-fs-sensitivity=3 + +# When to raise the interface (integer) +#qt-auto-raise=1 + +[prefetch] # Stream prefetch filter + +# Buffer size (integer) +#prefetch-buffer-size=16384 + +# Read size (integer) +#prefetch-read-size=16777216 + +# Seek threshold (integer) +#prefetch-seek-threshold=16384 + +[console] # Console logger + +[file] # File logger + +# Log to file (boolean) +#file-logging=0 + +# Log filename (string) +#logfile= + +# Log format (string) +#logmode=text + +# Verbosity (integer) +#log-verbose=-1 + +[syslog] # System logger (syslog) + +# System log (syslog) (boolean) +#syslog=0 + +# Debug messages (boolean) +#syslog-debug=0 + +# Identity (string) +#syslog-ident=vlc + +# Facility (string) +#syslog-facility=user + +[mpegvideo] # MPEG-I/II video packetizer + +# Sync on Intra Frame (boolean) +#packetizer-mpegvideo-sync-iframe=0 + +[playlist] # Playlist + +# Skip ads (boolean) +#playlist-skip-ads=1 + +# Show shoutcast adult content (boolean) +#shoutcast-show-adult=0 + +[mp4] # MP4 stream demuxer + +# M4A audio only (boolean) +#mp4-m4a-audioonly=0 + +[subtitle] # Text subtitle parser + +# Frames per Second (float) +#sub-fps=0.000000 + +# Subtitle delay (integer) +#sub-delay=0 + +# Subtitle format (string) +#sub-type=auto + +# Subtitle description (string) +#sub-description= + +[mjpeg] # M-JPEG camera demuxer + +# Frames per Second (float) +#mjpeg-fps=0.000000 + +[demuxdump] # File dumper + +# Dump module (string) +#demuxdump-access=file + +# Dump filename (string) +#demuxdump-file=stream-demux.dump + +# Append to existing file (boolean) +#demuxdump-append=0 + +[h26x] # H264 video demuxer + +# Frames per Second (float) +#h264-fps=0.000000 + +# Frames per Second (float) +#hevc-fps=0.000000 + +[image] # Image demuxer + +# ES ID (integer) +#image-id=-1 + +# Group (integer) +#image-group=0 + +# Decode (boolean) +#image-decode=1 + +# Forced chroma (string) +#image-chroma= + +# Duration in seconds (float) +#image-duration=10.000000 + +# Frame rate (string) +#image-fps=10/1 + +# Real-time (boolean) +#image-realtime=0 + +[es] # MPEG-I/II/4 / A52 / DTS / MLP audio + +# Frames per Second (float) +#es-fps=25.000000 + +[vc1] # VC1 video demuxer + +# Frames per Second (float) +#vc1-fps=25.000000 + +[ps] # MPEG-PS demuxer + +# Trust MPEG timestamps (boolean) +#ps-trust-timestamps=1 + +[ts] # MPEG Transport Stream demuxer + +# Digital TV Standard (string) +#ts-standard=auto + +# Extra PMT (string) +#ts-extra-pmt= + +# Trust in-stream PCR (boolean) +#ts-trust-pcr=1 + +# Set id of ES to PID (boolean) +#ts-es-id-pid=1 + +# CSA Key (string) +#ts-csa-ck= + +# Second CSA Key (string) +#ts-csa2-ck= + +# Packet size in bytes to decrypt (integer) +#ts-csa-pkt=188 + +# Separate sub-streams (boolean) +#ts-split-es=1 + +# Seek based on percent not time (boolean) +#ts-seek-percent=0 + +# Check packets continuity counter (boolean) +#ts-cc-check=1 + +# Only create ES on program sending data (boolean) +#ts-pmtfix-waitdata=1 + +# Try to generate PAT/PMT if missing (boolean) +#ts-patfix=1 + +# Try to fix too early PCR (or late DTS) (boolean) +#ts-pcr-offsetfix=1 + +[rawvid] # Raw video demuxer + +# Frames per Second (string) +#rawvid-fps= + +# Width (integer) +#rawvid-width=0 + +# Height (integer) +#rawvid-height=0 + +# Force chroma (Use carefully) (string) +#rawvid-chroma= + +# Aspect ratio (string) +#rawvid-aspect-ratio= + +[rawdv] # DV (Digital Video) demuxer + +# Hurry up (boolean) +#rawdv-hurry-up=0 + +[mod] # MOD demuxer (libmodplug) + +# Noise reduction (boolean) +#mod-noisereduction=1 + +# Reverb (boolean) +#mod-reverb=0 + +# Reverberation level (integer) +#mod-reverb-level=0 + +# Reverberation delay (integer) +#mod-reverb-delay=40 + +# Mega bass (boolean) +#mod-megabass=0 + +# Mega bass level (integer) +#mod-megabass-level=0 + +# Mega bass cutoff (integer) +#mod-megabass-range=10 + +# Surround (boolean) +#mod-surround=0 + +# Surround level (integer) +#mod-surround-level=0 + +# Surround delay (ms) (integer) +#mod-surround-delay=5 + +[adaptive] # Unified adaptive streaming for DASH/HLS + +# Adaptive Logic (string) +#adaptive-logic= + +# Maximum device width (integer) +#adaptive-maxwidth=0 + +# Maximum device height (integer) +#adaptive-maxheight=0 + +# Fixed Bandwidth in KiB/s (integer) +#adaptive-bw=250 + +# Use regular HTTP modules (boolean) +#adaptive-use-access=0 + +# Live Playback delay (ms) (integer) +#adaptive-livedelay=15000 + +# Max buffering (ms) (integer) +#adaptive-maxbuffer=30000 + +# Low latency (integer) +#adaptive-lowlatency=-1 + +[mkv] # Matroska stream demuxer + +# Respect ordered chapters (boolean) +#mkv-use-ordered-chapters=1 + +# Chapter codecs (boolean) +#mkv-use-chapter-codec=1 + +# Preload MKV files in the same directory (boolean) +#mkv-preload-local-dir=1 + +# Seek based on percent not time (boolean) +#mkv-seek-percent=0 + +# Dummy Elements (boolean) +#mkv-use-dummy=0 + +# Preload clusters (boolean) +#mkv-preload-clusters=0 + +[rawaud] # Raw audio demuxer + +# Audio channels (integer) +#rawaud-channels=2 + +# Audio samplerate (Hz) (integer) +#rawaud-samplerate=48000 + +# FOURCC code of raw input format (string) +#rawaud-fourcc=s16l + +# Forces the audio language (string) +#rawaud-lang=eng + +[diracsys] # Dirac video demuxer + +# Value to adjust dts by (integer) +#dirac-dts-offset=0 + +[avformat] # Avformat demuxer + +# Format name (string) +#avformat-format= + +# Advanced options (string) +#avformat-options= + +# Avformat mux (string) +#sout-avformat-mux= + +# Advanced options (string) +#sout-avformat-options= + +# Reset timestamps (boolean) +#sout-avformat-reset-ts=1 + +[avi] # AVI demuxer + +# Force interleaved method (boolean) +#avi-interleaved=0 + +# Force index creation (integer) +#avi-index=0 + +[file] # Secrets are stored on a file without any encryption + +# ? (string) +#keystore-file= + +[es] # Elementary stream output + +# Output access method (string) +#sout-es-access= + +# Output muxer (string) +#sout-es-mux= + +# Output URL (string) +#sout-es-dst= + +# Audio output access method (string) +#sout-es-access-audio= + +# Audio output muxer (string) +#sout-es-mux-audio= + +# Audio output URL (string) +#sout-es-dst-audio= + +# Video output access method (string) +#sout-es-access-video= + +# Video output muxer (string) +#sout-es-mux-video= + +# Video output URL (string) +#sout-es-dst-video= + +[stream_out_rtp] # RTP stream output + +# Destination (string) +#sout-rtp-dst= + +# SDP (string) +#sout-rtp-sdp= + +# Muxer (string) +#sout-rtp-mux= + +# SAP announcing (boolean) +#sout-rtp-sap=0 + +# Session name (string) +#sout-rtp-name= + +# Session category (string) +#sout-rtp-cat= + +# Session description (string) +#sout-rtp-description= + +# Session URL (string) +#sout-rtp-url= + +# Session email (string) +#sout-rtp-email= + +# Transport protocol (string) +#sout-rtp-proto=udp + +# Port (integer) +#sout-rtp-port=5004 + +# Audio port (integer) +#sout-rtp-port-audio=0 + +# Video port (integer) +#sout-rtp-port-video=0 + +# Hop limit (TTL) (integer) +#sout-rtp-ttl=-1 + +# RTP/RTCP multiplexing (boolean) +#sout-rtp-rtcp-mux=0 + +# Caching value (ms) (integer) +#sout-rtp-caching=300 + +# MP4A LATM (boolean) +#sout-rtp-mp4a-latm=0 + +# RTSP session timeout (s) (integer) +#rtsp-timeout=60 + +# Username (string) +#sout-rtsp-user= + +# Password (string) +#sout-rtsp-pwd= + +[stream_out_chromecast] # Chromecast stream output + +# ? (string) +#sout-chromecast-ip= + +# ? (integer) +#sout-chromecast-port=8009 + +# ? (boolean) +#sout-chromecast-video=1 + +# HTTP port (integer) +#sout-chromecast-http-port=8010 + +# Performance warning (integer) +#sout-chromecast-show-perf-warning=1 + +# Enable Audio passthrough (boolean) +#sout-chromecast-audio-passthrough=0 + +# Conversion quality (integer) +#sout-chromecast-conversion-quality=1 + +[record] # Record stream output + +# Destination prefix (string) +#sout-record-dst-prefix= + +[delay] # Delay a stream + +# Elementary Stream ID (integer) +#sout-delay-id=0 + +# Delay of the ES (ms) (integer) +#sout-delay-delay=0 + +[display] # Display stream output + +# Enable audio (boolean) +#sout-display-audio=1 + +# Enable video (boolean) +#sout-display-video=1 + +# Delay (ms) (integer) +#sout-display-delay=100 + +[stream_out_standard] # Standard stream output + +# Output access method (string) +#sout-standard-access= + +# Output muxer (string) +#sout-standard-mux= + +# Output destination (string) +#sout-standard-dst= + +# Address to bind to (helper setting for dst) (string) +#sout-standard-bind= + +# Filename for stream (helper setting for dst) (string) +#sout-standard-path= + +# SAP announcing (boolean) +#sout-standard-sap=0 + +# Session name (string) +#sout-standard-name= + +# Session description (string) +#sout-standard-description= + +# Session URL (string) +#sout-standard-url= + +# Session email (string) +#sout-standard-email= + +[setid] # Change the id of an elementary stream + +# Elementary Stream ID (integer) +#sout-setid-id=0 + +# New ES ID (integer) +#sout-setid-new-id=0 + +# Elementary Stream ID (integer) +#sout-setlang-id=0 + +# Language (string) +#sout-setlang-lang=eng + +[bridge] # Bridge stream output + +# ID (integer) +#sout-bridge-out-id=0 + +# Destination bridge-in name (string) +#sout-bridge-out-in-name=default + +# Delay (integer) +#sout-bridge-in-delay=0 + +# ID Offset (integer) +#sout-bridge-in-id-offset=8192 + +# Name of current instance (string) +#sout-bridge-in-name=default + +# Fallback to placeholder stream when out of data (boolean) +#sout-bridge-in-placeholder=0 + +# Placeholder delay (integer) +#sout-bridge-in-placeholder-delay=200 + +# Wait for I frame before toggling placeholder (boolean) +#sout-bridge-in-placeholder-switch-on-iframe=1 + +[stats] # Writes statistic info about stream + +# Output file (string) +#sout-stats-output= + +# Prefix to show on output line (string) +#sout-stats-prefix=stats + +[smem] # Stream output to memory buffer + +# Time Synchronized output (boolean) +#sout-smem-time-sync=1 + +[stream_out_transcode] # Transcode stream output + +# Video encoder (string) +#sout-transcode-venc= + +# Destination video codec (string) +#sout-transcode-vcodec= + +# Video bitrate (integer) +#sout-transcode-vb=0 + +# Video scaling (float) +#sout-transcode-scale=0.000000 + +# Video frame-rate (string) +#sout-transcode-fps= + +# Deinterlace video (boolean) +#sout-transcode-deinterlace=0 + +# Deinterlace module (string) +#sout-transcode-deinterlace-module=deinterlace + +# Video width (integer) +#sout-transcode-width=0 + +# Video height (integer) +#sout-transcode-height=0 + +# Maximum video width (integer) +#sout-transcode-maxwidth=0 + +# Maximum video height (integer) +#sout-transcode-maxheight=0 + +# Video filter (string) +#sout-transcode-vfilter= + +# Audio encoder (string) +#sout-transcode-aenc= + +# Destination audio codec (string) +#sout-transcode-acodec= + +# Audio bitrate (integer) +#sout-transcode-ab=96 + +# Audio language (string) +#sout-transcode-alang= + +# Audio channels (integer) +#sout-transcode-channels=0 + +# Audio sample rate (integer) +#sout-transcode-samplerate=0 + +# Audio filter (string) +#sout-transcode-afilter= + +# Subtitle encoder (string) +#sout-transcode-senc= + +# Destination subtitle codec (string) +#sout-transcode-scodec= + +# Destination subtitle codec (boolean) +#sout-transcode-soverlay=0 + +# Overlays (string) +#sout-transcode-sfilter= + +# Number of threads (integer) +#sout-transcode-threads=0 + +# Picture pool size (integer) +#sout-transcode-pool-size=10 + +# High priority (boolean) +#sout-transcode-high-priority=0 + +[mosaic_bridge] # Mosaic bridge stream output + +# ID (string) +#sout-mosaic-bridge-id=Id + +# Video width (integer) +#sout-mosaic-bridge-width=0 + +# Video height (integer) +#sout-mosaic-bridge-height=0 + +# Sample aspect ratio (string) +#sout-mosaic-bridge-sar=1:1 + +# Image chroma (string) +#sout-mosaic-bridge-chroma= + +# Video filter (string) +#sout-mosaic-bridge-vfilter= + +# Transparency (integer) +#sout-mosaic-bridge-alpha=255 + +# X offset (integer) +#sout-mosaic-bridge-x=-1 + +# Y offset (integer) +#sout-mosaic-bridge-y=-1 + +[vdpau_chroma] # VDPAU surface conversions + +# Deinterlace (integer) +#vdpau-deinterlace=1 + +# Inverse telecine (boolean) +#vdpau-ivtc=0 + +# Deinterlace chroma skip (boolean) +#vdpau-chroma-skip=0 + +# Noise reduction level (float) +#vdpau-noise-reduction=0.000000 + +# Scaling quality (integer) +#vdpau-scaling=0 + +[svg] # svg + +# SVG template file (string) +#svg-template-file= + +[freetype] # Freetype2 font renderer + +# Font (string) +freetype-font=Noto Sans + +# Monospace Font (string) +#freetype-monofont=Monospace + +# Font size in pixels (integer) +#freetype-fontsize=0 + +# Relative font size (integer) +freetype-rel-fontsize=20 + +# Text opacity (integer) +#freetype-opacity=255 + +# Text default color (integer) +#freetype-color=16777215 + +# Force bold (boolean) +#freetype-bold=0 + +# Background opacity (integer) +#freetype-background-opacity=0 + +# Background color (integer) +#freetype-background-color=0 + +# Outline opacity (integer) +#freetype-outline-opacity=255 + +# Outline color (integer) +#freetype-outline-color=0 + +# Outline thickness (integer) +#freetype-outline-thickness=4 + +# Shadow opacity (integer) +#freetype-shadow-opacity=128 + +# Shadow color (integer) +#freetype-shadow-color=0 + +# Shadow angle (float) +#freetype-shadow-angle=-45.000000 + +# Shadow distance (float) +#freetype-shadow-distance=0.060000 + +# Use YUVP renderer (boolean) +#freetype-yuvp=0 + +# Text direction (integer) +#freetype-text-direction=0 + +[lua] # Lua interpreter + +# Lua interface (string) +#lua-intf=dummy + +# Lua interface configuration (string) +#lua-config= + +# Password (string) +#http-password= + +# Source directory (string) +#http-src= + +# Directory index (boolean) +#http-index=0 + +# TCP command input (string) +#rc-host= + +# CLI input (string) +#cli-host= + +# Host (string) +#telnet-host=localhost + +# Port (integer) +#telnet-port=4212 + +# Password (string) +#telnet-password= + +[clone] # Clone video filter + +# Number of clones (integer) +#clone-count=2 + +# Video output modules (string) +#clone-vout-list= + +[wall] # Wall video filter + +# Number of columns (integer) +#wall-cols=3 + +# Number of rows (integer) +#wall-rows=3 + +# Active windows (string) +#wall-active= + +# Element aspect ratio (string) +#wall-element-aspect=16:9 + +[panoramix] # Panoramix: wall with overlap video filter + +# Number of columns (integer) +#panoramix-cols=-1 + +# Number of rows (integer) +#panoramix-rows=-1 + +# length of the overlapping area (in %) (integer) +#panoramix-bz-length=100 + +# height of the overlapping area (in %) (integer) +#panoramix-bz-height=100 + +# Attenuation (boolean) +#panoramix-attenuate=1 + +# Attenuation, begin (in %) (integer) +#panoramix-bz-begin=0 + +# Attenuation, middle (in %) (integer) +#panoramix-bz-middle=50 + +# Attenuation, end (in %) (integer) +#panoramix-bz-end=100 + +# middle position (in %) (integer) +#panoramix-bz-middle-pos=50 + +# Gamma (Red) correction (float) +#panoramix-bz-gamma-red=1.000000 + +# Gamma (Green) correction (float) +#panoramix-bz-gamma-green=1.000000 + +# Gamma (Blue) correction (float) +#panoramix-bz-gamma-blue=1.000000 + +# Black Crush for Red (integer) +#panoramix-bz-blackcrush-red=140 + +# Black Crush for Green (integer) +#panoramix-bz-blackcrush-green=140 + +# Black Crush for Blue (integer) +#panoramix-bz-blackcrush-blue=140 + +# White Crush for Red (integer) +#panoramix-bz-whitecrush-red=200 + +# White Crush for Green (integer) +#panoramix-bz-whitecrush-green=200 + +# White Crush for Blue (integer) +#panoramix-bz-whitecrush-blue=200 + +# Black Level for Red (integer) +#panoramix-bz-blacklevel-red=150 + +# Black Level for Green (integer) +#panoramix-bz-blacklevel-green=150 + +# Black Level for Blue (integer) +#panoramix-bz-blacklevel-blue=150 + +# White Level for Red (integer) +#panoramix-bz-whitelevel-red=0 + +# White Level for Green (integer) +#panoramix-bz-whitelevel-green=0 + +# White Level for Blue (integer) +#panoramix-bz-whitelevel-blue=0 + +# Active windows (string) +#panoramix-active= + +[speex] # Speex audio decoder + +# Mode (integer) +#sout-speex-mode=0 + +# Encoding complexity (integer) +#sout-speex-complexity=3 + +# CBR encoding (boolean) +#sout-speex-cbr=0 + +# Encoding quality (float) +#sout-speex-quality=8.000000 + +# Maximal bitrate (integer) +#sout-speex-max-bitrate=0 + +# Voice activity detection (boolean) +#sout-speex-vad=1 + +# Discontinuous Transmission (boolean) +#sout-speex-dtx=0 + +[ddummy] # Dummy decoder + +# Save raw codec data (boolean) +#dummy-save-es=0 + +[zvbi] # VBI and Teletext decoder + +# Teletext page (integer) +#vbi-page=100 + +# Opacity (boolean) +#vbi-opaque=0 + +# Teletext alignment (integer) +#vbi-position=8 + +# Teletext text subtitles (boolean) +#vbi-text=0 + +# Presentation Level (integer) +#vbi-level=3 + +[dav1d] # Dav1d video decoder + +# Frames Threads (integer) +#dav1d-thread-frames=0 + +# All Layers (boolean) +#dav1d-all-layers=0 + +[kate] # Kate overlay decoder + +# Formatted Subtitles (boolean) +#kate-formatted=1 + +# Use Tiger for rendering (boolean) +#kate-use-tiger=1 + +# Rendering quality (float) +#kate-tiger-quality=1.000000 + +# Default font description (string) +#kate-tiger-default-font-desc= + +# Default font effect (integer) +#kate-tiger-default-font-effect=0 + +# Default font effect strength (float) +#kate-tiger-default-font-effect-strength=0.500000 + +# Default font color (integer) +#kate-tiger-default-font-color=16777215 + +# Default font alpha (integer) +#kate-tiger-default-font-alpha=255 + +# Default background color (integer) +#kate-tiger-default-background-color=16777215 + +# Default background alpha (integer) +#kate-tiger-default-background-alpha=0 + +[theora] # Theora video decoder + +# Post processing quality (integer) +#theora-postproc=-1 + +# Encoding quality (integer) +#sout-theora-quality=2 + +[svcdsub] # Philips OGT (SVCD subtitle) decoder + +[telx] # Teletext subtitles decoder + +# Override page (integer) +#telx-override-page=-1 + +# Ignore subtitle flag (boolean) +#telx-ignore-subtitle-flag=0 + +# Workaround for France (boolean) +#telx-french-workaround=0 + +[twolame] # Libtwolame audio encoder + +# Encoding quality (float) +#sout-twolame-quality=0.000000 + +# Stereo mode (integer) +#sout-twolame-mode=0 + +# VBR mode (boolean) +#sout-twolame-vbr=0 + +# Psycho-acoustic model (integer) +#sout-twolame-psy=3 + +[spudec] # DVD subtitles decoder + +# Disable DVD subtitle transparency (boolean) +#dvdsub-transparency=0 + +[cc] # Closed Captions decoder + +# Opacity (boolean) +#cc-opaque=1 + +[x26410b] # H.264/MPEG-4 Part 10/AVC encoder (x264 10-bit) + +# Maximum GOP size (integer) +#sout-x26410b-keyint=250 + +# Minimum GOP size (integer) +#sout-x26410b-min-keyint=25 + +# Use recovery points to close GOPs (boolean) +#sout-x26410b-opengop=0 + +# Enable compatibility hacks for Blu-ray support (boolean) +#sout-x26410b-bluray-compat=0 + +# Extra I-frames aggressivity (integer) +#sout-x26410b-scenecut=40 + +# B-frames between I and P (integer) +#sout-x26410b-bframes=3 + +# Adaptive B-frame decision (integer) +#sout-x26410b-b-adapt=1 + +# Influence (bias) B-frames usage (integer) +#sout-x26410b-b-bias=0 + +# Keep some B-frames as references (string) +#sout-x26410b-bpyramid=normal + +# CABAC (boolean) +#sout-x26410b-cabac=1 + +# Use fullrange instead of TV colorrange (boolean) +#sout-x26410b-fullrange=0 + +# Number of reference frames (integer) +#sout-x26410b-ref=3 + +# Skip loop filter (boolean) +#sout-x26410b-nf=0 + +# Loop filter AlphaC0 and Beta parameters alpha:beta (string) +#sout-x26410b-deblock=0:0 + +# Strength of psychovisual optimization, default is "1.0:0.0" (string) +#sout-x26410b-psy-rd=1.0:0.0 + +# Use Psy-optimizations (boolean) +#sout-x26410b-psy=1 + +# H.264 level (string) +#sout-x26410b-level=0 + +# H.264 profile (string) +#sout-x26410b-profile=high + +# Interlaced mode (boolean) +#sout-x26410b-interlaced=0 + +# Frame packing (integer) +#sout-x26410b-frame-packing=-1 + +# Force number of slices per frame (integer) +#sout-x26410b-slices=0 + +# Limit the size of each slice in bytes (integer) +#sout-x26410b-slice-max-size=0 + +# Limit the size of each slice in macroblocks (integer) +#sout-x26410b-slice-max-mbs=0 + +# HRD-timing information (string) +#sout-x26410b-hrd=none + +# Set QP (integer) +#sout-x26410b-qp=-1 + +# Quality-based VBR (integer) +#sout-x26410b-crf=23 + +# Min QP (integer) +#sout-x26410b-qpmin=10 + +# Max QP (integer) +#sout-x26410b-qpmax=51 + +# Max QP step (integer) +#sout-x26410b-qpstep=4 + +# Average bitrate tolerance (float) +#sout-x26410b-ratetol=1.000000 + +# Max local bitrate (integer) +#sout-x26410b-vbv-maxrate=0 + +# VBV buffer (integer) +#sout-x26410b-vbv-bufsize=0 + +# Initial VBV buffer occupancy (float) +#sout-x26410b-vbv-init=0.900000 + +# QP factor between I and P (float) +#sout-x26410b-ipratio=1.400000 + +# QP factor between P and B (float) +#sout-x26410b-pbratio=1.300000 + +# QP difference between chroma and luma (integer) +#sout-x26410b-chroma-qp-offset=0 + +# Multipass ratecontrol (integer) +#sout-x26410b-pass=0 + +# QP curve compression (float) +#sout-x26410b-qcomp=0.600000 + +# Reduce fluctuations in QP (float) +#sout-x26410b-cplxblur=20.000000 + +# Reduce fluctuations in QP (float) +#sout-x26410b-qblur=0.500000 + +# How AQ distributes bits (integer) +#sout-x26410b-aq-mode=1 + +# Strength of AQ (float) +#sout-x26410b-aq-strength=1.000000 + +# Partitions to consider (string) +#sout-x26410b-partitions=normal + +# Direct MV prediction mode (string) +#sout-x26410b-direct=spatial + +# Direct prediction size (integer) +#sout-x26410b-direct-8x8=1 + +# Weighted prediction for B-frames (boolean) +#sout-x26410b-weightb=1 + +# Weighted prediction for P-frames (integer) +#sout-x26410b-weightp=2 + +# Integer pixel motion estimation method (string) +#sout-x26410b-me=hex + +# Maximum motion vector search range (integer) +#sout-x26410b-merange=16 + +# Maximum motion vector length (integer) +#sout-x26410b-mvrange=-1 + +# Minimum buffer space between threads (integer) +#sout-x26410b-mvrange-thread=-1 + +# Subpixel motion estimation and partition decision quality (integer) +#sout-x26410b-subme=7 + +# Decide references on a per partition basis (boolean) +#sout-x26410b-mixed-refs=1 + +# Chroma in motion estimation (boolean) +#sout-x26410b-chroma-me=1 + +# Adaptive spatial transform size (boolean) +#sout-x26410b-8x8dct=1 + +# Trellis RD quantization (integer) +#sout-x26410b-trellis=1 + +# Framecount to use on frametype lookahead (integer) +#sout-x26410b-lookahead=40 + +# Use Periodic Intra Refresh (boolean) +#sout-x26410b-intra-refresh=0 + +# Use mb-tree ratecontrol (boolean) +#sout-x26410b-mbtree=1 + +# Early SKIP detection on P-frames (boolean) +#sout-x26410b-fast-pskip=1 + +# Coefficient thresholding on P-frames (boolean) +#sout-x26410b-dct-decimate=1 + +# Noise reduction (integer) +#sout-x26410b-nr=0 + +# Inter luma quantization deadzone (integer) +#sout-x26410b-deadzone-inter=21 + +# Intra luma quantization deadzone (integer) +#sout-x26410b-deadzone-intra=11 + +# Non-deterministic optimizations when threaded (boolean) +#sout-x26410b-non-deterministic=0 + +# CPU optimizations (boolean) +#sout-x26410b-asm=1 + +# PSNR computation (boolean) +#sout-x26410b-psnr=0 + +# SSIM computation (boolean) +#sout-x26410b-ssim=0 + +# Quiet mode (boolean) +#sout-x26410b-quiet=0 + +# SPS and PPS id numbers (integer) +#sout-x26410b-sps-id=0 + +# Access unit delimiters (boolean) +#sout-x26410b-aud=0 + +# Statistics (boolean) +#sout-x26410b-verbose=0 + +# Filename for 2 pass stats file (string) +#sout-x26410b-stats=x264_2pass.log + +# Default preset setting used (string) +#sout-x26410b-preset= + +# Default tune setting used (string) +#sout-x26410b-tune= + +# x264 advanced options (string) +#sout-x26410b-options= + +[jpeg] # JPEG image decoder + +# Quality level (integer) +#sout-jpeg-quality=95 + +[x264] # H.264/MPEG-4 Part 10/AVC encoder (x264) + +# Maximum GOP size (integer) +#sout-x264-keyint=250 + +# Minimum GOP size (integer) +#sout-x264-min-keyint=25 + +# Use recovery points to close GOPs (boolean) +#sout-x264-opengop=0 + +# Enable compatibility hacks for Blu-ray support (boolean) +#sout-x264-bluray-compat=0 + +# Extra I-frames aggressivity (integer) +#sout-x264-scenecut=40 + +# B-frames between I and P (integer) +#sout-x264-bframes=3 + +# Adaptive B-frame decision (integer) +#sout-x264-b-adapt=1 + +# Influence (bias) B-frames usage (integer) +#sout-x264-b-bias=0 + +# Keep some B-frames as references (string) +#sout-x264-bpyramid=normal + +# CABAC (boolean) +#sout-x264-cabac=1 + +# Use fullrange instead of TV colorrange (boolean) +#sout-x264-fullrange=0 + +# Number of reference frames (integer) +#sout-x264-ref=3 + +# Skip loop filter (boolean) +#sout-x264-nf=0 + +# Loop filter AlphaC0 and Beta parameters alpha:beta (string) +#sout-x264-deblock=0:0 + +# Strength of psychovisual optimization, default is "1.0:0.0" (string) +#sout-x264-psy-rd=1.0:0.0 + +# Use Psy-optimizations (boolean) +#sout-x264-psy=1 + +# H.264 level (string) +#sout-x264-level=0 + +# H.264 profile (string) +#sout-x264-profile=high + +# Interlaced mode (boolean) +#sout-x264-interlaced=0 + +# Frame packing (integer) +#sout-x264-frame-packing=-1 + +# Force number of slices per frame (integer) +#sout-x264-slices=0 + +# Limit the size of each slice in bytes (integer) +#sout-x264-slice-max-size=0 + +# Limit the size of each slice in macroblocks (integer) +#sout-x264-slice-max-mbs=0 + +# HRD-timing information (string) +#sout-x264-hrd=none + +# Set QP (integer) +#sout-x264-qp=-1 + +# Quality-based VBR (integer) +#sout-x264-crf=23 + +# Min QP (integer) +#sout-x264-qpmin=10 + +# Max QP (integer) +#sout-x264-qpmax=51 + +# Max QP step (integer) +#sout-x264-qpstep=4 + +# Average bitrate tolerance (float) +#sout-x264-ratetol=1.000000 + +# Max local bitrate (integer) +#sout-x264-vbv-maxrate=0 + +# VBV buffer (integer) +#sout-x264-vbv-bufsize=0 + +# Initial VBV buffer occupancy (float) +#sout-x264-vbv-init=0.900000 + +# QP factor between I and P (float) +#sout-x264-ipratio=1.400000 + +# QP factor between P and B (float) +#sout-x264-pbratio=1.300000 + +# QP difference between chroma and luma (integer) +#sout-x264-chroma-qp-offset=0 + +# Multipass ratecontrol (integer) +#sout-x264-pass=0 + +# QP curve compression (float) +#sout-x264-qcomp=0.600000 + +# Reduce fluctuations in QP (float) +#sout-x264-cplxblur=20.000000 + +# Reduce fluctuations in QP (float) +#sout-x264-qblur=0.500000 + +# How AQ distributes bits (integer) +#sout-x264-aq-mode=1 + +# Strength of AQ (float) +#sout-x264-aq-strength=1.000000 + +# Partitions to consider (string) +#sout-x264-partitions=normal + +# Direct MV prediction mode (string) +#sout-x264-direct=spatial + +# Direct prediction size (integer) +#sout-x264-direct-8x8=1 + +# Weighted prediction for B-frames (boolean) +#sout-x264-weightb=1 + +# Weighted prediction for P-frames (integer) +#sout-x264-weightp=2 + +# Integer pixel motion estimation method (string) +#sout-x264-me=hex + +# Maximum motion vector search range (integer) +#sout-x264-merange=16 + +# Maximum motion vector length (integer) +#sout-x264-mvrange=-1 + +# Minimum buffer space between threads (integer) +#sout-x264-mvrange-thread=-1 + +# Subpixel motion estimation and partition decision quality (integer) +#sout-x264-subme=7 + +# Decide references on a per partition basis (boolean) +#sout-x264-mixed-refs=1 + +# Chroma in motion estimation (boolean) +#sout-x264-chroma-me=1 + +# Adaptive spatial transform size (boolean) +#sout-x264-8x8dct=1 + +# Trellis RD quantization (integer) +#sout-x264-trellis=1 + +# Framecount to use on frametype lookahead (integer) +#sout-x264-lookahead=40 + +# Use Periodic Intra Refresh (boolean) +#sout-x264-intra-refresh=0 + +# Use mb-tree ratecontrol (boolean) +#sout-x264-mbtree=1 + +# Early SKIP detection on P-frames (boolean) +#sout-x264-fast-pskip=1 + +# Coefficient thresholding on P-frames (boolean) +#sout-x264-dct-decimate=1 + +# Noise reduction (integer) +#sout-x264-nr=0 + +# Inter luma quantization deadzone (integer) +#sout-x264-deadzone-inter=21 + +# Intra luma quantization deadzone (integer) +#sout-x264-deadzone-intra=11 + +# Non-deterministic optimizations when threaded (boolean) +#sout-x264-non-deterministic=0 + +# CPU optimizations (boolean) +#sout-x264-asm=1 + +# PSNR computation (boolean) +#sout-x264-psnr=0 + +# SSIM computation (boolean) +#sout-x264-ssim=0 + +# Quiet mode (boolean) +#sout-x264-quiet=0 + +# SPS and PPS id numbers (integer) +#sout-x264-sps-id=0 + +# Access unit delimiters (boolean) +#sout-x264-aud=0 + +# Statistics (boolean) +#sout-x264-verbose=0 + +# Filename for 2 pass stats file (string) +#sout-x264-stats=x264_2pass.log + +# Default preset setting used (string) +#sout-x264-preset= + +# Default tune setting used (string) +#sout-x264-tune= + +# x264 advanced options (string) +#sout-x264-options= + +[vpx] # WebM video decoder + +# Quality mode (integer) +#sout-vpx-quality-mode=1000000 + +[fluidsynth] # FluidSynth MIDI synthesizer + +# SoundFont file (string) +#soundfont= + +# Chorus (boolean) +#synth-chorus=1 + +# Synthesis gain (float) +#synth-gain=0.500000 + +# Polyphony (integer) +#synth-polyphony=256 + +# Reverb (boolean) +#synth-reverb=1 + +# Sample rate (integer) +#synth-sample-rate=44100 + +[gstdecode] # GStreamer Based Decoder + +# Use DecodeBin (boolean) +#use-decodebin=1 + +[avcodec] # FFmpeg audio/video decoder + +# Direct rendering (boolean) +#avcodec-dr=1 + +# Show corrupted frames (boolean) +#avcodec-corrupted=1 + +# Error resilience (integer) +#avcodec-error-resilience=1 + +# Workaround bugs (integer) +#avcodec-workaround-bugs=1 + +# Hurry up (boolean) +#avcodec-hurry-up=1 + +# Skip frame (default=0) (integer) +#avcodec-skip-frame=0 + +# Skip idct (default=0) (integer) +#avcodec-skip-idct=0 + +# Allow speed tricks (boolean) +#avcodec-fast=0 + +# Skip the loop filter for H.264 decoding (integer) +#avcodec-skiploopfilter=0 + +# Debug mask (integer) +#avcodec-debug=0 + +# Codec name (string) +#avcodec-codec= + +# Hardware decoding (string) +#avcodec-hw=any + +# Threads (integer) +#avcodec-threads=0 + +# Advanced options (string) +#avcodec-options= + +# Codec name (string) +#sout-avcodec-codec= + +# Quality level (string) +#sout-avcodec-hq=rd + +# Ratio of key frames (integer) +#sout-avcodec-keyint=0 + +# Ratio of B frames (integer) +#sout-avcodec-bframes=0 + +# Hurry up (boolean) +#sout-avcodec-hurry-up=0 + +# Interlaced encoding (boolean) +#sout-avcodec-interlace=0 + +# Interlaced motion estimation (boolean) +#sout-avcodec-interlace-me=1 + +# Video bitrate tolerance (integer) +#sout-avcodec-vt=0 + +# Pre-motion estimation (boolean) +#sout-avcodec-pre-me=0 + +# Rate control buffer size (integer) +#sout-avcodec-rc-buffer-size=0 + +# Rate control buffer aggressiveness (float) +#sout-avcodec-rc-buffer-aggressivity=1.000000 + +# I quantization factor (float) +#sout-avcodec-i-quant-factor=0.000000 + +# Noise reduction (integer) +#sout-avcodec-noise-reduction=0 + +# MPEG4 quantization matrix (boolean) +#sout-avcodec-mpeg4-matrix=0 + +# Minimum video quantizer scale (integer) +#sout-avcodec-qmin=0 + +# Maximum video quantizer scale (integer) +#sout-avcodec-qmax=0 + +# Trellis quantization (boolean) +#sout-avcodec-trellis=0 + +# Fixed quantizer scale (float) +#sout-avcodec-qscale=3.000000 + +# Strict standard compliance (integer) +#sout-avcodec-strict=0 + +# Luminance masking (float) +#sout-avcodec-lumi-masking=0.000000 + +# Darkness masking (float) +#sout-avcodec-dark-masking=0.000000 + +# Motion masking (float) +#sout-avcodec-p-masking=0.000000 + +# Border masking (float) +#sout-avcodec-border-masking=0.000000 + +# Luminance elimination (integer) +#sout-avcodec-luma-elim-threshold=0 + +# Chrominance elimination (integer) +#sout-avcodec-chroma-elim-threshold=0 + +# Specify AAC audio profile to use (string) +#sout-avcodec-aac-profile=low + +# Advanced options (string) +#sout-avcodec-options= + +[subsdec] # Text subtitle decoder + +# Subtitle justification (integer) +#subsdec-align=-1 + +# Subtitle text encoding (string) +#subsdec-encoding= + +# UTF-8 subtitle autodetection (boolean) +#subsdec-autodetect-utf8=1 + +[ttml] # TTML subtitles decoder + +# Subtitle justification (integer) +#ttml-align=0 + +[libass] # Subtitle renderers using libass + +# Additional fonts directory (string) +#ssa-fontsdir= + +[dca] # DTS Coherent Acoustics audio decoder + +# DTS dynamic range compression (boolean) +#dts-dynrng=1 + +[dvbsub] # DVB subtitles decoder + +# Subpicture position (integer) +#dvbsub-position=8 + +# Decoding X coordinate (integer) +#dvbsub-x=-1 + +# Decoding Y coordinate (integer) +#dvbsub-y=-1 + +# Encoding X coordinate (integer) +#sout-dvbsub-x=-1 + +# Encoding Y coordinate (integer) +#sout-dvbsub-y=-1 + +[vorbis] # Vorbis audio decoder + +# Encoding quality (integer) +#sout-vorbis-quality=0 + +# Maximum encoding bitrate (integer) +#sout-vorbis-max-bitrate=0 + +# Minimum encoding bitrate (integer) +#sout-vorbis-min-bitrate=0 + +# CBR encoding (boolean) +#sout-vorbis-cbr=0 + +[subsusf] # USF subtitles decoder + +# Formatted Subtitles (boolean) +#subsdec-formatted=1 + +[aribsub] # ARIB subtitles decoder + +# Ignore ruby (furigana) (boolean) +#aribsub-ignore-ruby=0 + +# Use Core Text renderer (boolean) +#aribsub-use-coretext=0 + +[svgdec] # SVG video decoder + +# Image width (integer) +#svg-width=-1 + +# Image height (integer) +#svg-height=-1 + +# Scale factor (float) +#svg-scale=-1.000000 + +[a52] # ATSC A/52 (AC-3) audio decoder + +# A/52 dynamic range compression (boolean) +#a52-dynrng=1 + +[vdummy] # Dummy video output + +# Dummy image chroma format (string) +#dummy-chroma= + +[wl_shell] # Wayland shell surface + +# Wayland display (string) +#wl-display= + +[xcb_window] # X11 video window (XCB) + +# X11 display (string) +#x11-display= + +[gl] # OpenGL video output + +# OpenGL extension (string) +#gl= + +# Open GL/GLES hardware converter (string) +#glconv= + +[xcb_xv] # XVideo output (XCB) + +# XVideo adaptor number (integer) +#xvideo-adaptor=-1 + +# XVideo format id (integer) +#xvideo-format-id=0 + +[xcb_x11] # X11 video output (XCB) + +[xdg_shell] # XDG shell surface + +# Wayland display (string) +#wl-display= + +[flaschen] # Flaschen-Taschen video output + +# Flaschen-Taschen display address (string) +#flaschen-display= + +# Width (integer) +#flaschen-width=25 + +# Height (integer) +#flaschen-height=20 + +[vmem] # Video memory output + +# Width (integer) +#vmem-width=320 + +# Height (integer) +#vmem-height=200 + +# Pitch (integer) +#vmem-pitch=640 + +# Chroma (string) +#vmem-chroma=RV16 + +[yuv] # YUV video output + +# device, fifo or filename (string) +#yuv-file=stream.yuv + +# Chroma used (string) +#yuv-chroma= + +# Add a YUV4MPEG2 header (boolean) +#yuv-yuv4mpeg2=0 + +[fb] # GNU/Linux framebuffer video output + +# Framebuffer device (string) +#fbdev=/dev/fb0 + +# Run fb on current tty (boolean) +#fb-tty=1 + +# Image format (default RGB) (string) +#fb-chroma= + +# Framebuffer resolution to use (integer) +#fb-mode=4 + +# Framebuffer uses hw acceleration (boolean) +#fb-hw-accel=1 + +[marq] # Marquee display + +# Text (string) +#marq-marquee=VLC + +# Text file (string) +#marq-file= + +# X offset (integer) +#marq-x=0 + +# Y offset (integer) +#marq-y=0 + +# Marquee position (integer) +#marq-position=-1 + +# Opacity (integer) +#marq-opacity=255 + +# Color (integer) +#marq-color=16777215 + +# Font size, pixels (integer) +#marq-size=0 + +# Timeout (integer) +#marq-timeout=0 + +# Refresh period in ms (integer) +#marq-refresh=1000 + +[logo] # Logo sub source + +# Logo filenames (string) +#logo-file= + +# X coordinate (integer) +#logo-x=-1 + +# Y coordinate (integer) +#logo-y=-1 + +# Logo individual image time in ms (integer) +#logo-delay=1000 + +# Logo animation # of loops (integer) +#logo-repeat=-1 + +# Opacity of the logo (integer) +#logo-opacity=255 + +# Logo position (integer) +#logo-position=-1 + +[subsdelay] # Subtitle delay + +# Delay calculation mode (integer) +#subsdelay-mode=1 + +# Calculation factor (float) +#subsdelay-factor=2.000000 + +# Maximum overlapping subtitles (integer) +#subsdelay-overlap=3 + +# Minimum alpha value (integer) +#subsdelay-min-alpha=70 + +# Interval between two disappearances (integer) +#subsdelay-min-stops=1000 + +# Interval between appearance and disappearance (integer) +#subsdelay-min-start-stop=1000 + +# Interval between disappearance and appearance (integer) +#subsdelay-min-stop-start=1000 + +[dynamicoverlay] # Dynamic video overlay + +# Input FIFO (string) +#overlay-input= + +# Output FIFO (string) +#overlay-output= + +[mosaic] # Mosaic video sub source + +# Transparency (integer) +#mosaic-alpha=255 + +# Height (integer) +#mosaic-height=100 + +# Width (integer) +#mosaic-width=100 + +# Mosaic alignment (integer) +#mosaic-align=5 + +# Top left corner X coordinate (integer) +#mosaic-xoffset=0 + +# Top left corner Y coordinate (integer) +#mosaic-yoffset=0 + +# Border width (integer) +#mosaic-borderw=0 + +# Border height (integer) +#mosaic-borderh=0 + +# Positioning method (integer) +#mosaic-position=0 + +# Number of rows (integer) +#mosaic-rows=2 + +# Number of columns (integer) +#mosaic-cols=2 + +# Keep aspect ratio (boolean) +#mosaic-keep-aspect-ratio=0 + +# Keep original size (boolean) +#mosaic-keep-picture=0 + +# Elements order (string) +#mosaic-order= + +# Offsets in order (string) +#mosaic-offsets= + +# Delay (integer) +#mosaic-delay=0 + +[rss] # RSS and Atom feed display + +# Feed URLs (string) +#rss-urls= + +# X offset (integer) +#rss-x=0 + +# Y offset (integer) +#rss-y=0 + +# Text position (integer) +#rss-position=-1 + +# Opacity (integer) +#rss-opacity=255 + +# Color (integer) +#rss-color=16777215 + +# Font size, pixels (integer) +#rss-size=0 + +# Speed of feeds (integer) +#rss-speed=100000 + +# Max length (integer) +#rss-length=60 + +# Refresh time (integer) +#rss-ttl=1800 + +# Feed images (boolean) +#rss-images=1 + +# Title display mode (integer) +#rss-title=-1 + +[audiobargraph_v] # Audio Bar Graph Video sub source + +# X coordinate (integer) +#audiobargraph_v-x=0 + +# Y coordinate (integer) +#audiobargraph_v-y=0 + +# Transparency of the bargraph (integer) +#audiobargraph_v-transparency=255 + +# Bargraph position (integer) +#audiobargraph_v-position=-1 + +# Bar width in pixel (integer) +#audiobargraph_v-barWidth=10 + +# Bar Height in pixel (integer) +#audiobargraph_v-barHeight=400 + +[asf] # ASF muxer + +# Title (string) +#sout-asf-title= + +# Author (string) +#sout-asf-author= + +# Copyright (string) +#sout-asf-copyright= + +# Comment (string) +#sout-asf-comment= + +# Rating (string) +#sout-asf-rating= + +# Packet Size (integer) +#sout-asf-packet-size=4096 + +# Bitrate override (integer) +#sout-asf-bitrate-override=0 + +[ps] # PS muxer + +# DTS delay (ms) (integer) +#sout-ps-dts-delay=200 + +# PES maximum size (integer) +#sout-ps-pes-max-size=65500 + +[mp4] # MP4/MOV muxer + +# Create "Fast Start" files (boolean) +#sout-mp4-faststart=1 + +[avi] # AVI muxer + +# Artist (string) +#sout-avi-artist= + +# Date (string) +#sout-avi-date= + +# Genre (string) +#sout-avi-genre= + +# Copyright (string) +#sout-avi-copyright= + +# Comment (string) +#sout-avi-comment= + +# Name (string) +#sout-avi-name= + +# Subject (string) +#sout-avi-subject= + +# Encoder (string) +#sout-avi-encoder=VLC Media Player - 3.0.23 Vetinari + +# Keywords (string) +#sout-avi-keywords= + +[mux_ogg] # Ogg/OGM muxer + +# Index interval (integer) +#sout-ogg-indexintvl=1000 + +# Index size ratio (float) +#sout-ogg-indexratio=1.000000 + +[mux_ts] # TS muxer (libdvbpsi) + +# Digital TV Standard (string) +#sout-ts-standard=dvb + +# Video PID (integer) +#sout-ts-pid-video=100 + +# Audio PID (integer) +#sout-ts-pid-audio=200 + +# SPU PID (integer) +#sout-ts-pid-spu=300 + +# PMT PID (integer) +#sout-ts-pid-pmt=32 + +# TS ID (integer) +#sout-ts-tsid=0 + +# NET ID (integer) +#sout-ts-netid=0 + +# PMT Program numbers (string) +#sout-ts-program-pmt= + +# Set PID to ID of ES (boolean) +#sout-ts-es-id-pid=0 + +# Mux PMT (requires --sout-ts-es-id-pid) (string) +#sout-ts-muxpmt= + +# SDT Descriptors (requires --sout-ts-es-id-pid) (string) +#sout-ts-sdtdesc= + +# Data alignment (boolean) +#sout-ts-alignment=1 + +# Shaping delay (ms) (integer) +#sout-ts-shaping=200 + +# Use keyframes (boolean) +#sout-ts-use-key-frames=0 + +# PCR interval (ms) (integer) +#sout-ts-pcr=70 + +# Minimum B (deprecated) (integer) +#sout-ts-bmin=0 + +# Maximum B (deprecated) (integer) +#sout-ts-bmax=0 + +# DTS delay (ms) (integer) +#sout-ts-dts-delay=400 + +# Crypt audio (boolean) +#sout-ts-crypt-audio=1 + +# Crypt video (boolean) +#sout-ts-crypt-video=1 + +# CSA Key (string) +#sout-ts-csa-ck= + +# Second CSA Key (string) +#sout-ts-csa2-ck= + +# CSA Key in use (string) +#sout-ts-csa-use=1 + +# Packet size in bytes to encrypt (integer) +#sout-ts-csa-pkt=188 + +[vaapi_filters] # Video Accelerated API filters + +# Denoise strength (0-2) (float) +#denoise-sigma=1.000000 + +[glspectrum] # 3D OpenGL spectrum visualization + +# Video width (integer) +#glspectrum-width=400 + +# Video height (integer) +#glspectrum-height=300 + +[visual] # Visualizer filter + +# Effects list (string) +#effect-list=spectrum + +# Video width (integer) +#effect-width=800 + +# Video height (integer) +#effect-height=500 + +# FFT window (string) +#effect-fft-window=flat + +# Kaiser window parameter (float) +#effect-kaiser-param=3.000000 + +# Show 80 bands instead of 20 (boolean) +#visual-80-bands=1 + +# Draw peaks in the analyzer (boolean) +#visual-peaks=1 + +# Enable original graphic spectrum (boolean) +#spect-show-original=0 + +# Draw the base of the bands (boolean) +#spect-show-base=1 + +# Base pixel radius (integer) +#spect-radius=42 + +# Spectral sections (integer) +#spect-sections=3 + +# V-plane color (integer) +#spect-color=80 + +# Draw bands in the spectrometer (boolean) +#spect-show-bands=1 + +# Show 80 bands instead of 20 (boolean) +#spect-80-bands=1 + +# Number of blank pixels between bands. (integer) +#spect-separ=1 + +# Amplification (integer) +#spect-amp=8 + +# Draw peaks in the analyzer (boolean) +#spect-show-peaks=1 + +# Peak extra width (integer) +#spect-peak-width=61 + +# Peak height (integer) +#spect-peak-height=1 + +[goom] # Goom effect + +# Goom display width (integer) +#goom-width=800 + +# Goom display height (integer) +#goom-height=500 + +# Goom animation speed (integer) +#goom-speed=6 + +[projectm] # libprojectM effect + +# projectM preset path (string) +#projectm-preset-path=/usr/share/projectM/presets + +# Title font (string) +#projectm-title-font=/usr/share/fonts/TTF/DejaVuSans.ttf + +# Font menu (string) +#projectm-menu-font=/usr/share/fonts/TTF/DejaVuSansMono.ttf + +# Video width (integer) +#projectm-width=800 + +# Video height (integer) +#projectm-height=500 + +# Mesh width (integer) +#projectm-meshx=32 + +# Mesh height (integer) +#projectm-meshy=24 + +# Texture size (integer) +#projectm-texture-size=1024 + +[spatializer] # Audio Spatializer + +# Room size (float) +#spatializer-roomsize=0.850000 + +# Room width (float) +#spatializer-width=1.000000 + +# Wet (float) +#spatializer-wet=0.400000 + +# Dry (float) +#spatializer-dry=0.500000 + +# Damp (float) +#spatializer-damp=0.500000 + +[stereo_widen] # Simple stereo widening effect + +# Delay time (float) +#stereowiden-delay=20.000000 + +# Feedback gain (float) +#stereowiden-feedback=0.300000 + +# Crossfeed (float) +#stereowiden-crossfeed=0.300000 + +# Dry mix (float) +#stereowiden-dry-mix=0.800000 + +[normvol] # Volume normalizer + +# Number of audio buffers (integer) +#norm-buff-size=20 + +# Maximal volume level (float) +#norm-max-level=2.000000 + +[samplerate] # Secret Rabbit Code (libsamplerate) resampler + +# Sample rate converter type (integer) +#src-converter-type=2 + +[equalizer] # Equalizer with 10 bands + +# Equalizer preset (string) +#equalizer-preset=flat + +# Bands gain (string) +#equalizer-bands= + +# Two pass (boolean) +#equalizer-2pass=0 + +# Use VLC frequency bands (boolean) +#equalizer-vlcfreqs=1 + +# Global gain (float) +#equalizer-preamp=12.000000 + +[soxr] # soxr + +# Resampling quality (integer) +#soxr-resampler-quality=2 + +[param_eq] # Parametric Equalizer + +# Low freq (Hz) (float) +#param-eq-lowf=100.000000 + +# Low freq gain (dB) (float) +#param-eq-lowgain=0.000000 + +# High freq (Hz) (float) +#param-eq-highf=10000.000000 + +# High freq gain (dB) (float) +#param-eq-highgain=0.000000 + +# Freq 1 (Hz) (float) +#param-eq-f1=300.000000 + +# Freq 1 gain (dB) (float) +#param-eq-gain1=0.000000 + +# Freq 1 Q (float) +#param-eq-q1=3.000000 + +# Freq 2 (Hz) (float) +#param-eq-f2=1000.000000 + +# Freq 2 gain (dB) (float) +#param-eq-gain2=0.000000 + +# Freq 2 Q (float) +#param-eq-q2=3.000000 + +# Freq 3 (Hz) (float) +#param-eq-f3=3000.000000 + +# Freq 3 gain (dB) (float) +#param-eq-gain3=0.000000 + +# Freq 3 Q (float) +#param-eq-q3=3.000000 + +[speex_resampler] # Speex resampler + +# Resampling quality (integer) +#speex-resampler-quality=4 + +[headphone] # Headphone virtual spatialization effect + +# Characteristic dimension (integer) +#headphone-dim=10 + +# Compensate delay (boolean) +#headphone-compensate=0 + +# No decoding of Dolby Surround (boolean) +#headphone-dolby=0 + +[scaletempo_pitch] # Pitch Shifter + +# Stride Length (integer) +#scaletempo-stride=30 + +# Overlap Length (float) +#scaletempo-overlap=0.200000 + +# Search Length (integer) +#scaletempo-search=14 + +# Pitch Shift (float) +#pitch-shift=0.000000 + +[gain] # Gain control filter + +# Gain multiplier (float) +#gain-value=1.000000 + +[compressor] # Dynamic range compressor + +# RMS/peak (float) +#compressor-rms-peak=0.200000 + +# Attack time (float) +#compressor-attack=25.000000 + +# Release time (float) +#compressor-release=100.000000 + +# Threshold level (float) +#compressor-threshold=-11.000000 + +# Ratio (float) +#compressor-ratio=4.000000 + +# Knee radius (float) +#compressor-knee=5.000000 + +# Makeup gain (float) +#compressor-makeup-gain=7.000000 + +[chorus_flanger] # Sound Delay + +# Delay time (float) +#delay-time=20.000000 + +# Sweep Depth (float) +#sweep-depth=6.000000 + +# Sweep Rate (float) +#sweep-rate=6.000000 + +# Feedback gain (float) +#feedback-gain=0.500000 + +# Wet mix (float) +#wet-mix=0.400000 + +# Dry Mix (float) +#dry-mix=0.400000 + +[mono] # Stereo to mono downmixer + +# Use downmix algorithm (boolean) +#sout-mono-downmix=1 + +# Select channel to keep (integer) +#sout-mono-channel=-1 + +[audiobargraph_a] # Audio part of the BarGraph function + +# Defines if BarGraph information should be sent (integer) +#audiobargraph_a-bargraph=1 + +# Sends the barGraph information every n audio packets (integer) +#audiobargraph_a-bargraph_repetition=4 + +# Defines if silence alarm information should be sent (integer) +#audiobargraph_a-silence=1 + +# Time window to use in ms (integer) +#audiobargraph_a-time_window=5000 + +# Minimum Audio level to raise the alarm (float) +#audiobargraph_a-alarm_threshold=0.020000 + +# Time between two alarm messages in ms (integer) +#audiobargraph_a-repetition_time=2000 + +[scaletempo] # Audio tempo scaler synched with rate + +# Stride Length (integer) +#scaletempo-stride=30 + +# Overlap Length (float) +#scaletempo-overlap=0.200000 + +# Search Length (integer) +#scaletempo-search=14 + +[remap] # Audio channel remapper + +# Left (integer) +#aout-remap-channel-left=0 + +# Center (integer) +#aout-remap-channel-center=1 + +# Right (integer) +#aout-remap-channel-right=2 + +# Rear left (integer) +#aout-remap-channel-rearleft=3 + +# Rear center (integer) +#aout-remap-channel-rearcenter=4 + +# Rear right (integer) +#aout-remap-channel-rearright=5 + +# Side left (integer) +#aout-remap-channel-middleleft=6 + +# Side right (integer) +#aout-remap-channel-middleright=7 + +# Low-frequency effects (integer) +#aout-remap-channel-lfe=8 + +# Normalize channels (boolean) +#aout-remap-normalize=1 + +[upnp] # Universal Plug'n'Play + +# Custom SAT>IP channel list URL (string) +#satip-channellist-url= + +[sap] # Network streams (SAP) + +# SAP multicast address (string) +#sap-addr= + +# SAP timeout (seconds) (integer) +#sap-timeout=1800 + +# Try to parse the announce (boolean) +#sap-parse=1 + +# SAP Strict mode (boolean) +#sap-strict=0 + +[podcast] # Podcasts + +# Podcast URLs list (string) +#podcast-urls= + +[core] # core program + +# Enable audio (boolean) +#audio=1 + +# Audio gain (float) +#gain=1.000000 + +# Audio output volume step (float) +#volume-step=12.800000 + +# Remember the audio volume (boolean) +#volume-save=1 + +# Force S/PDIF support (boolean) +#spdif=0 + +# Force detection of Dolby Surround (integer) +#force-dolby-surround=0 + +# Stereo audio output mode (integer) +#stereo-mode=0 + +# Audio desynchronization compensation (integer) +#audio-desync=0 + +# Replay gain mode (string) +#audio-replay-gain-mode=none + +# Replay preamp (float) +#audio-replay-gain-preamp=0.000000 + +# Default replay gain (float) +#audio-replay-gain-default=-7.000000 + +# Peak protection (boolean) +#audio-replay-gain-peak-protection=1 + +# Enable time stretching audio (boolean) +#audio-time-stretch=1 + +# Audio output module (string) +#aout= + +# Media role (string) +#role=video + +# Audio filters (string) +#audio-filter= + +# Audio visualizations (string) +#audio-visual=none + +# Audio resampler (string) +#audio-resampler= + +# Enable video (boolean) +#video=1 + +# Grayscale video output (boolean) +#grayscale=0 + +# Fullscreen video output (boolean) +#fullscreen=0 + +# Embedded video (boolean) +#embedded-video=1 + +# (boolean) +#xlib=1 + +# Drop late frames (boolean) +#drop-late-frames=1 + +# Skip frames (boolean) +#skip-frames=1 + +# Quiet synchro (boolean) +#quiet-synchro=0 + +# Key press events (boolean) +#keyboard-events=1 + +# Mouse events (boolean) +#mouse-events=1 + +# Always on top (boolean) +#video-on-top=0 + +# Enable wallpaper mode (boolean) +#video-wallpaper=0 + +# Disable screensaver (boolean) +#disable-screensaver=1 + +# Show media title on video (boolean) +video-title-show=0 + +# Show video title for x milliseconds (integer) +#video-title-timeout=5000 + +# Position of video title (integer) +#video-title-position=8 + +# Hide cursor and fullscreen controller after x milliseconds (integer) +#mouse-hide-timeout=1000 + +# Video snapshot directory (or filename) (string) +#snapshot-path= + +# Video snapshot file prefix (string) +#snapshot-prefix=vlcsnap- + +# Video snapshot format (string) +#snapshot-format=png + +# Display video snapshot preview (boolean) +#snapshot-preview=1 + +# Use sequential numbers instead of timestamps (boolean) +#snapshot-sequential=0 + +# Video snapshot width (integer) +#snapshot-width=-1 + +# Video snapshot height (integer) +#snapshot-height=-1 + +# Video width (integer) +#width=-1 + +# Video height (integer) +#height=-1 + +# Video X coordinate (integer) +#video-x=0 + +# Video Y coordinate (integer) +#video-y=0 + +# Video cropping (string) +#crop= + +# Custom crop ratios list (string) +#custom-crop-ratios= + +# Source aspect ratio (string) +#aspect-ratio= + +# Video Auto Scaling (boolean) +#autoscale=1 + +# Monitor pixel aspect ratio (string) +#monitor-par= + +# Custom aspect ratios list (string) +#custom-aspect-ratios= + +# Fix HDTV height (boolean) +#hdtv-fix=1 + +# Window decorations (boolean) +#video-deco=1 + +# Video title (string) +#video-title= + +# Video alignment (integer) +#align=0 + +# Zoom video (float) +#zoom=1.000000 + +# Deinterlace (integer) +#deinterlace=-1 + +# Deinterlace mode (string) +#deinterlace-mode=auto + +# Video output module (string) +#vout= + +# Video filter module (string) +#video-filter= + +# Video splitter module (string) +#video-splitter= + +# Enable sub-pictures (boolean) +spu=0 + +# On Screen Display (boolean) +#osd=1 + +# Text rendering module (string) +#text-renderer= + +# Use subtitle file (string) +#sub-file= + +# Autodetect subtitle files (boolean) +#sub-autodetect-file=1 + +# Subtitle autodetection fuzziness (integer) +#sub-autodetect-fuzzy=3 + +# Subtitle autodetection paths (string) +#sub-autodetect-path=./Subtitles, ./subtitles, ./Subs, ./subs + +# Force subtitle position (integer) +#sub-margin=0 + +# Subpictures source module (string) +#sub-source= + +# Subpictures filter module (string) +#sub-filter= + +# Program (integer) +#program=0 + +# Programs (string) +#programs= + +# Audio track (integer) +#audio-track=-1 + +# Subtitle track (integer) +#sub-track=-1 + +# Audio language (string) +#audio-language= + +# Subtitle language (string) +#sub-language= + +# Menu language (string) +#menu-language= + +# Audio track ID (integer) +#audio-track-id=-1 + +# Subtitle track ID (integer) +#sub-track-id=-1 + +# Preferred Closed Captions decoder (integer) +#captions=608 + +# Preferred video resolution (integer) +#preferred-resolution=-1 + +# Input repetitions (integer) +#input-repeat=0 + +# Start time (float) +#start-time=0.000000 + +# Stop time (float) +#stop-time=0.000000 + +# Run time (float) +#run-time=0.000000 + +# Fast seek (boolean) +#input-fast-seek=0 + +# Playback speed (float) +#rate=1.000000 + +# Input list (string) +#input-list= + +# Input slave (experimental) (string) +#input-slave= + +# Bookmarks list for a stream (string) +#bookmarks= + +# DVD device (string) +#dvd=/dev/sr0 + +# VCD device (string) +#vcd=/dev/sr0 + +# MTU of the network interface (integer) +#mtu=1400 + +# TCP connection timeout (integer) +#ipv4-timeout=5000 + +# HTTP server address (string) +#http-host= + +# HTTP server port (integer) +#http-port=8080 + +# HTTPS server port (integer) +#https-port=8443 + +# RTSP server address (string) +#rtsp-host= + +# RTSP server port (integer) +#rtsp-port=554 + +# HTTP/TLS server certificate (string) +#http-cert= + +# HTTP/TLS server private key (string) +#http-key= + +# SOCKS server (string) +#socks= + +# SOCKS user name (string) +#socks-user= + +# SOCKS password (string) +#socks-pwd= + +# Title metadata (string) +#meta-title= + +# Author metadata (string) +#meta-author= + +# Artist metadata (string) +#meta-artist= + +# Genre metadata (string) +#meta-genre= + +# Copyright metadata (string) +#meta-copyright= + +# Description metadata (string) +#meta-description= + +# Date metadata (string) +#meta-date= + +# URL metadata (string) +#meta-url= + +# File caching (ms) (integer) +#file-caching=1000 + +# Live capture caching (ms) (integer) +#live-caching=300 + +# Disc caching (ms) (integer) +#disc-caching=300 + +# Network caching (ms) (integer) +#network-caching=1000 + +# Clock reference average counter (integer) +#cr-average=40 + +# Clock synchronisation (integer) +#clock-synchro=-1 + +# Clock jitter (integer) +#clock-jitter=5000 + +# Network synchronisation (boolean) +#network-synchronisation=0 + +# Record directory (string) +#input-record-path= + +# Prefer native stream recording (boolean) +#input-record-native=1 + +# Timeshift directory (string) +#input-timeshift-path= + +# Timeshift granularity (integer) +#input-timeshift-granularity=-1 + +# Change title according to current media (string) +#input-title-format=$Z + +# Disable all lua plugins (boolean) +#lua=1 + +# Preferred decoders list (string) +#codec= + +# Preferred encoders list (string) +#encoder= + +# Access module (string) +#access= + +# Demux module (string) +#demux=any + +# Stream filter module (string) +#stream-filter= + +# Demux filter module (string) +#demux-filter= + +# Default stream output chain (string) +#sout= + +# Display while streaming (boolean) +#sout-display=0 + +# Keep stream output open (boolean) +#sout-keep=0 + +# Enable streaming of all ES (boolean) +#sout-all=1 + +# Enable audio stream output (boolean) +#sout-audio=1 + +# Enable video stream output (boolean) +#sout-video=1 + +# Enable SPU stream output (boolean) +#sout-spu=1 + +# Stream output muxer caching (ms) (integer) +#sout-mux-caching=1500 + +# VLM configuration file (string) +#vlm-conf= + +# SAP announcement interval (integer) +#sap-interval=5 + +# Mux module (string) +#mux= + +# Access output module (string) +#access_output= + +# Hop limit (TTL) (integer) +#ttl=-1 + +# Multicast output interface (string) +#miface= + +# DiffServ Code Point (integer) +#dscp=0 + +# Preferred packetizer list (string) +#packetizer= + +# VoD server module (string) +#vod-server= + +# Use a plugins cache (boolean) +#plugins-cache=1 + +# Scan for new plugins (boolean) +#plugins-scan=1 + +# Preferred keystore list (string) +#keystore= + +# Allow real-time priority (boolean) +#rt-priority=0 + +# Adjust VLC priority (integer) +#rt-offset=0 + +# Play files randomly forever (boolean) +#random=0 + +# Repeat all (boolean) +loop=1 + +# Repeat current item (boolean) +#repeat=0 + +# Play and exit (boolean) +#play-and-exit=0 + +# Play and stop (boolean) +#play-and-stop=0 + +# Play and pause (boolean) +#play-and-pause=0 + +# Start paused (boolean) +#start-paused=0 + +# Auto start (boolean) +#playlist-autostart=1 + +# Pause on audio communication (boolean) +#playlist-cork=1 + +# Allow only one running instance (boolean) +#one-instance=0 + +# Use only one instance when started from file manager (boolean) +#one-instance-when-started-from-file=1 + +# Enqueue items into playlist in one instance mode (boolean) +#playlist-enqueue=0 + +# Expose media player via D-Bus (boolean) +#dbus=0 + +# Use media library (boolean) +#media-library=0 + +# Display playlist tree (boolean) +#playlist-tree=0 + +# Default stream (string) +#open= + +# Automatically preparse items (boolean) +#auto-preparse=1 + +# Preparsing timeout (integer) +#preparse-timeout=5000 + +# Allow metadata network access (boolean) +metadata-network-access=1 + +# Subdirectory behavior (string) +#recursive=collapse + +# Ignored extensions (string) +#ignore-filetypes=m3u,db,nfo,ini,jpg,jpeg,ljpg,gif,png,pgm,pgmyuv,pbm,pam,tga,bmp,pnm,xpm,xcf,pcx,tif,tiff,lbm,sfv,txt,sub,idx,srt,cue,ssa + +# Show hidden files (boolean) +#show-hiddenfiles=0 + +# Services discovery modules (string) +#services-discovery= + +# Run as daemon process (boolean) +#daemon=0 + +# Write process id to file (string) +#pidfile= + +# Show advanced options (boolean) +#advanced=0 + +# Interface interaction (boolean) +#interact=1 + +# Locally collect statistics (boolean) +#stats=1 + +# Interface module (string) +#intf= + +# Extra interface modules (string) +#extraintf= + +# Control interfaces (string) +#control= + +# Mouse wheel vertical axis control (integer) +#hotkeys-y-wheel-mode=0 + +# Mouse wheel horizontal axis control (integer) +#hotkeys-x-wheel-mode=2 + +# Fullscreen (string) +#global-key-toggle-fullscreen= + +# Fullscreen (string) +#key-toggle-fullscreen=f + +# Exit fullscreen (string) +#global-key-leave-fullscreen= + +# Exit fullscreen (string) +#key-leave-fullscreen=Esc + +# Play/Pause (string) +#global-key-play-pause= + +# Play/Pause (string) +#key-play-pause=Space Media Play Pause + +# Pause only (string) +#global-key-pause= + +# Pause only (string) +#key-pause=Browser Stop + +# Play only (string) +#global-key-play= + +# Play only (string) +#key-play=Browser Refresh + +# Faster (string) +#global-key-faster= + +# Faster (string) +#key-faster=+ + +# Slower (string) +#global-key-slower= + +# Slower (string) +#key-slower=- + +# Normal rate (string) +#global-key-rate-normal= + +# Normal rate (string) +#key-rate-normal== + +# Faster (fine) (string) +#global-key-rate-faster-fine= + +# Faster (fine) (string) +#key-rate-faster-fine=] + +# Slower (fine) (string) +#global-key-rate-slower-fine= + +# Slower (fine) (string) +#key-rate-slower-fine=[ + +# Next (string) +#global-key-next= + +# Next (string) +#key-next=n Media Next Track + +# Previous (string) +#global-key-prev= + +# Previous (string) +#key-prev=p Media Prev Track + +# Stop (string) +#global-key-stop= + +# Stop (string) +#key-stop=s Media Stop + +# Position (string) +#global-key-position= + +# Position (string) +#key-position=t + +# Very short backwards jump (string) +#global-key-jump-extrashort= + +# Very short backwards jump (string) +#key-jump-extrashort=Shift+Left + +# Very short forward jump (string) +#global-key-jump+extrashort= + +# Very short forward jump (string) +#key-jump+extrashort=Shift+Right + +# Short backwards jump (string) +#global-key-jump-short= + +# Short backwards jump (string) +#key-jump-short=Alt+Left + +# Short forward jump (string) +#global-key-jump+short= + +# Short forward jump (string) +#key-jump+short=Alt+Right + +# Medium backwards jump (string) +#global-key-jump-medium= + +# Medium backwards jump (string) +#key-jump-medium=Ctrl+Left + +# Medium forward jump (string) +#global-key-jump+medium= + +# Medium forward jump (string) +#key-jump+medium=Ctrl+Right + +# Long backwards jump (string) +#global-key-jump-long= + +# Long backwards jump (string) +#key-jump-long=Ctrl+Alt+Left + +# Long forward jump (string) +#global-key-jump+long= + +# Long forward jump (string) +#key-jump+long=Ctrl+Alt+Right + +# Next frame (string) +#global-key-frame-next= + +# Next frame (string) +#key-frame-next=e Browser Next + +# Activate (string) +#global-key-nav-activate= + +# Activate (string) +#key-nav-activate=Enter + +# Navigate up (string) +#global-key-nav-up= + +# Navigate up (string) +#key-nav-up=Up + +# Navigate down (string) +#global-key-nav-down= + +# Navigate down (string) +#key-nav-down=Down + +# Navigate left (string) +#global-key-nav-left= + +# Navigate left (string) +#key-nav-left=Left + +# Navigate right (string) +#global-key-nav-right= + +# Navigate right (string) +#key-nav-right=Right + +# Go to the DVD menu (string) +#global-key-disc-menu= + +# Go to the DVD menu (string) +#key-disc-menu=Shift+m + +# Select previous DVD title (string) +#global-key-title-prev= + +# Select previous DVD title (string) +#key-title-prev=Shift+o + +# Select next DVD title (string) +#global-key-title-next= + +# Select next DVD title (string) +#key-title-next=Shift+b + +# Select prev DVD chapter (string) +#global-key-chapter-prev= + +# Select prev DVD chapter (string) +#key-chapter-prev=Shift+p + +# Select next DVD chapter (string) +#global-key-chapter-next= + +# Select next DVD chapter (string) +#key-chapter-next=Shift+n + +# Quit (string) +#global-key-quit= + +# Quit (string) +#key-quit=Ctrl+q + +# Volume up (string) +#global-key-vol-up= + +# Volume up (string) +#key-vol-up=Ctrl+Up Volume Up + +# Volume down (string) +#global-key-vol-down= + +# Volume down (string) +#key-vol-down=Ctrl+Down Volume Down + +# Mute (string) +#global-key-vol-mute= + +# Mute (string) +#key-vol-mute=m Volume Mute + +# Subtitle delay up (string) +#global-key-subdelay-up= + +# Subtitle delay up (string) +#key-subdelay-up=h + +# Subtitle delay down (string) +#global-key-subdelay-down= + +# Subtitle delay down (string) +#key-subdelay-down=g + +# Subtitle sync / bookmark audio timestamp (string) +#global-key-subsync-markaudio= + +# Subtitle sync / bookmark audio timestamp (string) +#key-subsync-markaudio=Shift+h + +# Subtitle sync / bookmark subtitle timestamp (string) +#global-key-subsync-marksub= + +# Subtitle sync / bookmark subtitle timestamp (string) +#key-subsync-marksub=Shift+j + +# Subtitle sync / synchronize audio & subtitle timestamps (string) +#global-key-subsync-apply= + +# Subtitle sync / synchronize audio & subtitle timestamps (string) +#key-subsync-apply=Shift+k + +# Subtitle sync / reset audio & subtitle synchronization (string) +#global-key-subsync-reset= + +# Subtitle sync / reset audio & subtitle synchronization (string) +#key-subsync-reset=Ctrl+Shift+k + +# Subtitle position up (string) +#global-key-subpos-up= + +# Subtitle position up (string) +#key-subpos-up= + +# Subtitle position down (string) +#global-key-subpos-down= + +# Subtitle position down (string) +#key-subpos-down= + +# Audio delay up (string) +#global-key-audiodelay-up= + +# Audio delay up (string) +#key-audiodelay-up=k + +# Audio delay down (string) +#global-key-audiodelay-down= + +# Audio delay down (string) +#key-audiodelay-down=j + +# Cycle audio track (string) +#global-key-audio-track= + +# Cycle audio track (string) +#key-audio-track=b + +# Cycle through audio devices (string) +#global-key-audiodevice-cycle= + +# Cycle through audio devices (string) +#key-audiodevice-cycle=Shift+a + +# Cycle subtitle track in reverse order (string) +#global-key-subtitle-revtrack= + +# Cycle subtitle track in reverse order (string) +#key-subtitle-revtrack=Alt+v + +# Cycle subtitle track (string) +#global-key-subtitle-track= + +# Cycle subtitle track (string) +#key-subtitle-track=v + +# Toggle subtitles (string) +#global-key-subtitle-toggle= + +# Toggle subtitles (string) +#key-subtitle-toggle=Shift+v + +# Cycle next program Service ID (string) +#global-key-program-sid-next= + +# Cycle next program Service ID (string) +#key-program-sid-next=x + +# Cycle previous program Service ID (string) +#global-key-program-sid-prev= + +# Cycle previous program Service ID (string) +#key-program-sid-prev=Shift+x + +# Cycle source aspect ratio (string) +#global-key-aspect-ratio= + +# Cycle source aspect ratio (string) +#key-aspect-ratio=a + +# Cycle video crop (string) +#global-key-crop= + +# Cycle video crop (string) +#key-crop=c + +# Toggle autoscaling (string) +#global-key-toggle-autoscale= + +# Toggle autoscaling (string) +#key-toggle-autoscale=o + +# Increase scale factor (string) +#global-key-incr-scalefactor= + +# Increase scale factor (string) +#key-incr-scalefactor=Alt+o + +# Decrease scale factor (string) +#global-key-decr-scalefactor= + +# Decrease scale factor (string) +#key-decr-scalefactor=Alt+Shift+o + +# Toggle deinterlacing (string) +#global-key-deinterlace= + +# Toggle deinterlacing (string) +#key-deinterlace=d + +# Cycle deinterlace modes (string) +#global-key-deinterlace-mode= + +# Cycle deinterlace modes (string) +#key-deinterlace-mode=Shift+d + +# Show controller in fullscreen (string) +#global-key-intf-show= + +# Show controller in fullscreen (string) +#key-intf-show=i + +# Boss key (string) +#global-key-intf-boss= + +# Boss key (string) +#key-intf-boss= + +# Context menu (string) +#global-key-intf-popup-menu= + +# Context menu (string) +#key-intf-popup-menu=Menu + +# Take video snapshot (string) +#global-key-snapshot= + +# Take video snapshot (string) +#key-snapshot=Shift+s + +# Record (string) +#global-key-record= + +# Record (string) +#key-record=Shift+r + +# Zoom (string) +#global-key-zoom= + +# Zoom (string) +#key-zoom=z + +# Un-Zoom (string) +#global-key-unzoom= + +# Un-Zoom (string) +#key-unzoom=Shift+z + +# Toggle wallpaper mode in video output (string) +#global-key-wallpaper= + +# Toggle wallpaper mode in video output (string) +#key-wallpaper=w + +# Crop one pixel from the top of the video (string) +#global-key-crop-top= + +# Crop one pixel from the top of the video (string) +#key-crop-top=Alt+r + +# Uncrop one pixel from the top of the video (string) +#global-key-uncrop-top= + +# Uncrop one pixel from the top of the video (string) +#key-uncrop-top=Alt+Shift+r + +# Crop one pixel from the left of the video (string) +#global-key-crop-left= + +# Crop one pixel from the left of the video (string) +#key-crop-left=Alt+d + +# Uncrop one pixel from the left of the video (string) +#global-key-uncrop-left= + +# Uncrop one pixel from the left of the video (string) +#key-uncrop-left=Alt+Shift+d + +# Crop one pixel from the bottom of the video (string) +#global-key-crop-bottom= + +# Crop one pixel from the bottom of the video (string) +#key-crop-bottom=Alt+c + +# Uncrop one pixel from the bottom of the video (string) +#global-key-uncrop-bottom= + +# Uncrop one pixel from the bottom of the video (string) +#key-uncrop-bottom=Alt+Shift+c + +# Crop one pixel from the right of the video (string) +#global-key-crop-right= + +# Crop one pixel from the right of the video (string) +#key-crop-right=Alt+f + +# Uncrop one pixel from the right of the video (string) +#global-key-uncrop-right= + +# Uncrop one pixel from the right of the video (string) +#key-uncrop-right=Alt+Shift+f + +# Random (string) +#global-key-random= + +# Random (string) +#key-random=r + +# Normal/Loop/Repeat (string) +#global-key-loop= + +# Normal/Loop/Repeat (string) +#key-loop=l + +# Shrink the viewpoint field of view (360°) (string) +#global-key-viewpoint-fov-in= + +# Shrink the viewpoint field of view (360°) (string) +#key-viewpoint-fov-in=Page Up + +# Expand the viewpoint field of view (360°) (string) +#global-key-viewpoint-fov-out= + +# Expand the viewpoint field of view (360°) (string) +#key-viewpoint-fov-out=Page Down + +# Roll the viewpoint clockwise (360°) (string) +#global-key-viewpoint-roll-clock= + +# Roll the viewpoint clockwise (360°) (string) +#key-viewpoint-roll-clock= + +# Roll the viewpoint anti-clockwise (360°) (string) +#global-key-viewpoint-roll-anticlock= + +# Roll the viewpoint anti-clockwise (360°) (string) +#key-viewpoint-roll-anticlock= + +# 1:4 Quarter (string) +#global-key-zoom-quarter= + +# 1:4 Quarter (string) +#key-zoom-quarter=Alt+1 + +# 1:2 Half (string) +#global-key-zoom-half= + +# 1:2 Half (string) +#key-zoom-half=Alt+2 + +# 1:1 Original (string) +#global-key-zoom-original= + +# 1:1 Original (string) +#key-zoom-original=Alt+3 + +# 2:1 Double (string) +#global-key-zoom-double= + +# 2:1 Double (string) +#key-zoom-double=Alt+4 + +# Very short jump length (integer) +#extrashort-jump-size=3 + +# Short jump length (integer) +#short-jump-size=10 + +# Medium jump length (integer) +#medium-jump-size=60 + +# Long jump length (integer) +#long-jump-size=300 + +# Set playlist bookmark 1 (string) +#global-key-set-bookmark1= + +# Set playlist bookmark 1 (string) +#key-set-bookmark1=Ctrl+F1 + +# Set playlist bookmark 2 (string) +#global-key-set-bookmark2= + +# Set playlist bookmark 2 (string) +#key-set-bookmark2=Ctrl+F2 + +# Set playlist bookmark 3 (string) +#global-key-set-bookmark3= + +# Set playlist bookmark 3 (string) +#key-set-bookmark3=Ctrl+F3 + +# Set playlist bookmark 4 (string) +#global-key-set-bookmark4= + +# Set playlist bookmark 4 (string) +#key-set-bookmark4=Ctrl+F4 + +# Set playlist bookmark 5 (string) +#global-key-set-bookmark5= + +# Set playlist bookmark 5 (string) +#key-set-bookmark5=Ctrl+F5 + +# Set playlist bookmark 6 (string) +#global-key-set-bookmark6= + +# Set playlist bookmark 6 (string) +#key-set-bookmark6=Ctrl+F6 + +# Set playlist bookmark 7 (string) +#global-key-set-bookmark7= + +# Set playlist bookmark 7 (string) +#key-set-bookmark7=Ctrl+F7 + +# Set playlist bookmark 8 (string) +#global-key-set-bookmark8= + +# Set playlist bookmark 8 (string) +#key-set-bookmark8=Ctrl+F8 + +# Set playlist bookmark 9 (string) +#global-key-set-bookmark9= + +# Set playlist bookmark 9 (string) +#key-set-bookmark9=Ctrl+F9 + +# Set playlist bookmark 10 (string) +#global-key-set-bookmark10= + +# Set playlist bookmark 10 (string) +#key-set-bookmark10=Ctrl+F10 + +# Play playlist bookmark 1 (string) +#global-key-play-bookmark1= + +# Play playlist bookmark 1 (string) +#key-play-bookmark1=F1 + +# Play playlist bookmark 2 (string) +#global-key-play-bookmark2= + +# Play playlist bookmark 2 (string) +#key-play-bookmark2=F2 + +# Play playlist bookmark 3 (string) +#global-key-play-bookmark3= + +# Play playlist bookmark 3 (string) +#key-play-bookmark3=F3 + +# Play playlist bookmark 4 (string) +#global-key-play-bookmark4= + +# Play playlist bookmark 4 (string) +#key-play-bookmark4=F4 + +# Play playlist bookmark 5 (string) +#global-key-play-bookmark5= + +# Play playlist bookmark 5 (string) +#key-play-bookmark5=F5 + +# Play playlist bookmark 6 (string) +#global-key-play-bookmark6= + +# Play playlist bookmark 6 (string) +#key-play-bookmark6=F6 + +# Play playlist bookmark 7 (string) +#global-key-play-bookmark7= + +# Play playlist bookmark 7 (string) +#key-play-bookmark7=F7 + +# Play playlist bookmark 8 (string) +#global-key-play-bookmark8= + +# Play playlist bookmark 8 (string) +#key-play-bookmark8=F8 + +# Play playlist bookmark 9 (string) +#global-key-play-bookmark9= + +# Play playlist bookmark 9 (string) +#key-play-bookmark9=F9 + +# Play playlist bookmark 10 (string) +#global-key-play-bookmark10= + +# Play playlist bookmark 10 (string) +#key-play-bookmark10=F10 + +# Clear the playlist (string) +#global-key-clear-playlist= + +# Clear the playlist (string) +#key-clear-playlist=Ctrl+w + +# Reset subtitles text scale (string) +#global-key-subtitle-text-scale-normal= + +# Reset subtitles text scale (string) +#key-subtitle-text-scale-normal=Ctrl+0 + +# Scale down subtitles text (string) +#global-key-subtitle-text-scale-up= + +# Scale down subtitles text (string) +#key-subtitle-text-scale-up=Ctrl+Mouse Wheel Up + +# Scale up subtitles text (string) +#global-key-subtitle-text-scale-down= + +# Scale up subtitles text (string) +#key-subtitle-text-scale-down=Ctrl+Mouse Wheel Down + +# Playlist bookmark 1 (string) +#bookmark1= + +# Playlist bookmark 2 (string) +#bookmark2= + +# Playlist bookmark 3 (string) +#bookmark3= + +# Playlist bookmark 4 (string) +#bookmark4= + +# Playlist bookmark 5 (string) +#bookmark5= + +# Playlist bookmark 6 (string) +#bookmark6= + +# Playlist bookmark 7 (string) +#bookmark7= + +# Playlist bookmark 8 (string) +#bookmark8= + +# Playlist bookmark 9 (string) +#bookmark9= + +# Playlist bookmark 10 (string) +#bookmark10= + diff --git a/03-user/dotfiles/.config/waybar/config.jsonc b/03-user/dotfiles/.config/waybar/config.jsonc new file mode 100644 index 0000000..60cde1e --- /dev/null +++ b/03-user/dotfiles/.config/waybar/config.jsonc @@ -0,0 +1,217 @@ +{ + "layer": "top", + "position": "top", + "mod": "dock", + "exclusive": true, + "passthrough": false, + "gtk-layer-shell": true, + "height": 28, + "modules-left": [ + "clock", + "custom/weather", + "hyprland/workspaces", + "custom/apps", + "custom/files" + ], + "modules-center": [ + "hyprland/window" + ], + "modules-right": [ + "tray", + "custom/network", + "temperature", + "cpu", + "memory", + "battery", + "custom/studio-sound", + "bluetooth", + "wireplumber", + "custom/hyprsunset", + "custom/notificationbar", + "privacy" + ], + "privacy": { + "icon-spacing": 4, + "icon-size": 13, + "transition-duration": 250, + "modules": [ + { + "type": "screenshare", + "tooltip": true, + "tooltip-icon-size": 24 + }, + { + "type": "audio-in", + "tooltip": true, + "tooltip-icon-size": 24 + } + ], + "ignore-monitor": true +}, + "hyprland/workspaces": { + "format": "{icon}", + "on-scroll-up": "hyprctl dispatch workspace e+1", + "on-scroll-down": "hyprctl dispatch workspace e-1", + "format-icons": { + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5" + }, + "persistent_workspaces": { + "*": 1 + } + }, + "hyprland/window": { + "format": "{}", + "separate-outputs": true + }, + "custom/apps": { + "format": "Apps", + "tooltip": false, + "on-click": "wofi --show drun" + }, + + "custom/files": { + "format": "Files", + "tooltip": false, + "on-click": "nautilus" + }, + "custom/weather": { + "tooltip": true, + "format": "{}", + "interval": 3600, + "exec": "~/.config/waybar/scripts/waybar-wttr.py", + "return-type": "json" + }, + + "temperature": { + "thermal-zone": 2, + "hwmon-path": "/sys/class/hwmon/hwmon5/temp1_input", + "critical-threshold": 80, + "format-critical": " {temperatureC}°C", + "format": " {temperatureC}°C", + "interval": 2, + "tooltip": true + }, + + "cpu": { + "format": " {usage}%", + "tooltip": true, + "interval": 2, + "states": { + "warning": 70, + "critical": 90 + } + }, + "memory": { + "format": " {}%", + "format-alt": " {used:0.1f}G/{total:0.1f}G", + "tooltip": true, + "tooltip-format": "Used: {used:0.2f}GB ({percentage}%)\nAvailable: {avail:0.2f}GB\nTotal: {total:0.2f}GB", + "interval": 2, + "states": { + "warning": 70, + "critical": 90 + } + }, + "tray": { + "icon-size": 16, + "spacing": 25, + "icons": { + "blueman": "/usr/share/icons/WhiteSur-dark/devices@2x/32/network-bluetooth.svg", + "nm-applet": "/usr/share/icons/WhiteSur-dark/devices@2x/24/network-wired.svg", + "pasystray": "/usr/share/icons/WhiteSur-dark/devices@2x/16/audio-speakers.svg" + } + }, + "custom/notificationbar": { + "format": "", + "on-click": "swaync-client -t" + }, + "clock": { + "timezone": "Europe/Berlin", + "format": "{:%H:%M %a, %b %e}", + "tooltip-format": "{:%Y %B}\n{calendar}" + }, + "backlight": { + "device": "intel_backlight", + "format": "{icon} {percent}%", + "format-icons": [ + "󰃞", + "󰃟", + "󰃠" + ], + "on-scroll-up": "brightnessctl -q set 1%+", + "on-scroll-down": "brightnessctl -q set 1%-" + }, + "battery": { + "states": { + "good": 95, + "warning": 20, + "critical": 10 + }, + "format": "{icon} {capacity}%", + "format-charging": " {capacity}%", + "format-plugged": " {capacity}%", + "format-alt": "{time} {icon}", + "format-icons": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "wireplumber": { + "format": " {volume}%", + "format-muted": "", + "on-click": "qpwgraph", + "max-volume": 100, + "scroll-step": 0.2 +}, + + "custom/network": { + "exec": "~/.config/waybar/scripts/network.sh", + "return-type": "json", + "interval": 2, + "format": "{}" + //"on-click": "nmcli device wifi list", + //"on-click-right": "nm-connection-editor" +}, + +"custom/hyprsunset": { + "format": "{}", + "exec": "~/.config/waybar/scripts/hyprsunset.sh", + "on-click": "~/.config/waybar/scripts/hyprsunset.sh toggle", + "signal": 8, + "tooltip": true, + "return-type": "json" + }, + +"custom/studio-sound": { + "format": "{}", + "exec": "~/.config/waybar/scripts/studio-sound.py", + "on-click": "~/.config/waybar/scripts/studio-sound.py toggle", + "interval": 30, + "return-type": "json", + "tooltip": true + }, + + "bluetooth": { + "format": " {status}", + "format-disabled": "", + "format-connected": " {num_connections}", + "tooltip-format": "{device_alias}", + "tooltip-format-connected": " {device_enumerate}", + "tooltip-format-enumerate-connected": "{device_alias}" + } + + +} diff --git a/03-user/dotfiles/.config/waybar/scripts/hyprsunset.sh b/03-user/dotfiles/.config/waybar/scripts/hyprsunset.sh new file mode 100755 index 0000000..768249e --- /dev/null +++ b/03-user/dotfiles/.config/waybar/scripts/hyprsunset.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# Waybar Hyprsunset Module Script +# Place this in ~/.config/waybar/scripts/hyprsunset.sh +# Make executable: chmod +x ~/.config/waybar/scripts/hyprsunset.sh + +TEMP=3500 # Default temperature when enabled +STATE_FILE="/tmp/hyprsunset_state" + +# Initialize state file if it doesn't exist +if [ ! -f "$STATE_FILE" ]; then + echo "disabled" > "$STATE_FILE" +fi + +get_status() { + # Check if hyprsunset is currently active + if [ -f "$STATE_FILE" ]; then + state=$(cat "$STATE_FILE" 2>/dev/null) + if [ "$state" = "enabled" ]; then + echo "enabled" + else + echo "disabled" + fi + else + echo "disabled" + fi +} + +toggle_hyprsunset() { + current_status=$(get_status) + + if [ "$current_status" = "enabled" ]; then + # Disable hyprsunset + hyprctl hyprsunset identity + echo "disabled" > "$STATE_FILE" + else + # Enable hyprsunset + hyprctl hyprsunset temperature "$TEMP" + echo "enabled" > "$STATE_FILE" + fi + + # Signal Waybar to update the module + pkill -SIGRTMIN+8 waybar +} + +output_json() { + status=$(get_status) + + if [ "$status" = "enabled" ]; then + printf '{"text":"","tooltip":"Sunset: ON (%sK)","class":"enabled"}\n' "$TEMP" + else + printf '{"text":"","tooltip":"Sunset: OFF","class":"disabled"}\n' + fi +} + +case "$1" in + "toggle") + toggle_hyprsunset + ;; + *) + output_json + ;; +esac diff --git a/03-user/dotfiles/.config/waybar/scripts/network.sh b/03-user/dotfiles/.config/waybar/scripts/network.sh new file mode 100755 index 0000000..3aab5bd --- /dev/null +++ b/03-user/dotfiles/.config/waybar/scripts/network.sh @@ -0,0 +1,112 @@ +#!/bin/bash +INTERFACE="br0" +TEMP_FILE="/tmp/waybar_network_$INTERFACE" +MAX_AGE=10 + +# Function to format bytes/s to human readable with max 2 digits +format_rate() { + local rate=$1 + local unit="K" + local value + + # Convert to KB/s first + value=$(( (rate * 10) / 1024 )) + + # If KB/s would be >= 1000 (100.0K), convert to MB/s + if [ $value -ge 1000 ]; then + unit="M" + value=$(( (rate * 10) / 1048576 )) # 1024*1024 + + # If MB/s would be >= 1000 (100.0M), convert to GB/s + if [ $value -ge 1000 ]; then + unit="G" + value=$(( (rate * 10) / 1073741824 )) # 1024*1024*1024 + fi + fi + + # Split into whole and decimal parts + local whole=$((value / 10)) + local decimal=$((value % 10)) + + # Format with appropriate spacing + if [ $whole -lt 10 ]; then + printf "%d.%d%s" "$whole" "$decimal" "$unit" + else + printf "%2d%s" "$whole" "$unit" + fi +} + +# Check if interface exists +if [ ! -d "/sys/class/net/$INTERFACE" ]; then + echo '{"text":"󰈀 No Interface","tooltip":"Interface '$INTERFACE' not found"}' + exit 1 +fi + +# Get current values +RX_BYTES=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes) +TX_BYTES=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes) +CURRENT_TIME=$(date +%s) + +# Check if temp file exists and is recent +TEMP_FILE_VALID=0 +if [ -f "$TEMP_FILE" ]; then + read PREV_RX PREV_TX PREV_TIME < "$TEMP_FILE" + TIME_DIFF=$((CURRENT_TIME - PREV_TIME)) + + # Accept temp file if it's recent (0 seconds is OK, negative or too old is not) + if [ $TIME_DIFF -ge 0 ] && [ $TIME_DIFF -le $MAX_AGE ]; then + TEMP_FILE_VALID=1 + fi +fi + +# If no valid temp file, initialize +if [ $TEMP_FILE_VALID -eq 0 ]; then + echo "$RX_BYTES $TX_BYTES $CURRENT_TIME" > "$TEMP_FILE" + echo '{"text":"'${INTERFACE}' ↑0.0K ↓0.0K","tooltip":"Upload: 0.0 KB/s\\nDownload: 0.0 KB/s"}' + exit 0 +fi + +# If TIME_DIFF is 0, return the last calculated result without updating temp file +if [ $TIME_DIFF -eq 0 ]; then + # Try to read cached result from a secondary file + CACHE_FILE="/tmp/waybar_network_cache_$INTERFACE" + if [ -f "$CACHE_FILE" ]; then + cat "$CACHE_FILE" + exit 0 + else + # No cache, show 0.0K + echo '{"text":"'${INTERFACE}' ↑0.0K ↓0.0K","tooltip":"Upload: 0.0 KB/s\\nDownload: 0.0 KB/s"}' + exit 0 + fi +fi + +# Calculate rates (bytes per second) +RX_RATE=$(( (RX_BYTES - PREV_RX) / TIME_DIFF )) +TX_RATE=$(( (TX_BYTES - PREV_TX) / TIME_DIFF )) + +# Handle negative values (counter reset) or unrealistic high values +if [ $RX_RATE -lt 0 ] || [ $RX_RATE -gt 1073741824 ]; then RX_RATE=0; fi +if [ $TX_RATE -lt 0 ] || [ $TX_RATE -gt 1073741824 ]; then TX_RATE=0; fi + +# Format rates with auto-scaling +TX_FORMATTED=$(format_rate $TX_RATE) +RX_FORMATTED=$(format_rate $RX_RATE) + +# Calculate tooltip values (always in KB/s for consistency) +RX_KB_TENTHS=$(( (RX_RATE * 10) / 1024 )) +TX_KB_TENTHS=$(( (TX_RATE * 10) / 1024 )) +RX_WHOLE=$((RX_KB_TENTHS / 10)) +RX_DECIMAL=$((RX_KB_TENTHS % 10)) +TX_WHOLE=$((TX_KB_TENTHS / 10)) +TX_DECIMAL=$((TX_KB_TENTHS % 10)) + +# Format output with auto-scaled units +RESULT=$(printf '{"text":"'${INTERFACE}' ↑%4s ↓%4s","tooltip":"Upload: %d.%d KB/s\\nDownload: %d.%d KB/s"}' \ + "$TX_FORMATTED" "$RX_FORMATTED" \ + "$TX_WHOLE" "$TX_DECIMAL" "$RX_WHOLE" "$RX_DECIMAL") + +echo "$RESULT" + +# Store current values for next iteration AND cache the result +echo "$RX_BYTES $TX_BYTES $CURRENT_TIME" > "$TEMP_FILE" +echo "$RESULT" > "/tmp/waybar_network_cache_$INTERFACE" diff --git a/03-user/dotfiles/.config/waybar/scripts/network.sh.bak b/03-user/dotfiles/.config/waybar/scripts/network.sh.bak new file mode 100755 index 0000000..8792e58 --- /dev/null +++ b/03-user/dotfiles/.config/waybar/scripts/network.sh.bak @@ -0,0 +1,78 @@ +#!/bin/bash + +INTERFACE="br0" +TEMP_FILE="/tmp/waybar_network_$INTERFACE" +MAX_AGE=10 + +# Check if interface exists +if [ ! -d "/sys/class/net/$INTERFACE" ]; then + echo '{"text":"󰈀 No Interface","tooltip":"Interface '$INTERFACE' not found"}' + exit 1 +fi + +# Get current values +RX_BYTES=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes) +TX_BYTES=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes) +CURRENT_TIME=$(date +%s) + +# Check if temp file exists and is recent +TEMP_FILE_VALID=0 +if [ -f "$TEMP_FILE" ]; then + read PREV_RX PREV_TX PREV_TIME < "$TEMP_FILE" + TIME_DIFF=$((CURRENT_TIME - PREV_TIME)) + + # Accept temp file if it's recent (0 seconds is OK, negative or too old is not) + if [ $TIME_DIFF -ge 0 ] && [ $TIME_DIFF -le $MAX_AGE ]; then + TEMP_FILE_VALID=1 + fi +fi + +# If no valid temp file, initialize +if [ $TEMP_FILE_VALID -eq 0 ]; then + echo "$RX_BYTES $TX_BYTES $CURRENT_TIME" > "$TEMP_FILE" + echo '{"text":"'${INTERFACE}' ↑ 0.0K ↓ 0.0K","tooltip":"Upload: 0.0 KB/s\\nDownload: 0.0 KB/s"}' + exit 0 +fi + +# If TIME_DIFF is 0, return the last calculated result without updating temp file +if [ $TIME_DIFF -eq 0 ]; then + # Try to read cached result from a secondary file + CACHE_FILE="/tmp/waybar_network_cache_$INTERFACE" + if [ -f "$CACHE_FILE" ]; then + cat "$CACHE_FILE" + exit 0 + else + # No cache, show 0.0K + echo '{"text":"'${INTERFACE}' ↑ 0.0K ↓ 0.0K","tooltip":"Upload: 0.0 KB/s\\nDownload: 0.0 KB/s"}' + exit 0 + fi +fi + +# Calculate rates (bytes per second) +RX_RATE=$(( (RX_BYTES - PREV_RX) / TIME_DIFF )) +TX_RATE=$(( (TX_BYTES - PREV_TX) / TIME_DIFF )) + +# Handle negative values (counter reset) or unrealistic high values +if [ $RX_RATE -lt 0 ] || [ $RX_RATE -gt 1073741824 ]; then RX_RATE=0; fi +if [ $TX_RATE -lt 0 ] || [ $TX_RATE -gt 1073741824 ]; then TX_RATE=0; fi + +# Convert to KB/s with one decimal place +RX_KB_TENTHS=$(( (RX_RATE * 10) / 1024 )) +TX_KB_TENTHS=$(( (TX_RATE * 10) / 1024 )) + +# Split into whole and decimal parts +RX_WHOLE=$((RX_KB_TENTHS / 10)) +RX_DECIMAL=$((RX_KB_TENTHS % 10)) +TX_WHOLE=$((TX_KB_TENTHS / 10)) +TX_DECIMAL=$((TX_KB_TENTHS % 10)) + +# Format output with fixed width +RESULT=$(printf '{"text":"'${INTERFACE}' ↑%2d.%dK ↓%2d.%dK","tooltip":"Upload: %d.%d KB/s\\nDownload: %d.%d KB/s"}' \ + "$TX_WHOLE" "$TX_DECIMAL" "$RX_WHOLE" "$RX_DECIMAL" \ + "$TX_WHOLE" "$TX_DECIMAL" "$RX_WHOLE" "$RX_DECIMAL") + +echo "$RESULT" + +# Store current values for next iteration AND cache the result +echo "$RX_BYTES $TX_BYTES $CURRENT_TIME" > "$TEMP_FILE" +echo "$RESULT" > "/tmp/waybar_network_cache_$INTERFACE" diff --git a/03-user/dotfiles/.config/waybar/scripts/studio-sound.py b/03-user/dotfiles/.config/waybar/scripts/studio-sound.py new file mode 100755 index 0000000..9b94ad4 --- /dev/null +++ b/03-user/dotfiles/.config/waybar/scripts/studio-sound.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +""" +Waybar module for controlling Studio Sound power outlet +Toggles power on click and shows current status +""" + +import json +import requests +import sys +import os + +STATUS_URL = 'http://192.168.1.75/cm?cmnd=status' +TOGGLE_URL = 'http://192.168.1.75/ay?o=1' +CACHE_FILE = '/tmp/studio_sound_status.json' +TIMEOUT = 2 # seconds + +def get_status(): + """Fetch the current power status from the device""" + try: + response = requests.get(STATUS_URL, timeout=TIMEOUT) + response.raise_for_status() + data = response.json() + return data.get('Status', {}).get('Power', 0) == 1 + except: + # Return cached status if available + if os.path.exists(CACHE_FILE): + try: + with open(CACHE_FILE, 'r') as f: + cached = json.load(f) + return cached.get('power', False) + except: + pass + return False + +def toggle_power(): + """Toggle the power state""" + try: + requests.get(TOGGLE_URL, timeout=TIMEOUT) + # Give device time to process + import time + time.sleep(0.5) + return get_status() + except: + return False + +def save_cache(power_state): + """Save current state to cache file""" + try: + with open(CACHE_FILE, 'w') as f: + json.dump({'power': power_state}, f) + except: + pass + +def main(): + # Check if this is a click event + if len(sys.argv) > 1 and sys.argv[1] == 'toggle': + power_state = toggle_power() + else: + power_state = get_status() + + # Save to cache + save_cache(power_state) + + # Output JSON for waybar + output = { + "text": "Studio " if power_state else "Studio ", + "tooltip": f"Studio Sound: {'ON' if power_state else 'OFF'}", + "class": "studio-sound-on" if power_state else "studio-sound-off", + "alt": "on" if power_state else "off" + } + + print(json.dumps(output)) + sys.stdout.flush() + +if __name__ == "__main__": + main() diff --git a/03-user/dotfiles/.config/waybar/style.css b/03-user/dotfiles/.config/waybar/style.css new file mode 100644 index 0000000..dd53511 --- /dev/null +++ b/03-user/dotfiles/.config/waybar/style.css @@ -0,0 +1,213 @@ +* { + border: none; + border-radius: 0; + /*font-family: "SF Pro Display", "FontAwesome";*/ + font-family: "SF Mono", "FontAwesome"; + font-weight: 600; + font-size: 13px; + min-height: 0; +} + +window#waybar { + background: rgba(21, 18, 27, 0.36); +} + +#privacy-item, #privacy-item > * { + color: #ffae00; +} + + +tooltip { + background: #1e1e2e; + border-radius: 10px; + border-width: 2px; + border-style: solid; + border-color: #11111b; +} + +.modules-left { + margin-left: 10px; +} + +.modules-right { + margin-right: 10px; +} + +#workspaces { + margin-left: 10px; + padding-right: 0px; + padding-left: 5px; +} + +#workspaces button { + padding: 2px 10px; +} + +#workspaces button.active { + background-color: rgba(0,0,0,0.3); +} + +#workspaces button:hover { + box-shadow: none; + text-shadow: none; + background: none; + background-color: rgba(255,255,255,0.1); +} + + +#custom-power_profile, +#custom-weather, +#custom-moon, +#custom-wallpaper, +#custom-studio-sound, +#custom-apps, +#custom-files, +#custom-hyprsunset, +#window, +#clock, +#battery, +#pulseaudio, +#custom-network, +#bluetooth, +#temperature, +#cpu, +#memory, +#wireplumber, +#workspaces, +#tray, +#custom-notificationbar, +#backlight, +#privacy { + opacity: 0.95; + padding: 0px 10px; + margin: 0px; + margin-top: 0px; + /*border: 2px solid red;*/ +} + +#custom-files { + border-radius: 0px 10px 10px 0px; +} + +#wireplumber { + min-width: 50px; +} + +#custom-network { + min-width: 110px; + border-radius: 10px 0px 0px 10px; +} + +#custom-studio-sound { + border-radius: 10px 0px 0px 10px; + min-width: 62px; +} + +#memory { + min-width: 45px; + color: #eba0ac; + border-radius: 0px 10px 10px 0px; +} + +#cpu { + min-width: 50px; + color: #c3eba0; +} + +#temperature { + min-width: 50px; + color: #89b4fa; +} + +#backlight { + border-radius: 10px 0px 0px 10px; +} + +#tray { + border-radius: 10px; + margin-right: 10px; +} + +#tray > .active, +#tray > .passive { + margin-right: 100px; + padding-left: 100px; +} + +#custom-power_profile { + color: #a6e3a1; + border-left: 0px; + border-right: 0px; +} + +#window { + border-radius: 10px; + margin-left: 60px; + margin-right: 60px; +} + +#clock { + border-radius: 10px 0px 0px 10px; + border-right: 0px; +} + +#network { + border-radius: 10px 0px 0px 10px; + border-left: 0px; + border-right: 0px; +} + +#bluetooth { + min-width: 17px; +} + +#battery { + margin-right: 0px; + padding: 0 10px; + border-left: 0px; +} + +#battery.warning { + color: #FFA500; +} + +#battery.critical { + color: #F00; +} + +/* Menu styling */ +menu { + border-radius: 8px; + background: rgba(43, 48, 59, 0.95); + color: #ffffff; + /*border: 1px solid rgba(100, 114, 125, 0.3);*/ + border-style: none; + padding: 4px 0; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +window decoration{ + border-style: none; + box-shadow: none; +} + +menuitem { + border-radius: 4px; + padding: 8px 16px; + margin: 2px 4px; + transition: background-color 0.2s ease; +} + +menuitem:hover { + background-color: rgba(100, 114, 125, 0.3); +} + +menuitem:selected { + background-color: #64727D; +} + +/* Separator styling */ +separator { + background-color: rgba(100, 114, 125, 0.3); + margin: 4px 8px; +} diff --git a/03-user/dotfiles/.config/waybar/style.css.bak b/03-user/dotfiles/.config/waybar/style.css.bak new file mode 100644 index 0000000..096302b --- /dev/null +++ b/03-user/dotfiles/.config/waybar/style.css.bak @@ -0,0 +1,167 @@ +* { + border: none; + border-radius: 0; + font-family: "SF Display"; + font-weight: bold; + font-size: 12px; + min-height: 0; +} + +window#waybar { + background: rgba(21, 18, 27, 0); + color: #cdd6f4; +} + +tooltip { + background: #1e1e2e; + border-radius: 10px; + border-width: 2px; + border-style: solid; + border-color: #11111b; +} + +#workspaces button { + padding: 2px 5px; + color: #636777; + margin-right: 5px; +} + +#workspaces button.active { + background-color: #000; +} + +#workspaces button.focused { + color: #a6adc8; + background: #eba0ac; + border-radius: 10px; +} + +#workspaces button.urgent { + color: #11111b; + background: #a6e3a1; + border-radius: 10px; +} + +#workspaces button:hover { + background: #11111b; + color: #11111b; + border-radius: 5px; +} + +#custom-power_profile, +#custom-weather, +#custom-moon, +#custom-wallpaper, +#window, +#clock, +#battery, +#pulseaudio, +#network, +#bluetooth, +#temperature, +#cpu, +#memory, +#workspaces, +#tray, +#backlight { + background: #1e1e2e; + opacity: 0.8; + padding: 0px 10px; + /* margin: 3px 0px; */ + margin: 0px; + margin-top: 10px; + border: 1px solid #181825; +} + +#memory { + color: #eba0ac; +} + +#temperature { + border-radius: 10px 0px 0px 10px; +} + +#custom-temperature.critical { + color: #f00; +} + +#backlight { + border-radius: 10px 0px 0px 10px; +} + +#tray { + border-radius: 10px; + margin-right: 10px; +} + +#workspaces { + background: #1e1e2e; + border-radius: 10px; + margin-left: 10px; + padding-right: 0px; + padding-left: 5px; +} + +#custom-power_profile { + color: #a6e3a1; + border-left: 0px; + border-right: 0px; +} + +#window { + border-radius: 10px; + margin-left: 60px; + margin-right: 60px; +} + +#clock { + color: #fab387; + border-radius: 10px 0px 0px 10px; + margin-left: 10px; + border-right: 0px; +} + +#network { + color: #f9e2af; + border-radius: 10px 0px 0px 10px; + border-left: 0px; + border-right: 0px; +} + +#bluetooth { + color: #89b4fa; + border-radius: 0px 10px 10px 0px; + margin-right: 10px +} + +#pulseaudio { + color: #89b4fa; + border-left: 0px; + border-right: 0px; +} + +#pulseaudio.microphone { + color: #cba6f7; + border-left: 0px; + border-right: 0px; + border-radius: 0px 10px 10px 0px; + margin-right: 10px; +} + +#battery { + color: #a6e3a1; + border-radius: 0 10px 10px 0; + margin-right: 10px; + border-left: 0px; +} +#battery.warning { + color: #FFA500; +} +#battery.critical { + color: #F00; +} +#custom-moon { + border-radius: 0px 10px 10px 0px; + border-right: 0px; + margin-left: 0px; +} diff --git a/03-user/dotfiles/.config/wofi/config b/03-user/dotfiles/.config/wofi/config new file mode 100644 index 0000000..7d92634 --- /dev/null +++ b/03-user/dotfiles/.config/wofi/config @@ -0,0 +1,2 @@ +mode=drun +insensitive=true diff --git a/03-user/dotfiles/.config/wofi/style.css b/03-user/dotfiles/.config/wofi/style.css new file mode 100644 index 0000000..184c230 --- /dev/null +++ b/03-user/dotfiles/.config/wofi/style.css @@ -0,0 +1,54 @@ +window { +margin: 0px; +border: 2px solid #bd93f9; +background-color: rgba(40,42,54,.5); +border-radius: 13px; +font-family: "SF Pro Display"; +} + +#input { +margin: 5px; +border: none; +color: #f8f8f2; +background-color: #44475a; +} + +#inner-box { +margin: 5px; +border: none; +background-color: rgba(40,42,54,.5); +} + +#outer-box { +margin: 5px; +border: none; +background-color: rgba(40,42,54,.5); +} + +#scroll { +margin: 0px; +border: none; +} + +#text { +margin: 5px; +border: none; +color: #f8f8f2; +} + +#entry.activatable #text { +color: #282a36; +} + +#entry > * { +color: #f8f8f2; +} + +#entry:selected { +background-color: #44475a; +border-radius: 6px; +} + +#entry:selected #text { +font-weight: bold; +} diff --git a/03-user/dotfiles/.local/share/applications/joplin.desktop b/03-user/dotfiles/.local/share/applications/joplin.desktop new file mode 100644 index 0000000..3e0509c --- /dev/null +++ b/03-user/dotfiles/.local/share/applications/joplin.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Joplin +Comment=Joplin - a note taking and to-do application with synchronization capabilities for Windows, macOS, Linux, Android and iOS. +Exec=env XDG_CURRENT_DESKTOP=GNOME /opt/Joplin/joplin %U --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime +Icon=/usr/share/joplin-desktop/resources/build/icons/128x128.png +Terminal=false +Type=Application +Categories=Application;Office; +StartupWMClass=Joplin diff --git a/03-user/dotfiles/.local/share/applications/open-stage-control.desktop b/03-user/dotfiles/.local/share/applications/open-stage-control.desktop new file mode 100644 index 0000000..95bc009 --- /dev/null +++ b/03-user/dotfiles/.local/share/applications/open-stage-control.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Name=Open Stage Control +Comment=Libre and modular OSC / MIDI controller +Exec=open-stage-control +Icon=/opt/open-stage-control/resources/app/assets/logo.png +Categories=Audio;AudioVideo; +Terminal=false diff --git a/03-user/dotfiles/.profile b/03-user/dotfiles/.profile new file mode 100644 index 0000000..0d5d197 --- /dev/null +++ b/03-user/dotfiles/.profile @@ -0,0 +1,2 @@ +# openframeworks +export PG_OF_PATH=/home/tobias/ofx/of_v0.12.0_linux64gcc6_release diff --git a/03-user/dotfiles/.zprofile b/03-user/dotfiles/.zprofile new file mode 100644 index 0000000..6e3fbd4 --- /dev/null +++ b/03-user/dotfiles/.zprofile @@ -0,0 +1,3 @@ +if [[ -z $WAYLAND_DISPLAY && $XDG_VTNR == 1 && $(tty) == /dev/tty1 ]]; then + exec ~/scripts/start_hyprland.sh +fi diff --git a/03-user/dotfiles/.zshrc b/03-user/dotfiles/.zshrc new file mode 100755 index 0000000..a1a2a92 --- /dev/null +++ b/03-user/dotfiles/.zshrc @@ -0,0 +1,46 @@ +# git display, add ${vcs_info_msg_0_} to PROMPT +#autoload -Uz vcs_info +#zstyle ':vcs_info:*' enable git svn +#precmd() { +# vcs_info +#} + +export CLICOLOR=1 +export LSCOLORS=ExGxBxDxCxEgEdxbxgxcxd +export TERM=xterm-256color + +# prompt format and color +PROMPT='%B%F{136}%n@%m%f%b %F{039}%.%f ❯ ' +#PROMPT='%B%F{002}%m%f%b:%F{039}%.%f %F{039}❯%f ' + +# autocompletion case insensitivity +zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' +autoload -Uz compinit && compinit -i + +# plugins +source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh +source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +# print all 256 color numbers to use in {}: +# for code in {000..255}; do print -P -- "$code: %F{$code}Color%f"; done + +# write a history file +HISTFILE=~/.zsh_history +HISTSIZE=10000 +SAVEHIST=10000 +setopt SHARE_HISTORY +setopt HIST_IGNORE_SPACE + +alias ls='ls --color=auto' +alias grep='grep --color=auto' + +#alias data="cd /volumes/data" +#alias proj="cd /volumes/data/Data/Projects" + +# enable jumping by words with ctrl+arrow keys +#bindkey ";5C" forward-word +#bindkey ";5D" backward-word + +bindkey "^[[1;5C" forward-word +bindkey "^[[1;5D" backward-word + diff --git a/03-user/dotfiles/scripts/display_sleep.sh b/03-user/dotfiles/scripts/display_sleep.sh new file mode 100755 index 0000000..ededaeb --- /dev/null +++ b/03-user/dotfiles/scripts/display_sleep.sh @@ -0,0 +1,30 @@ +#!/bin/zsh +# This script puts the monitors to sleep via dpms. +# Sth in hyprland crashes and creates high gpu usage, if hyprpaper is running +# when a monitor is being turned off and on again. +# Therefore, we kill hyprpaper when turning the monitor off and start it again when turning it on. + +export STATUS_FILE="$XDG_RUNTIME_DIR/display.status" + +enable_display() { + printf "true" >"$STATUS_FILE" + hyprctl dispatch dpms on + sleep 1 + exec hyprpaper +} + +disable_display() { + killall hyprpaper + printf "false" >"$STATUS_FILE" + hyprctl dispatch dpms off +} + +if ! [ -f "$STATUS_FILE" ]; then + disable_display +else + if [ $(cat "$STATUS_FILE") = "true" ]; then + disable_display + elif [ $(cat "$STATUS_FILE") = "false" ]; then + enable_display + fi +fi diff --git a/03-user/dotfiles/scripts/joplin.sh b/03-user/dotfiles/scripts/joplin.sh new file mode 100755 index 0000000..0fc2381 --- /dev/null +++ b/03-user/dotfiles/scripts/joplin.sh @@ -0,0 +1,8 @@ +#!/bin/zsh +JOPLIN_DEST=$(busctl --user list | grep "joplin" | awk '{print $1}' | sort -V | sed -n -e '2p') + +if [ -n "$JOPLIN_DEST" ]; then + busctl --user call "$JOPLIN_DEST" /StatusNotifierItem org.kde.StatusNotifierItem Activate ii 0 0 +else + exec gtk-launch joplin.desktop +fi diff --git a/03-user/dotfiles/scripts/start_hyprland.sh b/03-user/dotfiles/scripts/start_hyprland.sh new file mode 100755 index 0000000..cd3c29f --- /dev/null +++ b/03-user/dotfiles/scripts/start_hyprland.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +#source ~/scripts/set_gamma/set_gamma_table.sh +exec start-hyprland + diff --git a/03-user/optional/rme-proaudio.sh b/03-user/optional/rme-proaudio.sh new file mode 100755 index 0000000..b746330 --- /dev/null +++ b/03-user/optional/rme-proaudio.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# OPT-IN: PipeWire/WirePlumber pro-audio routing for the RME Fireface 802. +# +# Creates a stereo null sink ("rme-nullsink") and statically patches it to the +# RME's AES outs (AUX12/13), sets the card to the "pro-audio" profile, and keeps +# the null sink linked to whatever output is active — so Pulse/Wine apps always +# see a stable stereo device. (guide: bennett.dev/auto-link-pipewire-ports-wireplumber) +# +# Hardware-specific: the RME serial is baked into rme-proaudio/auto-connect-ports.lua +# ("Fireface 802 (24240739)") and rme-proaudio/alsa.conf (device.name) — edit those +# for a different unit. Run on the machine with the interface, as your normal user: +# ./rme-proaudio.sh +set -euo pipefail +[ "$(id -u)" -ne 0 ] || { echo "run as your user, not root (writes ~/.config)"; exit 1; } +cd "$(dirname "$0")" +src=rme-proaudio + +PW="$HOME/.config/pipewire/pipewire.conf.d" +WP="$HOME/.config/wireplumber" + +install -Dm644 "$src/nullsink.conf" "$PW/nullsink.conf" +install -Dm644 "$src/auto-connect-ports.lua" "$WP/scripts/auto-connect-ports.lua" +install -Dm644 "$src/alsa.conf" "$WP/wireplumber.conf.d/alsa.conf" + +# The component file registers the lua by ABSOLUTE path (~ isn't expanded here), +# so generate it with $HOME rather than shipping a hardcoded path. +install -Dm644 /dev/stdin "$WP/wireplumber.conf.d/99-auto-connect-ports.conf" < 0 + + if delete_links then + for _i, link in pairs(links) do + link:request_destroy() + end + + links = {} + + return + end + + for output_name, input_names in pairs(args.connect) do + local input_names = input_names[1] == nil and { input_names } or input_names + + if delete_links then + else + -- Iterate through all the output ports with the correct channel name + for output in output_om:iterate { Constraint { "audio.channel", "equals", output_name } } do + + for _i, input_name in pairs(input_names) do + -- Iterate through all the input ports with the correct channel name + for input in input_om:iterate { Constraint { "audio.channel", "equals", input_name } } do + -- Link all the nodes + local link = link_port(output, input) + + if link then + table.insert(links, link) + end + end + end + end + end + end + end + + output_om:connect("object-added", _connect) + input_om:connect("object-added", _connect) + all_links:connect("object-added", _connect) + + output_om:activate() + input_om:activate() + all_links:activate() + + if unless then + unless:connect("object-added", _connect) + unless:connect("object-removed", _connect) + unless:activate() + end +end + +-- Auto connect the stereo null sink to the first two channels of the RME Fireface +auto_connect_ports { + output = Constraint { "object.path", "matches", "rme-nullsink:*" }, + input = Constraint { "port.alias", "matches", "Fireface 802 (24240739):*" }, + connect = { + ["FL"] = "AUX12", + ["FR"] = "AUX13" + } +} + +-- Auto connect the stereo null sink to the jack_sink for when the jack server gets started +auto_connect_ports { + output = Constraint { "object.path", "matches", "rme-nullsink:*" }, + input = Constraint { "object.path", "matches", "jack_sink:*" }, + connect = { + ["FL"] = "FL", + ["FR"] = "FR" + } +} + +auto_connect_ports { + output = Constraint { "object.path", "matches", "rme-nullsink:*" }, + input = Constraint { "object.path", "matches", "alsa:*" }, + connect = { + ["FL"] = "FL", + ["FR"] = "FR" + }, + + -- Don't connect to speakers if there are bluetooth headphones plugged in + -- unless = Constraint { "object.path", "matches", "bluez_output.*" } +} + +-- Auto connect the stereo null sink to bluetooth headphones +-- auto_connect_ports { +-- output = Constraint { "object.path", "matches", "rme-nullsink:*" }, +-- input = Constraint { "object.path", "matches", "bluez_output.*" }, +-- connect = { +-- -- Connect to the correct channel or "MONO" if the output is in "headset" mode +-- ["FL"] = { "FL", "MONO" }, +-- ["FR"] = { "FR", "MONO" } +-- } +--} diff --git a/03-user/optional/rme-proaudio/nullsink.conf b/03-user/optional/rme-proaudio/nullsink.conf new file mode 100644 index 0000000..498a839 --- /dev/null +++ b/03-user/optional/rme-proaudio/nullsink.conf @@ -0,0 +1,14 @@ +context.objects = [ + { factory = adapter + args = { + factory.name = support.null-audio-sink + node.name = "rme-nullsink" + node.description = "RME Nullsink" + media.class = Audio/Sink + object.linger = true + audio.position = [ FL FR ] + monitor.channel-volumes = true + monitor.passthrough = true + } + } +] diff --git a/03-user/packages/aur.txt b/03-user/packages/aur.txt new file mode 100644 index 0000000..c260798 --- /dev/null +++ b/03-user/packages/aur.txt @@ -0,0 +1,47 @@ +# Explicit AUR packages. Refresh on the running system: pacman -Qqem > aur.txt +apple-fonts +arduino-ide-bin +binaryninja-free +coppwr +cura-bin +distroav-bin +dmg2img +dxvk-bin +ferdium +ffmpeg7.1 +fontbase +freeshow-bin +fswebcam +glfw-git +inkstitch +joplin-bin +librepods-git +llama.cpp +localsend-bin +logiops +lunacy-bin +ndi-sdk +obs-studio-liberty +onlyoffice-bin +openmeters-git +opensoundmeter-jack +open-stage-control-bin +pasystray-wayland +pdfsam-bin +posting +processing +puddletag +python310 +rapidraw +roomeqwizard +rustdesk-bin +scope-tui +sdrangel-bin +spotify +streamrip +ttf-ms-win11 +uxplay +vcvrack +vkd3d-proton-bin +whitesur-icon-theme +wl-screenrec diff --git a/03-user/run.sh b/03-user/run.sh new file mode 100755 index 0000000..c8f6ad3 --- /dev/null +++ b/03-user/run.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# User-level provisioning. Run as your normal user (NOT root), after the system +# layer has finished and you've rebooted into the installed system: +# ./run.sh +set -euo pipefail +cd "$(dirname "$0")" +source ../02-system/lib.sh +REPO_ROOT="$(cd .. && pwd)" + +[ "$(id -u)" -ne 0 ] || die "run as your normal user, not root" + +for step in [0-9][0-9]-*.sh; do + info "--- $step ---" + source "$step" +done + +info "user provisioning done." +[ -s "$HOME/aur-failed.log" ] && echo "NOTE: some AUR packages failed — see ~/aur-failed.log" diff --git a/03-user/seed/localsend-shared_preferences.json b/03-user/seed/localsend-shared_preferences.json new file mode 100644 index 0000000..0e9b8e0 --- /dev/null +++ b/03-user/seed/localsend-shared_preferences.json @@ -0,0 +1,12 @@ +{ + "flutter.ls_version": 2, + "flutter.ls_color": "system", + "flutter.ls_window_offset_x": 0.0, + "flutter.ls_window_offset_y": 0.0, + "flutter.ls_window_height": 500.0, + "flutter.ls_window_width": 401.0, + "flutter.ls_theme": "dark", + "flutter.ls_minimize_to_tray": true, + "flutter.ls_quick_save": true, + "flutter.ls_advanced_settings": true +} diff --git a/04-secrets/README.md b/04-secrets/README.md new file mode 100644 index 0000000..892eb35 --- /dev/null +++ b/04-secrets/README.md @@ -0,0 +1,18 @@ +# Secrets (NOT in git) + +Everything in this directory except `README.md` and `run.sh` is gitignored. +Secrets are **typed in interactively** by `run.sh` — nothing is committed, kept +on external media, or baked into the ISO. + +## What counts as a secret here +- share credentials — `/etc/nase.meow.credentials` (CIFS) and `/etc/davfs2/secrets` + (davfs); the fstab entries that reference them are non-secret and live in + `02-system/60-shares.sh` +- localsend keys — strip `flutter.ls_security_context` from its prefs before archiving; it regenerates +- GNOME Online Accounts (`~/.config/goa-1.0/accounts.conf`) +- later: licensed/cracked app installers & licenses (see `03-user/90-licensed-apps.sh`) + +## Usage +``` +sudo ./run.sh # prompts for each credential, writes the /etc files +``` diff --git a/04-secrets/run.sh b/04-secrets/run.sh new file mode 100755 index 0000000..d55a612 --- /dev/null +++ b/04-secrets/run.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Enter share credentials interactively and write them to their target files. +# Nothing secret is stored in the repo or on external media — you type it in here. +# Mount points + fstab entries are handled by 02-system/60-shares.sh, not this script. +# sudo ./run.sh +set -euo pipefail +[ "$(id -u)" -eq 0 ] || { echo "run as root (writes /etc/*)"; exit 1; } + +ask() { local v; read -rp " $1: " v; printf '%s' "$v"; } # visible +asks() { local v; read -rsp " $1: " v; echo >&2; printf '%s' "$v"; } # hidden + +# --- CIFS //nase.meow/data -> /etc/nase.meow.credentials --- +echo "nase.meow (CIFS) credentials:" +nm_user="$(ask username)" +nm_pass="$(asks password)" +nm_dom="$(ask 'domain (blank = none)')" +{ + printf 'username=%s\npassword=%s\n' "$nm_user" "$nm_pass" + [ -n "$nm_dom" ] && printf 'domain=%s\n' "$nm_dom" +} | install -Dm600 /dev/stdin /etc/nase.meow.credentials +echo " wrote /etc/nase.meow.credentials (600)" + +# --- davfs https://files.70b1.de -> /etc/davfs2/secrets --- +# Format: , one per line. We replace only this +# resource's line, leaving any other davfs secrets intact. +echo "files.70b1.de (davfs) credentials:" +dv_user="$(ask username)" +dv_pass="$(asks password)" +res="https://files.70b1.de" +tmp="$(mktemp)" +grep -vE "^${res//./\\.}[[:space:]]" /etc/davfs2/secrets 2>/dev/null > "$tmp" || true +printf '%s %s %s\n' "$res" "$dv_user" "$dv_pass" >> "$tmp" +install -Dm600 "$tmp" /etc/davfs2/secrets && rm -f "$tmp" +echo " wrote /etc/davfs2/secrets (600)" + +echo "credentials written. Mount with 'mount -a' or reboot (mounts wait on the -ready services)." diff --git a/README.md b/README.md new file mode 100644 index 0000000..763d099 --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ +# arch-system-th + +Reproducible Arch Linux + Hyprland install + +## Layers + +| Dir | Layer | Runs where | +|---------------|-------------------|-----------------------| +| `01-install/` | base install | live ISO (root) | +| `02-system/` | root provisioning | installed system | +| `03-user/` | user provisioning | installed system | +| `04-secrets/` | share credentials | interactive prompts | + +Opt-in, run-once scripts that aren't part of the auto-provision loop live in an +`optional/` dir under their layer: +- `02-system/optional/kvm-bridge.sh` — libvirt LAN bridge (root) +- `03-user/optional/rme-proaudio.sh` — RME Fireface pro-audio routing (user) + +## Rebuild a machine + +Boot the official Arch ISO, get online, then clone this repo and run it: + +```sh +# 1. boot the official Arch ISO, connect (iwctl for wifi; wired is automatic), +# then fetch this repo: +git clone arch-system-th && cd arch-system-th + +# 2. set target + options, then install the base: +vim system.conf # DISK, hostname, GPU, desktop/laptop… +./01-install/run.sh # partitions + base install + +# 3. reboot, log in, then provision: +sudo ~/arch-system-th/02-system/run.sh +~/arch-system-th/03-user/run.sh + +# 4. (optional) enter share credentials interactively +sudo ~/arch-system-th/04-secrets/run.sh +``` + +### Post Install + +- install openframeworks + - `tar -xf of_v0.12.0_linux64gcc6_release.tar.gz` + - sudo run both scripts from unpacked archive: scripts/linux/archlinux/ + - ensure that all pacman packages installed there are avail. offline + - install custom glfw-git from AUR, change in PKGBUILD: + - line 44, set `DGLFW_BUILD_WAYLAND=OFF`, otherwise of doesnt show window + - `mkdir ~/ofx && cp -r of_v0.12.0_linux64gcc6_release ~/ofx/` + - cd into the new dir under ~/ofx/, run + - `scripts/linux/compileOF.sh -j8` + - `scripts/linux/compilePG.sh -j8` + - say yes to install the projectGenerator, then add `export PG_OF_PATH=/home/tobias/ofx/of_v0.12.0_linux64gcc6_release` to ~/.profile manually + - optional: `scripts/linux/buildAllExamples.sh -j8` + - rm example debug files `find ./examples -wholename "*bin/*_debug" -type f -print0 | xargs -0 /bin/rm -f` + - the of dir must reside in the user folder because of permissions in /opt. copying to opt would work, but every time a new addon gets used by a project (the standard ones in /addons) new obj files are created in the ofx folder, which fails because users shall not have write perms in opt, so every make would have to be run as root at least once.. not a good solution. + +- install davinci resolve manually +- install bitwig studio manually +- agisoft metashape manually +- configure wine manually +- configure yabridge manually +- copy vcvrack modules +- copy arduino libraries +- copy processing libraries +- install firefox extensions manually + - ublock origin + - floccus + - dark reader + +- edit hyprland config to adjust for monitor setup, including color profiles under ~/.local/share/icc + + +## Package lists +`02-system/packages/pacman.txt` (native, system layer) and `03-user/packages/aur.txt` +(AUR, user layer) are the source of truth — edit them directly, or refresh from a +running machine: +```sh +pacman -Qqen > 02-system/packages/pacman.txt # native explicit +pacman -Qqem > 03-user/packages/aur.txt # explicit AUR +``` +GPU drivers live in `graphics-amd.txt` / `graphics-intel.txt`, installed per the +`GPU=` set in `system.conf` (kept out of `pacman.txt` so a machine only gets its +own GPU's packages). + diff --git a/iso/airootfs/etc/motd b/iso/airootfs/etc/motd new file mode 100644 index 0000000..ce9e8b9 --- /dev/null +++ b/iso/airootfs/etc/motd @@ -0,0 +1,10 @@ + + Arch + Hyprland custom installer (live environment) + =================================================== + The provisioning repo is at: /root/arch-system-th + + 1. Get online: iwctl (wifi) — wired works automatically + 2. Set target+opts: vim /root/arch-system-th/01-install/install.conf + 3. Install base: /root/arch-system-th/01-install/run.sh + 4. Reboot, then run the system + user provisioning (see repo README). + diff --git a/iso/extra-packages.x86_64 b/iso/extra-packages.x86_64 new file mode 100644 index 0000000..51ee292 --- /dev/null +++ b/iso/extra-packages.x86_64 @@ -0,0 +1,7 @@ +# Packages appended to releng's package list for the live ISO. +# (Most installer tools are already in releng; listed here to be explicit/safe.) +git +arch-install-scripts +gptfdisk +dosfstools +e2fsprogs diff --git a/iso/run.sh b/iso/run.sh new file mode 100755 index 0000000..fbe317f --- /dev/null +++ b/iso/run.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# REFERENCE / OPTIONAL — the normal flow uses the official Arch ISO + `git clone` +# (see README). Kept in case a self-contained custom ISO is ever wanted. +# +# Build the thin custom Arch ISO by extending the official `releng` profile with: +# - a few explicit installer packages (extra-packages.x86_64) +# - this repo baked into /root/arch-system-th +# - a login MOTD with install instructions (airootfs/etc/motd) +# +# Run on a machine with the `archiso` package installed (needs root for mkarchiso): +# sudo ./run.sh [output_dir] +set -euo pipefail +cd "$(dirname "$0")" +REPO_ROOT="$(cd .. && pwd)" +OUTDIR="${1:-$REPO_ROOT/out}" +RELENG=/usr/share/archiso/configs/releng + +command -v mkarchiso >/dev/null || { echo "install archiso first: pacman -S archiso"; exit 1; } +[ -d "$RELENG" ] || { echo "releng profile missing at $RELENG"; exit 1; } + +WORK="$(mktemp -d)"; PROFILE="$WORK/profile" +trap 'rm -rf "$WORK"' EXIT + +cp -r "$RELENG" "$PROFILE" + +# extra installer packages +cat extra-packages.x86_64 >> "$PROFILE/packages.x86_64" + +# our airootfs overlay (motd, etc.) +cp -aT airootfs "$PROFILE/airootfs" + +# bake the repo into the live root (without git history / build output) +dest="$PROFILE/airootfs/root/arch-system-th" +mkdir -p "$dest" +cp -a "$REPO_ROOT/." "$dest/" +rm -rf "$dest/.git" "$dest/out" + +# mkarchiso copies airootfs with --no-preserve=mode, so exec bits are dropped and +# must be declared in profiledef's file_permissions array (the same way releng's +# own scripts get +x). We only need the bootstrap executable here; run.sh then +# restores +x across the rest of the repo at runtime, which propagates to the +# installed system. file_permissions+=(...) appends to the array defined in releng. +printf '\nfile_permissions+=(["/root/arch-system-th/01-install/run.sh"]="0:0:755")\n' \ + >> "$PROFILE/profiledef.sh" + +mkdir -p "$OUTDIR" +mkarchiso -v -w "$WORK/work" -o "$OUTDIR" "$PROFILE" +echo "ISO written to $OUTDIR" diff --git a/original_docs/arch_notes.md b/original_docs/arch_notes.md new file mode 100644 index 0000000..6a59b92 --- /dev/null +++ b/original_docs/arch_notes.md @@ -0,0 +1,634 @@ +[deprecated] general info: +install blender after freecad, because at first install, blender was first installed and when installing freecad, there was a conflict between hdf5 and hdf5-openmpi. (this is probably not mandatory anymore). + + +AppImage/Manual: +process: copy program files, then icons and .desktop files for manually installed apps. copy appimages to /opt/softwarename +> These files usually reside in /usr/share/applications/ or /usr/local/share/applications/ for applications installed system-wide, or ~/.local/share/applications/ for user-specific applications. User entries take precedence over system entries. + +Bespoke +Meshlab +Agisoft Metashape + Crack (runs like portable app, put whole folder in /opt) +gnome astra monitor shell extension + - https://www.debugpoint.com/manual-installation-gnome-extension/ + - then, run `glib-compile-schemas ./schemas` inside the extension dir +gnome own smarthome plugin + - copy `smarthomebar@tobiashuttinger.de` to `/home/tobias/.local/share/gnome-shell/extensions/r` +openframeworks + - `tar -xf of_v0.12.0_linux64gcc6_release.tar.gz` + - sudo run both scripts from unpacked archive: scripts/linux/archlinux/ + - ensure that all pacman packages installed there are avail. offline + - install custom glfw-git from AUR, change in PKGBUILD: + - line 44, set `DGLFW_BUILD_WAYLAND=OFF`, otherwise of doesnt show window + - `mkdir ~/ofx && cp -r of_v0.12.0_linux64gcc6_release ~/ofx/` + - cd into the new dir under ~/ofx/, run + - `scripts/linux/compileOF.sh -j8` + - `scripts/linux/compilePG.sh -j8` + - say yes to install the projectGenerator, then add `export PG_OF_PATH=/home/tobias/ofx/of_v0.12.0_linux64gcc6_release` to ~/.profile manually + - optional: `scripts/linux/buildAllExamples.sh -j8` + - rm example debug files `find ./examples -wholename "*bin/*_debug" -type f -print0 | xargs -0 /bin/rm -f` + - the of dir must reside in the user folder because of permissions in /opt. copying to opt would work, but every time a new addon gets used by a project (the standard ones in /addons) new obj files are created in the ofx folder, which fails because users shall not have write perms in opt, so every make would have to be run as root at least once.. not a good solution. + +create webapps with webapp-manager manually +install firefox extensions manually + + + + +AUR: +gnome-shell-extension-blur-my-shell +gnome-shell-extension-tilingshell +gnome-shell-extension-dash-to-dock +gnome-shell-extension-appindicator +whitesur-icon-theme +inter-font +apple-fonts +ttf-ms-win11-auto +davfs2 +roomeqwizard +davinci-resolve-studio +bitwig-studio +spotify +cura-bin +processing-bin +lunacy-bin +joplin-desktop (3.0.14) +fontbase +obs-studio-liberty (includes browser) +ndi-sdk ffmpeg7.1 distroav +localsend-bin +webapp-manager +vcvrack +open-stage-control python-rtmidi (pacman) +freeshow-bin +python310 +sdrangel-bin +rtl_433 +scope-tui +uxplay +fswebcam +arduino-ide-bin (package from extra hangs) +ferdium +binaryninja-free +feishin-bin +puddletag +onlyoffice-bin +posting +rapidraw +logiops (for logitech mice) +opensoundmeter-jack +openmeters + + +Repos: + +zsh zsh-syntax-highlighting zsh-autosuggestions +vim +neovim +firefox +vlc vlc-plugins-all +sonic-visualiser +gimp +inkscape python-tinycss2 (curr. needed for eps import) +krita +mixxx +freecad +blender +element-desktop +code +libreoffice-fresh +tenacity +thunderbird +remmina libvncserver freerdp +reaper +keepassxc +kicad +prusa-slicer +dconf-editor +kismet +darktable +gnome-calendar gnome-contacts evolution evolution-ews +gnome-maps +qemu-full qemu-img libvirt virt-install virt-manager virt-viewer edk2-ovmf swtpm guestfs-tools libosinfo +wine-staging wine-mono wine-gecko +supercollider +puredata +musescore +pipewire-zeroconf (autodiscover airplay targets) +pipewire-roc +qpwgraph +sqlitebrowser +netcat (choose openbsd version for v6 support) +linssid +yabridge +arduino-cli +ghidra +rpi-imager +foliate +cups +kid3-common +kdenlive +godot +socat +cdrkit +solaar (logitech mice) +v4l2loopback-dkms (video loopback needed for obs virt webcam) +nvtop + +``` +sudo pacman -Sy tmux inetutils moreutils findutils wget curl httpie htop iotop sysstat iftop nethogs bmon nmap wireshark-cli wireshark-qt iperf rclone rsync p7zip hexedit go rust nodejs ffmpeg libusb mediainfo cmake perl-image-exiftool ninja yt-dlp ncdu mpv openssl libimobiledevice mitmproxy monolith chromium shairport-sync docker docker-compose docker-buildx wireguard-tools gnutls + +``` + +Hardware-dependant graphics libs: +AMD: +mesa lib32-mesa vulkan-radeon lib32-vulkan-radeon +(libva-mesa-driver (for video enc/dec accel)) -> not needed anymore, was merged with main mesa package +libva-utils (check if vaapi is enabled on system) +gst-plugin-va (gstreamer vaapi libs) +rocm-hip-runtime (amds rocm hip libraries) +rocm-opencl-runtime (opencl support) + + + +If using hyprland as main desktop: +disable gnome display manager +``` +systemctl set-default multi-user.target +``` +Then, add to ~/.zprofile: +``` +if [[ -z $WAYLAND_DISPLAY && $XDG_VTNR == 1 && $(tty) == /dev/tty1 ]]; then + exec ~/scripts/start_hyprland.sh +fi +``` +and copy the scripts start_hyprland.sh, display_sleep.sh and set_gamma folder to ~/scripts/ + + + +To enable autologin: +``` +sudo mkdir -p /etc/systemd/system/getty@tty1.service.d +``` +Create `/etc/systemd/system/getty@tty1.service.d/autologin.conf` with: +``` +[Service] +ExecStart= +ExecStart=-/usr/bin/agetty --autologin tobias --noclear %I $TERM +``` +Then: +``` +sudo systemctl daemon-reload +sudo systemctl restart getty@tty1 +``` + + +Settings: + +If system is a desktop: +add dir/file: +``` +/etc/systemd/sleep.conf.d/disable-sleep.conf +``` +With content: +``` +[Sleep] +AllowSuspend=no +AllowHibernation=no +AllowHybridSleep=no +AllowSuspendThenHibernate=no +``` + + + +activate iommu in kernel: +append to `/etc/kernel/cmdline`: +``` +intel_iommu=on iommu=pt +``` +then regenerate boot entries and initrds: `sudo reinstall-kernels` + + +import gnome settings + +experimental features in gnome 47 (also included in dconf settings, just for completeness): +``` +gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']" +gsettings set org.gnome.mutter experimental-features '["scale-monitor-framebuffer", "xwayland-native-scaling"]' +``` + +copy nautilus bookmarks bar file: `~/.config/gtk-3.0/bookmarks` + +copy xdg mime associations file: `~/.config/mimeapps.list` + +install monitor color profiles + +install blender addons + +Enable services: bluetooth service + +Copy ~/.profile +(for env vars that are not shell related) + +Copy ~/.zshrc and make zsh the default shell with +`chsh -s /usr/bin/zsh` + +Configure shairport-sync + - copy shairport config file `/etc/shairport-sync.conf` + - copy systemd user service file: `/home/tobias/.config/systemd/user/shairport-sync.service` + - enable service `systemctl --user enable shairport-sync.service` + +Configure joplin + - copy joplin.desktop from /usr/share/applications to ~/.local/share/applications + - change Exec line in joplin.desktop: + `Exec=env XDG_CURRENT_DESKTOP=GNOME /usr/bin/joplin-desktop --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime` + - The env XDG... is needed for non-gnome envs like hyprland because when set to sth else, joplin takes more startup time when probing what portal is used... + - Add line: `StartupWMClass=@joplin/app-desktop` + - copy settings json and userchrome.css + - then, copy joplin start helper script joplin.sh to ~/scripts/ + +Configure vscode + - install extensions + - copy settings file + - copy keybindings file + - copy .desktop file from `/usr/share/applications/code.desktop` to `~/.local/share/applications` + - replace the line `StartupWMClass=Code` with `StartupWMClass=code-url-handler` + + +Create ./config/electron-flags.conf and ./config/code-flags.conf with contents: +``` +--enable-features=UseOzonePlatform +--ozone-platform=wayland +--enable-wayland-ime +``` + +configure obs-ndi: +ndi-sdk from AUR installs v6 into /usr/lib. obs-ndi however expects v5. solution: symlink it: +`sudo ln -s /usr/lib/libndi.so.6 /usr/local/lib/libndi.so.5` +Because a ndi sdk version requires specific versions of ffmpeg (v6.1.1 >= ffmpeg 7, but NOT 8, that doesnt work), pin the ffmpeg package in pacman to stay at the current version and only update ffmpeg if its safe that ndi sdk works with it. +`strings /usr/lib/libndi.so.5.6.1 | grep 'libav'`. The version numbers of libavcodec and libavutil are important; those are provided by ffmpeg. + + +configure v4l2loopback kernel module +/etc/modprobe.d/v4l2loopback.conf: +``` +options v4l2loopback devices=1 video_nr=10 card_label="Virtual Cam" exclusive_caps=1 +``` +then: +``` +echo v4l2loopback | sudo tee /etc/modules-load.d/v4l2loopback.conf +``` + + + +configure fontbase: +apply fontbase crack +create symlink to fonts folder - change source path accordingly: +`ln -s /mnt/nase.meow/Data/Gfxres/fonts ~/FontBase/fonts` + + + +- apply bitwig crack +- for all bitwig versions before 5.3.9, theres a bug in bitwig with newer vulkan libs that prevent bitwig from starting. to fix: +copy `/opt/vulkan-icd-loader-1.4.309.0` +copy `~/.local/share/applications/com.bitwig.BitwigStudio.desktop` +(`env LD_LIBRARY_PATH=/opt/vulkan-icd-loader-1.4.309.0` was prepended to the Eexc command there) + + +apply resolve crack + +create webapps manually for now with webapp-manager + + + + +Set default file browser to nautilus: +``` +xdg-mime default org.gnome.Nautilus.desktop inode/directory +``` +Otherwise any app that has the mimetype inode/directory specified in its .desktop file will probably become default (easytag in this case) + + + +- mount net shares and ramdisk on boot/login + - mkdir /mnt/nase.meow + - mkdir /mnt/files.70b1.de + - mkdir /mnt/ramdisk + - put credentials file /etc/nase.meow.credentials and /etc/davfs2/secrets + ``` + chmod 600 /etc/davfs2/secrets + chown root:root /etc/davfs2/secrets + chmod 600 /etc/nase.meow.credentials + chown root:root /etc/nase.meow.credentials + ``` + - create systemd services that wait until shares are reachable + - /etc/systemd/system/files.70b1.de-ready.service + - /etc/systemd/system/nase.meow-ready.service + - enable those services with systemctl enable + - make entries in fstab + + +copy /etc/gdm/custom.conf for autologin settings, disable autologin because otherweise gnome keyring asks for password twice + + +copy gnome online accounts config to `~/.config/goa-1.0/accounts.conf`. might not work because other things are stored elsewhere... + +configure firefox +- sane user.prefs, also change +apz.gtk.pangesture.page_delta_mode_multiplier to 0.2 +apz.gtk.pangesture.pixel_delta_mode_multiplier to 10 +for slow trackpad scrolling +- to enable ffmpeg vaapi video decode hw accel, set: +media.ffmpeg.vaapi.enabled to true + + + +- configure kvm +enable libvirt daemons +``` +for drv in qemu interface network nodedev nwfilter secret storage; do + sudo systemctl enable virt${drv}d.service; + sudo systemctl enable virt${drv}d{,-ro,-admin}.socket; +done +``` +- configure kvm networking +[qemu bridge networking](:/25eb0085f9f04d1cbf343502255c432b) + + +Configure wine + - run `winecfg` + - installed samba package for ntlm_auth binary + - installed + ``` + winetricks d3dx9 + winetricks d3dx11_43 + winetricks vcrun2022 + winetricks corefonts + ``` + - installed dxvk-bin from AUR (directx 9/10/11 vulkan layers) + - activated for current wine env with `setup_dxvk install` + - installed vkd3d-proton-bin from AUR (directx 12 vulkan layer) + - activated for current wine env with `setup_vkd3d_proton install` + - necessary for some VST setups: + `winetricks vcrun6sp6 ` + + + +configure localsend + - localsend stores its generated priv/pub ssl keys in the config file, in the json key `flutter.ls_security_context`. strip this key completely when archiving the file for setup. they get generated if this key is missing. + location: `.local/share/org.localsend.localsend_app/shared_preferences.json` + +autostarting gui apps is best done via gnome autostart functionality, because systemd user units dont wait until display is ready + - remove anything thats already in `~/.config/autostart/` + - copy localsend.desktop + + +vcvrack: + - untar and copy rack appdata folder to ./local/share + + +arduino config and libraries: + - extract arduino15.tar.gz and copy to ~/.arduino15 + - extract arduino.tar.gz and copy to ~/Arduino + +processing config and libraries: + - copy ~/.config/processing/preferences.txt + - extract libraries.tar.gz and copy to ~/sketchbook/libraries + + +open stage control: + - its installed in /opt/open-stage-control but no desktop file or symlink is created + - create symlink: + ``` + sudo ln -s /opt/open-stage-control/open-stage-control /usr/local/bin + ``` + - create desktop file with icon + + + +Configure VLC + - copy `~/.config/vlc/vlcrc` + +Configure mpv: + - copy `~/.config/mpv/mpv.conf` + + + +Pipewire Roc sinks: +1. Install pipewire roc module +``` +pacman -S pipewire-roc +``` +2. Ensure that you have pipewire configuration directory: +``` +mkdir -p ~/.config/pipewire/pipewire.conf.d +``` +3. Create `~/.config/pipewire/pipewire.conf.d/roc-sink.conf` and add the following: +``` +context.modules = [ + { name = libpipewire-module-roc-sink + args = { + fec.code = rs8m + remote.ip = + remote.source.port = 10001 + remote.repair.port = 10002 + sink.name = "Studio Raspi" + sink.props = { + node.name = "studio-raspi-roc-sink" + node.description = "Studio Raspi" + } + } + } +] +``` +Here, `` is the IP address of the Roc receiver. +After that, the sink should be available. +https://docs.pipewire.org/page_module_roc_source.html + + +Pipewire airplay zeroconf: +Create file `~/.config/pipewire/pipewire.conf.d/raop-discover.conf` with content: +``` +context.modules = [ + { + name = libpipewire-module-raop-discover + args = { } + } +] +``` + + +Pipewire RME Fireface conf with virtual sink: Follow this [Pipewire Wireplumber Config for Pro Audio](:/a3c201df819d4fb4a99a5e6cb00bd89d) + + + + +configure ferdium +remove from gnome (xdg) autostart +``` +rm ~/.config/autostart/ferdium.desktop +``` + + + +configure cups +``` +sudo systemctl enable cups.socket +sudo systemctl start cups.socket +``` +Only cups.socket is enabled and started, this way, cups only runs when an application wants to use it. + + + + +Logitech mice: configure logiops +Create a udev rule with a file under: `/etc/udev/rules.d/90-logid-start-restart.rules`: +``` +# Logitech via USB receiver +ACTION=="add|change", SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="046d", \ + RUN+="/usr/bin/systemctl restart --no-block logid.service" + +# Logitech via Bluetooth (BlueZ UHID path 0005:046D:...) +ACTION=="add|change", SUBSYSTEM=="hidraw", KERNELS=="0005:046D:*", \ + RUN+="/usr/bin/systemctl restart --no-block logid.service" +``` +See this issue why: https://github.com/PixlOne/logiops/issues/279#issuecomment-1192737809 + +then, create config file: /etc/logid.cfg +Hint: When connected through Bolt receiver, MX Anywhere 3S shows up as "MX Anywhere 3" +``` +devices: ( +{ + name: "MX Anywhere 3"; + smartshift: + { + on: false; + threshold: 15; + torque: 50; + }; + hiresscroll: + { + hires: false; + invert: false; + target: false; + }; + dpi: 1000; + +} +); +``` +enable system service +``` +sudo systemctl enable logiops +sudo systemctl start logiops +``` +currently under gnome wayland, smooth scrolling doesnt work (wheel speed way too high, cant be adjusted via libinput) + + + + + +configure keepassxc +copy ~/.config/keepassxc/keepassxc.ini + + + + +For amggpu performance control, create the file `/usr/local/bin/gpuprofile.sh`: +``` +#!/bin/zsh +echo "high" | tee /sys/class/drm/card1/device/power_dpm_force_performance_level +``` +Setting perf level to high fixes memclock to 100% which increases idle power draw to around 20W, but fixes stuttering. +Then, add a systemd service `/etc/systemd/system/gpuprofile.service`: +``` +[Unit] +Description=Increase GPU core and memory clocks +After=multi-user.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/gpuprofile.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +``` + + + + +For amdgpu rx 6600 fan control, create the file `/usr/local/bin/amdgpu-fancontrol.sh`: +``` +#!/bin/sh +# ---------------- CONFIG ---------------- +# Temperature threshold in millidegrees Celsius +# 55000 = 55°C +TEMP_THRESHOLD=55000 + +# PWM values (0–255) +PWM_IDLE=25 # fan speed below threshold +PWM_HOT=90 # fan speed above threshold + +# Path root +HWMON_ROOT="/sys/class/drm/card1/device/hwmon" +# --------------------------------------- + +# Find hwmon +HWMON="$(ls -d $HWMON_ROOT/hwmon* 2>/dev/null | head -n1)" +[ -z "$HWMON" ] && exit 0 + +TEMP_FILE="$HWMON/temp1_input" +PWM_ENABLE="$HWMON/pwm1_enable" +PWM_FILE="$HWMON/pwm1" + +# Enable manual fan control (always) +echo 1 > "$PWM_ENABLE" + +# Read temperature +TEMP="$(cat "$TEMP_FILE")" + +# Decide PWM +if [ "$TEMP" -ge "$TEMP_THRESHOLD" ]; then + PWM="$PWM_HOT" +else + PWM="$PWM_IDLE" +fi + +# Always write PWM +echo "$PWM" > "$PWM_FILE" + +exit 0 +``` +Change the path root (card1) according to where the gpu is registered on the system. +Then, make it executable: `sudo chmod +x /usr/local/bin/amdgpu-fancontrol.sh` + +Then, create a systemd service under `/etc/systemd/system/amdgpu-fancontrol.service`: +``` +[Unit] +Description=AMDGPU fan control +After=multi-user.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/amdgpu-fancontrol.sh +``` + +Then, create a systemd timer under `/etc/systemd/system/amdgpu-fancontrol.timer`: +``` +[Unit] +Description=Run AMDGPU fan control periodically + +[Timer] +OnBootSec=20s +OnUnitActiveSec=20s + +[Install] +WantedBy=timers.target +``` + +Then, activate timer: +``` +sudo systemctl daemon-reload +sudo systemctl enable --now amdgpu-fancontrol.timer +``` \ No newline at end of file diff --git a/original_docs/hyprland_notes.md b/original_docs/hyprland_notes.md new file mode 100644 index 0000000..770d8f9 --- /dev/null +++ b/original_docs/hyprland_notes.md @@ -0,0 +1,39 @@ +```bash +pacman -S hyprland hyprpaper hyprshot hyprpicker kitty wofi hyprsunset swaync xdg-desktop-portal-hyprland +pacman -S waybar otf-font-awesome + +#statusbar applets +pacman -S blueman network-manager-applet +yay -S pasystray-wayland +``` + +hyprland conf: ~/.config/hypr/hyprland.conf +hyprpaper conf: ~/.config/hypr/hyprpaper.conf + + +hyprsunset conf: ~/.config/hypr/hyprsunset.conf + + +waybar conf: ~/.config/waybar/config.jsonc +waybar style: ~/.config/waybar/style.css +everythin in ~/.config/waybar/scripts + +wofi config: ~/.config/wofi/config +wofi style: ~/.config/wofi/style.css + +kitty config: ~/.config/kitty/kitty.conf + +swaync style: ~/.config/swaync/style.css + +## screensharing + +``` +sudo pacman -S xdg-desktop-portal-hyprland +``` + +## Joplin slow start +script in ~/scripts/joplin.sh + +## Firefox blurry after monitor wake + +In about:config, set `widget.wayland.fractional-scale.enabled = true` \ No newline at end of file diff --git a/system.conf b/system.conf new file mode 100644 index 0000000..64abf02 --- /dev/null +++ b/system.conf @@ -0,0 +1,14 @@ +# Global build config — the single source of truth for a rebuild. +# EDIT before running 01-install/run.sh; 02-system/run.sh reads it again later. + +# --- install target (used by 01-install) --- +DISK=/dev/vda # TARGET DISK — WILL BE COMPLETELY ERASED (e.g. /dev/nvme0n1) +HOSTNAME=arch-th +USERNAME=tobias +TIMEZONE=Europe/Berlin +LOCALE=en_US.UTF-8 +KEYMAP=de + +# --- hardware / role (used by 02-system) --- +GPU=amd # amd | intel — installs 02-system/packages/graphics-.txt +IS_DESKTOP=1 # 1 = desktop (no sleep, GPU fan/power tuning); 0 = laptop