summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--LICENSE674
-rw-r--r--configuration/default.nix107
-rw-r--r--configuration/desktop/default.nix17
-rw-r--r--configuration/hardware.nix25
-rw-r--r--configuration/services/jellyfin/default.nix14
-rw-r--r--flake.lock49
-rw-r--r--flake.nix26
-rw-r--r--home-configuration/config/alacritty/alacritty.toml15
-rw-r--r--home-configuration/config/hypr/hypridle.conf14
-rwxr-xr-xhome-configuration/config/hypr/hyprland.conf217
-rw-r--r--home-configuration/config/hypr/hyprlock.conf35
-rwxr-xr-xhome-configuration/config/hypr/hyprpaper.conf3
-rw-r--r--home-configuration/config/niri/config.kdl266
-rwxr-xr-xhome-configuration/config/nvim/init.lua10
-rwxr-xr-xhome-configuration/config/nvim/lazy-lock.json39
-rwxr-xr-xhome-configuration/config/nvim/lua/config.lua89
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/catppuccin/init.lua90
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/lazy/init.lua17
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/lazy/plugins.lua129
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/lsp/init.lua305
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/lualine/init.lua50
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/nvim-tree/init.lua2
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/render-markdown/init.lua139
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/telescope/init.lua3
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/treesitter/init.lua305
-rwxr-xr-xhome-configuration/config/nvim/lua/plugins/whichkey/init.lua2
-rwxr-xr-xhome-configuration/config/nvim/lua/status_line/init.lua102
-rw-r--r--home-configuration/config/picom/picom-animations.conf262
-rw-r--r--home-configuration/config/picom/picom.conf157
-rw-r--r--home-configuration/config/quickshell/config.js22
-rw-r--r--home-configuration/config/quickshell/shell.qml124
-rwxr-xr-xhome-configuration/config/rofi/config.rasi61
-rwxr-xr-xhome-configuration/config/waybar/config.jsonc154
-rwxr-xr-xhome-configuration/config/waybar/style.css207
-rwxr-xr-xhome-configuration/config/waybar/window.sh77
-rw-r--r--home-configuration/config/xmobar/xmobarrc8
-rw-r--r--home-configuration/config/xmobar/xmobarrc~8
-rw-r--r--home-configuration/config/xmonad/xmonad.hs45
-rw-r--r--home-configuration/config/xmonad/xmonad.hs~46
-rw-r--r--home-configuration/config/zathura/zathurarc46
-rw-r--r--home-configuration/default.nix103
-rw-r--r--home-configuration/managed/discord/default.nix13
-rw-r--r--home-configuration/managed/git/default.nix2
-rw-r--r--home-configuration/managed/obs-studio/default.nix12
-rw-r--r--home-configuration/managed/prismlauncher/default.nix31
-rw-r--r--home-configuration/managed/waybar/default.nix26
-rw-r--r--home-configuration/managed/waybar/style.nix101
48 files changed, 4250 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4cc1731
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+home-configuration/config/nvim/undo/
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/configuration/default.nix b/configuration/default.nix
new file mode 100644
index 0000000..1e5cefd
--- /dev/null
+++ b/configuration/default.nix
@@ -0,0 +1,107 @@
+{ lib, pkgs, ... }: {
+
+ imports = [
+ ./hardware.nix
+ ./services/jellyfin
+ ./desktop
+ ];
+
+ nixpkgs.overlays = [
+ (final: prev: {
+ inherit (prev.lixPackageSets.stable) nixpkgs-review nix-eval-jobs nix-fast-build colmena;
+ })
+ ];
+
+ nix.package = pkgs.lixPackageSets.stable.lix;
+
+ boot.kernelPackages = pkgs.linuxPackages_latest;
+ boot.initrd.compressor = "zstd";
+ boot.loader.systemd-boot.enable = true;
+ boot.loader.systemd-boot.editor = false;
+ boot.loader.systemd-boot.configurationLimit = 25;
+ boot.loader.efi.canTouchEfiVariables = true;
+
+ fileSystems."/media/drive".device = "/dev/disk/by-uuid/facf5a78-8872-437c-4345-50a28c894aca";
+ fileSystems."/media/drive".fsType = "btrfs";
+
+ hardware.graphics.enable = true;
+ hardware.graphics.enable32Bit = true;
+
+ networking.hostName = "unix";
+ networking.networkmanager.enable = true;
+ networking.wireguard.enable = true;
+ networking.firewall.enable = false;
+ networking.firewall.allowedTCPPorts = [ 2080 ];
+
+ time.timeZone = "Asia/Tehran";
+
+ services.printing.enable = false;
+ services.pipewire.enable = true;
+ services.pipewire.pulse.enable = true;
+ services.libinput.enable = true;
+ services.flatpak.enable = true;
+ services.openssh.enable = true;
+
+ xdg.portal.enable = true;
+ programs.nano.enable = false;
+ programs.firefox.enable = true;
+ programs.throne.enable = true;
+ programs.throne.tunMode.enable = true;
+ programs.nix-ld.enable = true;
+ programs.appimage.enable = true;
+ programs.nm-applet.enable = true;
+ programs.neovim.enable = true;
+ programs.neovim.viAlias = true;
+ programs.neovim.vimAlias = true;
+ programs.steam.enable = true;
+ programs.git.enable = true;
+ programs.zsh.enable = true;
+ programs.zsh.autosuggestions.enable = true;
+ programs.zsh.interactiveShellInit = ''
+ zmodload zsh/zprof
+ autoload -Uz compinit
+ if [[ -n ~/.zcompdump(#qN.mh+24) ]]; then
+ compinit
+ else
+ compinit -C
+ fi
+ source ${pkgs.zsh-fast-syntax-highlighting}/share/zsh/plugins/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
+ '';
+
+ virtualisation.waydroid.enable = true;
+ virtualisation.waydroid.package = pkgs.waydroid-nftables;
+ virtualisation.docker.enable = true;
+
+ environment.shells = with pkgs; [ zsh ];
+ environment.systemPackages = with pkgs; [
+ wineWow64Packages.stable
+ wget
+ adwaita-icon-theme
+ rofi
+ iptables
+ mesa-demos
+ wl-clipboard
+ wireguard-tools
+ ];
+
+ users.users.coast.isNormalUser = true;
+ users.users.coast.extraGroups = [ "wheel" "docker" "input" "video" "audio" "usb" ];
+ users.users.coast.shell = pkgs.zsh;
+
+ fonts.packages = builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts);
+
+ security.sudo.enable = false;
+ security.doas.enable = true;
+ security.doas.extraRules = [
+ {
+ users = [ "coast" ];
+ keepEnv = true;
+ persist = true;
+ }
+ ];
+ security.polkit.enable = true;
+
+ system.stateVersion = "25.11";
+ nix.settings.experimental-features = [ "nix-command" "flakes" ];
+ nixpkgs.config.allowUnfree = true;
+}
diff --git a/configuration/desktop/default.nix b/configuration/desktop/default.nix
new file mode 100644
index 0000000..34a5160
--- /dev/null
+++ b/configuration/desktop/default.nix
@@ -0,0 +1,17 @@
+{ pkgs, ... }:
+{
+ services.desktopManager.plasma6.enable = true;
+ services.displayManager.plasma-login-manager.enable = true;
+
+ #x11
+ services.xserver.enable = true;
+ services.xserver.xkb.layout = "us";
+ services.xserver.xkb.options = "eurosign:e,caps:escape";
+ services.xserver.displayManager.lightdm.enable = true;
+ services.xserver.displayManager.lightdm.greeters.gtk.enable = true;
+
+ #niriwm
+ programs.niri.enable = false;
+ programs.niri.useNautilus = true;
+ programs.niri.package = pkgs.niri;
+}
diff --git a/configuration/hardware.nix b/configuration/hardware.nix
new file mode 100644
index 0000000..7de8fe9
--- /dev/null
+++ b/configuration/hardware.nix
@@ -0,0 +1,25 @@
+{ config, lib, modulesPath, ... }:
+
+{
+ imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
+
+ boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
+ boot.initrd.kernelModules = [ ];
+ boot.kernelParams = [ "kvm-amd" ];
+ boot.extraModulePackages = [ ];
+
+ fileSystems."/".device = "/dev/disk/by-label/nixos";
+ fileSystems."/".fsType = "ext4";
+
+ fileSystems."/boot".device = "/dev/disk/by-label/boot";
+ fileSystems."/boot".fsType = "vfat";
+ fileSystems."/boot".options = [ "fmask=0022" "dmask=0022" ];
+
+ fileSystems."/media/drive".device = "/dev/disk/by-uuid/facf5a78-8872-437c-4345-50a28c894aca";
+ fileSystems."/media/drive".fsType = "btrfs";
+
+ swapDevices = [{ device = "/dev/disk/by-label/swap"; }];
+
+ nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+ hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+}
diff --git a/configuration/services/jellyfin/default.nix b/configuration/services/jellyfin/default.nix
new file mode 100644
index 0000000..dad9e6d
--- /dev/null
+++ b/configuration/services/jellyfin/default.nix
@@ -0,0 +1,14 @@
+{ pkgs, ... }:
+{
+ services.jellyfin.enable = true;
+ services.jellyfin.package = pkgs.jellyfin;
+ services.jellyfin.user = "coast";
+ services.jellyfin.hardwareAcceleration.enable = true;
+ services.jellyfin.hardwareAcceleration.device = "/dev/dri/renderD128";
+ services.jellyfin.hardwareAcceleration.type = "vaapi";
+
+ systemd.services.jellyfin.environment = {
+ http_proxy = "socks5://127.0.0.1:2080";
+ https_proxy = "socks5://127.0.0.1:2080";
+ };
+}
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..b0ba5b3
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,49 @@
+{
+ "nodes": {
+ "home-manager": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1780361225,
+ "narHash": "sha256-wnV9ttf4fPWNonBIQmvlrSlNpQYgx5HgWWd007mwIFA=",
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "e28654b71096e08c019d4861ca26acb646f583d8",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "ref": "release-26.05",
+ "repo": "home-manager",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1780243769,
+ "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "home-manager": "home-manager",
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..6c070fe
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,26 @@
+{
+ description = "4th flake";
+
+ inputs = {
+ nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
+ home-manager.url = "github:nix-community/home-manager/release-26.05";
+ home-manager.inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ outputs = { self, nixpkgs, home-manager }: {
+ nixosConfigurations.unix = nixpkgs.lib.nixosSystem {
+ system = "x86_64-linux";
+ modules =
+ [
+ ./configuration
+ home-manager.nixosModules.home-manager
+ {
+ home-manager.useGlobalPkgs = true;
+ home-manager.useUserPackages = true;
+ home-manager.users.coast = import ./home-configuration/default.nix;
+ home-manager.backupFileExtension = "home-backup";
+ }
+ ];
+ };
+ };
+}
diff --git a/home-configuration/config/alacritty/alacritty.toml b/home-configuration/config/alacritty/alacritty.toml
new file mode 100644
index 0000000..e7dcf4d
--- /dev/null
+++ b/home-configuration/config/alacritty/alacritty.toml
@@ -0,0 +1,15 @@
+[window]
+dimensions = { columns = 100, lines = 25 }
+dynamic_title = true
+opacity = 0.98
+[font]
+normal = { family = "Iosevka Nerd Font Propo", style = "Regular" }
+size = 13.0
+[cursor]
+style = { shape = "Underline", blinking = "Off" }
+[colors]
+primary = { background = "#000000", foreground = "#e0e0e0" }
+cursor = { cursor = "#e0e0e0", text = "#121212" }
+selection = { background = "#e0e0e0", text = "#121212" }
+normal = { black = "#121212", red = "#d32f2f", green = "#4caf50", yellow = "#ffeb3b", blue = "#2196f3", magenta = "#9c27b0", cyan = "#00bcd4", white = "#e0e0e0" }
+bright = { black = "#757575", red = "#f44336", green = "#8bc34a", yellow = "#ffc107", blue = "#3f51b5", magenta = "#673ab7", cyan = "#009688", white = "#ffffff" }
diff --git a/home-configuration/config/hypr/hypridle.conf b/home-configuration/config/hypr/hypridle.conf
new file mode 100644
index 0000000..8874a43
--- /dev/null
+++ b/home-configuration/config/hypr/hypridle.conf
@@ -0,0 +1,14 @@
+general {
+ lock_cmd = pidof hyprlock || hyprlock
+}
+
+listener {
+ timeout = 300
+ on-timeout = hyprlock
+}
+
+listener {
+ timeout = 600
+ on-timeout = hyprctl dispatch dpms off
+ on-resume = hyprctl dispatch dpms on
+}
diff --git a/home-configuration/config/hypr/hyprland.conf b/home-configuration/config/hypr/hyprland.conf
new file mode 100755
index 0000000..8efd6ad
--- /dev/null
+++ b/home-configuration/config/hypr/hyprland.conf
@@ -0,0 +1,217 @@
+#monitor=DP-1,1920x1080@75,auto,1
+monitor=HDMI-A-1,1920x1080@100.00,auto,1
+
+hide_on_fullscreen = true
+
+$terminal = footclient
+$menu = rofi -show drun -config /home/coast/.config/rofi/config.rasi
+$webBrowser = firefox-bin
+$discordApp = vesktop-bin --proxy-server="socks5://127.0.0.1:65000"
+$restartWaybar = pkill waybar; waybar&disown
+$fileManager = pcmanfm
+
+exec-once = hyprctl setcursor Adwaita 24 &
+exec-once = wbg /home/coast/Pictures/walls/wallhaven-yq5dmg_1920x1080.png &
+exec-once = hypridle &
+exec-once = hyprpm reload -n;
+exec-once = dbus-update-activation-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=Hyprland
+exec-once = gnome-keyring-daemon --start --components=secrets
+exec-once = waybar &
+exec-once = mpd ~/.mpdconf &
+exec-once = mpc add /;
+
+exec-once = foot --server;
+
+exec-once = flatpak override --env=GTK_THEME=Catppuccin-B-MB-Dark --user;
+
+env = XCURSOR_SIZE,24
+env = HYPRCURSOR_SIZE,24
+
+general {
+ gaps_in = 5
+ gaps_out = 15
+ border_size = 2
+ col.active_border = rgba(6c6c9dee) rgba(1e1e2eee) 45deg
+ col.inactive_border = rgba(1e1e2eaa)
+ resize_on_border = false
+ allow_tearing = false
+ layout = master
+}
+
+decoration {
+ rounding = 10
+ active_opacity = 1.0
+ inactive_opacity = 1.0
+ shadow {
+ enabled = true
+ range = 4
+ render_power = 3
+ color = rgba(1a1a1aee)
+ }
+ blur {
+ enabled = true
+ size = 3
+ passes = 1
+ vibrancy = 0.1696
+ new_optimizations = true
+ }
+}
+
+animations {
+ enabled = yes
+ bezier = shot, 0.2, 1, 0.3, 1
+ bezier = swipe, 0.6, 0, 0.4, 1
+ bezier = bounce, 0.1, 1.1, 0.3, 1
+ animation = windows, 1, 3, bounce, popin 80%
+ animation = windowsIn, 1, 3, bounce, popin 80%
+ animation = windowsOut, 1, 2, shot, popin 80%
+ animation = border, 1, 2, default
+ animation = fade, 1, 2, default
+ animation = layers, 1, 4, swipe, slide top
+ animation = layersIn, 1, 4, swipe, slide top
+ animation = layersOut, 1, 2, swipe, slide top
+ animation = workspaces, 1, 3, swipe, slide
+}
+
+master {
+ new_status = slave
+}
+
+misc {
+ force_default_wallpaper = 0
+ disable_hyprland_logo = true
+}
+
+input {
+ kb_layout = us
+ follow_mouse = 1
+ sensitivity = 0
+}
+
+$mainMod = SUPER
+
+bind = $mainMod, Return, exec, $terminal
+bind = $mainMod, S, killactive,
+bind = $mainMod, M, exec, killall eww; eww daemon && eww open bar
+bind = $mainMod SHIFT, Q, exit
+bind = $mainMod, Space, togglefloating
+bind = $mainMod, Space, resizeactive, exact 1000 800
+bind = $mainMod, Space, centerwindow
+bind = $mainMod, R, exec, $menu
+
+bind = $mainMod, H, movefocus, l
+bind = $mainMod, L, movefocus, r
+bind = $mainMod, K, movefocus, u
+bind = $mainMod, J, movefocus, d
+
+bind = $mainMod SHIFT, H, movewindow, l
+bind = $mainMod SHIFT, L, movewindow, r
+bind = $mainMod SHIFT, K, movewindow, u
+bind = $mainMod SHIFT, J, movewindow, d
+
+binde = $mainMod ALT, H, resizeactive, -30 0
+binde = $mainMod ALT, L, resizeactive, 30 0
+binde = $mainMod ALT, K, resizeactive, 0 -30
+binde = $mainMod ALT, J, resizeactive, 0 30
+
+binde = $mainMod, left, moveactive, -40 0
+binde = $mainMod, right, moveactive, 40 0
+binde = $mainMod, up, moveactive, 0 -40
+binde = $mainMod, down, moveactive, 0 40
+
+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
+
+bind = $mainMod, Backslash, centerwindow,
+
+workspace = 2, monitor:HDMI-A-1
+
+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 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, C, togglespecialworkspace, magic
+bind = $mainMod SHIFT, S, exec, grim -g "$(slurp)" - | wl-copy
+
+bind = $mainMod CONTROL, L, exec, hyprlock
+
+bind = $mainMod SHIFT, B, exec, $webBrowser
+bind = $mainMod SHIFT, V, exec, $discordApp
+bind = $mainMod, F, exec, $fileManager
+
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+bind = $mainMod SHIFT, P, exec, $restartWaybar
+
+plugin {
+ hyprbars {
+ enabled = true
+
+ bar_height = 25
+ bar_color = rgba(1e1e2eaa)
+ bar_blur = true
+
+ bar_title_enabled = true
+ bar_text_font = "JetBrainsMono Nerd Font"
+ bar_text_size = 12
+ bar_text_align = center
+ col.text = rgba(ffffffdd)
+
+ bar_buttons_alignment = left
+ bar_padding = 10
+ bar_button_padding = 6
+ icon_on_hover = false
+
+ hyprbars-button = rgb(ff5f57), 14, , hyprctl dispatch killactive
+ hyprbars-button = rgb(febb2e), 14, , hyprctl dispatch togglefloating
+ hyprbars-button = rgb(28c840), 14, , hyprctl dispatch fullscreen 1
+
+ on_double_click = hyprctl dispatch fullscreen 1
+ }
+
+ hyprexpo {
+ columns = 3
+ gap_size = 5
+ bg_col = rgba(1e1e2eaa)
+ workspace_method = center current
+ gesture_distance = 300
+ }
+}
+
+bind = $mainMod, e, hyprexpo:expo, toggle
+
+bind = $mainMod ALT, up, exec, /home/coast/.local/bin/mpc-shuf.sh shuf
+bind = $mainMod ALT, down, exec, /home/coast/.local/bin/mpc-shuf.sh shufno
+bind = $mainMod ALT, right, exec, /home/coast/.local/bin/mpc-shuf.sh next
+bind = $mainMod ALT, left, exec, /home/coast/.local/bin/mpc-shuf.sh prev
+bind = $mainMod SHIFT, R, exec, /home/coast/.local/bin/mpc-shuf.sh search
+bind = $mainMod CONTROL, R, exec, /home/coast/.local/bin/mpc-shuf.sh album
+bind = $mainMod ALT, R, exec, /home/coast/.local/bin/mpc-shuf.sh artist
+bind = $mainMod, slash, exec, /home/coast/.local/bin/mpc-shuf.sh info
+bind = $mainMod, comma, exec, mpc volume -5
+bind = $mainMod, period, exec, mpc volume +5
+bind = $mainMod, bracketright, exec, /home/coast/.local/bin/mpc-shuf.sh toggle
+bind = $mainMod CONTROL, up, exec, mpc stop; mpc add /; notify-send "Reset MPC!"
+
+xwayland {
+ enabled = true
+}
diff --git a/home-configuration/config/hypr/hyprlock.conf b/home-configuration/config/hypr/hyprlock.conf
new file mode 100644
index 0000000..43216c4
--- /dev/null
+++ b/home-configuration/config/hypr/hyprlock.conf
@@ -0,0 +1,35 @@
+background {
+ monitor =
+ path = screenshot
+ blur_passes = 3
+ blur_size = 12
+ dim = 0.4
+}
+
+input-field {
+ monitor =
+ size = 350, 60
+ position = 0, -100
+ rounding = 0
+ border_width = 2
+
+ font = "JetBrainsMono Nerd Font"
+ font_size = 22
+ font_color = rgb(245, 224, 220)
+
+ inner_color = rgb(30, 24, 36)
+ outer_color = rgb(58, 52, 70)
+ border_color = rgb(252, 205, 205)
+ placeholder_text = "Password..."
+ fade_on_empty = true
+}
+
+label {
+ monitor =
+ text = $TIME
+ font = "JetBrainsMono Nerd Font"
+ font_size = 64
+ position = 0, 100
+ color = rgb(245, 224, 220)
+}
+
diff --git a/home-configuration/config/hypr/hyprpaper.conf b/home-configuration/config/hypr/hyprpaper.conf
new file mode 100755
index 0000000..9018554
--- /dev/null
+++ b/home-configuration/config/hypr/hyprpaper.conf
@@ -0,0 +1,3 @@
+preload = ~/Pictures/Wallpapers/flowers.png
+wallpaper = HDMI-A-1,~/Pictures/Wallpapers/flowers.png
+wallpaper = eDP-1,~/Pictures/Wallpapers/flowers.png
diff --git a/home-configuration/config/niri/config.kdl b/home-configuration/config/niri/config.kdl
new file mode 100644
index 0000000..62e9793
--- /dev/null
+++ b/home-configuration/config/niri/config.kdl
@@ -0,0 +1,266 @@
+spawn-at-startup "waybar"
+spawn-at-startup "awww-daemon"
+spawn-at-startup "awww" "img" "/home/coast/Wallpapers/nature2art.png"
+spawn-sh-at-startup "XDG_DATA_DIRS=/etc/profiles/per-user/coast/share:/run/current-system/sw/share:$HOME/.nix-profile/share:$XDG_DATA_DIRS"
+
+input {
+ mod-key "Super"
+ keyboard {
+ xkb {
+ options "altwin:swap_alt_win"
+ }
+ numlock
+ repeat-delay 600
+ repeat-rate 25
+ }
+
+ touchpad {
+ tap
+ natural-scroll
+ }
+
+ trackpoint {
+ }
+}
+
+gestures {
+ hot-corners {
+ off
+ }
+}
+
+cursor {
+ xcursor-theme "Adwaita"
+ xcursor-size 24
+}
+
+output "HDMI-A-1" {
+ mode "1920x1080@100"
+ scale 1
+ transform "normal"
+}
+
+output "DP-1" {
+ mode "1920x1080@74.973"
+ scale 1
+ transform "normal"
+}
+
+output "eDP-1" {
+ off
+ scale 1
+ transform "normal"
+ position x=1280 y=0
+}
+
+layout {
+ gaps 10
+ center-focused-column "never"
+
+ preset-column-widths {
+ proportion 0.33333
+ proportion 0.5
+ proportion 0.66667
+ }
+
+ default-column-width {
+ proportion 0.5;
+ }
+
+ focus-ring {
+ width 2.5
+ active-color "#0E0F12"
+ inactive-color "#191724"
+ }
+
+ shadow {
+ on
+ softness 30
+ spread 5
+ offset x=0 y=5
+ color "#0007"
+ }
+
+ struts {
+ }
+}
+
+prefer-no-csd
+
+screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
+
+window-rule {
+ match title="Waydroid"
+ open-fullscreen true
+}
+window-rule {
+ match app-id=r#"firefox$"# title="^Picture-in-Picture$"
+ open-floating true
+}
+
+window-rule {
+ match app-id=r#"waydroid$"#
+ open-fullscreen true
+}
+
+window-rule {
+ geometry-corner-radius 7
+ clip-to-geometry true
+}
+
+binds {
+ Mod+Shift+Slash { show-hotkey-overlay; }
+ Mod+Return hotkey-overlay-title="Open a Terminal: alacritty" { spawn "alacritty"; }
+ Mod+R hotkey-overlay-title="Run an Application: rofi" {
+ spawn-sh "XDG_DATA_DIRS=/etc/profiles/per-user/coast/share:/run/current-system/sw/share:$HOME/.nix-profile/share:$XDG_DATA_DIRS rofi -show drun -config ~/.config/rofi/config.rasi"
+ }
+ Mod+Shift+Return hotkey-overlay-title="Run an application: rofi (run)" { spawn-sh "rofi -show run -config ~/.config/rofi/config.rasi"; }
+ Super+Alt+L hotkey-overlay-title="Lock the screen" { spawn "hyprlock"; }
+ Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; }
+
+ XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"; }
+ XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
+ XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
+ XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
+
+ XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
+ XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
+
+ Mod+O repeat=false { toggle-overview; }
+ Mod+S repeat=false { close-window; }
+
+ Mod+Left { focus-column-left; }
+ Mod+Down { focus-window-down; }
+ Mod+Up { focus-window-up; }
+ Mod+Right { focus-column-right; }
+ Mod+H { focus-column-left; }
+ Mod+J { focus-window-down; }
+ Mod+K { focus-window-up; }
+ Mod+L { focus-column-right; }
+ Mod+T {
+ spawn "sh" "-c" "pkill trayer 2>/dev/null; trayer --edge top --align right --widthtype pixel --width 350 --height 32 --padding 6 --transparent true --alpha 0 --tint 0x1e1e1e & pid=$!; sleep 15; kill $pid 2>/dev/null";
+ }
+
+ Mod+Ctrl+Left { move-column-left; }
+ Mod+Ctrl+Down { move-window-down; }
+ Mod+Ctrl+Up { move-window-up; }
+ Mod+Ctrl+Right { move-column-right; }
+ Mod+Shift+H { move-column-left; }
+ Mod+Shift+J { move-window-down; }
+ Mod+Shift+K { move-window-up; }
+ Mod+Shift+L { move-column-right; }
+
+ Mod+Home { focus-column-first; }
+ Mod+End { focus-column-last; }
+ Mod+Ctrl+Home { move-column-to-first; }
+ Mod+Ctrl+End { move-column-to-last; }
+
+ Mod+Shift+Left { focus-monitor-left; }
+ Mod+Shift+Down { focus-monitor-down; }
+ Mod+Shift+Up { focus-monitor-up; }
+ Mod+Shift+Right { focus-monitor-right; }
+ Mod+Ctrl+H { focus-monitor-left; }
+ Mod+Ctrl+J { focus-monitor-down; }
+ Mod+Ctrl+K { focus-monitor-up; }
+ Mod+Ctrl+L { focus-monitor-right; }
+
+ Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
+ Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
+
+ Mod+Page_Down { focus-workspace-down; }
+ Mod+Page_Up { focus-workspace-up; }
+ Mod+N { focus-workspace-down; }
+ Mod+M { focus-workspace-up; }
+ Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
+ Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
+ Mod+Ctrl+M { move-column-to-workspace-down; }
+ Mod+Ctrl+N { move-column-to-workspace-up; }
+
+ Mod+Shift+P hotkey-overlay-title="Restart waybar and eww" { spawn-sh "pkill waybar && waybar & disown && eww kill && eww daemon && eww open-many year month day daytype"; }
+
+ Mod+Shift+Page_Down { move-workspace-down; }
+ Mod+Shift+Page_Up { move-workspace-up; }
+ Mod+Shift+M { move-workspace-down; }
+ Mod+Shift+N { move-workspace-up; }
+
+ Mod+1 { focus-workspace 1; }
+ Mod+2 { focus-workspace 2; }
+ Mod+3 { focus-workspace 3; }
+ Mod+4 { focus-workspace 4; }
+ Mod+5 { focus-workspace 5; }
+ Mod+6 { focus-workspace 6; }
+ Mod+7 { focus-workspace 7; }
+ Mod+8 { focus-workspace 8; }
+ Mod+9 { focus-workspace 9; }
+ Mod+Shift+1 { move-column-to-workspace 1; }
+ Mod+Shift+2 { move-column-to-workspace 2; }
+ Mod+Shift+3 { move-column-to-workspace 3; }
+ Mod+Shift+4 { move-column-to-workspace 4; }
+ Mod+Shift+5 { move-column-to-workspace 5; }
+ Mod+Shift+6 { move-column-to-workspace 6; }
+ Mod+Shift+7 { move-column-to-workspace 7; }
+ Mod+Shift+8 { move-column-to-workspace 8; }
+ Mod+Shift+9 { move-column-to-workspace 9; }
+ Mod+Shift+F8 { spawn-sh "obs-cmd -w \"obsws://127.0.0.1:4455\" replay save"; }
+
+ Mod+BracketLeft { consume-or-expel-window-left; }
+ Mod+BracketRight { consume-or-expel-window-right; }
+
+ Mod+Comma { consume-window-into-column; }
+ Mod+Period { expel-window-from-column; }
+
+ Mod+D { switch-preset-column-width; }
+ Mod+Shift+R { switch-preset-window-height; }
+ Mod+Ctrl+R { reset-window-height; }
+ Mod+W { maximize-column; }
+ Mod+Shift+W { fullscreen-window; }
+
+ Mod+Ctrl+F { expand-column-to-available-width; }
+ Mod+C { center-column; }
+ Mod+Ctrl+C { center-visible-columns; }
+
+ Mod+Minus { set-column-width "-10%"; }
+ Mod+Equal { set-column-width "+10%"; }
+
+ Mod+Shift+Minus { set-window-height "-10%"; }
+ Mod+Shift+Equal { set-window-height "+10%"; }
+
+ Mod+Space { toggle-window-floating; }
+ Mod+Shift+V { switch-focus-between-floating-and-tiling; }
+
+ Mod+Shift+F { toggle-column-tabbed-display; }
+ Mod+F hotkey-overlay-title="Spawn file manager (caja)" { spawn-sh "XDG_DATA_DIRS=/etc/profiles/per-user/coast/share:/run/current-system/sw/share:$HOME/.nix-profile/share:$XDG_DATA_DIRS caja"; }
+ Print { screenshot; }
+ Super+Shift+S { screenshot; }
+ Control+Alt+S { screenshot-window; }
+ Ctrl+Print { screenshot-screen; }
+ Alt+Print { screenshot-window; }
+
+ Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
+
+ Mod+Shift+E { quit; }
+ Ctrl+Alt+Delete { quit; }
+
+ Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
+ Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
+ Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
+ Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
+
+ Mod+WheelScrollRight { focus-column-right; }
+ Mod+WheelScrollLeft { focus-column-left; }
+ Mod+Ctrl+WheelScrollRight { move-column-right; }
+ Mod+Ctrl+WheelScrollLeft { move-column-left; }
+
+ Mod+Shift+WheelScrollDown { focus-column-right; }
+ Mod+Shift+WheelScrollUp { focus-column-left; }
+ Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
+ Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
+}
+
+
diff --git a/home-configuration/config/nvim/init.lua b/home-configuration/config/nvim/init.lua
new file mode 100755
index 0000000..ab02259
--- /dev/null
+++ b/home-configuration/config/nvim/init.lua
@@ -0,0 +1,10 @@
+require("plugins/lazy")
+require("plugins/lsp")
+require("plugins/nvim-tree")
+require("plugins/telescope")
+require("plugins/treesitter")
+require("config")
+require("plugins/render-markdown")
+--require("status_line").setup()
+require("plugins/lualine")
+require("plugins/catppuccin")
diff --git a/home-configuration/config/nvim/lazy-lock.json b/home-configuration/config/nvim/lazy-lock.json
new file mode 100755
index 0000000..e4d83c3
--- /dev/null
+++ b/home-configuration/config/nvim/lazy-lock.json
@@ -0,0 +1,39 @@
+{
+ "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
+ "cmp-cmdline": { "branch": "main", "commit": "d126061b624e0af6c3a556428712dd4d4194ec6d" },
+ "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
+ "cmp-nvim-lua": { "branch": "main", "commit": "e3a22cb071eb9d6508a156306b102c45cd2d573d" },
+ "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
+ "cmp-spell": { "branch": "master", "commit": "694a4e50809d6d645c1ea29015dad0c293f019d6" },
+ "cmp-vsnip": { "branch": "main", "commit": "989a8a73c44e926199bfd05fa7a516d51f2d2752" },
+ "comfy-line-numbers.nvim": { "branch": "main", "commit": "9adedbaf1f410cdaacf4fb2ca8eb44f3d5f6d010" },
+ "fterm.nvim": { "branch": "master", "commit": "d1320892cc2ebab472935242d9d992a2c9570180" },
+ "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
+ "lsp_signature.nvim": { "branch": "master", "commit": "b7ace9ddb1640ce266012a45a672dfdaedfa5ec6" },
+ "lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" },
+ "mason.nvim": { "branch": "main", "commit": "16ba83bfc8a25f52bb545134f5bee082b195c460" },
+ "mini.nvim": { "branch": "main", "commit": "d5e6f5b843f1d813d9c4bfb242b751dc5ab6f8ae" },
+ "moonfly": { "branch": "master", "commit": "261664f92ed51cf0c077555b2d4b2530307eac17" },
+ "none-ls-extras.nvim": { "branch": "main", "commit": "27681d797a26f1b4d6119296df42f5204c88a2dc" },
+ "none-ls.nvim": { "branch": "main", "commit": "01f8e62ea11603e59ad9ff7afcfa94fd183f76d6" },
+ "nvim": { "branch": "main", "commit": "0303a7208dba448c459767486a38a6ec05c4216b" },
+ "nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" },
+ "nvim-cmp": { "branch": "main", "commit": "a1d504892f2bc56c2e79b65c6faded2fd21f3eca" },
+ "nvim-lspconfig": { "branch": "master", "commit": "229b79051b380377664edc4cbd534930154921a1" },
+ "nvim-numbertoggle": { "branch": "main", "commit": "c5c0d305aee8532b5515914a08396b9154394c55" },
+ "nvim-toggler": { "branch": "main", "commit": "467808600882fd6c9e33b9dbc4889b1b80cfd917" },
+ "nvim-tree.lua": { "branch": "master", "commit": "07f541fcaa4a5ae019598240362449ab7e9812b3" },
+ "nvim-treesitter": { "branch": "main", "commit": "4916d6592ede8c07973490d9322f187e07dfefac" },
+ "nvim-web-devicons": { "branch": "master", "commit": "dfbfaa967a6f7ec50789bead7ef87e336c1fa63c" },
+ "plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
+ "presence.nvim": { "branch": "main", "commit": "87c857a56b7703f976d3a5ef15967d80508df6e6" },
+ "render-markdown.nvim": { "branch": "main", "commit": "5adf0895310c1904e5abfaad40a2baad7fe44a07" },
+ "telescope-undo.nvim": { "branch": "main", "commit": "928d0c2dc9606e01e2cc547196f48d2eaecf58e5" },
+ "telescope.nvim": { "branch": "master", "commit": "d90956833d7c27e73c621a61f20b29fdb7122709" },
+ "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
+ "twilight.nvim": { "branch": "main", "commit": "664e752f4a219801265cc3fc18782b457b58c1e1" },
+ "typst-preview.nvim": { "branch": "master", "commit": "325036ee145ca51d9efb145c09ac16bce3bc8b7d" },
+ "vim-closetag": { "branch": "master", "commit": "d0a562f8bdb107a50595aefe53b1a690460c3822" },
+ "vim-vsnip": { "branch": "master", "commit": "9bcfabea653abdcdac584283b5097c3f8760abaa" },
+ "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }
+}
diff --git a/home-configuration/config/nvim/lua/config.lua b/home-configuration/config/nvim/lua/config.lua
new file mode 100755
index 0000000..9835875
--- /dev/null
+++ b/home-configuration/config/nvim/lua/config.lua
@@ -0,0 +1,89 @@
+local opt = vim.opt
+local map = vim.keymap.set
+local g = vim.g
+
+--filetypes
+vim.cmd("autocmd BufRead,BufNewFile *.m set filetype=objc")
+
+g.mapleader = " "
+
+opt.shiftwidth = 4
+opt.tabstop = 4
+opt.softtabstop = 4
+opt.smarttab = true
+opt.smartindent = true
+
+opt.undofile = true
+opt.undodir = vim.fn.stdpath("config") .. "/undo"
+
+opt.number = true
+opt.relativenumber = true
+
+opt.fillchars = "eob: "
+
+g.loaded_netrw = 1
+g.loaded_netrwPlugin = 1
+
+opt.termguicolors = true
+
+opt.spell = false
+opt.spelllang = { "en_us" }
+
+opt.shell = "/usr/bin/zsh"
+
+
+vim.lsp.handlers["textDocument/hover"] = function(err, result, ctx, config)
+ config = config or {}
+ config.border = "single"
+ return vim.lsp.handlers.hover(err, result, ctx, config)
+end
+vim.diagnostic.config({ float = { border = "single" } })
+
+map("n", "<leader>u", ":Telescope<cr>")
+map("n", "<leader>t", ":tabnew<cr>")
+map("n", "<A-Right>", ":tabn<cr>")
+map("n", "<A-Left>", ":tabp<cr>")
+map("n", "<A-q>", ":bw<cr>")
+
+map("n", "<leader>.", vim.diagnostic.open_float)
+
+map("n", "<leader>=", "=")
+
+map("n", "<leader>x", "<cmd>!chmod +x %<CR>")
+
+vim.api.nvim_create_autocmd("LspAttach", {
+ group = vim.api.nvim_create_augroup("UserLspConfig", {}),
+ callback = function(ev)
+ vim.bo[ev.buf].omnifunc = "v:lua.vim.lsp.omnifunc"
+
+ local opts = { buffer = ev.buf }
+ map("n", "K", function()
+ vim.lsp.buf.hover({ border = "single" })
+ end, opts)
+ map("n", "gi", vim.lsp.buf.implementation, opts)
+ map("n", "<C-k>", vim.lsp.buf.signature_help, opts)
+ map("n", "<space>wa", vim.lsp.buf.add_workspace_folder, opts)
+ map("n", "<space>wr", vim.lsp.buf.remove_workspace_folder, opts)
+ map("n", "<space>wl", function()
+ print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+ end, opts)
+ map("n", "<space>D", vim.lsp.buf.type_definition, opts)
+ map("n", "<space>rn", vim.lsp.buf.rename, opts)
+ map({ "n", "v" }, "<space>ca", vim.lsp.buf.code_action, opts)
+ map("n", "gr", vim.lsp.buf.references, opts)
+ map("n", "<space>f", function()
+ vim.lsp.buf.format({ async = true })
+ end, opts)
+ end,
+})
+
+local builtin = require("telescope.builtin")
+map("n", "<leader>ff", builtin.find_files, {})
+map("n", "<leader>fg", builtin.live_grep, {})
+map("n", "<leader>fb", builtin.buffers, {})
+map("n", "<leader>fh", builtin.help_tags, {})
+local treeapi = require("nvim-tree.api")
+map("n", "<leader>e", treeapi.tree.toggle, {})
+
+map("n", "<A-i>", '<CMD>lua require("FTerm").toggle()<CR>')
+map("t", "<A-i>", '<C-\\><C-n><CMD>lua require("FTerm").toggle()<CR>')
diff --git a/home-configuration/config/nvim/lua/plugins/catppuccin/init.lua b/home-configuration/config/nvim/lua/plugins/catppuccin/init.lua
new file mode 100755
index 0000000..c497b4d
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/catppuccin/init.lua
@@ -0,0 +1,90 @@
+local colors = {
+ black = "#121212",
+ white = "#ffffff",
+ gray = "#7e7e7e",
+ light_gray = "#d0d0d0",
+ dark_gray = "#505050",
+ red = "#ff5c57",
+ green = "#5af78e",
+ yellow = "#f3f99d",
+ blue = "#57c7ff",
+ purple = "#d183e8",
+ cyan = "#9aedfe",
+}
+
+local highlights = {
+ Normal = { fg = colors.light_gray, bg = "NONE" },
+ NormalNC = { fg = colors.light_gray, bg = "NONE" },
+ SignColumn = { bg = "NONE" },
+ FoldColumn = { bg = "NONE" },
+ Comment = { fg = colors.gray, italic = true },
+ Constant = { fg = colors.blue },
+ String = { fg = colors.green },
+ Identifier = { fg = colors.blue },
+ Function = { fg = colors.purple },
+ Statement = { fg = colors.yellow },
+ PreProc = { fg = colors.cyan },
+ Type = { fg = colors.blue },
+ Special = { fg = colors.red },
+ Underlined = { fg = colors.white, underline = true },
+ Todo = { fg = colors.black, bg = colors.yellow, bold = true },
+ StatusLine = { fg = colors.white, bg = "NONE" },
+ StatusLineNC = { fg = colors.light_gray, bg = "NONE" },
+ NvimTreeNormal = { fg = colors.light_gray, bg = "NONE" },
+ NvimTreeNormalNC = { fg = colors.light_gray, bg = "NONE" },
+ NvimTreeWinSeparator = { fg = colors.dark_gray, bg = "NONE" },
+ NvimTreeFolderName = { fg = colors.blue, bold = true },
+ NvimTreeOpenedFolderName = { fg = colors.green, bold = true },
+ NvimTreeRootFolder = { fg = colors.yellow, bold = true, underline = true },
+ NvimTreeFileIcon = { fg = colors.light_gray },
+ NvimTreeGitDirty = { fg = colors.red },
+ NvimTreeGitStaged = { fg = colors.green },
+ NvimTreeGitNew = { fg = colors.blue },
+ NvimTreeGitRenamed = { fg = colors.purple },
+ NvimTreeGitDeleted = { fg = colors.red },
+ CursorLine = { bg = colors.dark_gray },
+}
+
+for group, opts in pairs(highlights) do
+ vim.api.nvim_set_hl(0, group, opts)
+end
+
+local inactive_style = { fg = colors.dark_gray, bg = "NONE" }
+
+require("lualine").setup({
+ options = {
+ theme = {
+ normal = {
+ a = { fg = colors.black, bg = colors.white, gui = "bold" },
+ b = { fg = colors.white, bg = colors.dark_gray },
+ c = { fg = colors.white, bg = "NONE" },
+ },
+ inactive = {
+ a = { fg = colors.dark_gray, bg = "NONE", gui = "bold" },
+ b = inactive_style,
+ c = inactive_style,
+ },
+ },
+ },
+})
+
+require("nvim-tree").setup({
+ view = {
+ width = 30,
+ side = "left",
+ },
+ renderer = {
+ highlight_git = true,
+ root_folder_modifier = ":~",
+ icons = {
+ show = {
+ file = true,
+ folder = true,
+ git = true,
+ },
+ },
+ },
+ filters = {
+ dotfiles = false,
+ },
+})
diff --git a/home-configuration/config/nvim/lua/plugins/lazy/init.lua b/home-configuration/config/nvim/lua/plugins/lazy/init.lua
new file mode 100755
index 0000000..497cf69
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/lazy/init.lua
@@ -0,0 +1,17 @@
+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+if not vim.loop.fs_stat(lazypath) then
+ vim.fn.system({
+ "git",
+ "clone",
+ "--filter=blob:none",
+ "https://github.com/folke/lazy.nvim.git",
+ "--branch=stable",
+ lazypath,
+ })
+end
+vim.opt.rtp:prepend(lazypath)
+
+local lazy_plugins = require("plugins/lazy/plugins")
+
+require("lazy").setup(lazy_plugins)
+require("mason").setup()
diff --git a/home-configuration/config/nvim/lua/plugins/lazy/plugins.lua b/home-configuration/config/nvim/lua/plugins/lazy/plugins.lua
new file mode 100755
index 0000000..75b873a
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/lazy/plugins.lua
@@ -0,0 +1,129 @@
+return {
+ "andweeb/presence.nvim",
+ "catppuccin/nvim",
+ "neovim/nvim-lspconfig",
+ "williamboman/mason.nvim",
+ {
+ "nvim-telescope/telescope.nvim",
+ tag = "0.1.5",
+ dependencies = { "nvim-lua/plenary.nvim" },
+ },
+ {
+ "nvim-tree/nvim-tree.lua",
+ dependencies = { "nvim-tree/nvim-web-devicons" },
+ },
+ {
+ "folke/todo-comments.nvim",
+ dependencies = { "nvim-lua/plenary.nvim" },
+ opts = {},
+ },
+ {
+ "nvim-lualine/lualine.nvim",
+ dependencies = { "nvim-tree/nvim-web-devicons" },
+ },
+ {
+ "nvimtools/none-ls.nvim",
+ dependencies = {
+ "nvimtools/none-ls-extras.nvim",
+ },
+ },
+ {
+ "windwp/nvim-autopairs",
+ event = "InsertEnter",
+ },
+ {
+ "hrsh7th/nvim-cmp",
+ dependencies = {
+ "neovim/nvim-lspconfig",
+ "hrsh7th/cmp-nvim-lsp",
+ "hrsh7th/cmp-nvim-lua",
+ "hrsh7th/cmp-buffer",
+ "hrsh7th/cmp-path",
+ "hrsh7th/cmp-cmdline",
+ "hrsh7th/cmp-vsnip",
+ "hrsh7th/vim-vsnip",
+ },
+ },
+ {
+ "ray-x/lsp_signature.nvim",
+ event = "VeryLazy",
+ },
+ {
+ "nvim-treesitter/nvim-treesitter",
+ lazy = false,
+ priority = 1000,
+ build = ":TSUpdate",
+ },
+ "f3fora/cmp-spell",
+ {
+ "debugloop/telescope-undo.nvim",
+ dependencies = {
+ {
+ "nvim-telescope/telescope.nvim",
+ dependencies = { "nvim-lua/plenary.nvim" },
+ },
+ },
+ },
+ {
+ "chomosuke/typst-preview.nvim",
+ lazy = false,
+ version = "1.*",
+ opts = {},
+ },
+ {
+ "MeanderingProgrammer/render-markdown.nvim",
+ dependencies = {
+ "nvim-treesitter/nvim-treesitter",
+ "nvim-mini/mini.nvim",
+ },
+ opts = {},
+ },
+ "sitiom/nvim-numbertoggle",
+ "mluders/comfy-line-numbers.nvim",
+ {
+ "folke/which-key.nvim",
+ event = "VeryLazy",
+ init = function()
+ vim.o.timeout = true
+ vim.o.timeoutlen = 300
+ end,
+ },
+ {
+ "folke/twilight.nvim",
+ opts = {
+ dimming = {
+ alpha = 0.35,
+ color = { "Normal" },
+ term_bg = "#282828",
+ inactive = false,
+ },
+ context = 15,
+ treesitter = true,
+ expand = {
+ "function",
+ "method",
+ "table",
+ "if_statement",
+ },
+ exclude = {
+ "md",
+ },
+ },
+ },
+ "nguyenvukhang/nvim-toggler",
+ "alvan/vim-closetag",
+ {
+ "numtostr/fterm.nvim",
+ border = "double",
+ dimensions = {
+ height = 0.9,
+ width = 0.9,
+ },
+ },
+ {
+ "bluz71/vim-moonfly-colors",
+ name = "moonfly",
+ lazy = false,
+ priority = 1000,
+ },
+}
diff --git a/home-configuration/config/nvim/lua/plugins/lsp/init.lua b/home-configuration/config/nvim/lua/plugins/lsp/init.lua
new file mode 100755
index 0000000..c5245d9
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/lsp/init.lua
@@ -0,0 +1,305 @@
+local lsp = require("lspconfig")
+local cmp = require("cmp")
+
+vim.lsp.config('*', {
+ root_markers = { '.git' },
+})
+
+vim.diagnostic.config({
+ virtual_text = true,
+ severity_sort = true,
+ float = {
+ style = 'minimal',
+ border = 'rounded',
+ source = 'if_many',
+ header = '',
+ prefix = '',
+ },
+ signs = {
+ text = {
+ [vim.diagnostic.severity.ERROR] = '✘',
+ [vim.diagnostic.severity.WARN] = '▲',
+ [vim.diagnostic.severity.HINT] = '⚑',
+ [vim.diagnostic.severity.INFO] = '»',
+ },
+ },
+})
+
+local orig = vim.lsp.util.open_floating_preview
+---@diagnostic disable-next-line: duplicate-set-field
+function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...)
+ opts = opts or {}
+ opts.border = opts.border or 'rounded'
+ opts.max_width = opts.max_width or 80
+ opts.max_height = opts.max_height or 24
+ opts.wrap = opts.wrap ~= false
+ return orig(contents, syntax, opts, ...)
+end
+
+vim.api.nvim_create_autocmd('LspAttach', {
+ group = vim.api.nvim_create_augroup('my.lsp', {}),
+ callback = function(args)
+ local client = assert(vim.lsp.get_client_by_id(args.data.client_id))
+ local buf = args.buf
+ local map = function(mode, lhs, rhs) vim.keymap.set(mode, lhs, rhs, { buffer = buf }) end
+
+ map('n', 'K', vim.lsp.buf.hover)
+ map('n', 'gd', vim.lsp.buf.definition)
+ map('n', 'gD', vim.lsp.buf.declaration)
+ map('n', 'gi', vim.lsp.buf.implementation)
+ map('n', 'go', vim.lsp.buf.type_definition)
+ map('n', 'gr', vim.lsp.buf.references)
+ map('n', 'gs', vim.lsp.buf.signature_help)
+ map('n', 'gl', vim.diagnostic.open_float)
+ map('n', '<F2>', vim.lsp.buf.rename)
+ map({ 'n', 'x' }, '<F3>', function() vim.lsp.buf.format({ async = true }) end)
+ map('n', '<F4>', vim.lsp.buf.code_action)
+
+ if client:supports_method('textDocument/documentHighlight') then
+ local highlight_augroup = vim.api.nvim_create_augroup('my.lsp.highlight', { clear = false })
+ vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
+ buffer = buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.document_highlight,
+ })
+ vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
+ buffer = buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.clear_references,
+ })
+ end
+
+ local excluded_filetypes = { php = true, c = true, cpp = true }
+ if not client:supports_method('textDocument/willSaveWaitUntil')
+ and client:supports_method('textDocument/formatting')
+ and not excluded_filetypes[vim.bo[buf].filetype]
+ then
+ vim.api.nvim_create_autocmd('BufWritePre', {
+ group = vim.api.nvim_create_augroup('my.lsp.format', { clear = false }),
+ buffer = buf,
+ callback = function()
+ vim.lsp.buf.format({ bufnr = buf, id = client.id, timeout_ms = 1000 })
+ end,
+ })
+ end
+ end,
+})
+
+require("nvim-autopairs").setup({})
+require("lsp_signature").setup({ hint_enable = false })
+
+cmp.setup({
+ snippet = {
+ expand = function(args)
+ vim.fn["vsnip#anonymous"](args.body)
+ end,
+ },
+ mapping = cmp.mapping.preset.insert({
+ ["<C-b>"] = cmp.mapping.scroll_docs(-4),
+ ["<C-f>"] = cmp.mapping.scroll_docs(4),
+ ["<C-Space>"] = cmp.mapping.complete(),
+ ["<C-e>"] = cmp.mapping.abort(),
+ ["<CR>"] = cmp.mapping.confirm({ select = true }),
+ ["<Tab>"] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_next_item()
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+ ["<S-Tab>"] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_prev_item()
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+ }),
+ window = {
+ completion = cmp.config.window.bordered(),
+ documentation = cmp.config.window.bordered()
+ },
+ sources = cmp.config.sources({
+ { name = "nvim_lsp", keyword_length = 1 },
+ { name = "vsnip" },
+ }, {
+ { name = "buffer", keyword_length = 1 },
+ { name = "spell" },
+ }),
+})
+
+local caps = require("cmp_nvim_lsp").default_capabilities()
+
+vim.lsp.config['luals'] = {
+ cmd = { 'lua-language-server' },
+ filetypes = { 'lua' },
+ root_markers = { { '.luarc.json', '.luarc.jsonc' }, '.git' },
+ capabilities = caps,
+ settings = {
+ Lua = {
+ runtime = { version = 'LuaJIT' },
+ diagnostics = { globals = { 'vim' } },
+ workspace = {
+ checkThirdParty = false,
+ library = vim.list_extend(
+ vim.api.nvim_get_runtime_file('', true),
+ { '/home/tony/repos/oxwm/templates' }
+ ),
+ },
+ telemetry = { enable = false },
+ },
+ },
+}
+
+vim.lsp.config['cssls'] = {
+ cmd = { 'vscode-css-language-server', '--stdio' },
+ filetypes = { 'css', 'scss', 'less' },
+ root_markers = { 'package.json', '.git' },
+ capabilities = caps,
+ settings = {
+ css = { validate = true },
+ scss = { validate = true },
+ less = { validate = true },
+ },
+}
+
+vim.lsp.config['phpls'] = {
+ cmd = { 'intelephense', '--stdio' },
+ filetypes = { 'php' },
+ root_markers = { 'composer.json', '.git' },
+ capabilities = caps,
+ settings = {
+ intelephense = {
+ files = { maxSize = 5000000 },
+ },
+ },
+}
+
+vim.lsp.config['ts_ls'] = {
+ cmd = { 'typescript-language-server', '--stdio' },
+ filetypes = { 'javascript', 'javascriptreact', 'javascript.jsx', 'typescript', 'typescriptreact', 'typescript.tsx' },
+ root_markers = { 'package.json', 'tsconfig.json', 'jsconfig.json', '.git' },
+ capabilities = caps,
+ settings = {
+ completions = { completeFunctionCalls = true },
+ },
+}
+
+vim.lsp.config['zls'] = {
+ cmd = { 'zls' },
+ filetypes = { 'zig', 'zir' },
+ root_markers = { 'zls.json', 'build.zig', '.git' },
+ capabilities = caps,
+ settings = {
+ zls = {
+ enable_build_on_save = true,
+ build_on_save_step = "install",
+ warn_style = false,
+ enable_snippets = true,
+ }
+ }
+}
+
+vim.lsp.config['nil_ls'] = {
+ cmd = { 'nil' },
+ filetypes = { 'nix' },
+ root_markers = { 'flake.nix', 'default.nix', '.git' },
+ capabilities = caps,
+ settings = {
+ ['nil'] = {
+ formatting = {
+ command = { "nixpkgs-fmt" }
+ }
+ }
+ }
+}
+
+vim.lsp.config['rust_analyzer'] = {
+ cmd = { 'rust-analyzer' },
+ filetypes = { 'rust' },
+ root_markers = { 'Cargo.toml', 'rust-project.json', '.git' },
+ capabilities = caps,
+ settings = {
+ ['rust-analyzer'] = {
+ cargo = { allFeatures = true },
+ formatting = { command = { "rustfmt" } },
+ },
+ },
+}
+
+vim.lsp.config['clangd'] = {
+ cmd = { 'clangd', '--background-index', '--clang-tidy' },
+ filetypes = { 'c', 'cpp', 'objc', 'objcpp' },
+ root_markers = { 'compile_commands.json', '.clangd', 'configure.ac', 'Makefile', '.git' },
+ capabilities = caps,
+}
+
+vim.lsp.config['c3lsp'] = {
+ cmd = { 'c3-lsp' },
+ filetypes = { 'c3' },
+ root_markers = { 'project.json', '.git' },
+ capabilities = caps,
+}
+
+vim.lsp.config['serve_d'] = {
+ cmd = { 'serve-d' },
+ filetypes = { 'd' },
+ root_markers = { 'dub.sdl', 'dub.json', '.git' },
+ capabilities = caps,
+}
+
+vim.lsp.config['jsonls'] = {
+ cmd = { 'vscode-json-languageserver', '--stdio' },
+ filetypes = { 'json', 'jsonc' },
+ root_markers = { 'package.json', '.git', 'config.jsonc' },
+ capabilities = caps,
+}
+
+vim.lsp.config['hls'] = {
+ cmd = { 'haskell-language-server-wrapper', '--lsp' },
+ filetypes = { 'haskell', 'lhaskell' },
+ root_markers = { 'stack.yaml', 'cabal.project', 'package.yaml', '*.cabal', 'hie.yaml', '.git' },
+ capabilities = caps,
+ settings = {
+ haskell = {
+ formattingProvider = 'fourmolu',
+ plugin = { semanticTokens = { globalOn = false } },
+ },
+ },
+}
+
+vim.lsp.config['gopls'] = {
+ cmd = { 'gopls' },
+ filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' },
+ root_markers = { 'go.mod', 'go.work', '.git' },
+ capabilities = caps,
+ settings = {
+ gopls = {
+ analyses = { unusedparams = false, ST1003 = false, ST1000 = false },
+ staticcheck = true,
+ },
+ },
+}
+
+vim.lsp.config['templ'] = {
+ cmd = { 'templ', 'lsp' },
+ filetypes = { 'templ' },
+ root_markers = { 'go.mod', '.git' },
+ capabilities = caps,
+}
+
+vim.filetype.add({
+ extension = {
+ h = 'c',
+ c3 = 'c3',
+ d = 'd',
+ templ = 'templ',
+ },
+})
+
+---@diagnostic disable-next-line: invisible
+for name, _ in pairs(vim.lsp.config._configs) do
+ if name ~= '*' then
+ vim.lsp.enable(name)
+ end
+end
diff --git a/home-configuration/config/nvim/lua/plugins/lualine/init.lua b/home-configuration/config/nvim/lua/plugins/lualine/init.lua
new file mode 100755
index 0000000..d23b323
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/lualine/init.lua
@@ -0,0 +1,50 @@
+local lualine = require("lualine")
+
+lualine.setup({
+ options = {
+ icons_enabled = true,
+ theme = "auto",
+ component_separators = { left = "|", right = "|" },
+ section_separators = { left = "", right = "" },
+ disabled_filetypes = {
+ statusline = {},
+ winbar = {},
+ },
+ ignore_focus = {},
+ always_divide_middle = true,
+ globalstatus = false,
+ refresh = {
+ statusline = 1000,
+ tabline = 1000,
+ winbar = 1000,
+ },
+ },
+ sections = {
+ lualine_a = { "mode" },
+ lualine_b = {
+ { "branch", color = { bg = "NONE" } },
+ { "diff", color = { bg = "NONE" } },
+ { "diagnostics", color = { bg = "NONE" } }
+ },
+ lualine_c = { { "filename", color = { bg = "NONE" } } },
+ lualine_x = {
+ { "encoding", color = { bg = "NONE" } },
+ { "fileformat", color = { bg = "NONE" } },
+ { "filetype", color = { bg = "NONE" } }
+ },
+ lualine_y = {},
+ lualine_z = { "location" },
+ },
+ inactive_sections = {
+ lualine_a = {},
+ lualine_b = {},
+ lualine_c = { { "filename", color = { bg = "NONE" } } },
+ lualine_x = { { "location", color = { bg = "NONE" } } },
+ lualine_y = {},
+ lualine_z = {},
+ },
+ tabline = {},
+ winbar = {},
+ inactive_winbar = {},
+ extensions = {},
+})
diff --git a/home-configuration/config/nvim/lua/plugins/nvim-tree/init.lua b/home-configuration/config/nvim/lua/plugins/nvim-tree/init.lua
new file mode 100755
index 0000000..c7174f7
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/nvim-tree/init.lua
@@ -0,0 +1,2 @@
+local tree = require("nvim-tree")
+tree.setup() \ No newline at end of file
diff --git a/home-configuration/config/nvim/lua/plugins/render-markdown/init.lua b/home-configuration/config/nvim/lua/plugins/render-markdown/init.lua
new file mode 100755
index 0000000..ab078ce
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/render-markdown/init.lua
@@ -0,0 +1,139 @@
+require("render-markdown").setup({
+ link = {
+ -- Turn on / off inline link icon rendering.
+ enabled = true,
+ -- Additional modes to render links.
+ render_modes = false,
+ -- How to handle footnote links, start with a '^'.
+ footnote = {
+ -- Turn on / off footnote rendering.
+ enabled = true,
+ -- Replace value with superscript equivalent.
+ superscript = true,
+ -- Added before link content.
+ prefix = "",
+ -- Added after link content.
+ suffix = "",
+ },
+ -- Inlined with 'image' elements.
+ image = "󰥶 ",
+ -- Inlined with 'email_autolink' elements.
+ email = "󰀓 ",
+ -- Fallback icon for 'inline_link' and 'uri_autolink' elements.
+ hyperlink = "󰌹 ",
+ -- Applies to the inlined icon as a fallback.
+ highlight = "RenderMarkdownLink",
+ -- Applies to WikiLink elements.
+ wiki = {
+ icon = "󱗖 ",
+ body = function()
+ return nil
+ end,
+ highlight = "RenderMarkdownWikiLink",
+ },
+ -- Define custom destination patterns so icons can quickly inform you of what a link
+ -- contains. Applies to 'inline_link', 'uri_autolink', and wikilink nodes. When multiple
+ -- patterns match a link the one with the longer pattern is used.
+ -- The key is for healthcheck and to allow users to change its values, value type below.
+ -- | pattern | matched against the destination text |
+ -- | icon | gets inlined before the link text |
+ -- | kind | optional determines how pattern is checked |
+ -- | | pattern | @see :h lua-patterns, is the default if not set |
+ -- | | suffix | @see :h vim.endswith() |
+ -- | priority | optional used when multiple match, uses pattern length if empty |
+ -- | highlight | optional highlight for 'icon', uses fallback highlight if empty |
+ custom = {
+ web = { pattern = "^http", icon = "󰖟 " },
+ github = { pattern = "github%.com", icon = "󰊤 " },
+ gitlab = { pattern = "gitlab%.com", icon = "󰮠 " },
+ stackoverflow = { pattern = "stackoverflow%.com", icon = "󰓌 " },
+ wikipedia = { pattern = "wikipedia%.org", icon = "󰖬 " },
+ youtube = { pattern = "youtube%.com", icon = "󰗃 " },
+ },
+ },
+ callout = {
+ -- Callouts are a special instance of a 'block_quote' that start with a 'shortcut_link'.
+ -- The key is for healthcheck and to allow users to change its values, value type below.
+ -- | raw | matched against the raw text of a 'shortcut_link', case insensitive |
+ -- | rendered | replaces the 'raw' value when rendering |
+ -- | highlight | highlight for the 'rendered' text and quote markers |
+ -- | quote_icon | optional override for quote.icon value for individual callout |
+ -- | category | optional metadata useful for filtering |
+
+ note = { raw = "[!NOTE]", rendered = "󰋽 Note", highlight = "RenderMarkdownInfo" },
+ tip = { raw = "[!TIP]", rendered = "󰌶 Tip", highlight = "RenderMarkdownSuccess" },
+ important = { raw = "[!IMPORTANT]", rendered = "󰅾 Important", highlight = "RenderMarkdownHint" },
+ warning = { raw = "[!WARNING]", rendered = "󰀪 Warning", highlight = "RenderMarkdownWarn" },
+ caution = { raw = "[!CAUTION]", rendered = "󰳦 Caution", highlight = "RenderMarkdownError" },
+ abstract = { raw = "[!ABSTRACT]", rendered = "󰨸 Abstract", highlight = "RenderMarkdownInfo" },
+ summary = { raw = "[!SUMMARY]", rendered = "󰨸 Summary", highlight = "RenderMarkdownInfo" },
+ tldr = { raw = "[!TLDR]", rendered = "󰨸 Tldr", highlight = "RenderMarkdownInfo" },
+ info = { raw = "[!INFO]", rendered = "󰋽 Info", highlight = "RenderMarkdownInfo" },
+ todo = { raw = "[!TODO]", rendered = "󰗡 Todo", highlight = "RenderMarkdownInfo" },
+ hint = { raw = "[!HINT]", rendered = "󰌶 Hint", highlight = "RenderMarkdownSuccess" },
+ success = { raw = "[!SUCCESS]", rendered = "󰄬 Success", highlight = "RenderMarkdownSuccess" },
+ check = { raw = "[!CHECK]", rendered = "󰄬 Check", highlight = "RenderMarkdownSuccess" },
+ done = { raw = "[!DONE]", rendered = "󰄬 Done", highlight = "RenderMarkdownSuccess" },
+ question = { raw = "[!QUESTION]", rendered = "󰘥 Question", highlight = "RenderMarkdownWarn" },
+ help = { raw = "[!HELP]", rendered = "󰘥 Help", highlight = "RenderMarkdownWarn" },
+ faq = { raw = "[!FAQ]", rendered = "󰘥 Faq", highlight = "RenderMarkdownWarn" },
+ attention = { raw = "[!ATTENTION]", rendered = "󰀪 Attention", highlight = "RenderMarkdownWarn" },
+ failure = { raw = "[!FAILURE]", rendered = "󰅖 Failure", highlight = "RenderMarkdownError" },
+ fail = { raw = "[!FAIL]", rendered = "󰅖 Fail", highlight = "RenderMarkdownError" },
+ missing = { raw = "[!MISSING]", rendered = "󰅖 Missing", highlight = "RenderMarkdownError" },
+ danger = { raw = "[!DANGER]", rendered = "󱐌 Danger", highlight = "RenderMarkdownError" },
+ error = { raw = "[!ERROR]", rendered = "󱐌 Error", highlight = "RenderMarkdownError" },
+ bug = { raw = "[!BUG]", rendered = "󰨰 Bug", highlight = "RenderMarkdownError" },
+ example = { raw = "[!EXAMPLE]", rendered = "󰉹 Example", highlight = "RenderMarkdownHint" },
+ quote = { raw = "[!QUOTE]", rendered = "󱆨 Quote", highlight = "RenderMarkdownQuote" },
+ cite = { raw = "[!CITE]", rendered = "󱆨 Cite", highlight = "RenderMarkdownQuote" },
+ },
+ checkbox = {
+ enabled = true,
+ render_modes = false,
+ bullet = false,
+ right_pad = 1,
+ unchecked = {
+ icon = "󰄱 ",
+ highlight = "RenderMarkdownUnchecked",
+ scope_highlight = nil,
+ },
+ checked = {
+ icon = "󰱒 ",
+ highlight = "RenderMarkdownChecked",
+ scope_highlight = nil,
+ },
+ custom = {
+ todo = { raw = "[-]", rendered = "󰥔 ", highlight = "RenderMarkdownTodo", scope_highlight = nil },
+ },
+ },
+ bullet = {
+ enabled = true,
+ render_modes = false,
+ icons = { "●", "○", "◆", "◇" },
+ ordered_icons = function(ctx)
+ local value = vim.trim(ctx.value)
+ local index = tonumber(value:sub(1, #value - 1))
+ return ("%d."):format(index > 1 and index or ctx.index)
+ end,
+ left_pad = 0,
+ right_pad = 0,
+ highlight = "RenderMarkdownBullet",
+ scope_highlight = {},
+ },
+ quote = { icon = "▋" },
+ anti_conceal = {
+ enabled = true,
+ -- Which elements to always show, ignoring anti conceal behavior. Values can either be
+ -- booleans to fix the behavior or string lists representing modes where anti conceal
+ -- behavior will be ignored. Valid values are:
+ -- head_icon, head_background, head_border, code_language, code_background, code_border,
+ -- dash, bullet, check_icon, check_scope, quote, table_border, callout, link, sign
+ ignore = {
+ code_background = true,
+ sign = true,
+ },
+ above = 0,
+ below = 0,
+ },
+})
diff --git a/home-configuration/config/nvim/lua/plugins/telescope/init.lua b/home-configuration/config/nvim/lua/plugins/telescope/init.lua
new file mode 100755
index 0000000..2cb0f77
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/telescope/init.lua
@@ -0,0 +1,3 @@
+local tel = require("telescope")
+tel.setup({})
+tel.load_extension("undo")
diff --git a/home-configuration/config/nvim/lua/plugins/treesitter/init.lua b/home-configuration/config/nvim/lua/plugins/treesitter/init.lua
new file mode 100755
index 0000000..ffc8b17
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/treesitter/init.lua
@@ -0,0 +1,305 @@
+local lsp = require("lspconfig")
+local cmp = require("cmp")
+
+vim.lsp.config('*', {
+ root_markers = { '.git' },
+})
+
+vim.diagnostic.config({
+ virtual_text = true,
+ severity_sort = true,
+ float = {
+ style = 'minimal',
+ border = 'rounded',
+ source = 'if_many',
+ header = '',
+ prefix = '',
+ },
+ signs = {
+ text = {
+ [vim.diagnostic.severity.ERROR] = '✘',
+ [vim.diagnostic.severity.WARN] = '▲',
+ [vim.diagnostic.severity.HINT] = '⚑',
+ [vim.diagnostic.severity.INFO] = '»',
+ },
+ },
+})
+
+local orig = vim.lsp.util.open_floating_preview
+---@diagnostic disable-next-line: duplicate-set-field
+function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...)
+ opts = opts or {}
+ opts.border = opts.border or 'rounded'
+ opts.max_width = opts.max_width or 80
+ opts.max_height = opts.max_height or 24
+ opts.wrap = opts.wrap ~= false
+ return orig(contents, syntax, opts, ...)
+end
+
+vim.api.nvim_create_autocmd('LspAttach', {
+ group = vim.api.nvim_create_augroup('my.lsp', {}),
+ callback = function(args)
+ local client = assert(vim.lsp.get_client_by_id(args.data.client_id))
+ local buf = args.buf
+ local map = function(mode, lhs, rhs) vim.keymap.set(mode, lhs, rhs, { buffer = buf }) end
+
+ map('n', 'K', vim.lsp.buf.hover)
+ map('n', 'gd', vim.lsp.buf.definition)
+ map('n', 'gD', vim.lsp.buf.declaration)
+ map('n', 'gi', vim.lsp.buf.implementation)
+ map('n', 'go', vim.lsp.buf.type_definition)
+ map('n', 'gr', vim.lsp.buf.references)
+ map('n', 'gs', vim.lsp.buf.signature_help)
+ map('n', 'gl', vim.diagnostic.open_float)
+ map('n', '<F2>', vim.lsp.buf.rename)
+ map({ 'n', 'x' }, '<F3>', function() vim.lsp.buf.format({ async = true }) end)
+ map('n', '<F4>', vim.lsp.buf.code_action)
+
+ if client:supports_method('textDocument/documentHighlight') then
+ local highlight_augroup = vim.api.nvim_create_augroup('my.lsp.highlight', { clear = false })
+ vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
+ buffer = buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.document_highlight,
+ })
+ vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
+ buffer = buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.clear_references,
+ })
+ end
+
+ local excluded_filetypes = { php = true, c = true, cpp = true }
+ if not client:supports_method('textDocument/willSaveWaitUntil')
+ and client:supports_method('textDocument/formatting')
+ and not excluded_filetypes[vim.bo[buf].filetype]
+ then
+ vim.api.nvim_create_autocmd('BufWritePre', {
+ group = vim.api.nvim_create_augroup('my.lsp.format', { clear = false }),
+ buffer = buf,
+ callback = function()
+ vim.lsp.buf.format({ bufnr = buf, id = client.id, timeout_ms = 1000 })
+ end,
+ })
+ end
+ end,
+})
+
+require("nvim-autopairs").setup({})
+require("lsp_signature").setup({ hint_enable = false })
+
+cmp.setup({
+ snippet = {
+ expand = function(args)
+ vim.fn["vsnip#anonymous"](args.body)
+ end,
+ },
+ mapping = cmp.mapping.preset.insert({
+ ["<C-b>"] = cmp.mapping.scroll_docs(-4),
+ ["<C-f>"] = cmp.mapping.scroll_docs(4),
+ ["<C-Space>"] = cmp.mapping.complete(),
+ ["<C-e>"] = cmp.mapping.abort(),
+ ["<CR>"] = cmp.mapping.confirm({ select = true }),
+ ["<Tab>"] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_next_item()
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+ ["<S-Tab>"] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_prev_item()
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+ }),
+ window = {
+ completion = cmp.config.window.bordered(),
+ documentation = cmp.config.window.bordered()
+ },
+ sources = cmp.config.sources({
+ { name = "nvim_lsp", keyword_length = 1 },
+ { name = "vsnip" },
+ }, {
+ { name = "buffer", keyword_length = 1 },
+ { name = "spell" },
+ }),
+})
+
+local caps = require("cmp_nvim_lsp").default_capabilities()
+
+vim.lsp.config['luals'] = {
+ cmd = { 'lua-language-server' },
+ filetypes = { 'lua' },
+ root_markers = { { '.luarc.json', '.luarc.jsonc' }, '.git' },
+ capabilities = caps,
+ settings = {
+ Lua = {
+ runtime = { version = 'LuaJIT' },
+ diagnostics = { globals = { 'vim' } },
+ workspace = {
+ checkThirdParty = false,
+ library = vim.list_extend(
+ vim.api.nvim_get_runtime_file('', true),
+ { '/home/tony/repos/oxwm/templates' }
+ ),
+ },
+ telemetry = { enable = false },
+ },
+ },
+}
+
+vim.lsp.config['cssls'] = {
+ cmd = { 'vscode-css-language-server', '--stdio' },
+ filetypes = { 'css', 'scss', 'less' },
+ root_markers = { 'package.json', '.git' },
+ capabilities = caps,
+ settings = {
+ css = { validate = true },
+ scss = { validate = true },
+ less = { validate = true },
+ },
+}
+
+vim.lsp.config['phpls'] = {
+ cmd = { 'intelephense', '--stdio' },
+ filetypes = { 'php' },
+ root_markers = { 'composer.json', '.git' },
+ capabilities = caps,
+ settings = {
+ intelephense = {
+ files = { maxSize = 5000000 },
+ },
+ },
+}
+
+vim.lsp.config['ts_ls'] = {
+ cmd = { 'typescript-language-server', '--stdio' },
+ filetypes = { 'javascript', 'javascriptreact', 'javascript.jsx', 'typescript', 'typescriptreact', 'typescript.tsx' },
+ root_markers = { 'package.json', 'tsconfig.json', 'jsconfig.json', '.git' },
+ capabilities = caps,
+ settings = {
+ completions = { completeFunctionCalls = true },
+ },
+}
+
+vim.lsp.config['zls'] = {
+ cmd = { 'zls' },
+ filetypes = { 'zig', 'zir' },
+ root_markers = { 'zls.json', 'build.zig', '.git' },
+ capabilities = caps,
+ settings = {
+ zls = {
+ enable_build_on_save = true,
+ build_on_save_step = "install",
+ warn_style = false,
+ enable_snippets = true,
+ }
+ }
+}
+
+vim.lsp.config['nil_ls'] = {
+ cmd = { 'nil' },
+ filetypes = { 'nix' },
+ root_markers = { 'flake.nix', 'default.nix', '.git' },
+ capabilities = caps,
+ settings = {
+ ['nil'] = {
+ formatting = {
+ command = { "nixpkgs-fmt" }
+ }
+ }
+ }
+}
+
+vim.lsp.config['rust_analyzer'] = {
+ cmd = { 'rust-analyzer' },
+ filetypes = { 'rust' },
+ root_markers = { 'Cargo.toml', 'rust-project.json', '.git' },
+ capabilities = caps,
+ settings = {
+ ['rust-analyzer'] = {
+ cargo = { allFeatures = true },
+ formatting = { command = { "rustfmt" } },
+ },
+ },
+}
+
+vim.lsp.config['clangd'] = {
+ cmd = { 'clangd', '--background-index', '--clang-tidy' },
+ filetypes = { 'c', 'cpp', 'objc', 'objcpp' },
+ root_markers = { 'compile_commands.json', '.clangd', 'configure.ac', 'Makefile', '.git' },
+ capabilities = caps,
+}
+
+vim.lsp.config['c3lsp'] = {
+ cmd = { 'c3-lsp' },
+ filetypes = { 'c3' },
+ root_markers = { 'project.json', '.git' },
+ capabilities = caps,
+}
+
+vim.lsp.config['serve_d'] = {
+ cmd = { 'serve-d' },
+ filetypes = { 'd' },
+ root_markers = { 'dub.sdl', 'dub.json', '.git' },
+ capabilities = caps,
+}
+
+vim.lsp.config['jsonls'] = {
+ cmd = { 'vscode-json-languageserver', '--stdio' },
+ filetypes = { 'json', 'jsonc' },
+ root_markers = { 'package.json', '.git', 'config.jsonc' },
+ capabilities = caps,
+}
+
+vim.lsp.config['hls'] = {
+ cmd = { 'haskell-language-server-wrapper', '--lsp' },
+ filetypes = { 'haskell', 'lhaskell' },
+ root_markers = { 'stack.yaml', 'cabal.project', 'package.yaml', '*.cabal', 'hie.yaml', '.git' },
+ capabilities = caps,
+ settings = {
+ haskell = {
+ formattingProvider = 'fourmolu',
+ plugin = { semanticTokens = { globalOn = false } },
+ },
+ },
+}
+
+vim.lsp.config['gopls'] = {
+ cmd = { 'gopls' },
+ filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' },
+ root_markers = { 'go.mod', 'go.work', '.git' },
+ capabilities = caps,
+ settings = {
+ gopls = {
+ analyses = { unusedparams = false, ST1003 = false, ST1000 = false },
+ staticcheck = true,
+ },
+ },
+}
+
+vim.lsp.config['templ'] = {
+ cmd = { 'templ', 'lsp' },
+ filetypes = { 'templ' },
+ root_markers = { 'go.mod', '.git' },
+ capabilities = caps,
+}
+
+vim.filetype.add({
+ extension = {
+ h = 'c',
+ c3 = 'c3',
+ d = 'd',
+ templ = 'templ',
+ },
+})
+
+---@diagnostic disable-next-line: invisible
+for name, _ in pairs(vim.lsp.config._configs) do
+ if name ~= '*' then
+ vim.lsp.enable(name)
+ end
+end
diff --git a/home-configuration/config/nvim/lua/plugins/whichkey/init.lua b/home-configuration/config/nvim/lua/plugins/whichkey/init.lua
new file mode 100755
index 0000000..e6b9906
--- /dev/null
+++ b/home-configuration/config/nvim/lua/plugins/whichkey/init.lua
@@ -0,0 +1,2 @@
+local wk = require("which-key")
+wk.setup({})
diff --git a/home-configuration/config/nvim/lua/status_line/init.lua b/home-configuration/config/nvim/lua/status_line/init.lua
new file mode 100755
index 0000000..904684b
--- /dev/null
+++ b/home-configuration/config/nvim/lua/status_line/init.lua
@@ -0,0 +1,102 @@
+local colors = {
+ foreground = "#ebdbb2",
+ pink = "#b16286",
+ red = "#cc241d",
+ green = "#98971a",
+ yellow = "#d79921",
+ orange = "#d65d0e",
+ magenta = "#b16286",
+ cyan = "#458588",
+ bg_darken = "#1d2021",
+ dark_text = "#1d2021",
+}
+
+local M = {}
+
+function M.setup()
+ vim.cmd("hi StatusBackground guifg=" .. colors.foreground .. " guibg=" .. colors.bg_darken)
+ vim.cmd("hi Moden guifg=" .. colors.dark_text .. " guibg=" .. colors.pink .. " gui=bold")
+ vim.cmd("hi Modei guifg=" .. colors.dark_text .. " guibg=" .. colors.green .. " gui=bold")
+ vim.cmd("hi Modev guifg=" .. colors.dark_text .. " guibg=" .. colors.yellow .. " gui=bold")
+ vim.cmd("hi Modet guifg=" .. colors.dark_text .. " guibg=" .. colors.orange .. " gui=bold")
+ vim.cmd("hi Modec guifg=" .. colors.dark_text .. " guibg=" .. colors.magenta .. " gui=bold")
+ vim.cmd("hi Moder guifg=" .. colors.dark_text .. " guibg=" .. colors.red .. " gui=bold")
+ vim.cmd("hi Filetype guifg=" .. colors.cyan .. " guibg=" .. colors.bg_darken .. " gui=bold")
+ vim.cmd("hi Position guifg=" .. colors.yellow .. " guibg=" .. colors.bg_darken .. " gui=bold")
+ vim.cmd("hi GitBranch guifg=" .. colors.orange .. " guibg=" .. colors.bg_darken .. " gui=bold")
+ vim.cmd("hi GitDiff guifg=" .. colors.green .. " guibg=" .. colors.bg_darken)
+ vim.cmd("hi GitDiffDel guifg=" .. colors.red .. " guibg=" .. colors.bg_darken)
+ vim.cmd("hi Separator guifg=" .. colors.foreground .. " guibg=" .. colors.bg_darken)
+ vim.cmd("hi LSPError guifg=" .. colors.red .. " guibg=" .. colors.bg_darken)
+ vim.cmd("hi LSPWarn guifg=" .. colors.yellow .. " guibg=" .. colors.bg_darken)
+ vim.cmd("hi LSPInfo guifg=" .. colors.cyan .. " guibg=" .. colors.bg_darken)
+ vim.cmd("hi LSPOk guifg=" .. colors.green .. " guibg=" .. colors.bg_darken)
+
+ vim.o.statusline = table.concat({
+ "%{%v:lua.themeStatuslineMode()%} ",
+ "%f ",
+ "%{%v:lua.themeGitBranch()%} ",
+ "%{%v:lua.themeGitDiff()%} ",
+ "%{%v:lua.themeLSP()%} ",
+ "%=",
+ "%{%v:lua.themeStatuslineFiletype()%} ",
+ "%{%v:lua.themeStatuslinePosition()%}",
+ })
+end
+
+function themeStatuslineMode()
+ local mode = vim.fn.mode()
+ local mode_highlight = "Mode" .. mode:sub(1, 1)
+ return string.format("%%#%s# %s %%#StatusBackground#", mode_highlight, mode:upper())
+end
+
+function themeStatuslineFiletype()
+ return string.format("%%#Filetype# %s %%#Separator#│%%#StatusBackground#", vim.bo.filetype)
+end
+
+function themeStatuslinePosition()
+ local row, col = unpack(vim.api.nvim_win_get_cursor(0))
+ return string.format("%%#Position# %03d:%02d ", row, col)
+end
+
+function themeGitBranch()
+ local branch = vim.fn.systemlist("git rev-parse --abbrev-ref HEAD 2>/dev/null")[1] or ""
+ if branch ~= "" then
+ return string.format("%%#GitBranch# %s %%#Separator#│%%#StatusBackground#", branch)
+ end
+ return ""
+end
+
+function themeGitDiff()
+ local diff = vim.fn.systemlist("git diff --shortstat 2>/dev/null")[1] or ""
+ local added, removed = diff:match("(%d+) insertions?"), diff:match("(%d+) deletions?")
+ added = added or "0"
+ removed = removed or "0"
+ if diff ~= "" then
+ return string.format("%%#GitDiff#+%s %%#GitDiffDel#-%s %%#StatusBackground#", added, removed)
+ end
+ return ""
+end
+
+function themeLSP()
+ local errors = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.ERROR })
+ local warns = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.WARN })
+ local info = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.INFO })
+ local hints = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.HINT })
+ local str = ""
+ if errors > 0 then
+ str = str .. string.format("%%#LSPError#E:%d ", errors)
+ end
+ if warns > 0 then
+ str = str .. string.format("%%#LSPWarn#W:%d ", warns)
+ end
+ if info > 0 then
+ str = str .. string.format("%%#LSPInfo#I:%d ", info)
+ end
+ if hints > 0 then
+ str = str .. string.format("%%#LSPOk#H:%d ", hints)
+ end
+ return str
+end
+
+return M
diff --git a/home-configuration/config/picom/picom-animations.conf b/home-configuration/config/picom/picom-animations.conf
new file mode 100644
index 0000000..b101824
--- /dev/null
+++ b/home-configuration/config/picom/picom-animations.conf
@@ -0,0 +1,262 @@
+# Animations for NORMAL windows.
+ {
+ match = "window_type = 'normal'";
+ animations = (
+ {
+ triggers = ["close"];
+ opacity = {
+ curve = "cubic-bezier(0,1,1,1)";
+ duration = 0.6;
+ start = "window-raw-opacity-before";
+ end = 0;
+ };
+ blur-opacity = "opacity";
+ shadow-opacity = "opacity";
+
+ scale-x = {
+ curve = "cubic-bezier(0,1.3,1,1)";
+ duration = 0.6;
+ start = 1;
+ end = 0.6;
+ };
+ scale-y = "scale-x";
+
+ offset-x = "(1 - scale-x) / 2 * window-width";
+ offset-y = "(1 - scale-y) / 2 * window-height";
+
+ shadow-scale-x = "scale-x";
+ shadow-scale-y = "scale-y";
+ shadow-offset-x = "offset-x";
+ shadow-offset-y = "offset-y";
+ },
+
+ # Animación de APERTURA
+ {
+ triggers = ["open"];
+ opacity = {
+ curve = "cubic-bezier(0,1,1,1)";
+ duration = 0.5;
+ start = 0;
+ end = "window-raw-opacity";
+ };
+ blur-opacity = "opacity";
+ shadow-opacity = "opacity";
+
+ scale-x = {
+ curve = "cubic-bezier(0,1.3,1,1)";
+ duration = 0.5;
+ start = 0.6;
+ end = 1;
+ };
+ scale-y = "scale-x";
+
+ offset-x = "(1 - scale-x) / 2 * window-width";
+ offset-y = "(1 - scale-y) / 2 * window-height";
+
+ shadow-scale-x = "scale-x";
+ shadow-scale-y = "scale-y";
+ shadow-offset-x = "offset-x";
+ shadow-offset-y = "offset-y";
+ },
+
+ # Animación de GEOMETRÍA (modificada para ambos casos)
+ {
+ triggers = ["geometry"];
+ # Cuando la ventana CRECE (abrir/mover/redimensionar)
+ scale-x = {
+ curve = "cubic-bezier(0,0,0,1.28)";
+ duration = 0.5;
+ start = "window-width-before / window-width";
+ end = 1;
+ };
+
+ # Cuando la ventana ENCOGE (cerrar/mover/redimensionar)
+ scale-x-reverse = {
+ curve = "cubic-bezier(0,0,0,1.28)";
+ duration = 0.6;
+ start = "window-width / window-width-before";
+ end = 1;
+ };
+ scale-y = {
+ curve = "cubic-bezier(0,0,0,1.28)";
+ duration = 0.5;
+ start = "window-height-before / window-height";
+ end = 1;
+ };
+ scale-y-reverse = {
+ curve = "cubic-bezier(0,0,0,1.28)";
+ duration = 0.6;
+ start = "window-height / window-height-before";
+ end = 1;
+ };
+ offset-x = {
+ curve = "cubic-bezier(0,0,0,1.28)";
+ duration = 0.5;
+ start = "window-x-before - window-x";
+ end = 0;
+ };
+ offset-y = {
+ curve = "cubic-bezier(0,0,0,1.28)";
+ duration = 0.5;
+ start = "window-y-before - window-y";
+ end = 0;
+ };
+ shadow-scale-x = "scale-x";
+ shadow-scale-y = "scale-y";
+ shadow-offset-x = "offset-x";
+ shadow-offset-y = "offset-y";
+ }
+ )
+ },
+
+# Animations for Rofi launchers.
+ {
+ match = "class_g = 'Rofi'";
+ animations = (
+ {
+ triggers = ["close", "hide"];
+ preset = "disappear";
+ duration = 0.05;
+ scale = 0.5;
+ },
+ {
+ triggers = ["open", "show"];
+ preset = "appear";
+ duration = 0.2;
+ scale = 0.5;
+ }
+ )
+ },
+
+# Animations for Dunst notifications.
+ {
+ match = "class_g = 'dunst'";
+ animations = (
+ {
+ triggers = ["close", "hide"];
+ preset = "fly-out"; #-dunst-close-preset
+ direction = "up"; #-dunst-close-direction
+ duration = 0.2;
+ },
+ {
+ triggers = ["open", "show"];
+ preset = "fly-in"; #-dunst-open-preset
+ direction = "up"; #-dunst-open-direction
+ duration = 0.2;
+ }
+ )
+ },
+
+# Animations for Jgmenu.
+ {
+ match = "class_g = 'jgmenu'";
+ animations = (
+ {
+ triggers = ["close", "hide"];
+ preset = "disappear";
+ duration = 0.08;
+ scale = 0.5;
+ },
+ {
+ triggers = ["open", "show"];
+ preset = "appear";
+ duration = 0.15;
+ scale = 0.5;
+ }
+ )
+ },
+
+# Animations for Scratchpad.
+ {
+ match = "class_g = 'bspwm-scratch'";
+ animations = (
+ {
+ triggers = ["close", "hide"];
+ preset = "fly-out";
+ direction = "up";
+ duration = 0.2;
+ },
+ {
+ triggers = ["open", "show"];
+ preset = "fly-in";
+ direction = "up";
+ duration = 0.2;
+ }
+ )
+ },
+
+# Animations for Eww Profile card.
+ {
+ match = "name = 'Eww - launchermenu'";
+ animations = (
+ {
+ triggers = ["close", "hide"];
+ preset = "slide-out";
+ direction = "right";
+ duration = 0.2;
+ },
+ {
+ triggers = ["open", "show"];
+ preset = "slide-in";
+ direction = "right";
+ duration = 0.2;
+ }
+ )
+ },
+
+# Animations for Eww Music player.
+ {
+ match = "name = 'Eww - music'";
+ animations = (
+ {
+ triggers = ["close", "hide"];
+ preset = "slide-out";
+ direction = "up";
+ duration = 0.2;
+ },
+ {
+ triggers = ["open", "show"];
+ preset = "slide-in";
+ direction = "up";
+ duration = 0.2;
+ }
+ )
+ },
+
+# Animations for Eww calendar.
+ {
+ match = "name = 'Eww - date'";
+ animations = (
+ {
+ triggers = ["close", "hide"];
+ preset = "fly-out";
+ direction = "up";
+ duration = 0.2;
+ },
+ {
+ triggers = ["open", "show"];
+ preset = "fly-in";
+ direction = "up";
+ duration = 0.2;
+ }
+ )
+ },
+
+# Animations for Eww Cheatsheet.
+ {
+ match = "name = 'Eww - csheet'";
+ animations = (
+ {
+ triggers = ["close", "hide"];
+ preset = "disappear";
+ duration = 0.08;
+ scale = 0.5;
+ },
+ {
+ triggers = ["open", "show"];
+ preset = "appear";
+ duration = 0.15;
+ scale = 0.5;
+ }
+ )
+ }
diff --git a/home-configuration/config/picom/picom.conf b/home-configuration/config/picom/picom.conf
new file mode 100644
index 0000000..46ecbd6
--- /dev/null
+++ b/home-configuration/config/picom/picom.conf
@@ -0,0 +1,157 @@
+## ----- Shadows ----- ##
+
+#shadow = true;
+
+shadow-radius = 1;
+shadow-opacity = .1;
+shadow-offset-x = -7;
+shadow-offset-y = -7;
+shadow-color = "#000000"
+
+## ----- Fading ----- ##
+
+fading = true;
+
+fade-in-step = 0.03;
+fade-out-step = 0.03;
+fade-delta = 5
+no-fading-openclose = false
+no-fading-destroyed-argb = false
+
+## ----- Transparency ----- ##
+
+frame-opacity = 1.0;
+
+# inactive-dim-fixed = true
+
+## ----- Corners ----- ##
+
+corner-radius = 0
+
+#################################
+# General Settings #
+#################################
+
+# Available backends "xrender" "glx" "egl"
+backend = "xrender"
+
+dithered-present = false;
+vsync = true;
+
+detect-rounded-corners = true;
+detect-client-opacity = true;
+detect-transient = true;
+
+use-damage = true;
+# xrender-sync-fence = false
+# transparent-clipping = false
+
+#################################
+# Rules #
+#################################
+
+
+
+blur:
+
+ {
+ method = "dual_kawase";
+ size = 10;
+ deviation = 2.5;
+ }
+
+rules: (
+
+ {
+ blur-background = true;
+ blur-background-fixed = true;
+ fade = false;
+ },
+
+ {
+ match = "window_type = 'dock'";
+ corner-radius = 0;
+ shadow = false;
+ },
+
+ {
+ match = "class_g = 'dwm' || class_g = 'Polybar' || class_g = 'dmenu'";
+ corner-radius = 0;
+ blur-background = true;
+ opacity = 0.80;
+ shadow = false;
+ },
+
+ {
+ match = "fullscreen = true";
+ corner-radius = 0;
+ },
+
+ {
+ match = "window_type = 'normal'";
+ fade = true; #-fade-switch
+ shadow = true; #-shadow-switch
+ },
+
+ {
+ match = "window_type = 'dialog'";
+ shadow = true; #-shadow-switch
+ },
+
+ {
+ match = "window_type = 'tooltip'";
+ corner-radius = 0;
+ opacity = 0.90;
+ },
+
+ {
+ match = "window_type = 'dock'";
+ corner-radius = 0;
+ fade = true;
+ },
+
+ {
+ match = "window_type = 'dropdown_menu' || window_type = 'menu' || window_type = 'popup' || window_type = 'popup_menu'";
+ corner-radius = 0;
+ },
+
+ {
+ match = "class_g = 'Alacritty' || class_g = 'kitty' || class_g = 'FloaTerm'";
+ opacity = 1.0; #-term-opacity-switch
+ blur-background = true; #-blur-switch
+ },
+
+ {
+ match = "class_g = 'Polybar' || "
+ "class_g = 'eww-bar' || "
+ "class_g = 'Viewnior' || "
+ "class_g = 'Rofi' || "
+ "class_g = 'mpv' || "
+ "class_g = 'bspwm-scratch' || "
+ "class_g = 'Dunst' || "
+ "class_g = 'retroarch'";
+ corner-radius = 0;
+ },
+
+ {
+ match = "name = 'Notification' || "
+ "class_g ?= 'Notify-osd' || "
+ "class_g = 'Dunst' || "
+ "class_g = 'Polybar' || "
+ "class_g = 'Eww' || "
+ "class_g = 'jgmenu' || "
+ "class_g = 'scratch' || "
+ "class_g = 'Spotify' || "
+ "class_g = 'retroarch' || "
+ "class_g = 'firefox' || "
+ "class_g = 'Rofi' || "
+ "class_g = 'Screenkey' || "
+ "class_g = 'mpv' || "
+ "class_g = 'Viewnior' || "
+ "_GTK_FRAME_EXTENTS@";
+ shadow = false;
+ },
+
+@include "picom-animations.conf"
+
+)
diff --git a/home-configuration/config/quickshell/config.js b/home-configuration/config/quickshell/config.js
new file mode 100644
index 0000000..0983a40
--- /dev/null
+++ b/home-configuration/config/quickshell/config.js
@@ -0,0 +1,22 @@
+const colors = {
+ bg: "#1a1b26",
+ bgDark: "#16161a",
+ fg: "#cdd6f4",
+ muted: "#444b6a",
+ cyan: "#d3869b",
+ purple: "#cba6f7",
+ red: "#f38ba8",
+ yellow: "#e0af68",
+ blue: "#89b4fa",
+}
+const bar = {
+ fontFamily: "Iosevka Nerd Font",
+ fontSize: 14,
+ height: 44,
+}
+const notifications = {
+ timeout: 5000,
+}
+const wallpaper = {
+ wallpaper: "file:///home/coast/Wallpapers/nature2art.png"
+}
diff --git a/home-configuration/config/quickshell/shell.qml b/home-configuration/config/quickshell/shell.qml
new file mode 100644
index 0000000..a1356b1
--- /dev/null
+++ b/home-configuration/config/quickshell/shell.qml
@@ -0,0 +1,124 @@
+import Quickshell
+import Quickshell.Wayland
+import Quickshell.Services.Notifications
+import QtQuick
+import QtQuick.Layouts
+
+import "config.js" as Config
+
+Scope {
+ id: root
+
+ NotificationServer {
+ id: server
+ actionsSupported: true
+ bodySupported: true
+ imageSupported: true
+
+ onNotification: n => {
+ n.tracked = true
+ }
+ }
+
+ PanelWindow {
+ anchors { top: true; right: true }
+ margins { top: 56; right: 12 }
+
+ implicitWidth: 380
+ implicitHeight: Math.max(1, column.implicitHeight)
+ color: "transparent"
+ exclusionMode: ExclusionMode.Ignore
+
+ ColumnLayout {
+ id: column
+ width: parent.width
+ spacing: 10
+
+ Repeater {
+ model: server.trackedNotifications
+
+ delegate: Rectangle {
+ id: card
+ required property var modelData
+
+ Timer {
+ running: card.modelData.urgency !== NotificationUrgency.Critical
+ interval: Config.notifications.timeout
+ repeat: false
+ onTriggered: card.modelData.dismiss()
+ }
+
+ Layout.fillWidth: true
+ implicitHeight: layout.implicitHeight + 20
+
+ radius: 12
+ color: Config.colors.bgDark
+
+ Rectangle {
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ width: 4
+ radius: 12
+ color: card.modelData.urgency === NotificationUrgency.Critical
+ ? Config.colors.red
+ : Config.colors.purple
+ }
+
+ RowLayout {
+ id: layout
+ anchors.fill: parent
+ anchors.margins: 10
+ anchors.leftMargin: 18
+ spacing: 10
+
+ Image {
+ Layout.preferredWidth: 36
+ Layout.preferredHeight: 36
+ Layout.alignment: Qt.AlignTop
+ fillMode: Image.PreserveAspectFit
+ visible: source.toString() !== ""
+ source: card.modelData.image || card.modelData.appIcon || ""
+ }
+
+ ColumnLayout {
+ Layout.fillWidth: true
+ spacing: 2
+
+ Text {
+ Layout.fillWidth: true
+ text: card.modelData.summary
+ color: Config.colors.cyan
+
+ font.family: Config.bar.fontFamily
+ font.pixelSize: Config.bar.fontSize
+ font.bold: true
+
+ elide: Text.ElideRight
+ }
+
+ Text {
+ Layout.fillWidth: true
+ visible: text !== ""
+ text: card.modelData.body
+ color: Config.colors.fg
+
+ font.family: Config.bar.fontFamily
+ font.pixelSize: Config.bar.fontSize - 1
+
+ wrapMode: Text.WordWrap
+ }
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: card.modelData.dismiss()
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/home-configuration/config/rofi/config.rasi b/home-configuration/config/rofi/config.rasi
new file mode 100755
index 0000000..58e885e
--- /dev/null
+++ b/home-configuration/config/rofi/config.rasi
@@ -0,0 +1,61 @@
+* {
+ highlight: bold italic;
+ scrollbar: true;
+
+ base-bg: #000000;
+ base-bg-soft: #1a1a1a;
+ base-bg-alt: #0d0d0d;
+ base-fg: #f5f5f5;
+ base-fg-dim: #808080;
+ accent: #ffffff;
+ accent-light: #e0e0e0;
+ accent-dark: #4d4d4d;
+ border-gray: #333333;
+
+ background: @base-bg;
+ background-color: @background;
+ foreground: @base-fg;
+ border-color: @border-gray;
+ separatorcolor: @border-color;
+ scrollbar-handle: @border-color;
+
+ normal-background: @background;
+ normal-foreground: @foreground;
+ alternate-normal-background: @base-bg-soft;
+ alternate-normal-foreground: @foreground;
+
+ selected-normal-background: @accent;
+ selected-normal-foreground: @base-bg-alt;
+
+ active-background: @accent;
+ active-foreground: @base-bg-alt;
+ alternate-active-background: @accent;
+ alternate-active-foreground: @active-foreground;
+
+ selected-active-background: @accent-light;
+ selected-active-foreground: @active-foreground;
+
+ urgent-background: @accent-dark;
+ urgent-foreground: @base-bg-alt;
+ alternate-urgent-background: @accent-dark;
+ alternate-urgent-foreground: @urgent-foreground;
+
+ selected-urgent-background: @accent-light;
+ selected-urgent-foreground: @urgent-foreground;
+
+ padding: 6px 6px;
+}
+
+configuration {
+ font: "Iosevka Nerd Font Propo 14";
+ show-icons: true;
+ terminal: "alacritty";
+}
+
+element-icon {
+ size: 20px;
+}
+
+window {
+ border-radius: 10px;
+}
diff --git a/home-configuration/config/waybar/config.jsonc b/home-configuration/config/waybar/config.jsonc
new file mode 100755
index 0000000..80a4967
--- /dev/null
+++ b/home-configuration/config/waybar/config.jsonc
@@ -0,0 +1,154 @@
+{
+ "reload-style-on-change": true,
+ "layer": "top",
+ "position": "top",
+ "output": "HDMI-A-1",
+ "spacing": 0,
+ "height": 35,
+ "border-radius": 25,
+
+ "modules-left": ["niri/workspaces"],
+ "modules-center": [],
+ "modules-right": ["group/right"],
+
+ "group/right": {
+ "orientation": "inherit",
+ "modules": [
+ "clock"
+ ]
+ },
+
+ "custom/active_window": {
+ "exec": "~/.config/waybar/window.sh",
+ "return-type": "json",
+ "markup": true
+ },
+
+ "niri/workspaces": {
+ "on-click": "activate",
+ "format": "{icon}",
+ "format-icons": {
+ "default": "",
+ "active": "",
+ "urgent": "",
+ "empty": ""
+ },
+ "persistent-workspaces": {
+ "1": [],
+ "2": [],
+ "3": [],
+ "4": [],
+ "5": [],
+ "6": [],
+ "7": [],
+ "8": []
+ }
+ },
+
+ "custom/wbmenu": {
+ "format": "<span size='13500'></span>",
+ "on-click": "rofi -show drun -config ~/.config/rofi/gruvbox.rasi",
+ "on-click-right": "xdg-terminal-exec",
+ "tooltip-format": "Menu\n\nSuper + Return"
+ },
+
+ "cpu": {
+ "interval": 2,
+ "format": "{icon} ",
+ "format-icons": ["󰪞", "󰪟", "󰪠", "󰪡", "󰪢", "󰪣", "󰪤", "󰪥"]
+ },
+
+ "memory": {
+ "interval": 2,
+ "format": "{icon}",
+ "format-icons": ["󰪞", "󰪟", "󰪠", "󰪡", "󰪢", "󰪣", "󰪤", "󰪥"]
+ },
+
+ "clock": {
+ "format": " {:%I:%M %p • %a, %d/%m} ",
+ "format-alt": "{:%A, %d %B %Y}",
+ "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
+ },
+
+ "network": {
+ "format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"],
+ "format": "{icon}",
+ "format-wifi": "{icon}",
+ "format-ethernet": "<span size='11500'>󰌘</span>",
+ "format-disconnected": "<span size='11500'>󰤮</span>",
+ "tooltip-format-wifi": "{essid} ({frequency} GHz)\n⇣{bandwidthDownBytes} ⇡{bandwidthUpBytes}",
+ "tooltip-format-ethernet": "⇣{bandwidthDownBytes} ⇡{bandwidthUpBytes}",
+ "tooltip-format-disconnected": "Disconnected",
+ "interval": 3,
+ "spacing": 1
+ },
+
+ "battery": {
+ "format": "{capacity}% {icon}",
+ "format-discharging": "{icon}",
+ "format-charging": "{icon}",
+ "format-plugged": "",
+ "format-icons": {
+ "charging": ["󰢜", "󰂆", "󰂇", "󰂈", "󰢝", "󰂉", "󰢞", "󰂊", "󰂋", "󰂅"],
+ "default": ["󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"]
+ },
+ "format-full": "󰂅",
+ "tooltip-format-discharging": "{power:>1.0f}W↓ {capacity}%",
+ "tooltip-format-charging": "{power:>1.0f}W↑ {capacity}%",
+ "interval": 5,
+ "states": {
+ "warning": 20,
+ "critical": 10
+ }
+ },
+
+ "bluetooth": {
+ "format": "<span size='11500'>󰂯</span>",
+ "format-disabled": "<span size='11500'>󰂲</span>",
+ "format-connected": "<span size='11500'></span>",
+ "format-no-controller": "",
+ "tooltip-format": "Devices connected: {num_connections}"
+ },
+
+ "pulseaudio": {
+ "format": "{icon}{volume}%",
+ "on-click-right": "pamixer -t",
+ "tooltip-format": "Playing at {volume}%",
+ "scroll-step": 5,
+ "format-muted": "",
+ "format-icons": {
+ "default": [" ", " ", " "]
+ }
+ },
+
+ "group/tray-expander": {
+ "orientation": "inherit",
+ "drawer": {
+ "transition-duration": 600,
+ "children-class": "tray-group-item"
+ },
+ "modules": ["custom/expand-icon", "tray"]
+ },
+
+ "custom/expand-icon": {
+ "format": "",
+ "tooltip": false
+ },
+
+ "tray": {
+ "icon-size": 16,
+ "spacing": 8
+ },
+
+ "custom/separator#blank": {
+ "format": " ",
+ "interval": "once",
+ "tooltip": false
+ },
+
+ "custom/separator#dot": {
+ "format": " ",
+ "interval": "once",
+ "tooltip": false
+ }
+}
diff --git a/home-configuration/config/waybar/style.css b/home-configuration/config/waybar/style.css
new file mode 100755
index 0000000..7f63e4b
--- /dev/null
+++ b/home-configuration/config/waybar/style.css
@@ -0,0 +1,207 @@
+@define-color background #0E0F12;
+@define-color foreground #E6DAD1;
+@define-color accent #A07A6A;
+@define-color muted #6E5A52;
+@define-color subtle #15161A;
+
+* {
+ color: @foreground;
+ border: none;
+ border-radius: 0;
+ min-height: 0;
+ font-family: 'JetBrainsMono Nerd Font Propo';
+ font-size: 12px;
+}
+
+window#waybar {
+ background-color: @background;
+ transition-property: background-color;
+ transition-duration: .5s;
+}
+
+window#waybar > box {
+ background-color: @background;
+ border-radius: 32px;
+ margin: 2px 10px 0px 10px;
+}
+
+window#waybar.empty #window {
+ background: transparent;
+ background-color: transparent;
+ border: none;
+ border-radius: 0;
+ color: transparent;
+ padding: 0;
+ margin: 0;
+}
+
+#waybar.empty .modules-center {
+ opacity: 0;
+}
+
+.modules-left {
+ margin-left: 8px;
+}
+.modules-right {
+ margin-right: 8px;
+}
+
+#workspaces {
+ padding: 0px 5px;
+ margin: 3.5px 3.5px;
+ border-radius: 11px;
+ background-color: alpha(@foreground, 0.06);
+ opacity: 0.95;
+}
+
+#workspaces button {
+ all: initial;
+ color: @foreground;
+ padding: 0 6px;
+ margin: 0 1.5px;
+ min-width: 9px;
+}
+
+#workspaces button.empty {
+ opacity: 0.45;
+}
+
+#workspaces button.active {
+ border-radius: 18px;
+ background: alpha(@foreground, 0.14);
+ opacity: 1;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ margin-left: 5px;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+
+#workspaces button:hover {
+ border-radius: 18px;
+ background: alpha(@foreground, 0.08);
+ opacity: 1;
+}
+
+#workspaces button.urgent {
+ border-radius: 18px;
+ background: alpha(#f13333, 0.4);
+ opacity: 1;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ margin-left: 5px;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+
+#clock {
+ font-size: 13px;
+ font-weight: 700;
+}
+
+#battery,
+#pulseaudio,
+#custom-screenrecording-indicator,
+#custom-update {
+ min-width: 12px;
+ margin: 0 7.5px;
+}
+
+#pulseaudio {
+ margin-right: 5px;
+}
+
+#bluetooth {
+ margin-right: 12px;
+}
+
+#network {
+ margin-right: 9px;
+}
+
+#custom-idle-indicator,
+#custom-notification-silencing-indicator {
+ margin-right: 2px;
+ min-width: 15px;
+}
+
+#custom-update {
+ font-size: 10px;
+}
+
+#custom-screenrecording-indicator {
+ min-width: 12px;
+ margin-left: 8.75px;
+ font-size: 10px;
+}
+
+#custom-screenrecording-indicator.active {
+ color: red;
+}
+
+#tray {
+ background: alpha(@foreground, 0.0);
+ border-radius: 16px;
+ padding: 0px 5px;
+ margin: 3.5px 2px;
+ margin-right: 4px;
+}
+
+#custom-omarchy {
+ background: alpha(@foreground, 0.08);
+ border-radius: 99px;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ margin-left: -3px;
+ margin-right: 5px;
+ padding-right: 7px;
+ padding-left: 7px;
+}
+
+#cpu, #memory {
+ font-size: 18px;
+ padding: 2px 1px;
+}
+
+#custom-active_window {
+ padding: 3px 6px;
+ border-radius: 14px;
+ background: alpha(@foreground, 0.06);
+ font-size: 12px;
+}
+
+#group-right1,
+#group_right1,
+#right1 {
+ font-weight: 800;
+ background: transparent;
+ padding: 0px 5px;
+ margin: 3.5px 2px;
+}
+
+#group-left,
+#group_left,
+#left,
+#group-right,
+#group_right,
+#right {
+ font-weight: 800;
+ background: alpha(@foreground, 0.06);
+ border-radius: 12px;
+ padding: 0px 5px;
+ margin: 3.5px 2px;
+}
+
+tooltip {
+ background: @subtle;
+ border: 1px solid alpha(@foreground, 0.12);
+ border-radius: 4px 4px 11px 11px;
+}
+
+tooltip label {
+ color: alpha(@foreground, 0.92);
+}
+
+.hidden {
+ opacity: 0;
+}
diff --git a/home-configuration/config/waybar/window.sh b/home-configuration/config/waybar/window.sh
new file mode 100755
index 0000000..abf1e39
--- /dev/null
+++ b/home-configuration/config/waybar/window.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+
+MAX_TITLE_LEN=20
+
+print_status() {
+ window=$(hyprctl activewindow -j 2>/dev/null)
+ address=$(jq -r '.address // empty' <<< "$window")
+
+ # No active window → show Desktop + Workspace
+ if [[ -z "$address" || "$address" == "null" ]]; then
+ ws=$(hyprctl activeworkspace -j | jq -r '.id')
+
+ top_line="Desktop"
+ bottom_line="Workspace $ws"
+
+ esc_top=$(sed 's/&/&amp;/g; s/</&lt;/g; s/>/&gt;/g' <<< "$top_line")
+ esc_bottom=$(sed 's/&/&amp;/g; s/</&lt;/g; s/>/&gt;/g' <<< "$bottom_line")
+
+ text="<span size='7500' foreground='#a6adc8' rise='-2000'>$esc_top</span>
+<span size='9000' weight='bold' foreground='#ffffff'>$esc_bottom</span>"
+
+ jq -nc \
+ --arg text "$text" \
+ --arg tooltip "$bottom_line" \
+ '{ text: $text, class: "custom-window", tooltip: $tooltip }'
+ return
+ fi
+
+ class=$(jq -r '.class // "Unknown"' <<< "$window")
+ title=$(jq -r '.title // ""' <<< "$window")
+
+ app_class="${class,,}"
+
+ # Discord / Vesktop cleanup
+ if [[ "$app_class" == *discord* || "$app_class" == *vesktop* ]]; then
+ title=$(sed -E 's/^\([0-9]+\)[[:space:]]*//' <<< "$title")
+ title=$(sed -E 's/^Discord[[:space:]]*\|[[:space:]]*//' <<< "$title")
+ fi
+
+ # Truncate title
+ if (( ${#title} > MAX_TITLE_LEN )); then
+ title="${title:0:$((MAX_TITLE_LEN-3))}..."
+ fi
+
+ esc_top=$(sed 's/&/&amp;/g; s/</&lt;/g; s/>/&gt;/g' <<< "$class")
+ esc_bottom=$(sed 's/&/&amp;/g; s/</&lt;/g; s/>/&gt;/g' <<< "$title")
+
+ text="<span size='7500' foreground='#a6adc8' rise='-2000'>$esc_top</span>
+<span size='9000' weight='bold' foreground='#ffffff'>$esc_bottom</span>"
+
+ tooltip="$class: $title"
+
+ jq -nc \
+ --arg text "$text" \
+ --arg tooltip "$tooltip" \
+ '{ text: $text, class: "custom-window", tooltip: $tooltip }'
+}
+
+# Initial output
+print_status
+
+last=""
+
+# Update only when state changes
+while true; do
+ current_window=$(hyprctl activewindow -j 2>/dev/null)
+ current_ws=$(hyprctl activeworkspace -j 2>/dev/null)
+
+ current="$current_window$current_ws"
+
+ if [[ "$current" != "$last" ]]; then
+ print_status
+ last="$current"
+ fi
+
+ sleep 0.5
+done
diff --git a/home-configuration/config/xmobar/xmobarrc b/home-configuration/config/xmobar/xmobarrc
new file mode 100644
index 0000000..d9c81ef
--- /dev/null
+++ b/home-configuration/config/xmobar/xmobarrc
@@ -0,0 +1,8 @@
+Config {
+ font = "xft:Iosevka Nerd Font-14",
+ bgColor = "#000000",
+ fgColor = "#ffffff",
+ position = TopW L 100,
+ commands = [ Run XMonadLog ],
+ template = "%XMonadLog%"
+ }
diff --git a/home-configuration/config/xmobar/xmobarrc~ b/home-configuration/config/xmobar/xmobarrc~
new file mode 100644
index 0000000..5b7110a
--- /dev/null
+++ b/home-configuration/config/xmobar/xmobarrc~
@@ -0,0 +1,8 @@
+Config {
+ font = "xft:Iosevka Nerd Font-14",
+ bgColor = "#000000",
+ fgColor = "#ffffff",
+ position = Top,
+ commands = [ Run XMonadLog ],
+ template = %XMonadLog%
+ } \ No newline at end of file
diff --git a/home-configuration/config/xmonad/xmonad.hs b/home-configuration/config/xmonad/xmonad.hs
new file mode 100644
index 0000000..a5db5a8
--- /dev/null
+++ b/home-configuration/config/xmonad/xmonad.hs
@@ -0,0 +1,45 @@
+import XMonad
+import XMonad.Util.EZConfig (additionalKeysP)
+import XMonad.Layout.Spacing
+import XMonad.Hooks.DynamicLog
+import XMonad.Hooks.StatusBar
+import XMonad.Hooks.ManageDocks
+import XMonad.Hooks.InsertPosition
+import qualified XMonad.StackSet as W
+
+myLayoutHook = avoidStruts $ spacingWithEdge 3 $ layoutHook def
+
+myXmobarPP :: PP
+myXmobarPP = def
+ {
+ ppCurrent = xmobarColor "#0db9d7" "",
+ ppHidden = xmobarColor "#a9b1d6" "",
+ ppHiddenNoWindows = xmobarColor "#444b6a" ""
+ }
+
+myStatusBar = statusBarPropTo "_XMONAD_LOG" "xmobar -x 1" (pure myXmobarPP)
+
+myManageHook = insertPosition End Newer
+
+myKeys =
+ [
+ ("M-<Return>", spawn "alacritty"),
+ ("M-r", spawn "rofi -show drun"),
+ ("M-S-r", spawn "xmonad --recompile" >> spawn "xmonad --restart"),
+ ("M-s", kill),
+ ("M-S-s", spawn "/home/coast/.local/bin/screenshot"),
+ ("M-f", withFocused $ \w -> windows $ W.float w (W.RationalRect 0 0 1 1)),
+ ("M-S-f", withFocused (windows . W.sink))
+ ]
+
+main = xmonad $ withEasySB myStatusBar defToggleStrutsKey $ def
+ {
+ modMask = mod4Mask,
+ terminal = "alacritty",
+ borderWidth = 2,
+ normalBorderColor = "#444b6a",
+ focusedBorderColor = "#ad8ee6",
+ layoutHook = myLayoutHook,
+ manageHook = myManageHook
+ }
+ `additionalKeysP` myKeys
diff --git a/home-configuration/config/xmonad/xmonad.hs~ b/home-configuration/config/xmonad/xmonad.hs~
new file mode 100644
index 0000000..e39d3be
--- /dev/null
+++ b/home-configuration/config/xmonad/xmonad.hs~
@@ -0,0 +1,46 @@
+import XMonad
+import XMonad.Util.EZConfig (additionalKeysP)
+import XMonad.Layout.Spacing
+import XMonad.Hooks.DynamicLog
+import XMonad.Hooks.StatusBar
+import XMonad.Hooks.ManageDocks
+import XMonad.Hooks.ManageHelpers
+import qualified XMonad.StackSet as W
+
+myLayoutHook = avoidStruts $ spacingWithEdge 3 $ layoutHook def
+
+myXmobarPP :: PP
+myXmobarPP = def
+ {
+ ppCurrent = xmobarColor "#0db9d7" "",
+ ppHidden = xmobarColor "#a9b1d6" "",
+ ppHiddenNoWindows = xmobarColor "#444b6a" ""
+ }
+
+myStatusBar = statusBarPropTo "_XMONAD_LOG" "xmobar -x 1" (pure myXmobarPP)
+
+myManageHook = composeAll
+ [
+ (return True) --> doF W.shiftMaster
+ ]
+
+myKeys =
+ [
+ ("M-<Return>", spawn "alacritty"),
+ ("M-r", spawn "rofi -show drun"),
+ ("M-S-r", spawn "xmonad --recompile" >> spawn "xmonad --restart"),
+ ("M-s", kill),
+ ("M-S-s", spawn "/home/coast/.local/bin/screenshot")
+ ]
+
+main = xmonad $ withEasySB myStatusBar defToggleStrutsKey $ def
+ {
+ modMask = mod4Mask,
+ terminal = "alacritty",
+ borderWidth = 2,
+ normalBorderColor = "#444b6a",
+ focusedBorderColor = "#ad8ee6",
+ layoutHook = myLayoutHook,
+ manageHook = myManageHook
+ }
+ `additionalKeysP` myKeys
diff --git a/home-configuration/config/zathura/zathurarc b/home-configuration/config/zathura/zathurarc
new file mode 100644
index 0000000..96ee898
--- /dev/null
+++ b/home-configuration/config/zathura/zathurarc
@@ -0,0 +1,46 @@
+set default-fg "#CDD6F4"
+set default-bg "#09090F"
+
+set completion-bg "#09090F"
+set completion-fg "#CDD6F4"
+set completion-highlight-bg "#09090F"
+
+set completion-highlight-fg "#CDD6F4"
+set completion-group-bg "#09090F"
+
+set completion-group-fg "#89B4FA"
+
+set statusbar-fg "#d4be98"
+set statusbar-bg "#32302f"
+
+
+set notification-bg "#09090F"
+
+set notification-fg "#CDD6F4"
+set notification-error-bg "#09090F"
+set notification-error-fg "#F38BA8"
+set notification-warning-bg "#09090F"
+set notification-warning-fg "#FAE3B0"
+
+set inputbar-fg "#CDD6F4"
+set inputbar-bg "#09090F"
+
+
+set recolor "true"
+set recolor-lightcolor "#09090F"
+set recolor-darkcolor "#d4be98"
+
+set index-fg "#CDD6F4"
+set index-bg "#09090F"
+
+set index-active-fg "#CDD6F4"
+set index-active-bg "#09090F"
+
+
+set render-loading-bg "#09090F"
+set render-loading-fg "#CDD6F4"
+
+set highlight-color "#575268"
+set highlight-fg "#F5C2E7"
+set highlight-active-color "#F5C2E7"
+set guioptions none
diff --git a/home-configuration/default.nix b/home-configuration/default.nix
new file mode 100644
index 0000000..0c955db
--- /dev/null
+++ b/home-configuration/default.nix
@@ -0,0 +1,103 @@
+{ config, pkgs, ... }:
+let
+ configs = {
+ niri = "niri";
+ alacritty = "alacritty";
+ rofi = "rofi";
+ #waybar = "waybar";
+ nvim = "nvim";
+ zathura = "zathura";
+ quickshell = "quickshell";
+ };
+in
+{
+ imports = [
+ ./managed/waybar
+ ./managed/discord
+ ./managed/git
+ ./managed/prismlauncher
+ ./managed/obs-studio
+ ];
+ home.username = "coast";
+ home.homeDirectory = "/home/coast";
+ home.stateVersion = "26.05";
+ home.enableNixpkgsReleaseCheck = false;
+ xdg.configFile = builtins.mapAttrs
+ (key: subpath: {
+ source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Configuration/home-configuration/config/${subpath}";
+ recursive = true;
+ })
+ configs;
+
+ dconf.settings = {
+ "org/gnome/desktop/interface" = {
+ color-scheme = "prefer-dark";
+ };
+ };
+
+ gtk.enable = true;
+ systemd.user.sessionVariables = config.home.sessionVariables;
+ qt.enable = true;
+ qt.kvantum.enable = true;
+ qt.kvantum.themes = [
+ pkgs.gruvbox-kvantum
+ pkgs.catppuccin-kvantum
+ ];
+
+
+
+ home.packages = [
+ pkgs.python3
+ pkgs.starship
+ pkgs.libarchive
+ pkgs.fastfetch
+ pkgs.alacritty
+ pkgs.awww
+ pkgs.xwayland-satellite
+ pkgs.telegram-desktop
+ pkgs.mpv
+ pkgs.jdk25
+ pkgs.nil
+ pkgs.nixpkgs-fmt
+ pkgs.qbittorrent
+ pkgs.nautilus
+ pkgs.caja
+ pkgs.xray
+ pkgs.git
+ pkgs.gnumake
+ pkgs.clang
+ pkgs.clang-tools
+ pkgs.haskell-language-server
+ pkgs.imagemagick
+ pkgs.xclip
+ pkgs.picom
+ pkgs.dnsutils
+ pkgs.python3Packages.pip
+ pkgs.cmake
+ pkgs.libtool
+ pkgs.brightnessctl
+ pkgs.pkg-config
+ pkgs.lua
+ pkgs.lua-language-server
+ pkgs.rust-analyzer
+ pkgs.rustc
+ pkgs.cargo
+ pkgs.rustfmt
+ pkgs.clippy
+ pkgs.ffmpeg
+ pkgs.mumble
+ pkgs.eog
+ pkgs.zathura
+ pkgs.gimp3
+ pkgs.gamescope
+ pkgs.xkill
+ pkgs.trayer
+ pkgs.quickshell
+ pkgs.libnotify
+ pkgs.kdePackages.kdenlive
+ pkgs.obs-cmd
+ pkgs.gedit
+ pkgs.feishin
+ pkgs.gnome-themes-extra
+ ];
+}
diff --git a/home-configuration/managed/discord/default.nix b/home-configuration/managed/discord/default.nix
new file mode 100644
index 0000000..039724d
--- /dev/null
+++ b/home-configuration/managed/discord/default.nix
@@ -0,0 +1,13 @@
+{ pkgs, ... }:
+{
+ home.packages = [ pkgs.vesktop ];
+
+ # change the desktop file
+ xdg.desktopEntries.vesktop.comment = "VESKTOP, a Discord client, running on socks5:2080";
+ xdg.desktopEntries.vesktop.name = "Vesktop (Modified)";
+ xdg.desktopEntries.vesktop.genericName = "Discord client";
+ xdg.desktopEntries.vesktop.exec = "vesktop --proxy-server=\"socks5://127.0.0.1:2080 %U\"";
+ xdg.desktopEntries.vesktop.icon = "vesktop";
+ xdg.desktopEntries.vesktop.type = "Application";
+ xdg.desktopEntries.vesktop.categories = [ "Network" "InstantMessaging" ];
+}
diff --git a/home-configuration/managed/git/default.nix b/home-configuration/managed/git/default.nix
new file mode 100644
index 0000000..569e214
--- /dev/null
+++ b/home-configuration/managed/git/default.nix
@@ -0,0 +1,2 @@
+{ pkgs, ... }:
+{ }
diff --git a/home-configuration/managed/obs-studio/default.nix b/home-configuration/managed/obs-studio/default.nix
new file mode 100644
index 0000000..908a24d
--- /dev/null
+++ b/home-configuration/managed/obs-studio/default.nix
@@ -0,0 +1,12 @@
+{ pkgs, ... }:
+{
+ programs.obs-studio.enable = true;
+ programs.obs-studio.package = (pkgs.obs-studio.override { cudaSupport = true; });
+ programs.obs-studio.plugins = [
+ pkgs.obs-studio-plugins.wlrobs
+ pkgs.obs-studio-plugins.obs-backgroundremoval
+ pkgs.obs-studio-plugins.obs-vaapi
+ pkgs.obs-studio-plugins.obs-gstreamer
+ pkgs.obs-studio-plugins.obs-vkcapture
+ ];
+}
diff --git a/home-configuration/managed/prismlauncher/default.nix b/home-configuration/managed/prismlauncher/default.nix
new file mode 100644
index 0000000..f31c610
--- /dev/null
+++ b/home-configuration/managed/prismlauncher/default.nix
@@ -0,0 +1,31 @@
+{ lib, pkgs, ... }:
+let
+ pname = "prismlauncher";
+ version = "11.0.2-1";
+ src = pkgs.fetchurl {
+ url = "https://github.com/Diegiwg/PrismLauncher-Cracked/releases/download/${version}/PrismLauncher-Linux-x86_64.AppImage";
+ hash = "sha256-P+6s4g8uCqXQx0p5rieJFpuDV7AquGVYrcTs9XWFAsA=";
+ };
+ icon = pkgs.fetchurl {
+ url = "https://upload.wikimedia.org/wikipedia/commons/7/74/Prism_Launcher_logo.svg";
+ hash = "sha256-AQexWc1uadtsYQpTTwI3BVCJQyfV2AZ/jxNWshyFxnE=";
+ };
+in
+{
+ home.packages = [
+ (pkgs.appimageTools.wrapType2 {
+ inherit pname version src;
+ meta = {
+ description = "Cracked version of Prism Launcher";
+ platforms = [ "x86_64-linux" ];
+ sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+ };
+ })
+ ];
+ home.file.".local/share/icons/hicolor/scalable/apps/prismlauncher.svg".source = icon;
+ xdg.desktopEntries.prismlauncher.comment = "Cracked version of Prism Launcher";
+ xdg.desktopEntries.prismlauncher.name = "Prism Launcher (Modified)";
+ xdg.desktopEntries.prismlauncher.genericName = "Prism Launcher client";
+ xdg.desktopEntries.prismlauncher.exec = "prismlauncher";
+ xdg.desktopEntries.prismlauncher.icon = "prismlauncher";
+}
diff --git a/home-configuration/managed/waybar/default.nix b/home-configuration/managed/waybar/default.nix
new file mode 100644
index 0000000..e72c78b
--- /dev/null
+++ b/home-configuration/managed/waybar/default.nix
@@ -0,0 +1,26 @@
+{ pkgs, ... }:
+{
+ programs.waybar.enable = true;
+ programs.waybar.package = pkgs.waybar;
+ programs.waybar.systemd.enable = false;
+ programs.waybar.settings.mainBar.layer = "top";
+ programs.waybar.settings.mainBar.position = "top";
+ programs.waybar.settings.mainBar.spacing = "0";
+ programs.waybar.settings.mainBar.height = 35;
+ programs.waybar.settings.mainBar.border-radius = 25;
+ programs.waybar.settings.mainBar.output = [ "HDMI-A-1" ];
+
+ programs.waybar.settings.mainBar.modules-left = [ "niri/workspaces" ];
+ programs.waybar.settings.mainBar.modules-center = [ "niri/window" ];
+ programs.waybar.settings.mainBar.modules-right = [ "clock" ];
+
+ programs.waybar.settings.mainBar."custom/distro-icon".format = "󱄅";
+ programs.waybar.settings.mainBar."custom/distro-icon".tooltip = "false";
+ programs.waybar.settings.mainBar."niri/workspaces".disable-scroll = true;
+ programs.waybar.settings.mainBar."niri/workspaces".all-outputs = false;
+ programs.waybar.settings.mainBar."niri/workspaces".on-click = "activate";
+ programs.waybar.settings.mainBar."clock".format = "{:%I:%M %p • %a, %d/%m}";
+ programs.waybar.settings.mainBar."clock".format-alt = "{:%A, %d %B %Y}";
+ programs.waybar.settings.mainBar."clock".tooltip-format = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>";
+ imports = [ ./style.nix ];
+}
diff --git a/home-configuration/managed/waybar/style.nix b/home-configuration/managed/waybar/style.nix
new file mode 100644
index 0000000..83bff23
--- /dev/null
+++ b/home-configuration/managed/waybar/style.nix
@@ -0,0 +1,101 @@
+{ ... }:
+{
+ programs.waybar.style = ''
+ * {
+ font-family: "Iosevka Nerd Font";
+ font-size: 14px;
+ }
+
+ window#waybar {
+ background-color: #000000;
+ margin: 0;
+ }
+
+ #workspaces {
+ margin: 8px 0 4px 8px;
+ }
+
+ #workspaces button {
+ color: #89b4fa;
+ background: #16161a;
+ margin-right: 6px;
+ border-radius: 12px;
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.4);
+ padding: 4px 12px;
+ font-weight: bold;
+ transition: all 0.3s ease;
+ }
+
+ #workspaces button.active {
+ color: #09090F;
+ margin-right: 6px;
+ border-radius: 12px;
+ background: linear-gradient(135deg, #cba6f7, #f9e2af, #a6e3a1, #89b4fa);
+ background-size: 200% 200%;
+ animation: shift 6s ease infinite;
+ }
+
+ @keyframes shift {
+ 0% { background-position: 0% 50%; }
+ 50% { background-position: 100% 50%; }
+ 100% { background-position: 0% 50%; }
+ }
+
+ #window {
+ color: #d3869b;
+ margin: 8px 8px 4px 8px;
+ border-radius: 12px;
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.4);
+ padding: 4px 12px;
+ font-weight: bold;
+ }
+
+ #cpu,
+ #network,
+ #wireplumber,
+ #battery {
+ color: #d3869b;
+ background: #16161a;
+ margin: 8px 8px 4px 0;
+ border-radius: 12px;
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.4);
+ padding: 4px 12px;
+ font-weight: bold;
+ }
+
+ #clock {
+ background: linear-gradient(135deg, #cdd6f4, #f38ba8);
+ background-size: 200% 200%;
+ animation: shift 6s ease infinite;
+ margin: 8px 8px 4px 0;
+ border-radius: 12px;
+ padding: 4px 12px;
+ color: #09090F;
+ font-weight: bold;
+ text-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+ }
+
+ #taskbar {
+ background: #16161a;
+ color: #89b4fa;
+ margin: 8px 8px 4px 0;
+ border-radius: 12px;
+ min-width: 38px;
+ padding: 3px;
+ font-weight: bold;
+ }
+
+ #custom-distro-icon {
+ background: radial-gradient(circle, rgba(203,166,247,1) 0%, rgba(193,168,247,1) 12%, rgba(249,226,175,1) 19%, rgba(189,169,247,1) 20%, rgba(182,171,247,1) 24%, rgba(198,255,194,1) 36%, rgba(177,172,247,1) 37%, rgba(170,173,248,1) 48%, rgba(255,255,255,1) 52%, rgba(166,174,248,1) 52%, rgba(160,175,248,1) 59%, rgba(148,226,213,1) 66%, rgba(155,176,248,1) 67%, rgba(152,177,248,1) 68%, rgba(205,214,244,1) 77%, rgba(148,178,249,1) 78%, rgba(144,179,250,1) 82%, rgba(180,190,254,1) 83%, rgba(141,179,250,1) 90%, rgba(137,180,250,1) 100%);
+ background-size: 400% 400%;
+ color: #09090F;
+ margin: 8px 4px 4px 8px;
+ border-radius: 12px;
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.4);
+ padding: 0;
+ min-width: 34px;
+ font-size: 18px;
+ font-weight: bold;
+ }
+ '';
+}