feat: init bce757a0
Steve · 2025-11-30 20:12 9 file(s) · +1578 −0
.gitignore (added) +2 −0
1 +
doc/tags
2 +
.DS_Store
LICENSE (added) +674 −0
1 +
                    GNU GENERAL PUBLIC LICENSE
2 +
                       Version 3, 29 June 2007
3 +
4 +
 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5 +
 Everyone is permitted to copy and distribute verbatim copies
6 +
 of this license document, but changing it is not allowed.
7 +
8 +
                            Preamble
9 +
10 +
  The GNU General Public License is a free, copyleft license for
11 +
software and other kinds of works.
12 +
13 +
  The licenses for most software and other practical works are designed
14 +
to take away your freedom to share and change the works.  By contrast,
15 +
the GNU General Public License is intended to guarantee your freedom to
16 +
share and change all versions of a program--to make sure it remains free
17 +
software for all its users.  We, the Free Software Foundation, use the
18 +
GNU General Public License for most of our software; it applies also to
19 +
any other work released this way by its authors.  You can apply it to
20 +
your programs, too.
21 +
22 +
  When we speak of free software, we are referring to freedom, not
23 +
price.  Our General Public Licenses are designed to make sure that you
24 +
have the freedom to distribute copies of free software (and charge for
25 +
them if you wish), that you receive source code or can get it if you
26 +
want it, that you can change the software or use pieces of it in new
27 +
free programs, and that you know you can do these things.
28 +
29 +
  To protect your rights, we need to prevent others from denying you
30 +
these rights or asking you to surrender the rights.  Therefore, you have
31 +
certain responsibilities if you distribute copies of the software, or if
32 +
you modify it: responsibilities to respect the freedom of others.
33 +
34 +
  For example, if you distribute copies of such a program, whether
35 +
gratis or for a fee, you must pass on to the recipients the same
36 +
freedoms that you received.  You must make sure that they, too, receive
37 +
or can get the source code.  And you must show them these terms so they
38 +
know their rights.
39 +
40 +
  Developers that use the GNU GPL protect your rights with two steps:
41 +
(1) assert copyright on the software, and (2) offer you this License
42 +
giving you legal permission to copy, distribute and/or modify it.
43 +
44 +
  For the developers' and authors' protection, the GPL clearly explains
45 +
that there is no warranty for this free software.  For both users' and
46 +
authors' sake, the GPL requires that modified versions be marked as
47 +
changed, so that their problems will not be attributed erroneously to
48 +
authors of previous versions.
49 +
50 +
  Some devices are designed to deny users access to install or run
51 +
modified versions of the software inside them, although the manufacturer
52 +
can do so.  This is fundamentally incompatible with the aim of
53 +
protecting users' freedom to change the software.  The systematic
54 +
pattern of such abuse occurs in the area of products for individuals to
55 +
use, which is precisely where it is most unacceptable.  Therefore, we
56 +
have designed this version of the GPL to prohibit the practice for those
57 +
products.  If such problems arise substantially in other domains, we
58 +
stand ready to extend this provision to those domains in future versions
59 +
of the GPL, as needed to protect the freedom of users.
60 +
61 +
  Finally, every program is threatened constantly by software patents.
62 +
States should not allow patents to restrict development and use of
63 +
software on general-purpose computers, but in those that do, we wish to
64 +
avoid the special danger that patents applied to a free program could
65 +
make it effectively proprietary.  To prevent this, the GPL assures that
66 +
patents cannot be used to render the program non-free.
67 +
68 +
  The precise terms and conditions for copying, distribution and
69 +
modification follow.
70 +
71 +
                       TERMS AND CONDITIONS
72 +
73 +
  0. Definitions.
74 +
75 +
  "This License" refers to version 3 of the GNU General Public License.
76 +
77 +
  "Copyright" also means copyright-like laws that apply to other kinds of
78 +
works, such as semiconductor masks.
79 +
80 +
  "The Program" refers to any copyrightable work licensed under this
81 +
License.  Each licensee is addressed as "you".  "Licensees" and
82 +
"recipients" may be individuals or organizations.
83 +
84 +
  To "modify" a work means to copy from or adapt all or part of the work
85 +
in a fashion requiring copyright permission, other than the making of an
86 +
exact copy.  The resulting work is called a "modified version" of the
87 +
earlier work or a work "based on" the earlier work.
88 +
89 +
  A "covered work" means either the unmodified Program or a work based
90 +
on the Program.
91 +
92 +
  To "propagate" a work means to do anything with it that, without
93 +
permission, would make you directly or secondarily liable for
94 +
infringement under applicable copyright law, except executing it on a
95 +
computer or modifying a private copy.  Propagation includes copying,
96 +
distribution (with or without modification), making available to the
97 +
public, and in some countries other activities as well.
98 +
99 +
  To "convey" a work means any kind of propagation that enables other
100 +
parties to make or receive copies.  Mere interaction with a user through
101 +
a computer network, with no transfer of a copy, is not conveying.
102 +
103 +
  An interactive user interface displays "Appropriate Legal Notices"
104 +
to the extent that it includes a convenient and prominently visible
105 +
feature that (1) displays an appropriate copyright notice, and (2)
106 +
tells the user that there is no warranty for the work (except to the
107 +
extent that warranties are provided), that licensees may convey the
108 +
work under this License, and how to view a copy of this License.  If
109 +
the interface presents a list of user commands or options, such as a
110 +
menu, a prominent item in the list meets this criterion.
111 +
112 +
  1. Source Code.
113 +
114 +
  The "source code" for a work means the preferred form of the work
115 +
for making modifications to it.  "Object code" means any non-source
116 +
form of a work.
117 +
118 +
  A "Standard Interface" means an interface that either is an official
119 +
standard defined by a recognized standards body, or, in the case of
120 +
interfaces specified for a particular programming language, one that
121 +
is widely used among developers working in that language.
122 +
123 +
  The "System Libraries" of an executable work include anything, other
124 +
than the work as a whole, that (a) is included in the normal form of
125 +
packaging a Major Component, but which is not part of that Major
126 +
Component, and (b) serves only to enable use of the work with that
127 +
Major Component, or to implement a Standard Interface for which an
128 +
implementation is available to the public in source code form.  A
129 +
"Major Component", in this context, means a major essential component
130 +
(kernel, window system, and so on) of the specific operating system
131 +
(if any) on which the executable work runs, or a compiler used to
132 +
produce the work, or an object code interpreter used to run it.
133 +
134 +
  The "Corresponding Source" for a work in object code form means all
135 +
the source code needed to generate, install, and (for an executable
136 +
work) run the object code and to modify the work, including scripts to
137 +
control those activities.  However, it does not include the work's
138 +
System Libraries, or general-purpose tools or generally available free
139 +
programs which are used unmodified in performing those activities but
140 +
which are not part of the work.  For example, Corresponding Source
141 +
includes interface definition files associated with source files for
142 +
the work, and the source code for shared libraries and dynamically
143 +
linked subprograms that the work is specifically designed to require,
144 +
such as by intimate data communication or control flow between those
145 +
subprograms and other parts of the work.
146 +
147 +
  The Corresponding Source need not include anything that users
148 +
can regenerate automatically from other parts of the Corresponding
149 +
Source.
150 +
151 +
  The Corresponding Source for a work in source code form is that
152 +
same work.
153 +
154 +
  2. Basic Permissions.
155 +
156 +
  All rights granted under this License are granted for the term of
157 +
copyright on the Program, and are irrevocable provided the stated
158 +
conditions are met.  This License explicitly affirms your unlimited
159 +
permission to run the unmodified Program.  The output from running a
160 +
covered work is covered by this License only if the output, given its
161 +
content, constitutes a covered work.  This License acknowledges your
162 +
rights of fair use or other equivalent, as provided by copyright law.
163 +
164 +
  You may make, run and propagate covered works that you do not
165 +
convey, without conditions so long as your license otherwise remains
166 +
in force.  You may convey covered works to others for the sole purpose
167 +
of having them make modifications exclusively for you, or provide you
168 +
with facilities for running those works, provided that you comply with
169 +
the terms of this License in conveying all material for which you do
170 +
not control copyright.  Those thus making or running the covered works
171 +
for you must do so exclusively on your behalf, under your direction
172 +
and control, on terms that prohibit them from making any copies of
173 +
your copyrighted material outside their relationship with you.
174 +
175 +
  Conveying under any other circumstances is permitted solely under
176 +
the conditions stated below.  Sublicensing is not allowed; section 10
177 +
makes it unnecessary.
178 +
179 +
  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 +
181 +
  No covered work shall be deemed part of an effective technological
182 +
measure under any applicable law fulfilling obligations under article
183 +
11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 +
similar laws prohibiting or restricting circumvention of such
185 +
measures.
186 +
187 +
  When you convey a covered work, you waive any legal power to forbid
188 +
circumvention of technological measures to the extent such circumvention
189 +
is effected by exercising rights under this License with respect to
190 +
the covered work, and you disclaim any intention to limit operation or
191 +
modification of the work as a means of enforcing, against the work's
192 +
users, your or third parties' legal rights to forbid circumvention of
193 +
technological measures.
194 +
195 +
  4. Conveying Verbatim Copies.
196 +
197 +
  You may convey verbatim copies of the Program's source code as you
198 +
receive it, in any medium, provided that you conspicuously and
199 +
appropriately publish on each copy an appropriate copyright notice;
200 +
keep intact all notices stating that this License and any
201 +
non-permissive terms added in accord with section 7 apply to the code;
202 +
keep intact all notices of the absence of any warranty; and give all
203 +
recipients a copy of this License along with the Program.
204 +
205 +
  You may charge any price or no price for each copy that you convey,
206 +
and you may offer support or warranty protection for a fee.
207 +
208 +
  5. Conveying Modified Source Versions.
209 +
210 +
  You may convey a work based on the Program, or the modifications to
211 +
produce it from the Program, in the form of source code under the
212 +
terms of section 4, provided that you also meet all of these conditions:
213 +
214 +
    a) The work must carry prominent notices stating that you modified
215 +
    it, and giving a relevant date.
216 +
217 +
    b) The work must carry prominent notices stating that it is
218 +
    released under this License and any conditions added under section
219 +
    7.  This requirement modifies the requirement in section 4 to
220 +
    "keep intact all notices".
221 +
222 +
    c) You must license the entire work, as a whole, under this
223 +
    License to anyone who comes into possession of a copy.  This
224 +
    License will therefore apply, along with any applicable section 7
225 +
    additional terms, to the whole of the work, and all its parts,
226 +
    regardless of how they are packaged.  This License gives no
227 +
    permission to license the work in any other way, but it does not
228 +
    invalidate such permission if you have separately received it.
229 +
230 +
    d) If the work has interactive user interfaces, each must display
231 +
    Appropriate Legal Notices; however, if the Program has interactive
232 +
    interfaces that do not display Appropriate Legal Notices, your
233 +
    work need not make them do so.
234 +
235 +
  A compilation of a covered work with other separate and independent
236 +
works, which are not by their nature extensions of the covered work,
237 +
and which are not combined with it such as to form a larger program,
238 +
in or on a volume of a storage or distribution medium, is called an
239 +
"aggregate" if the compilation and its resulting copyright are not
240 +
used to limit the access or legal rights of the compilation's users
241 +
beyond what the individual works permit.  Inclusion of a covered work
242 +
in an aggregate does not cause this License to apply to the other
243 +
parts of the aggregate.
244 +
245 +
  6. Conveying Non-Source Forms.
246 +
247 +
  You may convey a covered work in object code form under the terms
248 +
of sections 4 and 5, provided that you also convey the
249 +
machine-readable Corresponding Source under the terms of this License,
250 +
in one of these ways:
251 +
252 +
    a) Convey the object code in, or embodied in, a physical product
253 +
    (including a physical distribution medium), accompanied by the
254 +
    Corresponding Source fixed on a durable physical medium
255 +
    customarily used for software interchange.
256 +
257 +
    b) Convey the object code in, or embodied in, a physical product
258 +
    (including a physical distribution medium), accompanied by a
259 +
    written offer, valid for at least three years and valid for as
260 +
    long as you offer spare parts or customer support for that product
261 +
    model, to give anyone who possesses the object code either (1) a
262 +
    copy of the Corresponding Source for all the software in the
263 +
    product that is covered by this License, on a durable physical
264 +
    medium customarily used for software interchange, for a price no
265 +
    more than your reasonable cost of physically performing this
266 +
    conveying of source, or (2) access to copy the
267 +
    Corresponding Source from a network server at no charge.
268 +
269 +
    c) Convey individual copies of the object code with a copy of the
270 +
    written offer to provide the Corresponding Source.  This
271 +
    alternative is allowed only occasionally and noncommercially, and
272 +
    only if you received the object code with such an offer, in accord
273 +
    with subsection 6b.
274 +
275 +
    d) Convey the object code by offering access from a designated
276 +
    place (gratis or for a charge), and offer equivalent access to the
277 +
    Corresponding Source in the same way through the same place at no
278 +
    further charge.  You need not require recipients to copy the
279 +
    Corresponding Source along with the object code.  If the place to
280 +
    copy the object code is a network server, the Corresponding Source
281 +
    may be on a different server (operated by you or a third party)
282 +
    that supports equivalent copying facilities, provided you maintain
283 +
    clear directions next to the object code saying where to find the
284 +
    Corresponding Source.  Regardless of what server hosts the
285 +
    Corresponding Source, you remain obligated to ensure that it is
286 +
    available for as long as needed to satisfy these requirements.
287 +
288 +
    e) Convey the object code using peer-to-peer transmission, provided
289 +
    you inform other peers where the object code and Corresponding
290 +
    Source of the work are being offered to the general public at no
291 +
    charge under subsection 6d.
292 +
293 +
  A separable portion of the object code, whose source code is excluded
294 +
from the Corresponding Source as a System Library, need not be
295 +
included in conveying the object code work.
296 +
297 +
  A "User Product" is either (1) a "consumer product", which means any
298 +
tangible personal property which is normally used for personal, family,
299 +
or household purposes, or (2) anything designed or sold for incorporation
300 +
into a dwelling.  In determining whether a product is a consumer product,
301 +
doubtful cases shall be resolved in favor of coverage.  For a particular
302 +
product received by a particular user, "normally used" refers to a
303 +
typical or common use of that class of product, regardless of the status
304 +
of the particular user or of the way in which the particular user
305 +
actually uses, or expects or is expected to use, the product.  A product
306 +
is a consumer product regardless of whether the product has substantial
307 +
commercial, industrial or non-consumer uses, unless such uses represent
308 +
the only significant mode of use of the product.
309 +
310 +
  "Installation Information" for a User Product means any methods,
311 +
procedures, authorization keys, or other information required to install
312 +
and execute modified versions of a covered work in that User Product from
313 +
a modified version of its Corresponding Source.  The information must
314 +
suffice to ensure that the continued functioning of the modified object
315 +
code is in no case prevented or interfered with solely because
316 +
modification has been made.
317 +
318 +
  If you convey an object code work under this section in, or with, or
319 +
specifically for use in, a User Product, and the conveying occurs as
320 +
part of a transaction in which the right of possession and use of the
321 +
User Product is transferred to the recipient in perpetuity or for a
322 +
fixed term (regardless of how the transaction is characterized), the
323 +
Corresponding Source conveyed under this section must be accompanied
324 +
by the Installation Information.  But this requirement does not apply
325 +
if neither you nor any third party retains the ability to install
326 +
modified object code on the User Product (for example, the work has
327 +
been installed in ROM).
328 +
329 +
  The requirement to provide Installation Information does not include a
330 +
requirement to continue to provide support service, warranty, or updates
331 +
for a work that has been modified or installed by the recipient, or for
332 +
the User Product in which it has been modified or installed.  Access to a
333 +
network may be denied when the modification itself materially and
334 +
adversely affects the operation of the network or violates the rules and
335 +
protocols for communication across the network.
336 +
337 +
  Corresponding Source conveyed, and Installation Information provided,
338 +
in accord with this section must be in a format that is publicly
339 +
documented (and with an implementation available to the public in
340 +
source code form), and must require no special password or key for
341 +
unpacking, reading or copying.
342 +
343 +
  7. Additional Terms.
344 +
345 +
  "Additional permissions" are terms that supplement the terms of this
346 +
License by making exceptions from one or more of its conditions.
347 +
Additional permissions that are applicable to the entire Program shall
348 +
be treated as though they were included in this License, to the extent
349 +
that they are valid under applicable law.  If additional permissions
350 +
apply only to part of the Program, that part may be used separately
351 +
under those permissions, but the entire Program remains governed by
352 +
this License without regard to the additional permissions.
353 +
354 +
  When you convey a copy of a covered work, you may at your option
355 +
remove any additional permissions from that copy, or from any part of
356 +
it.  (Additional permissions may be written to require their own
357 +
removal in certain cases when you modify the work.)  You may place
358 +
additional permissions on material, added by you to a covered work,
359 +
for which you have or can give appropriate copyright permission.
360 +
361 +
  Notwithstanding any other provision of this License, for material you
362 +
add to a covered work, you may (if authorized by the copyright holders of
363 +
that material) supplement the terms of this License with terms:
364 +
365 +
    a) Disclaiming warranty or limiting liability differently from the
366 +
    terms of sections 15 and 16 of this License; or
367 +
368 +
    b) Requiring preservation of specified reasonable legal notices or
369 +
    author attributions in that material or in the Appropriate Legal
370 +
    Notices displayed by works containing it; or
371 +
372 +
    c) Prohibiting misrepresentation of the origin of that material, or
373 +
    requiring that modified versions of such material be marked in
374 +
    reasonable ways as different from the original version; or
375 +
376 +
    d) Limiting the use for publicity purposes of names of licensors or
377 +
    authors of the material; or
378 +
379 +
    e) Declining to grant rights under trademark law for use of some
380 +
    trade names, trademarks, or service marks; or
381 +
382 +
    f) Requiring indemnification of licensors and authors of that
383 +
    material by anyone who conveys the material (or modified versions of
384 +
    it) with contractual assumptions of liability to the recipient, for
385 +
    any liability that these contractual assumptions directly impose on
386 +
    those licensors and authors.
387 +
388 +
  All other non-permissive additional terms are considered "further
389 +
restrictions" within the meaning of section 10.  If the Program as you
390 +
received it, or any part of it, contains a notice stating that it is
391 +
governed by this License along with a term that is a further
392 +
restriction, you may remove that term.  If a license document contains
393 +
a further restriction but permits relicensing or conveying under this
394 +
License, you may add to a covered work material governed by the terms
395 +
of that license document, provided that the further restriction does
396 +
not survive such relicensing or conveying.
397 +
398 +
  If you add terms to a covered work in accord with this section, you
399 +
must place, in the relevant source files, a statement of the
400 +
additional terms that apply to those files, or a notice indicating
401 +
where to find the applicable terms.
402 +
403 +
  Additional terms, permissive or non-permissive, may be stated in the
404 +
form of a separately written license, or stated as exceptions;
405 +
the above requirements apply either way.
406 +
407 +
  8. Termination.
408 +
409 +
  You may not propagate or modify a covered work except as expressly
410 +
provided under this License.  Any attempt otherwise to propagate or
411 +
modify it is void, and will automatically terminate your rights under
412 +
this License (including any patent licenses granted under the third
413 +
paragraph of section 11).
414 +
415 +
  However, if you cease all violation of this License, then your
416 +
license from a particular copyright holder is reinstated (a)
417 +
provisionally, unless and until the copyright holder explicitly and
418 +
finally terminates your license, and (b) permanently, if the copyright
419 +
holder fails to notify you of the violation by some reasonable means
420 +
prior to 60 days after the cessation.
421 +
422 +
  Moreover, your license from a particular copyright holder is
423 +
reinstated permanently if the copyright holder notifies you of the
424 +
violation by some reasonable means, this is the first time you have
425 +
received notice of violation of this License (for any work) from that
426 +
copyright holder, and you cure the violation prior to 30 days after
427 +
your receipt of the notice.
428 +
429 +
  Termination of your rights under this section does not terminate the
430 +
licenses of parties who have received copies or rights from you under
431 +
this License.  If your rights have been terminated and not permanently
432 +
reinstated, you do not qualify to receive new licenses for the same
433 +
material under section 10.
434 +
435 +
  9. Acceptance Not Required for Having Copies.
436 +
437 +
  You are not required to accept this License in order to receive or
438 +
run a copy of the Program.  Ancillary propagation of a covered work
439 +
occurring solely as a consequence of using peer-to-peer transmission
440 +
to receive a copy likewise does not require acceptance.  However,
441 +
nothing other than this License grants you permission to propagate or
442 +
modify any covered work.  These actions infringe copyright if you do
443 +
not accept this License.  Therefore, by modifying or propagating a
444 +
covered work, you indicate your acceptance of this License to do so.
445 +
446 +
  10. Automatic Licensing of Downstream Recipients.
447 +
448 +
  Each time you convey a covered work, the recipient automatically
449 +
receives a license from the original licensors, to run, modify and
450 +
propagate that work, subject to this License.  You are not responsible
451 +
for enforcing compliance by third parties with this License.
452 +
453 +
  An "entity transaction" is a transaction transferring control of an
454 +
organization, or substantially all assets of one, or subdividing an
455 +
organization, or merging organizations.  If propagation of a covered
456 +
work results from an entity transaction, each party to that
457 +
transaction who receives a copy of the work also receives whatever
458 +
licenses to the work the party's predecessor in interest had or could
459 +
give under the previous paragraph, plus a right to possession of the
460 +
Corresponding Source of the work from the predecessor in interest, if
461 +
the predecessor has it or can get it with reasonable efforts.
462 +
463 +
  You may not impose any further restrictions on the exercise of the
464 +
rights granted or affirmed under this License.  For example, you may
465 +
not impose a license fee, royalty, or other charge for exercise of
466 +
rights granted under this License, and you may not initiate litigation
467 +
(including a cross-claim or counterclaim in a lawsuit) alleging that
468 +
any patent claim is infringed by making, using, selling, offering for
469 +
sale, or importing the Program or any portion of it.
470 +
471 +
  11. Patents.
472 +
473 +
  A "contributor" is a copyright holder who authorizes use under this
474 +
License of the Program or a work on which the Program is based.  The
475 +
work thus licensed is called the contributor's "contributor version".
476 +
477 +
  A contributor's "essential patent claims" are all patent claims
478 +
owned or controlled by the contributor, whether already acquired or
479 +
hereafter acquired, that would be infringed by some manner, permitted
480 +
by this License, of making, using, or selling its contributor version,
481 +
but do not include claims that would be infringed only as a
482 +
consequence of further modification of the contributor version.  For
483 +
purposes of this definition, "control" includes the right to grant
484 +
patent sublicenses in a manner consistent with the requirements of
485 +
this License.
486 +
487 +
  Each contributor grants you a non-exclusive, worldwide, royalty-free
488 +
patent license under the contributor's essential patent claims, to
489 +
make, use, sell, offer for sale, import and otherwise run, modify and
490 +
propagate the contents of its contributor version.
491 +
492 +
  In the following three paragraphs, a "patent license" is any express
493 +
agreement or commitment, however denominated, not to enforce a patent
494 +
(such as an express permission to practice a patent or covenant not to
495 +
sue for patent infringement).  To "grant" such a patent license to a
496 +
party means to make such an agreement or commitment not to enforce a
497 +
patent against the party.
498 +
499 +
  If you convey a covered work, knowingly relying on a patent license,
500 +
and the Corresponding Source of the work is not available for anyone
501 +
to copy, free of charge and under the terms of this License, through a
502 +
publicly available network server or other readily accessible means,
503 +
then you must either (1) cause the Corresponding Source to be so
504 +
available, or (2) arrange to deprive yourself of the benefit of the
505 +
patent license for this particular work, or (3) arrange, in a manner
506 +
consistent with the requirements of this License, to extend the patent
507 +
license to downstream recipients.  "Knowingly relying" means you have
508 +
actual knowledge that, but for the patent license, your conveying the
509 +
covered work in a country, or your recipient's use of the covered work
510 +
in a country, would infringe one or more identifiable patents in that
511 +
country that you have reason to believe are valid.
512 +
513 +
  If, pursuant to or in connection with a single transaction or
514 +
arrangement, you convey, or propagate by procuring conveyance of, a
515 +
covered work, and grant a patent license to some of the parties
516 +
receiving the covered work authorizing them to use, propagate, modify
517 +
or convey a specific copy of the covered work, then the patent license
518 +
you grant is automatically extended to all recipients of the covered
519 +
work and works based on it.
520 +
521 +
  A patent license is "discriminatory" if it does not include within
522 +
the scope of its coverage, prohibits the exercise of, or is
523 +
conditioned on the non-exercise of one or more of the rights that are
524 +
specifically granted under this License.  You may not convey a covered
525 +
work if you are a party to an arrangement with a third party that is
526 +
in the business of distributing software, under which you make payment
527 +
to the third party based on the extent of your activity of conveying
528 +
the work, and under which the third party grants, to any of the
529 +
parties who would receive the covered work from you, a discriminatory
530 +
patent license (a) in connection with copies of the covered work
531 +
conveyed by you (or copies made from those copies), or (b) primarily
532 +
for and in connection with specific products or compilations that
533 +
contain the covered work, unless you entered into that arrangement,
534 +
or that patent license was granted, prior to 28 March 2007.
535 +
536 +
  Nothing in this License shall be construed as excluding or limiting
537 +
any implied license or other defenses to infringement that may
538 +
otherwise be available to you under applicable patent law.
539 +
540 +
  12. No Surrender of Others' Freedom.
541 +
542 +
  If conditions are imposed on you (whether by court order, agreement or
543 +
otherwise) that contradict the conditions of this License, they do not
544 +
excuse you from the conditions of this License.  If you cannot convey a
545 +
covered work so as to satisfy simultaneously your obligations under this
546 +
License and any other pertinent obligations, then as a consequence you may
547 +
not convey it at all.  For example, if you agree to terms that obligate you
548 +
to collect a royalty for further conveying from those to whom you convey
549 +
the Program, the only way you could satisfy both those terms and this
550 +
License would be to refrain entirely from conveying the Program.
551 +
552 +
  13. Use with the GNU Affero General Public License.
553 +
554 +
  Notwithstanding any other provision of this License, you have
555 +
permission to link or combine any covered work with a work licensed
556 +
under version 3 of the GNU Affero General Public License into a single
557 +
combined work, and to convey the resulting work.  The terms of this
558 +
License will continue to apply to the part which is the covered work,
559 +
but the special requirements of the GNU Affero General Public License,
560 +
section 13, concerning interaction through a network will apply to the
561 +
combination as such.
562 +
563 +
  14. Revised Versions of this License.
564 +
565 +
  The Free Software Foundation may publish revised and/or new versions of
566 +
the GNU General Public License from time to time.  Such new versions will
567 +
be similar in spirit to the present version, but may differ in detail to
568 +
address new problems or concerns.
569 +
570 +
  Each version is given a distinguishing version number.  If the
571 +
Program specifies that a certain numbered version of the GNU General
572 +
Public License "or any later version" applies to it, you have the
573 +
option of following the terms and conditions either of that numbered
574 +
version or of any later version published by the Free Software
575 +
Foundation.  If the Program does not specify a version number of the
576 +
GNU General Public License, you may choose any version ever published
577 +
by the Free Software Foundation.
578 +
579 +
  If the Program specifies that a proxy can decide which future
580 +
versions of the GNU General Public License can be used, that proxy's
581 +
public statement of acceptance of a version permanently authorizes you
582 +
to choose that version for the Program.
583 +
584 +
  Later license versions may give you additional or different
585 +
permissions.  However, no additional obligations are imposed on any
586 +
author or copyright holder as a result of your choosing to follow a
587 +
later version.
588 +
589 +
  15. Disclaimer of Warranty.
590 +
591 +
  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 +
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 +
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 +
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 +
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 +
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 +
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 +
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 +
600 +
  16. Limitation of Liability.
601 +
602 +
  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 +
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 +
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 +
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 +
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 +
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 +
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 +
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 +
SUCH DAMAGES.
611 +
612 +
  17. Interpretation of Sections 15 and 16.
613 +
614 +
  If the disclaimer of warranty and limitation of liability provided
615 +
above cannot be given local legal effect according to their terms,
616 +
reviewing courts shall apply local law that most closely approximates
617 +
an absolute waiver of all civil liability in connection with the
618 +
Program, unless a warranty or assumption of liability accompanies a
619 +
copy of the Program in return for a fee.
620 +
621 +
                     END OF TERMS AND CONDITIONS
622 +
623 +
            How to Apply These Terms to Your New Programs
624 +
625 +
  If you develop a new program, and you want it to be of the greatest
626 +
possible use to the public, the best way to achieve this is to make it
627 +
free software which everyone can redistribute and change under these terms.
628 +
629 +
  To do so, attach the following notices to the program.  It is safest
630 +
to attach them to the start of each source file to most effectively
631 +
state the exclusion of warranty; and each file should have at least
632 +
the "copyright" line and a pointer to where the full notice is found.
633 +
634 +
    <one line to give the program's name and a brief idea of what it does.>
635 +
    Copyright (C) <year>  <name of author>
636 +
637 +
    This program is free software: you can redistribute it and/or modify
638 +
    it under the terms of the GNU General Public License as published by
639 +
    the Free Software Foundation, either version 3 of the License, or
640 +
    (at your option) any later version.
641 +
642 +
    This program is distributed in the hope that it will be useful,
643 +
    but WITHOUT ANY WARRANTY; without even the implied warranty of
644 +
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
645 +
    GNU General Public License for more details.
646 +
647 +
    You should have received a copy of the GNU General Public License
648 +
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
649 +
650 +
Also add information on how to contact you by electronic and paper mail.
651 +
652 +
  If the program does terminal interaction, make it output a short
653 +
notice like this when it starts in an interactive mode:
654 +
655 +
    <program>  Copyright (C) <year>  <name of author>
656 +
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 +
    This is free software, and you are welcome to redistribute it
658 +
    under certain conditions; type `show c' for details.
659 +
660 +
The hypothetical commands `show w' and `show c' should show the appropriate
661 +
parts of the General Public License.  Of course, your program's commands
662 +
might be different; for a GUI interface, you would use an "about box".
663 +
664 +
  You should also get your employer (if you work as a programmer) or school,
665 +
if any, to sign a "copyright disclaimer" for the program, if necessary.
666 +
For more information on this, and how to apply and follow the GNU GPL, see
667 +
<https://www.gnu.org/licenses/>.
668 +
669 +
  The GNU General Public License does not permit incorporating your program
670 +
into proprietary programs.  If your program is a subroutine library, you
671 +
may consider it more useful to permit linking proprietary applications with
672 +
the library.  If this is what you want to do, use the GNU Lesser General
673 +
Public License instead of this License.  But first, please read
674 +
<https://www.gnu.org/licenses/why-not-lgpl.html>.
README.md (added) +86 −0
1 +
# compline-nvim
2 +
3 +
![cover](https://files.stevedylan.dev/darkmatter-nvim.png)
4 +
5 +
A soft, muted colorscheme for Neovim based on the [Compline](https://github.com/jblais493/compline) theme
6 +
7 +
## Features
8 +
9 +
- Support for Neovim's built-in LSP
10 +
- Treesitter highlighting
11 +
- Plugin integrations:
12 +
  - Telescope
13 +
  - Indent Blankline
14 +
  - Nvim-notify
15 +
  - Rainbow parentheses
16 +
  - Nvim-cmp
17 +
  - vim-illuminate
18 +
  - LSP semantic tokens
19 +
  - mini.completion
20 +
  - nvim-dap-ui
21 +
22 +
## Installation
23 +
24 +
### Using [packer.nvim](https://github.com/wbthomason/packer.nvim)
25 +
26 +
```lua
27 +
use {
28 +
  'stevedylandev/compline-nvim',
29 +
  config = function()
30 +
    vim.cmd('colorscheme compline')
31 +
  end
32 +
}
33 +
```
34 +
35 +
### Using [lazy.nvim](https://github.com/folke/lazy.nvim)
36 +
37 +
```lua
38 +
{
39 +
  'stevedylandev/compline-nvim',
40 +
  lazy = false,
41 +
  priority = 1000,
42 +
  config = function()
43 +
    vim.cmd('colorscheme compline')
44 +
  end,
45 +
}
46 +
```
47 +
48 +
## Usage
49 +
50 +
Simply set the colorscheme in your Neovim configuration:
51 +
52 +
```lua
53 +
vim.cmd('colorscheme compline')
54 +
```
55 +
56 +
If you don't see colors, make sure you have true color support enabled:
57 +
58 +
```lua
59 +
vim.opt.termguicolors = true
60 +
```
61 +
62 +
## Configuration
63 +
64 +
You can configure the colorscheme by passing options to the setup function:
65 +
66 +
```lua
67 +
require('compline-colorscheme').setup('compline', {
68 +
  -- All options default to true
69 +
  telescope = true,          -- Telescope plugin
70 +
  telescope_borders = false, -- Telescope borders
71 +
  indentblankline = true,    -- Indent-blankline plugin
72 +
  notify = true,             -- Nvim-notify plugin
73 +
  ts_rainbow = true,         -- Rainbow parentheses
74 +
  cmp = true,                -- Nvim-cmp plugin
75 +
  illuminate = true,         -- vim-illuminate plugin
76 +
  lsp_semantic = true,       -- LSP semantic tokens
77 +
  mini_completion = true,    -- mini.completion plugin
78 +
  dapui = true,              -- nvim-dap-ui plugin
79 +
})
80 +
```
81 +
82 +
## Credits
83 +
84 +
This colorscheme is based on the [Compline](https://github.com/jblais493/compline) theme by [jblais493](https://github.com/jblais493), adapted for Neovim with support for modern plugins and features.
85 +
86 +
The plugin structure is based on [base16-nvim](https://github.com/RRethy/base16-nvim) by RRethy.
colors/compline.vim (added) +3 −0
1 +
hi clear
2 +
let g:colors_name = 'compline'
3 +
lua require('compline-colorscheme').setup('compline')
doc/colorscheme.txt (added) +14 −0
1 +
*compline-nvim.txt* Neovim colorscheme based on Compline
2 +
3 +
Author:  Steve Simkins (stevedylandev) <hello@stevedylan.dev>
4 +
Original theme by jblais493: https://github.com/jblais493/compline
5 +
6 +
INTRODUCTION                                                    *compline-nvim*
7 +
===========================================================================
8 +
9 +
Colorschemes can be accessed with |:colorscheme|.
10 +
>
11 +
    :colorscheme compline
12 +
<
13 +
14 +
vim:tw=78:ts=8:ft=help:norl:
lua/colors/compline.lua (added) +21 −0
1 +
-- Compline colorscheme
2 +
-- Original theme by jblais493: https://github.com/jblais493/compline
3 +
4 +
return {
5 +
    base00 = '#1a1d21', -- background (color0)
6 +
    base01 = '#25282c', -- lighter background (derived)
7 +
    base02 = '#3d424a', -- selection background
8 +
    base03 = '#515761', -- comments (color8)
9 +
    base04 = '#c0bdb8', -- dark foreground (color7)
10 +
    base05 = '#e0dcd4', -- default foreground
11 +
    base06 = '#e0dcd4', -- light foreground (color15)
12 +
    base07 = '#e0dcd4', -- lightest (color15)
13 +
    base08 = '#CDACAC', -- red (color1)
14 +
    base09 = '#c8beb8', -- orange/bright (color9)
15 +
    base0A = '#DBCDB3', -- yellow (color3)
16 +
    base0B = '#b8c4b8', -- green (color2)
17 +
    base0C = '#b0bcc8', -- cyan (color6)
18 +
    base0D = '#b4bcc4', -- blue (color4)
19 +
    base0E = '#c0b8bc', -- magenta (color5)
20 +
    base0F = '#b0c0b8', -- extra (color14)
21 +
}
lua/colors/init.lua (added) +3 −0
1 +
local M = {}
2 +
M['compline'] = require('colors.compline')
3 +
return M
lua/colorscheme.lua (added) +1 −0
1 +
return require('compline-colorscheme')
lua/compline-colorscheme.lua (added) +774 −0
1 +
-- Some useful links for making your own colorscheme:
2 +
--
3 +
-- https://github.com/chriskempson/base16
4 +
-- https://colourco.de/
5 +
-- https://color.adobe.com/create/color-wheel
6 +
-- http://vrl.cs.brown.edu/color
7 +
8 +
local M = {}
9 +
local hex_re = vim.regex('#\\x\\x\\x\\x\\x\\x')
10 +
11 +
local HEX_DIGITS = {
12 +
    ['0'] = 0,
13 +
    ['1'] = 1,
14 +
    ['2'] = 2,
15 +
    ['3'] = 3,
16 +
    ['4'] = 4,
17 +
    ['5'] = 5,
18 +
    ['6'] = 6,
19 +
    ['7'] = 7,
20 +
    ['8'] = 8,
21 +
    ['9'] = 9,
22 +
    ['a'] = 10,
23 +
    ['b'] = 11,
24 +
    ['c'] = 12,
25 +
    ['d'] = 13,
26 +
    ['e'] = 14,
27 +
    ['f'] = 15,
28 +
    ['A'] = 10,
29 +
    ['B'] = 11,
30 +
    ['C'] = 12,
31 +
    ['D'] = 13,
32 +
    ['E'] = 14,
33 +
    ['F'] = 15,
34 +
}
35 +
36 +
local function hex_to_rgb(hex)
37 +
    return HEX_DIGITS[string.sub(hex, 1, 1)] * 16 + HEX_DIGITS[string.sub(hex, 2, 2)],
38 +
        HEX_DIGITS[string.sub(hex, 3, 3)] * 16 + HEX_DIGITS[string.sub(hex, 4, 4)],
39 +
        HEX_DIGITS[string.sub(hex, 5, 5)] * 16 + HEX_DIGITS[string.sub(hex, 6, 6)]
40 +
end
41 +
42 +
local function rgb_to_hex(r, g, b)
43 +
    return bit.tohex(bit.bor(bit.lshift(r, 16), bit.lshift(g, 8), b), 6)
44 +
end
45 +
46 +
local function darken(hex, pct)
47 +
    pct = 1 - pct
48 +
    local r, g, b = hex_to_rgb(string.sub(hex, 2))
49 +
    r = math.floor(r * pct)
50 +
    g = math.floor(g * pct)
51 +
    b = math.floor(b * pct)
52 +
    return string.format("#%s", rgb_to_hex(r, g, b))
53 +
end
54 +
55 +
-- This is a bit of syntactic sugar for creating highlight groups.
56 +
--
57 +
-- local colorscheme = require('colorscheme')
58 +
-- local hi = colorscheme.highlight
59 +
-- hi.Comment = { guifg='#ffffff', guibg='#000000', gui='italic', guisp=nil }
60 +
-- hi.LspDiagnosticsDefaultError = 'DiagnosticError' -- Link to another group
61 +
--
62 +
-- This is equivalent to the following vimscript
63 +
--
64 +
-- hi Comment guifg=#ffffff guibg=#000000 gui=italic
65 +
-- hi! link LspDiagnosticsDefaultError DiagnosticError
66 +
M.highlight = setmetatable({}, {
67 +
    __newindex = function(_, hlgroup, args)
68 +
        if ('string' == type(args)) then
69 +
            vim.api.nvim_set_hl(0, hlgroup, { link = args })
70 +
            return
71 +
        end
72 +
73 +
        local guifg, guibg, gui, guisp = args.guifg or nil, args.guibg or nil, args.gui or nil, args.guisp or nil
74 +
        local ctermfg, ctermbg = args.ctermfg or nil, args.ctermbg or nil
75 +
        local val = {}
76 +
        if guifg then val.fg = guifg end
77 +
        if guibg then val.bg = guibg end
78 +
        if ctermfg then val.ctermfg = ctermfg end
79 +
        if ctermbg then val.ctermbg = ctermbg end
80 +
        if guisp then val.sp = guisp end
81 +
        if gui then
82 +
            for x in string.gmatch(gui, '([^,]+)') do
83 +
                if x ~= "none" then
84 +
                    val[x] = true
85 +
                end
86 +
            end
87 +
        end
88 +
        vim.api.nvim_set_hl(0, hlgroup, val)
89 +
    end
90 +
})
91 +
92 +
function M.with_config(config)
93 +
    M.config = vim.tbl_extend("force", {
94 +
        telescope = true,
95 +
        telescope_borders = false,
96 +
        indentblankline = true,
97 +
        notify = true,
98 +
        ts_rainbow = true,
99 +
        cmp = true,
100 +
        illuminate = true,
101 +
        lsp_semantic = true,
102 +
        mini_completion = true,
103 +
        dapui = true,
104 +
    }, config or M.config or {})
105 +
end
106 +
107 +
--- Creates a base16 colorscheme using the colors specified.
108 +
--
109 +
-- Builtin colorschemes can be found in the M.colorschemes table.
110 +
--
111 +
-- The default Vim highlight groups (including User[1-9]), highlight groups
112 +
-- pertaining to Neovim's builtin LSP, and highlight groups pertaining to
113 +
-- Treesitter will be defined.
114 +
--
115 +
-- It's worth noting that many colorschemes will specify language specific
116 +
-- highlight groups like rubyConstant or pythonInclude. However, I don't do
117 +
-- that here since these should instead be linked to an existing highlight
118 +
-- group.
119 +
--
120 +
-- @param colors (table) table with keys 'base00', 'base01', 'base02',
121 +
--   'base03', 'base04', 'base05', 'base06', 'base07', 'base08', 'base09',
122 +
--   'base0A', 'base0B', 'base0C', 'base0D', 'base0E', 'base0F'. Each key should
123 +
--   map to a valid 6 digit hex color. If a string is provided, the
124 +
--   corresponding table specifying the colorscheme will be used.
125 +
function M.setup(colors, config)
126 +
    M.with_config(config)
127 +
128 +
    if type(colors) == 'string' then
129 +
        colors = M.colorschemes[colors]
130 +
    end
131 +
132 +
    if vim.fn.exists('syntax_on') then
133 +
        vim.cmd('syntax reset')
134 +
    end
135 +
136 +
    -- BASE16_THEME in a tmux session cannot be trusted because of how envs in tmux panes work.
137 +
    local base16_colorscheme = nil
138 +
    if vim.env.TMUX == nil and vim.env.BASE16_THEME ~= nil then
139 +
        -- Only trust BASE16_THEME if not inside a tmux pane:
140 +
        base16_colorscheme = M.colorschemes[vim.env.BASE16_THEME]
141 +
    end
142 +
    M.colors                              = colors or base16_colorscheme or
143 +
        M.colorschemes['schemer-dark']
144 +
    local hi                              = M.highlight
145 +
146 +
    -- Vim editor colors
147 +
    hi.Normal                             = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
148 +
    hi.Bold                               = { guifg = nil, guibg = nil, gui = 'bold', guisp = nil, ctermfg = nil, ctermbg = nil }
149 +
    hi.Debug                              = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
150 +
    hi.Directory                          = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
151 +
    hi.Error                              = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
152 +
    hi.ErrorMsg                           = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
153 +
    hi.Exception                          = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
154 +
    hi.FoldColumn                         = { guifg = M.colors.base0C, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = M.colors.cterm00 }
155 +
    hi.Folded                             = { guifg = M.colors.base03, guibg = M.colors.base01, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = M.colors.cterm01 }
156 +
    hi.IncSearch                          = { guifg = M.colors.base01, guibg = M.colors.base09, gui = 'none', guisp = nil, ctermfg = M.colors.cterm01, ctermbg = M.colors.cterm09 }
157 +
    hi.Italic                             = { guifg = nil, guibg = nil, gui = 'italic', guisp = nil, ctermfg = nil, ctermbg = nil }
158 +
    hi.Macro                              = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
159 +
    hi.MatchParen                         = { guifg = nil, guibg = M.colors.base03, gui = nil, guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm03 }
160 +
    hi.ModeMsg                            = { guifg = M.colors.base0B, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
161 +
    hi.MoreMsg                            = { guifg = M.colors.base0B, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
162 +
    hi.Question                           = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
163 +
    hi.Search                             = { guifg = M.colors.base01, guibg = M.colors.base0A, gui = nil, guisp = nil, ctermfg = M.colors.cterm01, ctermbg = M.colors.cterm0A }
164 +
    hi.Substitute                         = { guifg = M.colors.base01, guibg = M.colors.base0A, gui = 'none', guisp = nil, ctermfg = M.colors.cterm01, ctermbg = M.colors.cterm0A }
165 +
    hi.SpecialKey                         = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
166 +
    hi.TooLong                            = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
167 +
    hi.Underlined                         = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
168 +
    hi.Visual                             = { guifg = nil, guibg = M.colors.base02, gui = nil, guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm02 }
169 +
    hi.VisualNOS                          = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
170 +
    hi.WarningMsg                         = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
171 +
    hi.WildMenu                           = { guifg = M.colors.base08, guibg = M.colors.base0A, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm0A }
172 +
    hi.Title                              = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
173 +
    hi.Conceal                            = { guifg = M.colors.base0D, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = M.colors.cterm00 }
174 +
    hi.Cursor                             = { guifg = M.colors.base00, guibg = M.colors.base05, gui = nil, guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm05 }
175 +
    hi.NonText                            = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
176 +
    hi.LineNr                             = { guifg = M.colors.base04, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = M.colors.cterm00 }
177 +
    hi.SignColumn                         = { guifg = M.colors.base04, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = M.colors.cterm00 }
178 +
    hi.StatusLine                         = { guifg = M.colors.base05, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm02 }
179 +
    hi.StatusLineNC                       = { guifg = M.colors.base04, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm04, ctermbg = M.colors.cterm01 }
180 +
    hi.WinBar                             = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
181 +
    hi.WinBarNC                           = { guifg = M.colors.base04, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm04, ctermbg = nil }
182 +
    hi.VertSplit                          = { guifg = M.colors.base05, guibg = M.colors.base00, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
183 +
    hi.ColorColumn                        = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
184 +
    hi.CursorColumn                       = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
185 +
    hi.CursorLine                         = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
186 +
    hi.CursorLineNr                       = { guifg = M.colors.base04, guibg = M.colors.base01, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = M.colors.cterm01 }
187 +
    hi.QuickFixLine                       = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
188 +
    hi.PMenu                              = { guifg = M.colors.base05, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm01 }
189 +
    hi.PMenuSel                           = { guifg = M.colors.base01, guibg = M.colors.base05, gui = nil, guisp = nil, ctermfg = M.colors.cterm01, ctermbg = M.colors.cterm05 }
190 +
    hi.TabLine                            = { guifg = M.colors.base03, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = M.colors.cterm01 }
191 +
    hi.TabLineFill                        = { guifg = M.colors.base03, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = M.colors.cterm01 }
192 +
    hi.TabLineSel                         = { guifg = M.colors.base0B, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm01 }
193 +
194 +
    -- Standard syntax highlighting
195 +
    hi.Boolean                            = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
196 +
    hi.Character                          = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
197 +
    hi.Comment                            = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
198 +
    hi.Conditional                        = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
199 +
    hi.Constant                           = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
200 +
    hi.Define                             = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
201 +
    hi.Delimiter                          = { guifg = M.colors.base0F, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
202 +
    hi.Float                              = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
203 +
    hi.Function                           = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
204 +
    hi.Identifier                         = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
205 +
    hi.Include                            = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
206 +
    hi.Keyword                            = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
207 +
    hi.Label                              = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
208 +
    hi.Number                             = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
209 +
    hi.Operator                           = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
210 +
    hi.PreProc                            = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
211 +
    hi.Repeat                             = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
212 +
    hi.Special                            = { guifg = M.colors.base0C, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
213 +
    hi.SpecialChar                        = { guifg = M.colors.base0F, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
214 +
    hi.Statement                          = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
215 +
    hi.StorageClass                       = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
216 +
    hi.String                             = { guifg = M.colors.base0B, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
217 +
    hi.Structure                          = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
218 +
    hi.Tag                                = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
219 +
    hi.Todo                               = { guifg = M.colors.base0A, guibg = M.colors.base01, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = M.colors.cterm01 }
220 +
    hi.Type                               = { guifg = M.colors.base0A, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
221 +
    hi.Typedef                            = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
222 +
223 +
    -- Diff highlighting
224 +
    hi.DiffAdd                            = { guifg = M.colors.base0B, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm00 }
225 +
    hi.DiffChange                         = { guifg = M.colors.base03, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = M.colors.cterm00 }
226 +
    hi.DiffDelete                         = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
227 +
    hi.DiffText                           = { guifg = M.colors.base0D, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = M.colors.cterm00 }
228 +
    hi.DiffAdded                          = { guifg = M.colors.base0B, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm00 }
229 +
    hi.DiffFile                           = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
230 +
    hi.DiffNewFile                        = { guifg = M.colors.base0B, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm00 }
231 +
    hi.DiffLine                           = { guifg = M.colors.base0D, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = M.colors.cterm00 }
232 +
    hi.DiffRemoved                        = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
233 +
234 +
    -- Git highlighting
235 +
    hi.gitcommitOverflow                  = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
236 +
    hi.gitcommitSummary                   = { guifg = M.colors.base0B, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
237 +
    hi.gitcommitComment                   = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
238 +
    hi.gitcommitUntracked                 = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
239 +
    hi.gitcommitDiscarded                 = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
240 +
    hi.gitcommitSelected                  = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
241 +
    hi.gitcommitHeader                    = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
242 +
    hi.gitcommitSelectedType              = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
243 +
    hi.gitcommitUnmergedType              = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
244 +
    hi.gitcommitDiscardedType             = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
245 +
    hi.gitcommitBranch                    = { guifg = M.colors.base09, guibg = nil, gui = 'bold', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
246 +
    hi.gitcommitUntrackedFile             = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
247 +
    hi.gitcommitUnmergedFile              = { guifg = M.colors.base08, guibg = nil, gui = 'bold', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
248 +
    hi.gitcommitDiscardedFile             = { guifg = M.colors.base08, guibg = nil, gui = 'bold', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
249 +
    hi.gitcommitSelectedFile              = { guifg = M.colors.base0B, guibg = nil, gui = 'bold', guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
250 +
251 +
    -- GitGutter highlighting
252 +
    hi.GitGutterAdd                       = { guifg = M.colors.base0B, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm00 }
253 +
    hi.GitGutterChange                    = { guifg = M.colors.base0D, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = M.colors.cterm00 }
254 +
    hi.GitGutterDelete                    = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
255 +
    hi.GitGutterChangeDelete              = { guifg = M.colors.base0E, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = M.colors.cterm00 }
256 +
257 +
    -- Spelling highlighting
258 +
    hi.SpellBad                           = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base08, ctermfg = nil, ctermbg = nil }
259 +
    hi.SpellLocal                         = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0C, ctermfg = nil, ctermbg = nil }
260 +
    hi.SpellCap                           = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0D, ctermfg = nil, ctermbg = nil }
261 +
    hi.SpellRare                          = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0E, ctermfg = nil, ctermbg = nil }
262 +
263 +
    hi.DiagnosticError                    = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
264 +
    hi.DiagnosticWarn                     = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
265 +
    hi.DiagnosticInfo                     = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
266 +
    hi.DiagnosticHint                     = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
267 +
    hi.DiagnosticUnderlineError           = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base08, ctermfg = nil, ctermbg = nil }
268 +
    hi.DiagnosticUnderlineWarning         = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0E, ctermfg = nil, ctermbg = nil }
269 +
    hi.DiagnosticUnderlineWarn            = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0E, ctermfg = nil, ctermbg = nil }
270 +
    hi.DiagnosticUnderlineInformation     = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0F, ctermfg = nil, ctermbg = nil }
271 +
    hi.DiagnosticUnderlineHint            = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0C, ctermfg = nil, ctermbg = nil }
272 +
273 +
    hi.LspReferenceText                   = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
274 +
    hi.LspReferenceRead                   = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
275 +
    hi.LspReferenceWrite                  = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
276 +
    hi.LspDiagnosticsDefaultError         = 'DiagnosticError'
277 +
    hi.LspDiagnosticsDefaultWarning       = 'DiagnosticWarn'
278 +
    hi.LspDiagnosticsDefaultInformation   = 'DiagnosticInfo'
279 +
    hi.LspDiagnosticsDefaultHint          = 'DiagnosticHint'
280 +
    hi.LspDiagnosticsUnderlineError       = 'DiagnosticUnderlineError'
281 +
    hi.LspDiagnosticsUnderlineWarning     = 'DiagnosticUnderlineWarning'
282 +
    hi.LspDiagnosticsUnderlineInformation = 'DiagnosticUnderlineInformation'
283 +
    hi.LspDiagnosticsUnderlineHint        = 'DiagnosticUnderlineHint'
284 +
285 +
    hi.TSAnnotation                       = { guifg = M.colors.base0F, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
286 +
    hi.TSAttribute                        = { guifg = M.colors.base0A, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
287 +
    hi.TSBoolean                          = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
288 +
    hi.TSCharacter                        = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
289 +
    hi.TSComment                          = { guifg = M.colors.base03, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
290 +
    hi.TSConstructor                      = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
291 +
    hi.TSConditional                      = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
292 +
    hi.TSConstant                         = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
293 +
    hi.TSConstBuiltin                     = { guifg = M.colors.base09, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
294 +
    hi.TSConstMacro                       = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
295 +
    hi.TSError                            = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
296 +
    hi.TSException                        = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
297 +
    hi.TSField                            = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
298 +
    hi.TSFloat                            = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
299 +
    hi.TSFunction                         = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
300 +
    hi.TSFuncBuiltin                      = { guifg = M.colors.base0D, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
301 +
    hi.TSFuncMacro                        = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
302 +
    hi.TSInclude                          = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
303 +
    hi.TSKeyword                          = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
304 +
    hi.TSKeywordFunction                  = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
305 +
    hi.TSKeywordOperator                  = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
306 +
    hi.TSLabel                            = { guifg = M.colors.base0A, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
307 +
    hi.TSMethod                           = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
308 +
    hi.TSNamespace                        = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
309 +
    hi.TSNone                             = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
310 +
    hi.TSNumber                           = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
311 +
    hi.TSOperator                         = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
312 +
    hi.TSParameter                        = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
313 +
    hi.TSParameterReference               = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
314 +
    hi.TSProperty                         = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
315 +
    hi.TSPunctDelimiter                   = { guifg = M.colors.base0F, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
316 +
    hi.TSPunctBracket                     = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
317 +
    hi.TSPunctSpecial                     = { guifg = M.colors.base0F, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
318 +
    hi.TSRepeat                           = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
319 +
    hi.TSString                           = { guifg = M.colors.base0B, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
320 +
    hi.TSStringRegex                      = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
321 +
    hi.TSStringEscape                     = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
322 +
    hi.TSSymbol                           = { guifg = M.colors.base0B, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
323 +
    hi.TSTag                              = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
324 +
    hi.TSTagDelimiter                     = { guifg = M.colors.base0F, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
325 +
    hi.TSText                             = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
326 +
    hi.TSStrong                           = { guifg = nil, guibg = nil, gui = 'bold', guisp = nil, ctermfg = nil, ctermbg = nil }
327 +
    hi.TSEmphasis                         = { guifg = M.colors.base09, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
328 +
    hi.TSUnderline                        = { guifg = M.colors.base00, guibg = nil, gui = 'underline', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = nil }
329 +
    hi.TSStrike                           = { guifg = M.colors.base00, guibg = nil, gui = 'strikethrough', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = nil }
330 +
    hi.TSTitle                            = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
331 +
    hi.TSLiteral                          = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
332 +
    hi.TSURI                              = { guifg = M.colors.base09, guibg = nil, gui = 'underline', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
333 +
    hi.TSType                             = { guifg = M.colors.base0A, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
334 +
    hi.TSTypeBuiltin                      = { guifg = M.colors.base0A, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
335 +
    hi.TSVariable                         = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
336 +
    hi.TSVariableBuiltin                  = { guifg = M.colors.base08, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
337 +
338 +
    hi.TSDefinition                       = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
339 +
    hi.TSDefinitionUsage                  = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
340 +
    hi.TSCurrentScope                     = { guifg = nil, guibg = nil, gui = 'bold', guisp = nil, ctermfg = nil, ctermbg = nil }
341 +
342 +
    hi.LspInlayHint                       = { guifg = M.colors.base03, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
343 +
344 +
    if vim.fn.has('nvim-0.8.0') then
345 +
        hi['@comment']                  = 'TSComment'
346 +
        hi['@error']                    = 'TSError'
347 +
        hi['@none']                     = 'TSNone'
348 +
        hi['@preproc']                  = 'PreProc'
349 +
        hi['@define']                   = 'Define'
350 +
        hi['@operator']                 = 'TSOperator'
351 +
        hi['@punctuation.delimiter']    = 'TSPunctDelimiter'
352 +
        hi['@punctuation.bracket']      = 'TSPunctBracket'
353 +
        hi['@punctuation.special']      = 'TSPunctSpecial'
354 +
        hi['@string']                   = 'TSString'
355 +
        hi['@string.regex']             = 'TSStringRegex'
356 +
        hi['@string.escape']            = 'TSStringEscape'
357 +
        hi['@string.special']           = 'SpecialChar'
358 +
        hi['@character']                = 'TSCharacter'
359 +
        hi['@character.special']        = 'SpecialChar'
360 +
        hi['@boolean']                  = 'TSBoolean'
361 +
        hi['@number']                   = 'TSNumber'
362 +
        hi['@float']                    = 'TSFloat'
363 +
        hi['@function']                 = 'TSFunction'
364 +
        hi['@function.call']            = 'TSFunction'
365 +
        hi['@function.builtin']         = 'TSFuncBuiltin'
366 +
        hi['@function.macro']           = 'TSFuncMacro'
367 +
        hi['@method']                   = 'TSMethod'
368 +
        hi['@method.call']              = 'TSMethod'
369 +
        hi['@constructor']              = 'TSConstructor'
370 +
        hi['@parameter']                = 'TSParameter'
371 +
        hi['@keyword']                  = 'TSKeyword'
372 +
        hi['@keyword.function']         = 'TSKeywordFunction'
373 +
        hi['@keyword.operator']         = 'TSKeywordOperator'
374 +
        hi['@keyword.return']           = 'TSKeyword'
375 +
        hi['@conditional']              = 'TSConditional'
376 +
        hi['@repeat']                   = 'TSRepeat'
377 +
        hi['@debug']                    = 'Debug'
378 +
        hi['@label']                    = 'TSLabel'
379 +
        hi['@include']                  = 'TSInclude'
380 +
        hi['@exception']                = 'TSException'
381 +
        hi['@type']                     = 'TSType'
382 +
        hi['@type.builtin']             = 'TSTypeBuiltin'
383 +
        hi['@type.qualifier']           = 'TSKeyword'
384 +
        hi['@type.definition']          = 'TSType'
385 +
        hi['@storageclass']             = 'StorageClass'
386 +
        hi['@attribute']                = 'TSAttribute'
387 +
        hi['@field']                    = 'TSField'
388 +
        hi['@property']                 = 'TSProperty'
389 +
        hi['@variable']                 = 'TSVariable'
390 +
        hi['@variable.builtin']         = 'TSVariableBuiltin'
391 +
        hi['@constant']                 = 'TSConstant'
392 +
        hi['@constant.builtin']         = 'TSConstant'
393 +
        hi['@constant.macro']           = 'TSConstant'
394 +
        hi['@namespace']                = 'TSNamespace'
395 +
        hi['@symbol']                   = 'TSSymbol'
396 +
        hi['@text']                     = 'TSText'
397 +
        hi['@text.diff.add']            = 'DiffAdd'
398 +
        hi['@text.diff.delete']         = 'DiffDelete'
399 +
        hi['@text.strong']              = 'TSStrong'
400 +
        hi['@text.emphasis']            = 'TSEmphasis'
401 +
        hi['@text.underline']           = 'TSUnderline'
402 +
        hi['@text.strike']              = 'TSStrike'
403 +
        hi['@text.title']               = 'TSTitle'
404 +
        hi['@text.literal']             = 'TSLiteral'
405 +
        hi['@text.uri']                 = 'TSUri'
406 +
        hi['@text.math']                = 'Number'
407 +
        hi['@text.environment']         = 'Macro'
408 +
        hi['@text.environment.name']    = 'Type'
409 +
        hi['@text.reference']           = 'TSParameterReference'
410 +
        hi['@text.todo']                = 'Todo'
411 +
        hi['@text.note']                = 'Tag'
412 +
        hi['@text.warning']             = 'DiagnosticWarn'
413 +
        hi['@text.danger']              = 'DiagnosticError'
414 +
        hi['@tag']                      = 'TSTag'
415 +
        hi['@tag.attribute']            = 'TSAttribute'
416 +
        hi['@tag.delimiter']            = 'TSTagDelimiter'
417 +
418 +
        hi['@function.method']          = '@method'
419 +
        hi['@function.method.call']     = '@method.call'
420 +
        hi['@comment.error']            = '@text.danger'
421 +
        hi['@comment.warning']          = '@text.warning'
422 +
        hi['@comment.hint']             = 'DiagnosticHint'
423 +
        hi['@comment.info']             = 'DiagnosticInfo'
424 +
        hi['@comment.todo']             = '@text.todo'
425 +
        hi['@diff.plus']                = '@text.diff.add'
426 +
        hi['@diff.minus']               = '@text.diff.delete'
427 +
        hi['@diff.delta']               = 'DiffChange'
428 +
        hi['@string.special.url']       = '@text.uri'
429 +
        hi['@keyword.directive']        = '@preproc'
430 +
        hi['@keyword.directive.define'] = '@define'
431 +
        hi['@keyword.storage']          = '@storageclass'
432 +
        hi['@keyword.conditional']      = '@conditional'
433 +
        hi['@keyword.debug']            = '@debug'
434 +
        hi['@keyword.exception']        = '@exception'
435 +
        hi['@keyword.import']           = '@include'
436 +
        hi['@keyword.repeat']           = '@repeat'
437 +
        hi['@variable.parameter']       = '@parameter'
438 +
        hi['@variable.member']          = '@field'
439 +
        hi['@module']                   = '@namespace'
440 +
        hi['@number.float']             = '@float'
441 +
        hi['@string.special.symbol']    = '@symbol'
442 +
        hi['@string.regexp']            = '@string.regex'
443 +
        hi['@markup.strong']            = '@text.strong'
444 +
        hi['@markup.italic']            = 'Italic'
445 +
        hi['@markup.link']              = '@text.link'
446 +
        hi['@markup.strikethrough']     = '@text.strikethrough'
447 +
        hi['@markup.heading']           = '@text.title'
448 +
        hi['@markup.raw']               = '@text.literal'
449 +
        hi['@markup.link']              = '@text.reference'
450 +
        hi['@markup.link.url']          = '@text.uri'
451 +
        hi['@markup.link.label']        = '@string.special'
452 +
        hi['@markup.list']              = '@punctuation.special'
453 +
    end
454 +
455 +
    if M.config.ts_rainbow then
456 +
        hi.rainbowcol1 = { guifg = M.colors.base06, ctermfg = M.colors.cterm06 }
457 +
        hi.rainbowcol2 = { guifg = M.colors.base09, ctermfg = M.colors.cterm09  }
458 +
        hi.rainbowcol3 = { guifg = M.colors.base0A, ctermfg = M.colors.cterm0A }
459 +
        hi.rainbowcol4 = { guifg = M.colors.base07, ctermfg = M.colors.cterm07  }
460 +
        hi.rainbowcol5 = { guifg = M.colors.base0C, ctermfg = M.colors.cterm0C  }
461 +
        hi.rainbowcol6 = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D  }
462 +
        hi.rainbowcol7 = { guifg = M.colors.base0E, ctermfg = M.colors.cterm0E  }
463 +
    end
464 +
465 +
    hi.NvimInternalError = { guifg = M.colors.base00, guibg = M.colors.base08, gui = 'none', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm08 }
466 +
467 +
    hi.NormalFloat       = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
468 +
    hi.FloatBorder       = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
469 +
    hi.NormalNC          = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
470 +
    hi.TermCursor        = { guifg = M.colors.base00, guibg = M.colors.base05, gui = 'none', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm05 }
471 +
    hi.TermCursorNC      = { guifg = M.colors.base00, guibg = M.colors.base05, gui = nil, guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm05 }
472 +
473 +
    hi.User1             = { guifg = M.colors.base08, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm02 }
474 +
    hi.User2             = { guifg = M.colors.base0E, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = M.colors.cterm02 }
475 +
    hi.User3             = { guifg = M.colors.base05, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm02 }
476 +
    hi.User4             = { guifg = M.colors.base0C, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = M.colors.cterm02 }
477 +
    hi.User5             = { guifg = M.colors.base05, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm02 }
478 +
    hi.User6             = { guifg = M.colors.base05, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm01 }
479 +
    hi.User7             = { guifg = M.colors.base05, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm02 }
480 +
    hi.User8             = { guifg = M.colors.base00, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm02 }
481 +
    hi.User9             = { guifg = M.colors.base00, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm02 }
482 +
483 +
    hi.TreesitterContext = { guifg = nil, guibg = M.colors.base01, gui = 'italic', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
484 +
485 +
    if M.config.telescope then
486 +
        if not M.config.telescope_borders and hex_re:match_str(M.colors.base00) and hex_re:match_str(M.colors.base01) and
487 +
            hex_re:match_str(M.colors.base02) then
488 +
            local darkerbg           = darken(M.colors.base00, 0.1)
489 +
            local darkercursorline   = darken(M.colors.base01, 0.1)
490 +
            local darkerstatusline   = darken(M.colors.base02, 0.1)
491 +
            hi.TelescopeBorder       = { guifg = darkerbg, guibg = darkerbg, gui = nil, guisp = nil }
492 +
            hi.TelescopePromptBorder = { guifg = darkerstatusline, guibg = darkerstatusline, gui = nil, guisp = nil }
493 +
            hi.TelescopePromptNormal = { guifg = M.colors.base05, guibg = darkerstatusline, gui = nil, guisp = nil }
494 +
            hi.TelescopePromptPrefix = { guifg = M.colors.base08, guibg = darkerstatusline, gui = nil, guisp = nil }
495 +
            hi.TelescopeNormal       = { guifg = nil, guibg = darkerbg, gui = nil, guisp = nil }
496 +
            hi.TelescopePreviewTitle = { guifg = darkercursorline, guibg = M.colors.base0B, gui = nil, guisp = nil }
497 +
            hi.TelescopePromptTitle  = { guifg = darkercursorline, guibg = M.colors.base08, gui = nil, guisp = nil }
498 +
            hi.TelescopeResultsTitle = { guifg = darkerbg, guibg = darkerbg, gui = nil, guisp = nil }
499 +
            hi.TelescopeSelection    = { guifg = nil, guibg = darkerstatusline, gui = nil, guisp = nil }
500 +
            hi.TelescopePreviewLine  = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil }
501 +
        else
502 +
            hi.TelescopeBorder       = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
503 +
            hi.TelescopePromptBorder = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
504 +
            hi.TelescopePromptNormal = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
505 +
            hi.TelescopePromptPrefix = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
506 +
            hi.TelescopeNormal       = { guifg = nil, guibg = M.colors.base00, gui = nil, guisp = nil }
507 +
            hi.TelescopePreviewTitle = { guifg = M.colors.base01, guibg = M.colors.base0B, gui = nil, guisp = nil }
508 +
            hi.TelescopePromptTitle  = { guifg = M.colors.base01, guibg = M.colors.base08, gui = nil, guisp = nil }
509 +
            hi.TelescopeResultsTitle = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
510 +
            hi.TelescopeSelection    = { guifg = nil, guibg = M.colors.base01, gui = nil, guisp = nil }
511 +
            hi.TelescopePreviewLine  = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil }
512 +
        end
513 +
    end
514 +
515 +
    if M.config.notify then
516 +
        hi.NotifyERRORBorder = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
517 +
        hi.NotifyWARNBorder  = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
518 +
        hi.NotifyINFOBorder  = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
519 +
        hi.NotifyDEBUGBorder = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
520 +
        hi.NotifyTRACEBorder = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
521 +
        hi.NotifyERRORIcon   = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
522 +
        hi.NotifyWARNIcon    = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
523 +
        hi.NotifyINFOIcon    = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
524 +
        hi.NotifyDEBUGIcon   = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
525 +
        hi.NotifyTRACEIcon   = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
526 +
        hi.NotifyERRORTitle  = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
527 +
        hi.NotifyWARNTitle   = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
528 +
        hi.NotifyINFOTitle   = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
529 +
        hi.NotifyDEBUGTitle  = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
530 +
        hi.NotifyTRACETitle  = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
531 +
        hi.NotifyERRORBody   = 'Normal'
532 +
        hi.NotifyWARNBody    = 'Normal'
533 +
        hi.NotifyINFOBody    = 'Normal'
534 +
        hi.NotifyDEBUGBody   = 'Normal'
535 +
        hi.NotifyTRACEBody   = 'Normal'
536 +
    end
537 +
538 +
    if M.config.indentblankline then
539 +
        hi.IndentBlanklineChar        = { guifg = M.colors.base02, gui = 'nocombine', ctermfg = M.colors.cterm02 }
540 +
        hi.IndentBlanklineContextChar = { guifg = M.colors.base04, gui = 'nocombine', ctermfg = M.colors.cterm04  }
541 +
        hi.IblIndent                  = { guifg = M.colors.base02, gui = 'nocombine', ctermfg = M.colors.cterm02  }
542 +
        hi.IblWhitespace              = 'Whitespace'
543 +
        hi.IblScope                   = { guifg = M.colors.base04, gui = 'nocombine', ctermfg = M.colors.cterm04  }
544 +
    end
545 +
546 +
    if M.config.cmp then
547 +
        hi.CmpDocumentationBorder   = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
548 +
        hi.CmpDocumentation         = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
549 +
        hi.CmpItemAbbr              = { guifg = M.colors.base05, guibg = M.colors.base01, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm01 }
550 +
        hi.CmpItemAbbrDeprecated    = { guifg = M.colors.base03, guibg = nil, gui = 'strikethrough', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
551 +
        hi.CmpItemAbbrMatch         = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
552 +
        hi.CmpItemAbbrMatchFuzzy    = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
553 +
        hi.CmpItemKindDefault       = { guifg = M.colors.base05, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
554 +
        hi.CmpItemMenu              = { guifg = M.colors.base04, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = nil }
555 +
        hi.CmpItemKindKeyword       = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
556 +
        hi.CmpItemKindVariable      = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
557 +
        hi.CmpItemKindConstant      = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
558 +
        hi.CmpItemKindReference     = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
559 +
        hi.CmpItemKindValue         = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
560 +
        hi.CmpItemKindFunction      = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
561 +
        hi.CmpItemKindMethod        = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
562 +
        hi.CmpItemKindConstructor   = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
563 +
        hi.CmpItemKindClass         = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
564 +
        hi.CmpItemKindInterface     = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
565 +
        hi.CmpItemKindStruct        = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
566 +
        hi.CmpItemKindEvent         = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
567 +
        hi.CmpItemKindEnum          = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
568 +
        hi.CmpItemKindUnit          = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
569 +
        hi.CmpItemKindModule        = { guifg = M.colors.base05, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
570 +
        hi.CmpItemKindProperty      = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
571 +
        hi.CmpItemKindField         = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
572 +
        hi.CmpItemKindTypeParameter = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
573 +
        hi.CmpItemKindEnumMember    = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
574 +
        hi.CmpItemKindOperator      = { guifg = M.colors.base05, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
575 +
        hi.CmpItemKindSnippet       = { guifg = M.colors.base04, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = nil }
576 +
    end
577 +
578 +
    if M.config.illuminate then
579 +
        hi.IlluminatedWordText  = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
580 +
        hi.IlluminatedWordRead  = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
581 +
        hi.IlluminatedWordWrite = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
582 +
    end
583 +
584 +
    if M.config.lsp_semantic then
585 +
        hi['@class'] = 'TSType'
586 +
        hi['@struct'] = 'TSType'
587 +
        hi['@enum'] = 'TSType'
588 +
        hi['@enumMember'] = 'Constant'
589 +
        hi['@event'] = 'Identifier'
590 +
        hi['@interface'] = 'Structure'
591 +
        hi['@modifier'] = 'Identifier'
592 +
        hi['@regexp'] = 'TSStringRegex'
593 +
        hi['@typeParameter'] = 'Type'
594 +
        hi['@decorator'] = 'Identifier'
595 +
596 +
        hi['@lsp.type.namespace'] = '@namespace'
597 +
        hi['@lsp.type.type'] = '@type'
598 +
        hi['@lsp.type.class'] = '@type'
599 +
        hi['@lsp.type.enum'] = '@type'
600 +
        hi['@lsp.type.interface'] = '@type'
601 +
        hi['@lsp.type.struct'] = '@type'
602 +
        hi['@lsp.type.parameter'] = '@parameter'
603 +
        hi['@lsp.type.variable'] = '@variable'
604 +
        hi['@lsp.type.property'] = '@property'
605 +
        hi['@lsp.type.enumMember'] = '@constant'
606 +
        hi['@lsp.type.function'] = '@function'
607 +
        hi['@lsp.type.method'] = '@method'
608 +
        hi['@lsp.type.macro'] = '@function.macro'
609 +
        hi['@lsp.type.decorator'] = '@function'
610 +
    end
611 +
612 +
    if M.config.mini_completion then
613 +
        hi.MiniCompletionActiveParameter = 'CursorLine'
614 +
    end
615 +
616 +
    if M.config.dapui then
617 +
        hi.DapUINormal = 'Normal'
618 +
        hi.DapUINormal    = "Normal"
619 +
        hi.DapUIVariable  = "Normal"
620 +
        hi.DapUIScope     = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
621 +
        hi.DapUIType      = { guifg = M.colors.base0E, ctermfg = M.colors.cterm0E }
622 +
        hi.DapUIValue     = "Normal"
623 +
        hi.DapUIModifiedValue = { gui = "bold", guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
624 +
        hi.DapUIDecoration = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
625 +
        hi.DapUIThread    = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
626 +
        hi.DapUIStoppedThread = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
627 +
        hi.DapUIFrameName = "Normal"
628 +
        hi.DapUISource    = { guifg = M.colors.base0E, ctermfg = M.colors.cterm0E }
629 +
        hi.DapUILineNumber = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
630 +
        hi.DapUIFloatNormal = "NormalFloat"
631 +
        hi.DapUIFloatBorder = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
632 +
        hi.DapUIWatchesEmpty = { guifg = M.colors.base08, ctermfg = M.colors.cterm08 }
633 +
        hi.DapUIWatchesValue = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
634 +
        hi.DapUIWatchesError = { guifg = M.colors.base08, ctermfg = M.colors.cterm08 }
635 +
        hi.DapUIBreakpointsPath = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
636 +
        hi.DapUIBreakpointsInfo = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
637 +
        hi.DapUIBreakpointsCurrentLine = { gui = "bold", guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
638 +
        hi.DapUIBreakpointsLine = "DapUILineNumber"
639 +
        hi.DapUIBreakpointsDisabledLine = { guifg = M.colors.base02, ctermfg = M.colors.cterm02 }
640 +
        hi.DapUICurrentFrameName = "DapUIBreakpointsCurrentLine"
641 +
        hi.DapUIStepOver  = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
642 +
        hi.DapUIStepInto  = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
643 +
        hi.DapUIStepBack  = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
644 +
        hi.DapUIStepOut   = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
645 +
        hi.DapUIStop      = { guifg = M.colors.base08, ctermfg = M.colors.cterm08 }
646 +
        hi.DapUIPlayPause = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
647 +
        hi.DapUIRestart   = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
648 +
        hi.DapUIUnavailable = { guifg = M.colors.base02, ctermfg = M.colors.cterm02 }
649 +
        hi.DapUIWinSelect = { gui = "bold", guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
650 +
        hi.DapUIEndofBuffer = "EndOfBuffer"
651 +
        hi.DapUINormalNC  = "Normal"
652 +
        hi.DapUIPlayPauseNC = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
653 +
        hi.DapUIRestartNC = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
654 +
        hi.DapUIStopNC    = { guifg = M.colors.base08, ctermfg = M.colors.cterm08 }
655 +
        hi.DapUIUnavailableNC = { guifg = M.colors.base02, ctermfg = M.colors.cterm02 }
656 +
        hi.DapUIStepOverNC = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
657 +
        hi.DapUIStepIntoNC = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
658 +
        hi.DapUIStepBackNC = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
659 +
        hi.DapUIStepOutNC = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
660 +
    end
661 +
662 +
663 +
    vim.g.terminal_color_0  = M.colors.base00
664 +
    vim.g.terminal_color_1  = M.colors.base08
665 +
    vim.g.terminal_color_2  = M.colors.base0B
666 +
    vim.g.terminal_color_3  = M.colors.base0A
667 +
    vim.g.terminal_color_4  = M.colors.base0D
668 +
    vim.g.terminal_color_5  = M.colors.base0E
669 +
    vim.g.terminal_color_6  = M.colors.base0C
670 +
    vim.g.terminal_color_7  = M.colors.base05
671 +
    vim.g.terminal_color_8  = M.colors.base03
672 +
    vim.g.terminal_color_9  = M.colors.base08
673 +
    vim.g.terminal_color_10 = M.colors.base0B
674 +
    vim.g.terminal_color_11 = M.colors.base0A
675 +
    vim.g.terminal_color_12 = M.colors.base0D
676 +
    vim.g.terminal_color_13 = M.colors.base0E
677 +
    vim.g.terminal_color_14 = M.colors.base0C
678 +
    vim.g.terminal_color_15 = M.colors.base07
679 +
680 +
    vim.g.base16_gui00      = M.colors.base00
681 +
    vim.g.base16_gui01      = M.colors.base01
682 +
    vim.g.base16_gui02      = M.colors.base02
683 +
    vim.g.base16_gui03      = M.colors.base03
684 +
    vim.g.base16_gui04      = M.colors.base04
685 +
    vim.g.base16_gui05      = M.colors.base05
686 +
    vim.g.base16_gui06      = M.colors.base06
687 +
    vim.g.base16_gui07      = M.colors.base07
688 +
    vim.g.base16_gui08      = M.colors.base08
689 +
    vim.g.base16_gui09      = M.colors.base09
690 +
    vim.g.base16_gui0A      = M.colors.base0A
691 +
    vim.g.base16_gui0B      = M.colors.base0B
692 +
    vim.g.base16_gui0C      = M.colors.base0C
693 +
    vim.g.base16_gui0D      = M.colors.base0D
694 +
    vim.g.base16_gui0E      = M.colors.base0E
695 +
    vim.g.base16_gui0F      = M.colors.base0F
696 +
end
697 +
698 +
function M.available_colorschemes()
699 +
    return vim.tbl_keys(M.colorschemes)
700 +
end
701 +
702 +
M.colorschemes = {}
703 +
setmetatable(M.colorschemes, {
704 +
    __index = function(t, key)
705 +
        t[key] = require(string.format('colors.%s', key))
706 +
        return t[key]
707 +
    end,
708 +
})
709 +
710 +
-- #16161D is called eigengrau and is kinda-ish the color your see when you
711 +
-- close your eyes. It makes for a really good background.
712 +
M.colorschemes['schemer-dark'] = {
713 +
    base00 = '#16161D',
714 +
    base01 = '#3e4451',
715 +
    base02 = '#2c313c',
716 +
    base03 = '#565c64',
717 +
    base04 = '#6c7891',
718 +
    base05 = '#abb2bf',
719 +
    base06 = '#9a9bb3',
720 +
    base07 = '#c5c8e6',
721 +
    base08 = '#e06c75',
722 +
    base09 = '#d19a66',
723 +
    base0A = '#e5c07b',
724 +
    base0B = '#98c379',
725 +
    base0C = '#56b6c2',
726 +
    base0D = '#0184bc',
727 +
    base0E = '#c678dd',
728 +
    base0F = '#a06949',
729 +
}
730 +
M.colorschemes['schemer-medium'] = {
731 +
    base00 = '#212226',
732 +
    base01 = '#3e4451',
733 +
    base02 = '#2c313c',
734 +
    base03 = '#565c64',
735 +
    base04 = '#6c7891',
736 +
    base05 = '#abb2bf',
737 +
    base06 = '#9a9bb3',
738 +
    base07 = '#c5c8e6',
739 +
    base08 = '#e06c75',
740 +
    base09 = '#d19a66',
741 +
    base0A = '#e5c07b',
742 +
    base0B = '#98c379',
743 +
    base0C = '#56b6c2',
744 +
    base0D = '#0184bc',
745 +
    base0E = '#c678dd',
746 +
    base0F = '#a06949',
747 +
}
748 +
749 +
M.load_from_shell = function()
750 +
    -- tinted-theming/base16-shell uses XDG_CONFIG_PATH if present.
751 +
    local config_dir = vim.env.XDG_CONFIG_HOME
752 +
    if config_dir == nil or config_dir == '' then
753 +
        config_dir = '~/.config'
754 +
    end
755 +
756 +
    local shell_theme_paths = {
757 +
        -- tinted-theming/base16-shell writes this file
758 +
        config_dir .. "/tinted-theming/set_theme.lua",
759 +
        -- chriskempson/base16-shell writes this file
760 +
        "~/.vimrc_background",
761 +
    }
762 +
763 +
    for _, path in pairs(shell_theme_paths) do
764 +
        local is_readable = vim.fn.filereadable(vim.fn.expand(path)) == 1
765 +
        if is_readable then
766 +
            vim.cmd([[let base16colorspace=256]])
767 +
            vim.cmd("source " .. path)
768 +
            return path
769 +
        end
770 +
    end
771 +
    return false
772 +
end
773 +
774 +
return M