Compare commits
12 commits
Author | SHA1 | Date | |
---|---|---|---|
10d8cda843 | |||
fda999db96 | |||
512a87da53 | |||
4c139f1a7a | |||
e6df94da34 | |||
b808a79ab2 | |||
db93fc5149 | |||
454a26a85a | |||
fe54e9b0c9 | |||
4502f0036f | |||
918824a59e | |||
300d20bdee |
28 changed files with 706 additions and 175 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,5 +1,4 @@
|
|||
flake.lock
|
||||
.DS_STORE
|
||||
**/.DS_STORE
|
||||
result
|
||||
result-*
|
||||
|
|
114
files/ghostty/cursor-smear-black.glsl
Normal file
114
files/ghostty/cursor-smear-black.glsl
Normal file
|
@ -0,0 +1,114 @@
|
|||
float getSdfRectangle(in vec2 p, in vec2 xy, in vec2 b)
|
||||
{
|
||||
vec2 d = abs(p - xy) - b;
|
||||
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
|
||||
}
|
||||
|
||||
// Based on Inigo Quilez's 2D distance functions article: https://iquilezles.org/articles/distfunctions2d/
|
||||
// Potencially optimized by eliminating conditionals and loops to enhance performance and reduce branching
|
||||
|
||||
float seg(in vec2 p, in vec2 a, in vec2 b, inout float s, float d) {
|
||||
vec2 e = b - a;
|
||||
vec2 w = p - a;
|
||||
vec2 proj = a + e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);
|
||||
float segd = dot(p - proj, p - proj);
|
||||
d = min(d, segd);
|
||||
|
||||
float c0 = step(0.0, p.y - a.y);
|
||||
float c1 = 1.0 - step(0.0, p.y - b.y);
|
||||
float c2 = 1.0 - step(0.0, e.x * w.y - e.y * w.x);
|
||||
float allCond = c0 * c1 * c2;
|
||||
float noneCond = (1.0 - c0) * (1.0 - c1) * (1.0 - c2);
|
||||
float flip = mix(1.0, -1.0, step(0.5, allCond + noneCond));
|
||||
s *= flip;
|
||||
return d;
|
||||
}
|
||||
|
||||
float getSdfParallelogram(in vec2 p, in vec2 v0, in vec2 v1, in vec2 v2, in vec2 v3) {
|
||||
float s = 1.0;
|
||||
float d = dot(p - v0, p - v0);
|
||||
|
||||
d = seg(p, v0, v3, s, d);
|
||||
d = seg(p, v1, v0, s, d);
|
||||
d = seg(p, v2, v1, s, d);
|
||||
d = seg(p, v3, v2, s, d);
|
||||
|
||||
return s * sqrt(d);
|
||||
}
|
||||
|
||||
vec2 normalize(vec2 value, float isPosition) {
|
||||
return (value * 2.0 - (iResolution.xy * isPosition)) / iResolution.y;
|
||||
}
|
||||
|
||||
float antialising(float distance) {
|
||||
return 1. - smoothstep(0., normalize(vec2(2., 2.), 0.).x, distance);
|
||||
}
|
||||
|
||||
float determineStartVertexFactor(vec2 a, vec2 b) {
|
||||
// Conditions using step
|
||||
float condition1 = step(b.x, a.x) * step(a.y, b.y); // a.x < b.x && a.y > b.y
|
||||
float condition2 = step(a.x, b.x) * step(b.y, a.y); // a.x > b.x && a.y < b.y
|
||||
|
||||
// If neither condition is met, return 1 (else case)
|
||||
return 1.0 - max(condition1, condition2);
|
||||
}
|
||||
|
||||
vec2 getRectangleCenter(vec4 rectangle) {
|
||||
return vec2(rectangle.x + (rectangle.z / 2.), rectangle.y - (rectangle.w / 2.));
|
||||
}
|
||||
float ease(float x) {
|
||||
return pow(1.0 - x, 3.0);
|
||||
}
|
||||
|
||||
const vec4 TRAIL_COLOR = vec4(0.0, 0.2, 0.5, 0.1);
|
||||
const float DURATION = 0.15; //IN SECONDS
|
||||
|
||||
void mainImage(out vec4 fragColor, in vec2 fragCoord)
|
||||
{
|
||||
#if !defined(WEB)
|
||||
fragColor = texture(iChannel0, fragCoord.xy / iResolution.xy);
|
||||
#endif
|
||||
// Normalization for fragCoord to a space of -1 to 1;
|
||||
vec2 vu = normalize(fragCoord, 1.);
|
||||
vec2 offsetFactor = vec2(-.5, 0.5);
|
||||
|
||||
// Normalization for cursor position and size;
|
||||
// cursor xy has the postion in a space of -1 to 1;
|
||||
// zw has the width and height
|
||||
vec4 currentCursor = vec4(normalize(iCurrentCursor.xy, 1.), normalize(iCurrentCursor.zw, 0.));
|
||||
vec4 previousCursor = vec4(normalize(iPreviousCursor.xy, 1.), normalize(iPreviousCursor.zw, 0.));
|
||||
|
||||
// When drawing a parellelogram between cursors for the trail i need to determine where to start at the top-left or top-right vertex of the cursor
|
||||
float vertexFactor = determineStartVertexFactor(currentCursor.xy, previousCursor.xy);
|
||||
float invertedVertexFactor = 1.0 - vertexFactor;
|
||||
|
||||
// Set every vertex of my parellogram
|
||||
vec2 v0 = vec2(currentCursor.x + currentCursor.z * vertexFactor, currentCursor.y - currentCursor.w);
|
||||
vec2 v1 = vec2(currentCursor.x + currentCursor.z * invertedVertexFactor, currentCursor.y);
|
||||
vec2 v2 = vec2(previousCursor.x + currentCursor.z * invertedVertexFactor, previousCursor.y);
|
||||
vec2 v3 = vec2(previousCursor.x + currentCursor.z * vertexFactor, previousCursor.y - previousCursor.w);
|
||||
|
||||
float sdfCurrentCursor = getSdfRectangle(vu, currentCursor.xy - (currentCursor.zw * offsetFactor), currentCursor.zw * 0.5);
|
||||
float sdfTrail = getSdfParallelogram(vu, v0, v1, v2, v3);
|
||||
|
||||
float progress = clamp((iTime - iTimeCursorChange) / DURATION, 0.0, 1.0);
|
||||
float easedProgress = ease(progress);
|
||||
// Distance between cursors determine the total length of the parallelogram;
|
||||
vec2 centerCC = getRectangleCenter(currentCursor);
|
||||
vec2 centerCP = getRectangleCenter(previousCursor);
|
||||
float lineLength = distance(centerCC, centerCP);
|
||||
|
||||
vec4 newColor = vec4(fragColor);
|
||||
// Compute fade factor based on distance along the trail
|
||||
float fadeFactor = 1.0 - smoothstep(lineLength, sdfCurrentCursor, easedProgress * lineLength);
|
||||
|
||||
// Apply fading effect to trail color
|
||||
vec4 fadedTrailColor = TRAIL_COLOR * fadeFactor;
|
||||
|
||||
// Blend trail with fade effect
|
||||
newColor = mix(newColor, fadedTrailColor, antialising(sdfTrail));
|
||||
// Draw current cursor
|
||||
newColor = mix(newColor, TRAIL_COLOR, antialising(sdfCurrentCursor));
|
||||
newColor = mix(newColor, fragColor, step(sdfCurrentCursor, 0.));
|
||||
fragColor = mix(fragColor, newColor, step(sdfCurrentCursor, easedProgress * lineLength));
|
||||
}
|
114
files/ghostty/cursor-smear-blue.glsl
Normal file
114
files/ghostty/cursor-smear-blue.glsl
Normal file
|
@ -0,0 +1,114 @@
|
|||
float getSdfRectangle(in vec2 p, in vec2 xy, in vec2 b)
|
||||
{
|
||||
vec2 d = abs(p - xy) - b;
|
||||
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
|
||||
}
|
||||
|
||||
// Based on Inigo Quilez's 2D distance functions article: https://iquilezles.org/articles/distfunctions2d/
|
||||
// Potencially optimized by eliminating conditionals and loops to enhance performance and reduce branching
|
||||
|
||||
float seg(in vec2 p, in vec2 a, in vec2 b, inout float s, float d) {
|
||||
vec2 e = b - a;
|
||||
vec2 w = p - a;
|
||||
vec2 proj = a + e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);
|
||||
float segd = dot(p - proj, p - proj);
|
||||
d = min(d, segd);
|
||||
|
||||
float c0 = step(0.0, p.y - a.y);
|
||||
float c1 = 1.0 - step(0.0, p.y - b.y);
|
||||
float c2 = 1.0 - step(0.0, e.x * w.y - e.y * w.x);
|
||||
float allCond = c0 * c1 * c2;
|
||||
float noneCond = (1.0 - c0) * (1.0 - c1) * (1.0 - c2);
|
||||
float flip = mix(1.0, -1.0, step(0.5, allCond + noneCond));
|
||||
s *= flip;
|
||||
return d;
|
||||
}
|
||||
|
||||
float getSdfParallelogram(in vec2 p, in vec2 v0, in vec2 v1, in vec2 v2, in vec2 v3) {
|
||||
float s = 1.0;
|
||||
float d = dot(p - v0, p - v0);
|
||||
|
||||
d = seg(p, v0, v3, s, d);
|
||||
d = seg(p, v1, v0, s, d);
|
||||
d = seg(p, v2, v1, s, d);
|
||||
d = seg(p, v3, v2, s, d);
|
||||
|
||||
return s * sqrt(d);
|
||||
}
|
||||
|
||||
vec2 normalize(vec2 value, float isPosition) {
|
||||
return (value * 2.0 - (iResolution.xy * isPosition)) / iResolution.y;
|
||||
}
|
||||
|
||||
float antialising(float distance) {
|
||||
return 1. - smoothstep(0., normalize(vec2(2., 2.), 0.).x, distance);
|
||||
}
|
||||
|
||||
float determineStartVertexFactor(vec2 a, vec2 b) {
|
||||
// Conditions using step
|
||||
float condition1 = step(b.x, a.x) * step(a.y, b.y); // a.x < b.x && a.y > b.y
|
||||
float condition2 = step(a.x, b.x) * step(b.y, a.y); // a.x > b.x && a.y < b.y
|
||||
|
||||
// If neither condition is met, return 1 (else case)
|
||||
return 1.0 - max(condition1, condition2);
|
||||
}
|
||||
|
||||
vec2 getRectangleCenter(vec4 rectangle) {
|
||||
return vec2(rectangle.x + (rectangle.z / 2.), rectangle.y - (rectangle.w / 2.));
|
||||
}
|
||||
float ease(float x) {
|
||||
return pow(1.0 - x, 3.0);
|
||||
}
|
||||
|
||||
const vec4 TRAIL_COLOR = vec4(0.8, 1.0, 1.0, 0.1);
|
||||
const float DURATION = 0.1; //IN SECONDS
|
||||
|
||||
void mainImage(out vec4 fragColor, in vec2 fragCoord)
|
||||
{
|
||||
#if !defined(WEB)
|
||||
fragColor = texture(iChannel0, fragCoord.xy / iResolution.xy);
|
||||
#endif
|
||||
// Normalization for fragCoord to a space of -1 to 1;
|
||||
vec2 vu = normalize(fragCoord, 1.);
|
||||
vec2 offsetFactor = vec2(-.5, 0.5);
|
||||
|
||||
// Normalization for cursor position and size;
|
||||
// cursor xy has the postion in a space of -1 to 1;
|
||||
// zw has the width and height
|
||||
vec4 currentCursor = vec4(normalize(iCurrentCursor.xy, 1.), normalize(iCurrentCursor.zw, 0.));
|
||||
vec4 previousCursor = vec4(normalize(iPreviousCursor.xy, 1.), normalize(iPreviousCursor.zw, 0.));
|
||||
|
||||
// When drawing a parellelogram between cursors for the trail i need to determine where to start at the top-left or top-right vertex of the cursor
|
||||
float vertexFactor = determineStartVertexFactor(currentCursor.xy, previousCursor.xy);
|
||||
float invertedVertexFactor = 1.0 - vertexFactor;
|
||||
|
||||
// Set every vertex of my parellogram
|
||||
vec2 v0 = vec2(currentCursor.x + currentCursor.z * vertexFactor, currentCursor.y - currentCursor.w);
|
||||
vec2 v1 = vec2(currentCursor.x + currentCursor.z * invertedVertexFactor, currentCursor.y);
|
||||
vec2 v2 = vec2(previousCursor.x + currentCursor.z * invertedVertexFactor, previousCursor.y);
|
||||
vec2 v3 = vec2(previousCursor.x + currentCursor.z * vertexFactor, previousCursor.y - previousCursor.w);
|
||||
|
||||
float sdfCurrentCursor = getSdfRectangle(vu, currentCursor.xy - (currentCursor.zw * offsetFactor), currentCursor.zw * 0.5);
|
||||
float sdfTrail = getSdfParallelogram(vu, v0, v1, v2, v3);
|
||||
|
||||
float progress = clamp((iTime - iTimeCursorChange) / DURATION, 0.0, 1.0);
|
||||
float easedProgress = ease(progress);
|
||||
// Distance between cursors determine the total length of the parallelogram;
|
||||
vec2 centerCC = getRectangleCenter(currentCursor);
|
||||
vec2 centerCP = getRectangleCenter(previousCursor);
|
||||
float lineLength = distance(centerCC, centerCP);
|
||||
|
||||
vec4 newColor = vec4(fragColor);
|
||||
// Compute fade factor based on distance along the trail
|
||||
float fadeFactor = 1.0 - smoothstep(lineLength, sdfCurrentCursor, easedProgress * lineLength);
|
||||
|
||||
// Apply fading effect to trail color
|
||||
vec4 fadedTrailColor = TRAIL_COLOR * fadeFactor;
|
||||
|
||||
// Blend trail with fade effect
|
||||
newColor = mix(newColor, fadedTrailColor, antialising(sdfTrail));
|
||||
// Draw current cursor
|
||||
newColor = mix(newColor, TRAIL_COLOR, antialising(sdfCurrentCursor));
|
||||
newColor = mix(newColor, fragColor, step(sdfCurrentCursor, 0.));
|
||||
fragColor = mix(fragColor, newColor, step(sdfCurrentCursor, easedProgress * lineLength));
|
||||
}
|
12
flake.nix
12
flake.nix
|
@ -44,7 +44,7 @@
|
|||
...
|
||||
}@inputs:
|
||||
let
|
||||
lib = nixpkgs.lib;
|
||||
inherit (nixpkgs) lib;
|
||||
# TODO: apply these overlays sooner and remove uses of legacyPackages elsewhere.
|
||||
overlays = [
|
||||
inputs.zig.overlays.default
|
||||
|
@ -110,10 +110,11 @@
|
|||
{
|
||||
nvim-chloe = mkNeovim "chloe" system;
|
||||
nvim-natalie = mkNeovim "natalie" system;
|
||||
nvim-julia = mkNeovim "julia" system;
|
||||
}
|
||||
// lib.optionalAttrs (system == "aarch64-darwin") {
|
||||
# "nix run .#darwin-rebuild"
|
||||
darwin-rebuild = darwin.packages.aarch64-darwin.darwin-rebuild;
|
||||
inherit (darwin.packages.aarch64-darwin) darwin-rebuild;
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -145,6 +146,13 @@
|
|||
system = "aarch64-darwin";
|
||||
};
|
||||
|
||||
# julia's cattop
|
||||
nixosConfigurations.cattop = mkSystem "cattop" {
|
||||
user = "julia";
|
||||
host = "cattop";
|
||||
system = "x86_64-linux";
|
||||
};
|
||||
|
||||
# generate checks for "nix flake check --all-systems --no-build"
|
||||
checks.aarch64-darwin = builtins.listToAttrs (
|
||||
builtins.map (
|
||||
|
|
|
@ -16,7 +16,14 @@ in
|
|||
imports = mainHomeImports ++ [
|
||||
./macos/sketchybar.nix
|
||||
];
|
||||
programs = {
|
||||
options = {
|
||||
programs.ghostty.shader = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = { };
|
||||
description = "set the ghostty shader, relative to 'files/ghostty'";
|
||||
};
|
||||
};
|
||||
config.programs = {
|
||||
home-manager.enable = true;
|
||||
nix-index.enable = true;
|
||||
|
||||
|
@ -89,5 +96,9 @@ in
|
|||
test -r '/Users/${user.username}/.opam/opam-init/init.fish' && source '/Users/${user.username}/.opam/opam-init/init.fish' > /dev/null 2> /dev/null; or true
|
||||
'';
|
||||
};
|
||||
|
||||
ghostty.settings.custom-shader = lib.mkIf (
|
||||
cfg.ghostty.shader != null
|
||||
) "${../../files/ghostty}/${cfg.ghostty.shader}";
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
{
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
|
|
@ -17,6 +17,24 @@
|
|||
theme = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
options = {
|
||||
tabstop = 2;
|
||||
softtabstop = 2;
|
||||
shiftwidth = 2;
|
||||
undofile = true;
|
||||
swapfile = false;
|
||||
showmode = false;
|
||||
foldlevel = 99;
|
||||
foldcolumn = "1";
|
||||
foldlevelstart = 99;
|
||||
foldenable = true;
|
||||
foldmethod = "expr";
|
||||
#Default to treesitter folding
|
||||
foldexpr = "v:lua.vim.treesitter.foldexpr()";
|
||||
};
|
||||
|
||||
|
||||
visuals = {
|
||||
# notification system
|
||||
# https://github.com/j-hui/fidget.nvim
|
||||
|
@ -26,7 +44,7 @@
|
|||
highlight-undo.enable = true;
|
||||
# indentation guides
|
||||
# https://github.com/lukas-reineke/indent-blankline.nvim
|
||||
indent-blankline.enable = false;
|
||||
indent-blankline.enable = true;
|
||||
# extra icons
|
||||
nvim-web-devicons.enable = true;
|
||||
# https://github.com/petertriho/nvim-scrollbar
|
||||
|
@ -35,16 +53,39 @@
|
|||
lsp = {
|
||||
# Must be enabled for language modules to hook into the LSP API.
|
||||
enable = true;
|
||||
|
||||
formatOnSave = true;
|
||||
# show errors inline
|
||||
# https://github.com/folke/trouble.nvim
|
||||
trouble.enable = true;
|
||||
# show lightbulb icon in gutter to indicate code actions
|
||||
# https://github.com/kosayoda/nvim-lightbulb
|
||||
lightbulb.enable = true;
|
||||
lightbulb.enable = false;
|
||||
# show icons in auto-completion menu
|
||||
# https://github.com/onsails/lspkind.nvim
|
||||
lspkind.enable = config.vim.autocomplete.blink-cmp.enable;
|
||||
# Enables inlay hints (types info in rust and shit)
|
||||
inlayHints.enable = true;
|
||||
#Nice mappings that i use :3
|
||||
mappings = {
|
||||
codeAction = "<leader>ca";
|
||||
goToDeclaration = "gD";
|
||||
goToDefinition = "gd";
|
||||
listReferences = "gr";
|
||||
goToType = "gy";
|
||||
hover = "K";
|
||||
nextDiagnostic = "<leader>d";
|
||||
openDiagnosticFloat = "<leader>df";
|
||||
renameSymbol = "rn";
|
||||
documentHighlight = null;
|
||||
listDocumentSymbols = null;
|
||||
listImplementations = null;
|
||||
listWorkspaceFolders = null;
|
||||
previousDiagnostic = null;
|
||||
removeWorkspaceFolder = null;
|
||||
signatureHelp = null;
|
||||
toggleFormatOnSave = null;
|
||||
};
|
||||
};
|
||||
treesitter = {
|
||||
enable = true;
|
||||
|
@ -60,6 +101,8 @@
|
|||
enableFormat = true;
|
||||
enableTreesitter = true;
|
||||
enableExtraDiagnostics = true;
|
||||
# enable debug adapter protocol by default
|
||||
enableDAP = true;
|
||||
|
||||
# sort-lines: on
|
||||
bash.enable = true;
|
||||
|
@ -73,6 +116,7 @@
|
|||
rust.enable = true;
|
||||
ts.enable = true;
|
||||
zig.enable = true;
|
||||
lua.enable = true;
|
||||
# sort-lines: off
|
||||
|
||||
ts.format.enable = false; # deno fmt is enabled elsewhere
|
||||
|
@ -184,17 +228,9 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
binds = {
|
||||
whichKey.enable = true;
|
||||
cheatsheet.enable = true;
|
||||
# discourages bad keyboard habit, e.g. disables arrow keys, explains better binds
|
||||
# https://github.com/m4xshen/hardtime.nvim
|
||||
hardtime-nvim.enable = true;
|
||||
hardtime-nvim.setupOpts = {
|
||||
disable_mouse = false;
|
||||
restriction_mode = "hint"; # default behavior is lenient
|
||||
};
|
||||
};
|
||||
ui = {
|
||||
borders.enable = true;
|
||||
|
@ -206,19 +242,6 @@
|
|||
enable = false;
|
||||
navbuddy.enable = config.vim.ui.breadcrumbs.enable;
|
||||
};
|
||||
smartcolumn = {
|
||||
enable = true;
|
||||
setupOpts.custom_colorcolumn = {
|
||||
# this is a freeform module, it's `buftype = int;` for configuring column position
|
||||
nix = "110";
|
||||
ruby = "120";
|
||||
java = "130";
|
||||
go = [
|
||||
"90"
|
||||
"130"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
notes = {
|
||||
todo-comments.enable = true;
|
||||
|
@ -228,5 +251,11 @@
|
|||
gitsigns.enable = true;
|
||||
gitsigns.codeActions.enable = false; # throws an annoying debug message
|
||||
};
|
||||
# Better help docs
|
||||
lazy.plugins."helpview.nvim" = {
|
||||
enabled = true;
|
||||
package = pkgs.vimPlugins.helpview-nvim;
|
||||
lazy = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
imports = [
|
||||
./boot.nix
|
||||
./ld.nix
|
||||
./nvidia.nix
|
||||
./services.nix
|
||||
];
|
||||
# make 'shared.darwin' not an error to define.
|
||||
|
|
|
@ -22,10 +22,6 @@
|
|||
};
|
||||
};
|
||||
|
||||
desktopManager.cosmic.enable = true;
|
||||
displayManager.cosmic-greeter.enable = true;
|
||||
desktopManager.cosmic.xwayland.enable = true;
|
||||
|
||||
# Auto mount devices
|
||||
udisks2 = {
|
||||
enable = true;
|
||||
|
|
9
nvim
9
nvim
|
@ -1,13 +1,14 @@
|
|||
#!/bin/sh
|
||||
username="$(id -u -n)"
|
||||
if [ "$username" = "clo" ]; then
|
||||
name="chloe";
|
||||
name="chloe"
|
||||
elif [ "$username" = "nmarks" ]; then
|
||||
name="natalie";
|
||||
name="natalie"
|
||||
elif [ "$username" = "fish" ]; then
|
||||
name="julia"
|
||||
fi
|
||||
if [ -z "$name" ]; then
|
||||
echo "Configure this wrapper script with your name." >2
|
||||
echo "Configure this wrapper script with your name." >&2
|
||||
exit 1
|
||||
fi
|
||||
exec nix run ".#nvim-$name" -- "$@"
|
||||
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
global {
|
||||
cmd + opt + backtick -> app "Keyboard Maestro"
|
||||
}
|
||||
|
||||
device WorkLouder {
|
||||
a -> {
|
||||
if app "REAPER" -> key cmd + shift
|
||||
}
|
||||
}
|
16
switch
16
switch
|
@ -1,12 +1,12 @@
|
|||
#!/bin/sh
|
||||
nh_subcommand="os"
|
||||
fallback_command="nixos-rebuild"
|
||||
if [ "$(uname -o)" ]; then
|
||||
nh_subcommand="darwin"
|
||||
fallback_command="nix run .#darwin-rebuild"
|
||||
fi;
|
||||
if command -v nh > /dev/null; then
|
||||
nh $nh_subcommand switch .
|
||||
else
|
||||
$fallback_command -- switch --flake .
|
||||
if [ "$(uname -o)" = "darwin" ]; then
|
||||
nh_subcommand="darwin"
|
||||
fallback_command="nix run .#darwin-rebuild"
|
||||
fi
|
||||
if command -v nh >/dev/null; then
|
||||
nh $nh_subcommand switch .
|
||||
else
|
||||
$fallback_command -- switch --flake .
|
||||
fi
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
git
|
||||
];
|
||||
|
||||
services.tailscale.enable = true;
|
||||
|
||||
# configuration for shared modules.
|
||||
# all custom options in 'shared' for clarity.
|
||||
shared.darwin = {
|
||||
|
|
|
@ -10,7 +10,9 @@ in
|
|||
let
|
||||
# packages to always install
|
||||
all = [
|
||||
ffmpeg
|
||||
(ffmpeg.override {
|
||||
withSvtav1 = true;
|
||||
})
|
||||
ripgrep
|
||||
uv
|
||||
nh
|
||||
|
@ -33,12 +35,26 @@ in
|
|||
};
|
||||
programs = {
|
||||
# sort-lines:start
|
||||
bat.enable = true;
|
||||
# bat.enable = true;
|
||||
btop.enable = true;
|
||||
fd.enable = true;
|
||||
hyfetch.enable = true;
|
||||
# sort-lines:end
|
||||
|
||||
ghostty = {
|
||||
enable = true;
|
||||
shader = "cursor-smear-black.glsl";
|
||||
package = null;
|
||||
settings = {
|
||||
theme = "catppuccin-latte";
|
||||
font-family = "AT Name Mono";
|
||||
adjust-cursor-thickness = 1;
|
||||
minimum-contrast = 1.1;
|
||||
background-opacity = 0.9;
|
||||
background-blur = true;
|
||||
};
|
||||
};
|
||||
|
||||
# zsh is the shell i use
|
||||
zsh = {
|
||||
enable = true;
|
||||
|
|
|
@ -1,25 +1,8 @@
|
|||
_: {
|
||||
vim = {
|
||||
languages.astro.enable = true;
|
||||
options = {
|
||||
tabstop = 2;
|
||||
softtabstop = 2;
|
||||
shiftwidth = 2;
|
||||
undofile = true;
|
||||
swapfile = false;
|
||||
showmode = false;
|
||||
foldlevel = 99;
|
||||
foldcolumn = "1";
|
||||
foldlevelstart = 99;
|
||||
foldenable = true;
|
||||
linebreak = true;
|
||||
};
|
||||
binds = {
|
||||
hardtime-nvim.setupOpts = {
|
||||
restriction_mode = "block";
|
||||
disable_mouse = false;
|
||||
};
|
||||
};
|
||||
git = {
|
||||
gitsigns.setupOpts = {
|
||||
current_line_blame = true;
|
||||
|
@ -47,11 +30,6 @@ _: {
|
|||
# Find Files
|
||||
(n "<leader><space>" ":lua require('snacks').picker.smart()<CR>" "Smart Find Files")
|
||||
(n "<leader>f" ":lua require('snacks').picker.grep()<CR>" "Grep Files")
|
||||
# Lsp
|
||||
(n "K" ":Lspsaga hover_doc<CR>" "Hover docs")
|
||||
(n "lr" ":lua vim.lsp.buf.rename()<CR>" "Rename")
|
||||
(n "gd" ":lua vim.lsp.buf.definition()<CR>" "Go to Definition")
|
||||
(n "gD" ":lua vim.lsp.buf.declaration()<CR>" "Go to Declaration")
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
127
users/julia/cattop/configuration.nix
Normal file
127
users/julia/cattop/configuration.nix
Normal file
|
@ -0,0 +1,127 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page, on
|
||||
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
|
||||
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ # Include the results of the hardware scan.
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
# Use the systemd-boot EFI boot loader.
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
# networking.hostName = "nixos"; # Define your hostname.
|
||||
# Pick only one of the below networking options.
|
||||
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
|
||||
# networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
|
||||
|
||||
# Set your time zone.
|
||||
# time.timeZone = "Europe/Amsterdam";
|
||||
|
||||
# Configure network proxy if necessary
|
||||
# networking.proxy.default = "http://user:password@proxy:port/";
|
||||
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
|
||||
|
||||
# Select internationalisation properties.
|
||||
# i18n.defaultLocale = "en_US.UTF-8";
|
||||
# console = {
|
||||
# font = "Lat2-Terminus16";
|
||||
# keyMap = "us";
|
||||
# useXkbConfig = true; # use xkb.options in tty.
|
||||
# };
|
||||
|
||||
# Enable the X11 windowing system.
|
||||
services.xserver.enable = true;
|
||||
|
||||
# Enable the GNOME Desktop Environment.
|
||||
services.xserver.displayManager.gdm.enable = true;
|
||||
services.xserver.desktopManager.gnome.enable = true;
|
||||
|
||||
|
||||
# Configure keymap in X11
|
||||
# services.xserver.xkb.layout = "us";
|
||||
# services.xserver.xkb.options = "eurosign:e,caps:escape";
|
||||
|
||||
# Enable CUPS to print documents.
|
||||
# services.printing.enable = true;
|
||||
|
||||
# Enable sound.
|
||||
# services.pulseaudio.enable = true;
|
||||
# OR
|
||||
# services.pipewire = {
|
||||
# enable = true;
|
||||
# pulse.enable = true;
|
||||
# };
|
||||
|
||||
# Enable touchpad support (enabled default in most desktopManager).
|
||||
# services.libinput.enable = true;
|
||||
|
||||
# Define a user account. Don't forget to set a password with ‘passwd’.
|
||||
users.users.fish = {
|
||||
isNormalUser = true;
|
||||
extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
|
||||
packages = with pkgs; [
|
||||
tree
|
||||
git
|
||||
nh
|
||||
vim
|
||||
fish
|
||||
];
|
||||
};
|
||||
|
||||
programs.firefox.enable = true;
|
||||
|
||||
# List packages installed in system profile.
|
||||
# You can use https://search.nixos.org/ to find more packages (and options).
|
||||
environment.systemPackages = with pkgs; [
|
||||
vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
|
||||
wget
|
||||
];
|
||||
|
||||
# Some programs need SUID wrappers, can be configured further or are
|
||||
# started in user sessions.
|
||||
programs.mtr.enable = true;
|
||||
programs.gnupg.agent = {
|
||||
enable = true;
|
||||
enableSSHSupport = true;
|
||||
};
|
||||
|
||||
# List services that you want to enable:
|
||||
|
||||
# Enable the OpenSSH daemon.
|
||||
# services.openssh.enable = true;
|
||||
|
||||
# Open ports in the firewall.
|
||||
# networking.firewall.allowedTCPPorts = [ ... ];
|
||||
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||
# Or disable the firewall altogether.
|
||||
# networking.firewall.enable = false;
|
||||
|
||||
# Copy the NixOS configuration file and link it from the resulting system
|
||||
# (/run/current-system/configuration.nix). This is useful in case you
|
||||
# accidentally delete configuration.nix.
|
||||
# system.copySystemConfiguration = true;
|
||||
|
||||
# This option defines the first version of NixOS you have installed on this particular machine,
|
||||
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
|
||||
#
|
||||
# Most users should NEVER change this value after the initial install, for any reason,
|
||||
# even if you've upgraded your system to a new NixOS release.
|
||||
#
|
||||
# This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
|
||||
# so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how
|
||||
# to actually do that.
|
||||
#
|
||||
# This value being lower than the current NixOS release does NOT mean your system is
|
||||
# out of date, out of support, or vulnerable.
|
||||
#
|
||||
# Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
|
||||
# and migrated your data accordingly.
|
||||
#
|
||||
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
|
||||
system.stateVersion = "25.05"; # Did you read the comment?
|
||||
}
|
||||
|
54
users/julia/cattop/hardware-configuration.nix
Normal file
54
users/julia/cattop/hardware-configuration.nix
Normal file
|
@ -0,0 +1,54 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
modulesPath,
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
imports = [
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [
|
||||
"xhci_pci"
|
||||
"thunderbolt"
|
||||
"vmd"
|
||||
"nvme"
|
||||
];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ "kvm-intel" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/8eb0d6a2-b8cf-4ef2-ba2a-e25a5555b0bc";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot/efi" = {
|
||||
device = "/dev/disk/by-uuid/3B51-4A1C";
|
||||
fsType = "vfat";
|
||||
options = [
|
||||
"fmask=0077"
|
||||
"dmask=0077"
|
||||
];
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{ device = "/dev/disk/by-uuid/58ee9d19-292f-49b5-9979-341b42e8e09d"; }
|
||||
];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.wlp0s20f3.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
77
users/julia/cattop/home.nix
Normal file
77
users/julia/cattop/home.nix
Normal file
|
@ -0,0 +1,77 @@
|
|||
{
|
||||
inputs,
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
userSettings,
|
||||
systemSettings,
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
home = {
|
||||
stateVersion = "23.05"; # Don't change this unless upgrading Home Manager versions
|
||||
|
||||
packages = with pkgs; [
|
||||
# General applications
|
||||
ghostty
|
||||
stremio
|
||||
julia
|
||||
qbittorrent
|
||||
calibre
|
||||
mpv
|
||||
signal-desktop
|
||||
python3
|
||||
gh
|
||||
|
||||
# Gaming
|
||||
bottles
|
||||
lutris
|
||||
mangohud
|
||||
dxvk_2
|
||||
steam-run
|
||||
vulkan-tools
|
||||
path-of-building
|
||||
wineWowPackages.stable
|
||||
winetricks
|
||||
(prismlauncher.override { gamemodeSupport = true; })
|
||||
|
||||
# System & desktop tools
|
||||
wofi
|
||||
xorg.xauth
|
||||
kdePackages.dolphin
|
||||
xdg-desktop-portal-gtk
|
||||
xclip
|
||||
pavucontrol
|
||||
ethtool
|
||||
grub2
|
||||
efibootmgr
|
||||
distrobox
|
||||
|
||||
# Dev tools
|
||||
legcord
|
||||
hyfetch
|
||||
arduino-cli
|
||||
rust-bin.stable.latest.default
|
||||
tytools
|
||||
inputs.zls.packages.x86_64-linux.zls
|
||||
platformio
|
||||
usbutils
|
||||
teensy-loader-cli
|
||||
teensyduino
|
||||
];
|
||||
};
|
||||
|
||||
programs = {
|
||||
btop.enable = true;
|
||||
hyfetch.enable = true;
|
||||
|
||||
gh = {
|
||||
enable = true;
|
||||
gitCredentialHelper.enable = true;
|
||||
};
|
||||
|
||||
# Uncomment if you want to use MangoHud system-wide
|
||||
# mangohud.enable = true;
|
||||
};
|
||||
}
|
72
users/julia/cattop/home.nix.old
Normal file
72
users/julia/cattop/home.nix.old
Normal file
|
@ -0,0 +1,72 @@
|
|||
{
|
||||
inputs,
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
userSettings,
|
||||
systemSettings,
|
||||
...
|
||||
}:
|
||||
{
|
||||
home = {
|
||||
stateVersion = "23.05"; # Please read the comment before changing.
|
||||
|
||||
packages = with pkgs; [
|
||||
#building macos apps hard :(
|
||||
ghostty
|
||||
stremio
|
||||
julia
|
||||
qbittorrent
|
||||
|
||||
#gaming
|
||||
bottles
|
||||
lutris
|
||||
mangohud
|
||||
dxvk_2
|
||||
steam-run
|
||||
vulkan-tools
|
||||
path-of-building
|
||||
wineWowPackages.stable
|
||||
winetricks
|
||||
(prismlauncher.override { gamemodeSupport = true; })
|
||||
|
||||
#window manager stuff
|
||||
wofi
|
||||
xorg.xauth
|
||||
#linux tools
|
||||
legcord
|
||||
pavucontrol
|
||||
ethtool
|
||||
grub2
|
||||
efibootmgr
|
||||
distrobox
|
||||
xdg-desktop-portal-gtk
|
||||
xclip
|
||||
kdePackages.dolphin
|
||||
hyfetch
|
||||
arduino-cli
|
||||
python3
|
||||
gh
|
||||
#broken on macos
|
||||
calibre
|
||||
mpv
|
||||
wireguard-tools
|
||||
signal-desktop
|
||||
inputs.zls.packages.x86_64-linux.zls
|
||||
rust-bin.stable.latest.default
|
||||
];
|
||||
|
||||
# programs.mangohud.enable = true;
|
||||
programs = {
|
||||
btop.enable = true;
|
||||
hyfetch.enable = true;
|
||||
programs.gh = {
|
||||
enable = true;
|
||||
gitCredentialHelper = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
}
|
9
users/julia/configuration.nix
Normal file
9
users/julia/configuration.nix
Normal file
|
@ -0,0 +1,9 @@
|
|||
# Applied to all systems
|
||||
{
|
||||
inputs,
|
||||
pkgs,
|
||||
host,
|
||||
...
|
||||
}:
|
||||
{
|
||||
}
|
13
users/julia/user.nix
Normal file
13
users/julia/user.nix
Normal file
|
@ -0,0 +1,13 @@
|
|||
rec {
|
||||
username = "fish"; # username
|
||||
name = "Julia"; # name/identifier
|
||||
email = "fish@fishcat.fish"; # email (used for certain configurations)
|
||||
dotfilesDir = "~/config"; # absolute path of the local repo
|
||||
theme = "catppuccin-mocha"; # name of theme that stylix will use
|
||||
browser = "firefox"; # Default browser; must select one from ./user/app/browser/
|
||||
term = "ghostty"; # Default terminal command;
|
||||
font = "iosevka"; # Selected font
|
||||
editor = "neovim"; # Default editor;
|
||||
timeZone = "America/Los_Angeles";
|
||||
sexuality = "transgender";
|
||||
}
|
3
users/julia/vim.nix
Normal file
3
users/julia/vim.nix
Normal file
|
@ -0,0 +1,3 @@
|
|||
{ ... }:
|
||||
{
|
||||
}
|
|
@ -121,6 +121,11 @@
|
|||
|
||||
# Enable sound with pipewire.
|
||||
security.rtkit.enable = true;
|
||||
services = {
|
||||
desktopManager.cosmic.enable = true;
|
||||
displayManager.cosmic-greeter.enable = true;
|
||||
desktopManager.cosmic.xwayland.enable = true;
|
||||
};
|
||||
|
||||
# Enable touchpad support (enabled default in most desktopManager).
|
||||
# services.xserver.libinput.enable = true;
|
||||
|
|
|
@ -85,7 +85,6 @@ with pkgs;
|
|||
python312Packages.pip
|
||||
|
||||
#programming languages
|
||||
R
|
||||
deno
|
||||
ruby
|
||||
nodePackages.npm
|
||||
|
@ -98,7 +97,7 @@ with pkgs;
|
|||
firefox
|
||||
|
||||
#math
|
||||
texlive.combined.scheme-full
|
||||
# texlive.combined.scheme-full
|
||||
|
||||
#fun things
|
||||
cowsay
|
||||
|
|
|
@ -9,21 +9,6 @@
|
|||
withPython3 = true;
|
||||
python3Packages = [ "pynvim" ];
|
||||
|
||||
options = {
|
||||
tabstop = 2;
|
||||
softtabstop = 2;
|
||||
shiftwidth = 2;
|
||||
undofile = true;
|
||||
swapfile = false;
|
||||
showmode = false;
|
||||
foldlevel = 99;
|
||||
foldcolumn = "1";
|
||||
foldlevelstart = 99;
|
||||
foldenable = true;
|
||||
foldmethod = "expr";
|
||||
#Default to treesitter folding
|
||||
foldexpr = "v:lua.vim.treesitter.foldexpr()";
|
||||
};
|
||||
|
||||
autocmds = [
|
||||
#Autocommand to fall back to treesitter folding if LSP doesnt support it
|
||||
|
@ -44,28 +29,9 @@
|
|||
tabline = {
|
||||
nvimBufferline.enable = true;
|
||||
};
|
||||
# nvf versions is VERY outdated
|
||||
# pluginOverrides = {
|
||||
# hardtime-nvim = pkgs.fetchFromGitHub {
|
||||
# owner = "m4xshen";
|
||||
# repo = "hardtime.nvim";
|
||||
# rev = "v1.0.1";
|
||||
# hash = "sha256-5tqiSuGvBJcr8l6anEBojXEaaxFS1P5T1ROr46ylVhk=";
|
||||
# };
|
||||
# };
|
||||
startPlugins = [
|
||||
"nui-nvim"
|
||||
];
|
||||
binds = {
|
||||
hardtime-nvim = {
|
||||
enable = false;
|
||||
setupOpts = {
|
||||
disable_mouse = false;
|
||||
restriction_mode = "warn";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
theme = {
|
||||
name = "catppuccin";
|
||||
style = "mocha";
|
||||
|
|
|
@ -1,26 +1,19 @@
|
|||
{ ... }:
|
||||
let
|
||||
mkKeymap = mode: key: action: desc: {
|
||||
inherit
|
||||
mode
|
||||
key
|
||||
action
|
||||
desc
|
||||
;
|
||||
};
|
||||
let
|
||||
mkKeymap = mode: key: action: desc: {
|
||||
inherit mode;
|
||||
inherit key action desc;
|
||||
};
|
||||
n = mkKeymap "n"; # normal mode
|
||||
in
|
||||
{
|
||||
vim = {
|
||||
keymaps = [
|
||||
(mkKeymap "n" "<leader>e" ":lua require('snacks').explorer()<CR>" "File Explorer")
|
||||
|
||||
(n "<leader>e" ":lua require('snacks').explorer()<CR>" "File Explorer")
|
||||
# Snacks Picker Replaces Telescope!?
|
||||
(mkKeymap "n" "<leader><space>" ":lua require('snacks').picker.smart()<CR>" "Smart Find Files")
|
||||
(mkKeymap "n" "<leader>ff" ":lua require('snacks').picker.files()<CR>" "Find File")
|
||||
(mkKeymap "n" "<leader>fg" ":lua require('snacks').picker.grep()<CR>" "Grep Files")
|
||||
# Lsp
|
||||
(mkKeymap "n" "lr" ":lua vim.lsp.buf.rename()<CR>" "Rename")
|
||||
# (mkKeymap "n" "<leader>th" ":lua function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end<CR>" "Toggle Inlay Hints")
|
||||
(n "<leader><space>" ":lua require('snacks').picker.smart()<CR>" "Smart Find Files")
|
||||
(n "<leader>ff" ":lua require('snacks').picker.files()<CR>" "Find File")
|
||||
(n "<leader>fg" ":lua require('snacks').picker.grep()<CR>" "Grep Files")
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -12,17 +12,6 @@
|
|||
nixd
|
||||
];
|
||||
lsp = {
|
||||
formatOnSave = true;
|
||||
lightbulb.enable = false;
|
||||
# lspsaga = {
|
||||
# enable = true;
|
||||
# setupOpts = {
|
||||
# lightbulb = {
|
||||
# virtual_text = false;
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
inlayHints.enable = true;
|
||||
servers = {
|
||||
nil = {
|
||||
settings.nil.nix.flake = {
|
||||
|
@ -58,30 +47,8 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
mappings = {
|
||||
codeAction = "<leader>ca";
|
||||
goToDeclaration = "gD";
|
||||
goToDefinition = "gd";
|
||||
listReferences = "gr";
|
||||
goToType = "gy";
|
||||
hover = "K";
|
||||
nextDiagnostic = "<leader>d";
|
||||
openDiagnosticFloat = "<leader>df";
|
||||
renameSymbol = "rn";
|
||||
documentHighlight = null;
|
||||
listDocumentSymbols = null;
|
||||
listImplementations = null;
|
||||
listWorkspaceFolders = null;
|
||||
previousDiagnostic = null;
|
||||
removeWorkspaceFolder = null;
|
||||
signatureHelp = null;
|
||||
toggleFormatOnSave = null;
|
||||
};
|
||||
};
|
||||
languages = {
|
||||
enableDAP = true;
|
||||
lua.enable = true;
|
||||
python.enable = true;
|
||||
python.format.type = "ruff";
|
||||
markdown = {
|
||||
enable = true;
|
||||
|
|
|
@ -1,11 +1,6 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
vim = {
|
||||
visuals = {
|
||||
indent-blankline = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
ui = {
|
||||
noice = {
|
||||
enable = true;
|
||||
|
@ -28,11 +23,5 @@
|
|||
};
|
||||
};
|
||||
|
||||
# Better help docs
|
||||
lazy.plugins."helpview.nvim" = {
|
||||
enabled = true;
|
||||
package = pkgs.vimPlugins.helpview-nvim;
|
||||
lazy = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue