neiam
/icon-studio
public · Issues · Pulls · Labels · Forks · Compare · Actions failure · Badges · Packages
⭐
Log in to mark this repository.
Add the blueprint palette
14f2f6e · gmorell · 2026-09-22 04:15
Message
{commit_body(@commit)}
Files changed
added
LICENSE.md
+675
−0
@@ -0,0 +1,675 @@
| 1 | +# GNU GENERAL PUBLIC LICENSE | |
| 2 | + | |
| 3 | +Version 3, 29 June 2007 | |
| 4 | + | |
| 5 | +Copyright (C) 2007 Free Software Foundation, Inc. | |
| 6 | +<https://fsf.org/> | |
| 7 | + | |
| 8 | +Everyone is permitted to copy and distribute verbatim copies of this | |
| 9 | +license document, but changing it is not allowed. | |
| 10 | + | |
| 11 | +## Preamble | |
| 12 | + | |
| 13 | +The GNU General Public License is a free, copyleft license for | |
| 14 | +software and other kinds of works. | |
| 15 | + | |
| 16 | +The licenses for most software and other practical works are designed | |
| 17 | +to take away your freedom to share and change the works. By contrast, | |
| 18 | +the GNU General Public License is intended to guarantee your freedom | |
| 19 | +to share and change all versions of a program--to make sure it remains | |
| 20 | +free software for all its users. We, the Free Software Foundation, use | |
| 21 | +the GNU General Public License for most of our software; it applies | |
| 22 | +also to any other work released this way by its authors. You can apply | |
| 23 | +it to your programs, too. | |
| 24 | + | |
| 25 | +When we speak of free software, we are referring to freedom, not | |
| 26 | +price. Our General Public Licenses are designed to make sure that you | |
| 27 | +have the freedom to distribute copies of free software (and charge for | |
| 28 | +them if you wish), that you receive source code or can get it if you | |
| 29 | +want it, that you can change the software or use pieces of it in new | |
| 30 | +free programs, and that you know you can do these things. | |
| 31 | + | |
| 32 | +To protect your rights, we need to prevent others from denying you | |
| 33 | +these rights or asking you to surrender the rights. Therefore, you | |
| 34 | +have certain responsibilities if you distribute copies of the | |
| 35 | +software, or if you modify it: responsibilities to respect the freedom | |
| 36 | +of others. | |
| 37 | + | |
| 38 | +For example, if you distribute copies of such a program, whether | |
| 39 | +gratis or for a fee, you must pass on to the recipients the same | |
| 40 | +freedoms that you received. You must make sure that they, too, receive | |
| 41 | +or can get the source code. And you must show them these terms so they | |
| 42 | +know their rights. | |
| 43 | + | |
| 44 | +Developers that use the GNU GPL protect your rights with two steps: | |
| 45 | +(1) assert copyright on the software, and (2) offer you this License | |
| 46 | +giving you legal permission to copy, distribute and/or modify it. | |
| 47 | + | |
| 48 | +For the developers' and authors' protection, the GPL clearly explains | |
| 49 | +that there is no warranty for this free software. For both users' and | |
| 50 | +authors' sake, the GPL requires that modified versions be marked as | |
| 51 | +changed, so that their problems will not be attributed erroneously to | |
| 52 | +authors of previous versions. | |
| 53 | + | |
| 54 | +Some devices are designed to deny users access to install or run | |
| 55 | +modified versions of the software inside them, although the | |
| 56 | +manufacturer can do so. This is fundamentally incompatible with the | |
| 57 | +aim of protecting users' freedom to change the software. The | |
| 58 | +systematic pattern of such abuse occurs in the area of products for | |
| 59 | +individuals to use, which is precisely where it is most unacceptable. | |
| 60 | +Therefore, we have designed this version of the GPL to prohibit the | |
| 61 | +practice for those products. If such problems arise substantially in | |
| 62 | +other domains, we stand ready to extend this provision to those | |
| 63 | +domains in future versions of the GPL, as needed to protect the | |
| 64 | +freedom of users. | |
| 65 | + | |
| 66 | +Finally, every program is threatened constantly by software patents. | |
| 67 | +States should not allow patents to restrict development and use of | |
| 68 | +software on general-purpose computers, but in those that do, we wish | |
| 69 | +to avoid the special danger that patents applied to a free program | |
| 70 | +could make it effectively proprietary. To prevent this, the GPL | |
| 71 | +assures that patents cannot be used to render the program non-free. | |
| 72 | + | |
| 73 | +The precise terms and conditions for copying, distribution and | |
| 74 | +modification follow. | |
| 75 | + | |
| 76 | +## TERMS AND CONDITIONS | |
| 77 | + | |
| 78 | +### 0. Definitions. | |
| 79 | + | |
| 80 | +"This License" refers to version 3 of the GNU General Public License. | |
| 81 | + | |
| 82 | +"Copyright" also means copyright-like laws that apply to other kinds | |
| 83 | +of works, such as semiconductor masks. | |
| 84 | + | |
| 85 | +"The Program" refers to any copyrightable work licensed under this | |
| 86 | +License. Each licensee is addressed as "you". "Licensees" and | |
| 87 | +"recipients" may be individuals or organizations. | |
| 88 | + | |
| 89 | +To "modify" a work means to copy from or adapt all or part of the work | |
| 90 | +in a fashion requiring copyright permission, other than the making of | |
| 91 | +an exact copy. The resulting work is called a "modified version" of | |
| 92 | +the earlier work or a work "based on" the earlier work. | |
| 93 | + | |
| 94 | +A "covered work" means either the unmodified Program or a work based | |
| 95 | +on the Program. | |
| 96 | + | |
| 97 | +To "propagate" a work means to do anything with it that, without | |
| 98 | +permission, would make you directly or secondarily liable for | |
| 99 | +infringement under applicable copyright law, except executing it on a | |
| 100 | +computer or modifying a private copy. Propagation includes copying, | |
| 101 | +distribution (with or without modification), making available to the | |
| 102 | +public, and in some countries other activities as well. | |
| 103 | + | |
| 104 | +To "convey" a work means any kind of propagation that enables other | |
| 105 | +parties to make or receive copies. Mere interaction with a user | |
| 106 | +through a computer network, with no transfer of a copy, is not | |
| 107 | +conveying. | |
| 108 | + | |
| 109 | +An interactive user interface displays "Appropriate Legal Notices" to | |
| 110 | +the extent that it includes a convenient and prominently visible | |
| 111 | +feature that (1) displays an appropriate copyright notice, and (2) | |
| 112 | +tells the user that there is no warranty for the work (except to the | |
| 113 | +extent that warranties are provided), that licensees may convey the | |
| 114 | +work under this License, and how to view a copy of this License. If | |
| 115 | +the interface presents a list of user commands or options, such as a | |
| 116 | +menu, a prominent item in the list meets this criterion. | |
| 117 | + | |
| 118 | +### 1. Source Code. | |
| 119 | + | |
| 120 | +The "source code" for a work means the preferred form of the work for | |
| 121 | +making modifications to it. "Object code" means any non-source form of | |
| 122 | +a work. | |
| 123 | + | |
| 124 | +A "Standard Interface" means an interface that either is an official | |
| 125 | +standard defined by a recognized standards body, or, in the case of | |
| 126 | +interfaces specified for a particular programming language, one that | |
| 127 | +is widely used among developers working in that language. | |
| 128 | + | |
| 129 | +The "System Libraries" of an executable work include anything, other | |
| 130 | +than the work as a whole, that (a) is included in the normal form of | |
| 131 | +packaging a Major Component, but which is not part of that Major | |
| 132 | +Component, and (b) serves only to enable use of the work with that | |
| 133 | +Major Component, or to implement a Standard Interface for which an | |
| 134 | +implementation is available to the public in source code form. A | |
| 135 | +"Major Component", in this context, means a major essential component | |
| 136 | +(kernel, window system, and so on) of the specific operating system | |
| 137 | +(if any) on which the executable work runs, or a compiler used to | |
| 138 | +produce the work, or an object code interpreter used to run it. | |
| 139 | + | |
| 140 | +The "Corresponding Source" for a work in object code form means all | |
| 141 | +the source code needed to generate, install, and (for an executable | |
| 142 | +work) run the object code and to modify the work, including scripts to | |
| 143 | +control those activities. However, it does not include the work's | |
| 144 | +System Libraries, or general-purpose tools or generally available free | |
| 145 | +programs which are used unmodified in performing those activities but | |
| 146 | +which are not part of the work. For example, Corresponding Source | |
| 147 | +includes interface definition files associated with source files for | |
| 148 | +the work, and the source code for shared libraries and dynamically | |
| 149 | +linked subprograms that the work is specifically designed to require, | |
| 150 | +such as by intimate data communication or control flow between those | |
| 151 | +subprograms and other parts of the work. | |
| 152 | + | |
| 153 | +The Corresponding Source need not include anything that users can | |
| 154 | +regenerate automatically from other parts of the Corresponding Source. | |
| 155 | + | |
| 156 | +The Corresponding Source for a work in source code form is that same | |
| 157 | +work. | |
| 158 | + | |
| 159 | +### 2. Basic Permissions. | |
| 160 | + | |
| 161 | +All rights granted under this License are granted for the term of | |
| 162 | +copyright on the Program, and are irrevocable provided the stated | |
| 163 | +conditions are met. This License explicitly affirms your unlimited | |
| 164 | +permission to run the unmodified Program. The output from running a | |
| 165 | +covered work is covered by this License only if the output, given its | |
| 166 | +content, constitutes a covered work. This License acknowledges your | |
| 167 | +rights of fair use or other equivalent, as provided by copyright law. | |
| 168 | + | |
| 169 | +You may make, run and propagate covered works that you do not convey, | |
| 170 | +without conditions so long as your license otherwise remains in force. | |
| 171 | +You may convey covered works to others for the sole purpose of having | |
| 172 | +them make modifications exclusively for you, or provide you with | |
| 173 | +facilities for running those works, provided that you comply with the | |
| 174 | +terms of this License in conveying all material for which you do not | |
| 175 | +control copyright. Those thus making or running the covered works for | |
| 176 | +you must do so exclusively on your behalf, under your direction and | |
| 177 | +control, on terms that prohibit them from making any copies of your | |
| 178 | +copyrighted material outside their relationship with you. | |
| 179 | + | |
| 180 | +Conveying under any other circumstances is permitted solely under the | |
| 181 | +conditions stated below. Sublicensing is not allowed; section 10 makes | |
| 182 | +it unnecessary. | |
| 183 | + | |
| 184 | +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. | |
| 185 | + | |
| 186 | +No covered work shall be deemed part of an effective technological | |
| 187 | +measure under any applicable law fulfilling obligations under article | |
| 188 | +11 of the WIPO copyright treaty adopted on 20 December 1996, or | |
| 189 | +similar laws prohibiting or restricting circumvention of such | |
| 190 | +measures. | |
| 191 | + | |
| 192 | +When you convey a covered work, you waive any legal power to forbid | |
| 193 | +circumvention of technological measures to the extent such | |
| 194 | +circumvention is effected by exercising rights under this License with | |
| 195 | +respect to the covered work, and you disclaim any intention to limit | |
| 196 | +operation or modification of the work as a means of enforcing, against | |
| 197 | +the work's users, your or third parties' legal rights to forbid | |
| 198 | +circumvention of technological measures. | |
| 199 | + | |
| 200 | +### 4. Conveying Verbatim Copies. | |
| 201 | + | |
| 202 | +You may convey verbatim copies of the Program's source code as you | |
| 203 | +receive it, in any medium, provided that you conspicuously and | |
| 204 | +appropriately publish on each copy an appropriate copyright notice; | |
| 205 | +keep intact all notices stating that this License and any | |
| 206 | +non-permissive terms added in accord with section 7 apply to the code; | |
| 207 | +keep intact all notices of the absence of any warranty; and give all | |
| 208 | +recipients a copy of this License along with the Program. | |
| 209 | + | |
| 210 | +You may charge any price or no price for each copy that you convey, | |
| 211 | +and you may offer support or warranty protection for a fee. | |
| 212 | + | |
| 213 | +### 5. Conveying Modified Source Versions. | |
| 214 | + | |
| 215 | +You may convey a work based on the Program, or the modifications to | |
| 216 | +produce it from the Program, in the form of source code under the | |
| 217 | +terms of section 4, provided that you also meet all of these | |
| 218 | +conditions: | |
| 219 | + | |
| 220 | +- a) The work must carry prominent notices stating that you modified | |
| 221 | + it, and giving a relevant date. | |
| 222 | +- b) The work must carry prominent notices stating that it is | |
| 223 | + released under this License and any conditions added under | |
| 224 | + section 7. This requirement modifies the requirement in section 4 | |
| 225 | + to "keep intact all notices". | |
| 226 | +- c) You must license the entire work, as a whole, under this | |
| 227 | + License to anyone who comes into possession of a copy. This | |
| 228 | + License will therefore apply, along with any applicable section 7 | |
| 229 | + additional terms, to the whole of the work, and all its parts, | |
| 230 | + regardless of how they are packaged. This License gives no | |
| 231 | + permission to license the work in any other way, but it does not | |
| 232 | + invalidate such permission if you have separately received it. | |
| 233 | +- d) If the work has interactive user interfaces, each must display | |
| 234 | + Appropriate Legal Notices; however, if the Program has interactive | |
| 235 | + interfaces that do not display Appropriate Legal Notices, your | |
| 236 | + work need not make them do so. | |
| 237 | + | |
| 238 | +A compilation of a covered work with other separate and independent | |
| 239 | +works, which are not by their nature extensions of the covered work, | |
| 240 | +and which are not combined with it such as to form a larger program, | |
| 241 | +in or on a volume of a storage or distribution medium, is called an | |
| 242 | +"aggregate" if the compilation and its resulting copyright are not | |
| 243 | +used to limit the access or legal rights of the compilation's users | |
| 244 | +beyond what the individual works permit. Inclusion of a covered work | |
| 245 | +in an aggregate does not cause this License to apply to the other | |
| 246 | +parts of the aggregate. | |
| 247 | + | |
| 248 | +### 6. Conveying Non-Source Forms. | |
| 249 | + | |
| 250 | +You may convey a covered work in object code form under the terms of | |
| 251 | +sections 4 and 5, provided that you also convey the machine-readable | |
| 252 | +Corresponding Source under the terms of this License, in one of these | |
| 253 | +ways: | |
| 254 | + | |
| 255 | +- a) Convey the object code in, or embodied in, a physical product | |
| 256 | + (including a physical distribution medium), accompanied by the | |
| 257 | + Corresponding Source fixed on a durable physical medium | |
| 258 | + customarily used for software interchange. | |
| 259 | +- b) Convey the object code in, or embodied in, a physical product | |
| 260 | + (including a physical distribution medium), accompanied by a | |
| 261 | + written offer, valid for at least three years and valid for as | |
| 262 | + long as you offer spare parts or customer support for that product | |
| 263 | + model, to give anyone who possesses the object code either (1) a | |
| 264 | + copy of the Corresponding Source for all the software in the | |
| 265 | + product that is covered by this License, on a durable physical | |
| 266 | + medium customarily used for software interchange, for a price no | |
| 267 | + more than your reasonable cost of physically performing this | |
| 268 | + conveying of source, or (2) access to copy the Corresponding | |
| 269 | + Source from a network server at no charge. | |
| 270 | +- c) Convey individual copies of the object code with a copy of the | |
| 271 | + written offer to provide the Corresponding Source. This | |
| 272 | + alternative is allowed only occasionally and noncommercially, and | |
| 273 | + only if you received the object code with such an offer, in accord | |
| 274 | + with subsection 6b. | |
| 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 | +- e) Convey the object code using peer-to-peer transmission, | |
| 288 | + provided you inform other peers where the object code and | |
| 289 | + Corresponding Source of the work are being offered to the general | |
| 290 | + public at no charge under subsection 6d. | |
| 291 | + | |
| 292 | +A separable portion of the object code, whose source code is excluded | |
| 293 | +from the Corresponding Source as a System Library, need not be | |
| 294 | +included in conveying the object code work. | |
| 295 | + | |
| 296 | +A "User Product" is either (1) a "consumer product", which means any | |
| 297 | +tangible personal property which is normally used for personal, | |
| 298 | +family, or household purposes, or (2) anything designed or sold for | |
| 299 | +incorporation into a dwelling. In determining whether a product is a | |
| 300 | +consumer product, doubtful cases shall be resolved in favor of | |
| 301 | +coverage. For a particular product received by a particular user, | |
| 302 | +"normally used" refers to a typical or common use of that class of | |
| 303 | +product, regardless of the status of the particular user or of the way | |
| 304 | +in which the particular user actually uses, or expects or is expected | |
| 305 | +to use, the product. A product is a consumer product regardless of | |
| 306 | +whether the product has substantial commercial, industrial or | |
| 307 | +non-consumer uses, unless such uses represent the only significant | |
| 308 | +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 | |
| 312 | +install and execute modified versions of a covered work in that User | |
| 313 | +Product from a modified version of its Corresponding Source. The | |
| 314 | +information must suffice to ensure that the continued functioning of | |
| 315 | +the modified object code is in no case prevented or interfered with | |
| 316 | +solely because 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 | |
| 331 | +updates for a work that has been modified or installed by the | |
| 332 | +recipient, or for the User Product in which it has been modified or | |
| 333 | +installed. Access to a network may be denied when the modification | |
| 334 | +itself materially and adversely affects the operation of the network | |
| 335 | +or violates the rules and protocols for communication across the | |
| 336 | +network. | |
| 337 | + | |
| 338 | +Corresponding Source conveyed, and Installation Information provided, | |
| 339 | +in accord with this section must be in a format that is publicly | |
| 340 | +documented (and with an implementation available to the public in | |
| 341 | +source code form), and must require no special password or key for | |
| 342 | +unpacking, reading or copying. | |
| 343 | + | |
| 344 | +### 7. Additional Terms. | |
| 345 | + | |
| 346 | +"Additional permissions" are terms that supplement the terms of this | |
| 347 | +License by making exceptions from one or more of its conditions. | |
| 348 | +Additional permissions that are applicable to the entire Program shall | |
| 349 | +be treated as though they were included in this License, to the extent | |
| 350 | +that they are valid under applicable law. If additional permissions | |
| 351 | +apply only to part of the Program, that part may be used separately | |
| 352 | +under those permissions, but the entire Program remains governed by | |
| 353 | +this License without regard to the additional permissions. | |
| 354 | + | |
| 355 | +When you convey a copy of a covered work, you may at your option | |
| 356 | +remove any additional permissions from that copy, or from any part of | |
| 357 | +it. (Additional permissions may be written to require their own | |
| 358 | +removal in certain cases when you modify the work.) You may place | |
| 359 | +additional permissions on material, added by you to a covered work, | |
| 360 | +for which you have or can give appropriate copyright permission. | |
| 361 | + | |
| 362 | +Notwithstanding any other provision of this License, for material you | |
| 363 | +add to a covered work, you may (if authorized by the copyright holders | |
| 364 | +of that material) supplement the terms of this License with terms: | |
| 365 | + | |
| 366 | +- a) Disclaiming warranty or limiting liability differently from the | |
| 367 | + terms of sections 15 and 16 of this License; or | |
| 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 | +- c) Prohibiting misrepresentation of the origin of that material, | |
| 372 | + or requiring that modified versions of such material be marked in | |
| 373 | + reasonable ways as different from the original version; or | |
| 374 | +- d) Limiting the use for publicity purposes of names of licensors | |
| 375 | + or authors of the material; or | |
| 376 | +- e) Declining to grant rights under trademark law for use of some | |
| 377 | + trade names, trademarks, or service marks; or | |
| 378 | +- f) Requiring indemnification of licensors and authors of that | |
| 379 | + material by anyone who conveys the material (or modified versions | |
| 380 | + of it) with contractual assumptions of liability to the recipient, | |
| 381 | + for any liability that these contractual assumptions directly | |
| 382 | + impose on those licensors and authors. | |
| 383 | + | |
| 384 | +All other non-permissive additional terms are considered "further | |
| 385 | +restrictions" within the meaning of section 10. If the Program as you | |
| 386 | +received it, or any part of it, contains a notice stating that it is | |
| 387 | +governed by this License along with a term that is a further | |
| 388 | +restriction, you may remove that term. If a license document contains | |
| 389 | +a further restriction but permits relicensing or conveying under this | |
| 390 | +License, you may add to a covered work material governed by the terms | |
| 391 | +of that license document, provided that the further restriction does | |
| 392 | +not survive such relicensing or conveying. | |
| 393 | + | |
| 394 | +If you add terms to a covered work in accord with this section, you | |
| 395 | +must place, in the relevant source files, a statement of the | |
| 396 | +additional terms that apply to those files, or a notice indicating | |
| 397 | +where to find the applicable terms. | |
| 398 | + | |
| 399 | +Additional terms, permissive or non-permissive, may be stated in the | |
| 400 | +form of a separately written license, or stated as exceptions; the | |
| 401 | +above requirements apply either way. | |
| 402 | + | |
| 403 | +### 8. Termination. | |
| 404 | + | |
| 405 | +You may not propagate or modify a covered work except as expressly | |
| 406 | +provided under this License. Any attempt otherwise to propagate or | |
| 407 | +modify it is void, and will automatically terminate your rights under | |
| 408 | +this License (including any patent licenses granted under the third | |
| 409 | +paragraph of section 11). | |
| 410 | + | |
| 411 | +However, if you cease all violation of this License, then your license | |
| 412 | +from a particular copyright holder is reinstated (a) provisionally, | |
| 413 | +unless and until the copyright holder explicitly and finally | |
| 414 | +terminates your license, and (b) permanently, if the copyright holder | |
| 415 | +fails to notify you of the violation by some reasonable means prior to | |
| 416 | +60 days after the cessation. | |
| 417 | + | |
| 418 | +Moreover, your license from a particular copyright holder is | |
| 419 | +reinstated permanently if the copyright holder notifies you of the | |
| 420 | +violation by some reasonable means, this is the first time you have | |
| 421 | +received notice of violation of this License (for any work) from that | |
| 422 | +copyright holder, and you cure the violation prior to 30 days after | |
| 423 | +your receipt of the notice. | |
| 424 | + | |
| 425 | +Termination of your rights under this section does not terminate the | |
| 426 | +licenses of parties who have received copies or rights from you under | |
| 427 | +this License. If your rights have been terminated and not permanently | |
| 428 | +reinstated, you do not qualify to receive new licenses for the same | |
| 429 | +material under section 10. | |
| 430 | + | |
| 431 | +### 9. Acceptance Not Required for Having Copies. | |
| 432 | + | |
| 433 | +You are not required to accept this License in order to receive or run | |
| 434 | +a copy of the Program. Ancillary propagation of a covered work | |
| 435 | +occurring solely as a consequence of using peer-to-peer transmission | |
| 436 | +to receive a copy likewise does not require acceptance. However, | |
| 437 | +nothing other than this License grants you permission to propagate or | |
| 438 | +modify any covered work. These actions infringe copyright if you do | |
| 439 | +not accept this License. Therefore, by modifying or propagating a | |
| 440 | +covered work, you indicate your acceptance of this License to do so. | |
| 441 | + | |
| 442 | +### 10. Automatic Licensing of Downstream Recipients. | |
| 443 | + | |
| 444 | +Each time you convey a covered work, the recipient automatically | |
| 445 | +receives a license from the original licensors, to run, modify and | |
| 446 | +propagate that work, subject to this License. You are not responsible | |
| 447 | +for enforcing compliance by third parties with this License. | |
| 448 | + | |
| 449 | +An "entity transaction" is a transaction transferring control of an | |
| 450 | +organization, or substantially all assets of one, or subdividing an | |
| 451 | +organization, or merging organizations. If propagation of a covered | |
| 452 | +work results from an entity transaction, each party to that | |
| 453 | +transaction who receives a copy of the work also receives whatever | |
| 454 | +licenses to the work the party's predecessor in interest had or could | |
| 455 | +give under the previous paragraph, plus a right to possession of the | |
| 456 | +Corresponding Source of the work from the predecessor in interest, if | |
| 457 | +the predecessor has it or can get it with reasonable efforts. | |
| 458 | + | |
| 459 | +You may not impose any further restrictions on the exercise of the | |
| 460 | +rights granted or affirmed under this License. For example, you may | |
| 461 | +not impose a license fee, royalty, or other charge for exercise of | |
| 462 | +rights granted under this License, and you may not initiate litigation | |
| 463 | +(including a cross-claim or counterclaim in a lawsuit) alleging that | |
| 464 | +any patent claim is infringed by making, using, selling, offering for | |
| 465 | +sale, or importing the Program or any portion of it. | |
| 466 | + | |
| 467 | +### 11. Patents. | |
| 468 | + | |
| 469 | +A "contributor" is a copyright holder who authorizes use under this | |
| 470 | +License of the Program or a work on which the Program is based. The | |
| 471 | +work thus licensed is called the contributor's "contributor version". | |
| 472 | + | |
| 473 | +A contributor's "essential patent claims" are all patent claims owned | |
| 474 | +or controlled by the contributor, whether already acquired or | |
| 475 | +hereafter acquired, that would be infringed by some manner, permitted | |
| 476 | +by this License, of making, using, or selling its contributor version, | |
| 477 | +but do not include claims that would be infringed only as a | |
| 478 | +consequence of further modification of the contributor version. For | |
| 479 | +purposes of this definition, "control" includes the right to grant | |
| 480 | +patent sublicenses in a manner consistent with the requirements of | |
| 481 | +this License. | |
| 482 | + | |
| 483 | +Each contributor grants you a non-exclusive, worldwide, royalty-free | |
| 484 | +patent license under the contributor's essential patent claims, to | |
| 485 | +make, use, sell, offer for sale, import and otherwise run, modify and | |
| 486 | +propagate the contents of its contributor version. | |
| 487 | + | |
| 488 | +In the following three paragraphs, a "patent license" is any express | |
| 489 | +agreement or commitment, however denominated, not to enforce a patent | |
| 490 | +(such as an express permission to practice a patent or covenant not to | |
| 491 | +sue for patent infringement). To "grant" such a patent license to a | |
| 492 | +party means to make such an agreement or commitment not to enforce a | |
| 493 | +patent against the party. | |
| 494 | + | |
| 495 | +If you convey a covered work, knowingly relying on a patent license, | |
| 496 | +and the Corresponding Source of the work is not available for anyone | |
| 497 | +to copy, free of charge and under the terms of this License, through a | |
| 498 | +publicly available network server or other readily accessible means, | |
| 499 | +then you must either (1) cause the Corresponding Source to be so | |
| 500 | +available, or (2) arrange to deprive yourself of the benefit of the | |
| 501 | +patent license for this particular work, or (3) arrange, in a manner | |
| 502 | +consistent with the requirements of this License, to extend the patent | |
| 503 | +license to downstream recipients. "Knowingly relying" means you have | |
| 504 | +actual knowledge that, but for the patent license, your conveying the | |
| 505 | +covered work in a country, or your recipient's use of the covered work | |
| 506 | +in a country, would infringe one or more identifiable patents in that | |
| 507 | +country that you have reason to believe are valid. | |
| 508 | + | |
| 509 | +If, pursuant to or in connection with a single transaction or | |
| 510 | +arrangement, you convey, or propagate by procuring conveyance of, a | |
| 511 | +covered work, and grant a patent license to some of the parties | |
| 512 | +receiving the covered work authorizing them to use, propagate, modify | |
| 513 | +or convey a specific copy of the covered work, then the patent license | |
| 514 | +you grant is automatically extended to all recipients of the covered | |
| 515 | +work and works based on it. | |
| 516 | + | |
| 517 | +A patent license is "discriminatory" if it does not include within the | |
| 518 | +scope of its coverage, prohibits the exercise of, or is conditioned on | |
| 519 | +the non-exercise of one or more of the rights that are specifically | |
| 520 | +granted under this License. You may not convey a covered work if you | |
| 521 | +are a party to an arrangement with a third party that is in the | |
| 522 | +business of distributing software, under which you make payment to the | |
| 523 | +third party based on the extent of your activity of conveying the | |
| 524 | +work, and under which the third party grants, to any of the parties | |
| 525 | +who would receive the covered work from you, a discriminatory patent | |
| 526 | +license (a) in connection with copies of the covered work conveyed by | |
| 527 | +you (or copies made from those copies), or (b) primarily for and in | |
| 528 | +connection with specific products or compilations that contain the | |
| 529 | +covered work, unless you entered into that arrangement, or that patent | |
| 530 | +license was granted, prior to 28 March 2007. | |
| 531 | + | |
| 532 | +Nothing in this License shall be construed as excluding or limiting | |
| 533 | +any implied license or other defenses to infringement that may | |
| 534 | +otherwise be available to you under applicable patent law. | |
| 535 | + | |
| 536 | +### 12. No Surrender of Others' Freedom. | |
| 537 | + | |
| 538 | +If conditions are imposed on you (whether by court order, agreement or | |
| 539 | +otherwise) that contradict the conditions of this License, they do not | |
| 540 | +excuse you from the conditions of this License. If you cannot convey a | |
| 541 | +covered work so as to satisfy simultaneously your obligations under | |
| 542 | +this License and any other pertinent obligations, then as a | |
| 543 | +consequence you may not convey it at all. For example, if you agree to | |
| 544 | +terms that obligate you to collect a royalty for further conveying | |
| 545 | +from those to whom you convey the Program, the only way you could | |
| 546 | +satisfy both those terms and this License would be to refrain entirely | |
| 547 | +from conveying the Program. | |
| 548 | + | |
| 549 | +### 13. Use with the GNU Affero General Public License. | |
| 550 | + | |
| 551 | +Notwithstanding any other provision of this License, you have | |
| 552 | +permission to link or combine any covered work with a work licensed | |
| 553 | +under version 3 of the GNU Affero General Public License into a single | |
| 554 | +combined work, and to convey the resulting work. The terms of this | |
| 555 | +License will continue to apply to the part which is the covered work, | |
| 556 | +but the special requirements of the GNU Affero General Public License, | |
| 557 | +section 13, concerning interaction through a network will apply to the | |
| 558 | +combination as such. | |
| 559 | + | |
| 560 | +### 14. Revised Versions of this License. | |
| 561 | + | |
| 562 | +The Free Software Foundation may publish revised and/or new versions | |
| 563 | +of the GNU General Public License from time to time. Such new versions | |
| 564 | +will be similar in spirit to the present version, but may differ in | |
| 565 | +detail to address new problems or concerns. | |
| 566 | + | |
| 567 | +Each version is given a distinguishing version number. If the Program | |
| 568 | +specifies that a certain numbered version of the GNU General Public | |
| 569 | +License "or any later version" applies to it, you have the option of | |
| 570 | +following the terms and conditions either of that numbered version or | |
| 571 | +of any later version published by the Free Software Foundation. If the | |
| 572 | +Program does not specify a version number of the GNU General Public | |
| 573 | +License, you may choose any version ever published by the Free | |
| 574 | +Software Foundation. | |
| 575 | + | |
| 576 | +If the Program specifies that a proxy can decide which future versions | |
| 577 | +of the GNU General Public License can be used, that proxy's public | |
| 578 | +statement of acceptance of a version permanently authorizes you to | |
| 579 | +choose that version for the Program. | |
| 580 | + | |
| 581 | +Later license versions may give you additional or different | |
| 582 | +permissions. However, no additional obligations are imposed on any | |
| 583 | +author or copyright holder as a result of your choosing to follow a | |
| 584 | +later version. | |
| 585 | + | |
| 586 | +### 15. Disclaimer of Warranty. | |
| 587 | + | |
| 588 | +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | |
| 589 | +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | |
| 590 | +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT | |
| 591 | +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT | |
| 592 | +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 593 | +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND | |
| 594 | +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE | |
| 595 | +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR | |
| 596 | +CORRECTION. | |
| 597 | + | |
| 598 | +### 16. Limitation of Liability. | |
| 599 | + | |
| 600 | +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |
| 601 | +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR | |
| 602 | +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |
| 603 | +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES | |
| 604 | +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT | |
| 605 | +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR | |
| 606 | +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM | |
| 607 | +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER | |
| 608 | +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. | |
| 609 | + | |
| 610 | +### 17. Interpretation of Sections 15 and 16. | |
| 611 | + | |
| 612 | +If the disclaimer of warranty and limitation of liability provided | |
| 613 | +above cannot be given local legal effect according to their terms, | |
| 614 | +reviewing courts shall apply local law that most closely approximates | |
| 615 | +an absolute waiver of all civil liability in connection with the | |
| 616 | +Program, unless a warranty or assumption of liability accompanies a | |
| 617 | +copy of the Program in return for a fee. | |
| 618 | + | |
| 619 | +END OF TERMS AND CONDITIONS | |
| 620 | + | |
| 621 | +## How to Apply These Terms to Your New Programs | |
| 622 | + | |
| 623 | +If you develop a new program, and you want it to be of the greatest | |
| 624 | +possible use to the public, the best way to achieve this is to make it | |
| 625 | +free software which everyone can redistribute and change under these | |
| 626 | +terms. | |
| 627 | + | |
| 628 | +To do so, attach the following notices to the program. It is safest to | |
| 629 | +attach them to the start of each source file to most effectively state | |
| 630 | +the exclusion of warranty; and each file should have at least the | |
| 631 | +"copyright" line and a pointer to where the full notice is found. | |
| 632 | + | |
| 633 | + <one line to give the program's name and a brief idea of what it does.> | |
| 634 | + Copyright (C) <year> <name of author> | |
| 635 | + | |
| 636 | + This program is free software: you can redistribute it and/or modify | |
| 637 | + it under the terms of the GNU General Public License as published by | |
| 638 | + the Free Software Foundation, either version 3 of the License, or | |
| 639 | + (at your option) any later version. | |
| 640 | + | |
| 641 | + This program is distributed in the hope that it will be useful, | |
| 642 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 643 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 644 | + GNU General Public License for more details. | |
| 645 | + | |
| 646 | + You should have received a copy of the GNU General Public License | |
| 647 | + along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| 648 | + | |
| 649 | +Also add information on how to contact you by electronic and paper | |
| 650 | +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 | |
| 661 | +appropriate parts of the General Public License. Of course, your | |
| 662 | +program's commands might be different; for a GUI interface, you would | |
| 663 | +use an "about box". | |
| 664 | + | |
| 665 | +You should also get your employer (if you work as a programmer) or | |
| 666 | +school, if any, to sign a "copyright disclaimer" for the program, if | |
| 667 | +necessary. For more information on this, and how to apply and follow | |
| 668 | +the GNU GPL, see <https://www.gnu.org/licenses/>. | |
| 669 | + | |
| 670 | +The GNU General Public License does not permit incorporating your | |
| 671 | +program into proprietary programs. If your program is a subroutine | |
| 672 | +library, you may consider it more useful to permit linking proprietary | |
| 673 | +applications with the library. If this is what you want to do, use the | |
| 674 | +GNU Lesser General Public License instead of this License. But first, | |
| 675 | +please read <https://www.gnu.org/licenses/why-not-lgpl.html>. |
modified
README.md
+10
−5
@@ -90,15 +90,20 @@ five and asserts they still reproduce the shipped background orientation.
| 90 | 90 | Nothing is retyped by hand. `tools/regen_palettes.py` writes |
| 91 | 91 | `src/palette/generated.rs` from: |
| 92 | 92 | |
| 93 | −- **neiam** — the daisyUI themes in `dms/assets/f/css/style.css` (`her`, | |
| 94 | − `afterdark`, `forest`, `sky`, `clays`, `stones`, `dark`, `light`), converted | |
| 95 | − from OKLCH to sRGB with the same transform the Android clients use; | |
| 93 | +- **neiam** — the daisyUI themes carried by the sites, converted from OKLCH to | |
| 94 | + sRGB with the same transform the Android clients use. Several sites ship the | |
| 95 | + same set, so more than one stylesheet is read and the results merged by name: | |
| 96 | + `dms` provides `her`, `afterdark`, `forest`, `sky`, `clays`, `stones`, | |
| 97 | + `dark` and `light`; `waxx` additionally provides `blueprint`. The shared | |
| 98 | + themes are identical between sources — where they ever diverge, the earlier | |
| 99 | + source wins and the script says so rather than resolving it quietly; | |
| 96 | 100 | - **Casabeza** — the exact values recovered from the cbzauth APK after the |
| 97 | 101 | loss, carried in the script. |
| 98 | 102 | |
| 99 | 103 | ``` |
| 100 | −tools/regen_palettes.py # refresh after dms changes | |
| 101 | −tools/regen_palettes.py --check # non-zero if stale, for CI | |
| 104 | +tools/regen_palettes.py # refresh after a site's themes change | |
| 105 | +tools/regen_palettes.py --source path.css # read a specific stylesheet, repeatable | |
| 106 | +tools/regen_palettes.py --check # non-zero if stale, for CI | |
| 102 | 107 | ``` |
| 103 | 108 | |
| 104 | 109 | The Android themes and the dms themes agree exactly on `primary` and `accent`; |
modified
src/palette/generated.rs
+166
−560
@@ -5,625 +5,231 @@
| 5 | 5 | |
| 6 | 6 | use super::{NamedColor, Theme}; |
| 7 | 7 | |
| 8 | +// rustfmt would explode each NamedColor across four lines, which makes a | |
| 9 | +// colour table far harder to scan — and CI enforces `cargo fmt --check`, | |
| 10 | +// so without this a regenerate would turn the build red. | |
| 11 | +#[rustfmt::skip] | |
| 8 | 12 | pub const THEMES: &[Theme] = &[ |
| 9 | 13 | Theme { |
| 10 | 14 | name: "Casabeza", |
| 11 | 15 | light: false, |
| 12 | 16 | colors: &[ |
| 13 | − NamedColor { | |
| 14 | − role: "accent", | |
| 15 | − rgb: [0xAA, 0xD4, 0x00], | |
| 16 | − }, | |
| 17 | − NamedColor { | |
| 18 | − role: "base-100", | |
| 19 | − rgb: [0x08, 0x1E, 0x20], | |
| 20 | − }, | |
| 21 | − NamedColor { | |
| 22 | − role: "base-200", | |
| 23 | − rgb: [0x0D, 0x2A, 0x2C], | |
| 24 | − }, | |
| 25 | − NamedColor { | |
| 26 | − role: "base-content", | |
| 27 | − rgb: [0xEE, 0xF9, 0xFA], | |
| 28 | − }, | |
| 29 | − NamedColor { | |
| 30 | − role: "neutral", | |
| 31 | − rgb: [0x7A, 0x96, 0x98], | |
| 32 | − }, | |
| 33 | − NamedColor { | |
| 34 | − role: "primary", | |
| 35 | − rgb: [0x00, 0xC9, 0xD4], | |
| 36 | − }, | |
| 17 | + NamedColor { role: "accent", rgb: [0xAA, 0xD4, 0x00] }, | |
| 18 | + NamedColor { role: "base-100", rgb: [0x08, 0x1E, 0x20] }, | |
| 19 | + NamedColor { role: "base-200", rgb: [0x0D, 0x2A, 0x2C] }, | |
| 20 | + NamedColor { role: "base-content", rgb: [0xEE, 0xF9, 0xFA] }, | |
| 21 | + NamedColor { role: "neutral", rgb: [0x7A, 0x96, 0x98] }, | |
| 22 | + NamedColor { role: "primary", rgb: [0x00, 0xC9, 0xD4] }, | |
| 37 | 23 | ], |
| 38 | 24 | }, |
| 39 | 25 | Theme { |
| 40 | 26 | name: "Casabeza Light", |
| 41 | 27 | light: true, |
| 42 | 28 | colors: &[ |
| 43 | − NamedColor { | |
| 44 | − role: "accent", | |
| 45 | − rgb: [0xC8, 0xF0, 0x17], | |
| 46 | − }, | |
| 47 | − NamedColor { | |
| 48 | − role: "base-100", | |
| 49 | − rgb: [0xF6, 0xFB, 0xFB], | |
| 50 | − }, | |
| 51 | − NamedColor { | |
| 52 | − role: "base-200", | |
| 53 | − rgb: [0xE9, 0xF5, 0xF6], | |
| 54 | − }, | |
| 55 | − NamedColor { | |
| 56 | − role: "base-content", | |
| 57 | − rgb: [0x1A, 0x1A, 0x1A], | |
| 58 | − }, | |
| 59 | − NamedColor { | |
| 60 | − role: "neutral", | |
| 61 | − rgb: [0x3D, 0x5F, 0x61], | |
| 62 | − }, | |
| 63 | − NamedColor { | |
| 64 | − role: "primary", | |
| 65 | − rgb: [0x00, 0x5A, 0x62], | |
| 66 | − }, | |
| 29 | + NamedColor { role: "accent", rgb: [0xC8, 0xF0, 0x17] }, | |
| 30 | + NamedColor { role: "base-100", rgb: [0xF6, 0xFB, 0xFB] }, | |
| 31 | + NamedColor { role: "base-200", rgb: [0xE9, 0xF5, 0xF6] }, | |
| 32 | + NamedColor { role: "base-content", rgb: [0x1A, 0x1A, 0x1A] }, | |
| 33 | + NamedColor { role: "neutral", rgb: [0x3D, 0x5F, 0x61] }, | |
| 34 | + NamedColor { role: "primary", rgb: [0x00, 0x5A, 0x62] }, | |
| 67 | 35 | ], |
| 68 | 36 | }, |
| 69 | 37 | Theme { |
| 70 | 38 | name: "light", |
| 71 | 39 | light: true, |
| 72 | 40 | colors: &[ |
| 73 | − NamedColor { | |
| 74 | − role: "accent", | |
| 75 | − rgb: [0x00, 0x00, 0x00], | |
| 76 | − }, | |
| 77 | − NamedColor { | |
| 78 | − role: "accent-content", | |
| 79 | − rgb: [0xFF, 0xFF, 0xFF], | |
| 80 | − }, | |
| 81 | − NamedColor { | |
| 82 | − role: "base-100", | |
| 83 | − rgb: [0xFE, 0xF6, 0xF6], | |
| 84 | − }, | |
| 85 | − NamedColor { | |
| 86 | − role: "base-200", | |
| 87 | − rgb: [0xFB, 0xEE, 0xED], | |
| 88 | − }, | |
| 89 | − NamedColor { | |
| 90 | − role: "base-300", | |
| 91 | − rgb: [0xF3, 0xDF, 0xDD], | |
| 92 | − }, | |
| 93 | − NamedColor { | |
| 94 | − role: "base-content", | |
| 95 | − rgb: [0x36, 0x17, 0x16], | |
| 96 | − }, | |
| 97 | − NamedColor { | |
| 98 | − role: "error", | |
| 99 | − rgb: [0xEA, 0x00, 0x3E], | |
| 100 | − }, | |
| 101 | − NamedColor { | |
| 102 | − role: "info", | |
| 103 | − rgb: [0x2A, 0x7E, 0xFF], | |
| 104 | − }, | |
| 105 | − NamedColor { | |
| 106 | − role: "neutral", | |
| 107 | − rgb: [0x51, 0x51, 0x5C], | |
| 108 | − }, | |
| 109 | − NamedColor { | |
| 110 | − role: "neutral-content", | |
| 111 | − rgb: [0xF8, 0xF8, 0xF8], | |
| 112 | − }, | |
| 113 | − NamedColor { | |
| 114 | − role: "primary", | |
| 115 | − rgb: [0xB6, 0x79, 0x7A], | |
| 116 | − }, | |
| 117 | − NamedColor { | |
| 118 | − role: "primary-content", | |
| 119 | − rgb: [0xFF, 0xF6, 0xF6], | |
| 120 | − }, | |
| 121 | − NamedColor { | |
| 122 | − role: "secondary", | |
| 123 | − rgb: [0x92, 0x63, 0x64], | |
| 124 | − }, | |
| 125 | − NamedColor { | |
| 126 | − role: "secondary-content", | |
| 127 | − rgb: [0xFF, 0xF6, 0xF6], | |
| 128 | − }, | |
| 129 | − NamedColor { | |
| 130 | − role: "success", | |
| 131 | − rgb: [0x00, 0xBA, 0xA6], | |
| 132 | − }, | |
| 133 | − NamedColor { | |
| 134 | − role: "warning", | |
| 135 | − rgb: [0xDF, 0x6F, 0x00], | |
| 136 | − }, | |
| 41 | + NamedColor { role: "accent", rgb: [0x00, 0x00, 0x00] }, | |
| 42 | + NamedColor { role: "accent-content", rgb: [0xFF, 0xFF, 0xFF] }, | |
| 43 | + NamedColor { role: "base-100", rgb: [0xFE, 0xF6, 0xF6] }, | |
| 44 | + NamedColor { role: "base-200", rgb: [0xFB, 0xEE, 0xED] }, | |
| 45 | + NamedColor { role: "base-300", rgb: [0xF3, 0xDF, 0xDD] }, | |
| 46 | + NamedColor { role: "base-content", rgb: [0x36, 0x17, 0x16] }, | |
| 47 | + NamedColor { role: "error", rgb: [0xEA, 0x00, 0x3E] }, | |
| 48 | + NamedColor { role: "info", rgb: [0x2A, 0x7E, 0xFF] }, | |
| 49 | + NamedColor { role: "neutral", rgb: [0x51, 0x51, 0x5C] }, | |
| 50 | + NamedColor { role: "neutral-content", rgb: [0xF8, 0xF8, 0xF8] }, | |
| 51 | + NamedColor { role: "primary", rgb: [0xB6, 0x79, 0x7A] }, | |
| 52 | + NamedColor { role: "primary-content", rgb: [0xFF, 0xF6, 0xF6] }, | |
| 53 | + NamedColor { role: "secondary", rgb: [0x92, 0x63, 0x64] }, | |
| 54 | + NamedColor { role: "secondary-content", rgb: [0xFF, 0xF6, 0xF6] }, | |
| 55 | + NamedColor { role: "success", rgb: [0x00, 0xBA, 0xA6] }, | |
| 56 | + NamedColor { role: "warning", rgb: [0xDF, 0x6F, 0x00] }, | |
| 137 | 57 | ], |
| 138 | 58 | }, |
| 139 | 59 | Theme { |
| 140 | 60 | name: "dark", |
| 141 | 61 | light: false, |
| 142 | 62 | colors: &[ |
| 143 | − NamedColor { | |
| 144 | − role: "accent", | |
| 145 | − rgb: [0xD1, 0x66, 0x71], | |
| 146 | − }, | |
| 147 | − NamedColor { | |
| 148 | − role: "accent-content", | |
| 149 | − rgb: [0x06, 0x02, 0x03], | |
| 150 | − }, | |
| 151 | − NamedColor { | |
| 152 | − role: "base-100", | |
| 153 | − rgb: [0x29, 0x2F, 0x37], | |
| 154 | − }, | |
| 155 | − NamedColor { | |
| 156 | − role: "base-200", | |
| 157 | − rgb: [0x1E, 0x23, 0x29], | |
| 158 | − }, | |
| 159 | − NamedColor { | |
| 160 | − role: "base-300", | |
| 161 | − rgb: [0x13, 0x17, 0x1C], | |
| 162 | − }, | |
| 163 | − NamedColor { | |
| 164 | − role: "base-content", | |
| 165 | − rgb: [0xEC, 0xF9, 0xFF], | |
| 166 | − }, | |
| 167 | − NamedColor { | |
| 168 | − role: "error", | |
| 169 | − rgb: [0xEA, 0x00, 0x3E], | |
| 170 | − }, | |
| 171 | − NamedColor { | |
| 172 | − role: "info", | |
| 173 | − rgb: [0x00, 0x82, 0xCE], | |
| 174 | − }, | |
| 175 | − NamedColor { | |
| 176 | − role: "neutral", | |
| 177 | − rgb: [0x31, 0x41, 0x57], | |
| 178 | − }, | |
| 179 | − NamedColor { | |
| 180 | − role: "neutral-content", | |
| 181 | − rgb: [0xF7, 0xF9, 0xFA], | |
| 182 | − }, | |
| 183 | − NamedColor { | |
| 184 | − role: "primary", | |
| 185 | − rgb: [0xB6, 0x79, 0x7A], | |
| 186 | − }, | |
| 187 | − NamedColor { | |
| 188 | − role: "primary-content", | |
| 189 | − rgb: [0x05, 0x03, 0x03], | |
| 190 | − }, | |
| 191 | − NamedColor { | |
| 192 | − role: "secondary", | |
| 193 | − rgb: [0xA9, 0x64, 0x65], | |
| 194 | − }, | |
| 195 | − NamedColor { | |
| 196 | − role: "secondary-content", | |
| 197 | − rgb: [0xFF, 0xF6, 0xF6], | |
| 198 | − }, | |
| 199 | − NamedColor { | |
| 200 | − role: "success", | |
| 201 | − rgb: [0x00, 0x96, 0x89], | |
| 202 | − }, | |
| 203 | − NamedColor { | |
| 204 | − role: "warning", | |
| 205 | − rgb: [0xDF, 0x6F, 0x00], | |
| 206 | − }, | |
| 63 | + NamedColor { role: "accent", rgb: [0xD1, 0x66, 0x71] }, | |
| 64 | + NamedColor { role: "accent-content", rgb: [0x06, 0x02, 0x03] }, | |
| 65 | + NamedColor { role: "base-100", rgb: [0x29, 0x2F, 0x37] }, | |
| 66 | + NamedColor { role: "base-200", rgb: [0x1E, 0x23, 0x29] }, | |
| 67 | + NamedColor { role: "base-300", rgb: [0x13, 0x17, 0x1C] }, | |
| 68 | + NamedColor { role: "base-content", rgb: [0xEC, 0xF9, 0xFF] }, | |
| 69 | + NamedColor { role: "error", rgb: [0xEA, 0x00, 0x3E] }, | |
| 70 | + NamedColor { role: "info", rgb: [0x00, 0x82, 0xCE] }, | |
| 71 | + NamedColor { role: "neutral", rgb: [0x31, 0x41, 0x57] }, | |
| 72 | + NamedColor { role: "neutral-content", rgb: [0xF7, 0xF9, 0xFA] }, | |
| 73 | + NamedColor { role: "primary", rgb: [0xB6, 0x79, 0x7A] }, | |
| 74 | + NamedColor { role: "primary-content", rgb: [0x05, 0x03, 0x03] }, | |
| 75 | + NamedColor { role: "secondary", rgb: [0xA9, 0x64, 0x65] }, | |
| 76 | + NamedColor { role: "secondary-content", rgb: [0xFF, 0xF6, 0xF6] }, | |
| 77 | + NamedColor { role: "success", rgb: [0x00, 0x96, 0x89] }, | |
| 78 | + NamedColor { role: "warning", rgb: [0xDF, 0x6F, 0x00] }, | |
| 207 | 79 | ], |
| 208 | 80 | }, |
| 209 | 81 | Theme { |
| 210 | 82 | name: "her", |
| 211 | 83 | light: false, |
| 212 | 84 | colors: &[ |
| 213 | − NamedColor { | |
| 214 | − role: "accent", | |
| 215 | − rgb: [0xFD, 0xF2, 0xC6], | |
| 216 | − }, | |
| 217 | − NamedColor { | |
| 218 | − role: "accent-content", | |
| 219 | − rgb: [0x04, 0x03, 0x01], | |
| 220 | − }, | |
| 221 | − NamedColor { | |
| 222 | − role: "base-100", | |
| 223 | − rgb: [0x66, 0x1E, 0x1E], | |
| 224 | − }, | |
| 225 | − NamedColor { | |
| 226 | − role: "base-200", | |
| 227 | − rgb: [0x57, 0x0E, 0x12], | |
| 228 | − }, | |
| 229 | − NamedColor { | |
| 230 | − role: "base-300", | |
| 231 | − rgb: [0x47, 0x00, 0x05], | |
| 232 | − }, | |
| 233 | − NamedColor { | |
| 234 | − role: "base-content", | |
| 235 | − rgb: [0xFF, 0xEC, 0xE8], | |
| 236 | − }, | |
| 237 | − NamedColor { | |
| 238 | − role: "error", | |
| 239 | − rgb: [0xFD, 0xA6, 0xA5], | |
| 240 | − }, | |
| 241 | − NamedColor { | |
| 242 | − role: "info", | |
| 243 | − rgb: [0x7E, 0xD4, 0xFC], | |
| 244 | − }, | |
| 245 | − NamedColor { | |
| 246 | − role: "neutral", | |
| 247 | − rgb: [0x7F, 0x35, 0x35], | |
| 248 | − }, | |
| 249 | − NamedColor { | |
| 250 | − role: "neutral-content", | |
| 251 | − rgb: [0xFF, 0xF6, 0xF5], | |
| 252 | − }, | |
| 253 | − NamedColor { | |
| 254 | − role: "primary", | |
| 255 | − rgb: [0xB6, 0x79, 0x7A], | |
| 256 | − }, | |
| 257 | − NamedColor { | |
| 258 | − role: "primary-content", | |
| 259 | − rgb: [0x05, 0x03, 0x03], | |
| 260 | − }, | |
| 261 | − NamedColor { | |
| 262 | − role: "secondary", | |
| 263 | − rgb: [0xD5, 0xAB, 0xAC], | |
| 264 | − }, | |
| 265 | − NamedColor { | |
| 266 | − role: "secondary-content", | |
| 267 | − rgb: [0x05, 0x03, 0x03], | |
| 268 | − }, | |
| 269 | − NamedColor { | |
| 270 | − role: "success", | |
| 271 | − rgb: [0xA6, 0xF1, 0xCE], | |
| 272 | − }, | |
| 273 | − NamedColor { | |
| 274 | − role: "warning", | |
| 275 | − rgb: [0xFF, 0xF2, 0x8C], | |
| 276 | − }, | |
| 85 | + NamedColor { role: "accent", rgb: [0xFD, 0xF2, 0xC6] }, | |
| 86 | + NamedColor { role: "accent-content", rgb: [0x04, 0x03, 0x01] }, | |
| 87 | + NamedColor { role: "base-100", rgb: [0x66, 0x1E, 0x1E] }, | |
| 88 | + NamedColor { role: "base-200", rgb: [0x57, 0x0E, 0x12] }, | |
| 89 | + NamedColor { role: "base-300", rgb: [0x47, 0x00, 0x05] }, | |
| 90 | + NamedColor { role: "base-content", rgb: [0xFF, 0xEC, 0xE8] }, | |
| 91 | + NamedColor { role: "error", rgb: [0xFD, 0xA6, 0xA5] }, | |
| 92 | + NamedColor { role: "info", rgb: [0x7E, 0xD4, 0xFC] }, | |
| 93 | + NamedColor { role: "neutral", rgb: [0x7F, 0x35, 0x35] }, | |
| 94 | + NamedColor { role: "neutral-content", rgb: [0xFF, 0xF6, 0xF5] }, | |
| 95 | + NamedColor { role: "primary", rgb: [0xB6, 0x79, 0x7A] }, | |
| 96 | + NamedColor { role: "primary-content", rgb: [0x05, 0x03, 0x03] }, | |
| 97 | + NamedColor { role: "secondary", rgb: [0xD5, 0xAB, 0xAC] }, | |
| 98 | + NamedColor { role: "secondary-content", rgb: [0x05, 0x03, 0x03] }, | |
| 99 | + NamedColor { role: "success", rgb: [0xA6, 0xF1, 0xCE] }, | |
| 100 | + NamedColor { role: "warning", rgb: [0xFF, 0xF2, 0x8C] }, | |
| 277 | 101 | ], |
| 278 | 102 | }, |
| 279 | 103 | Theme { |
| 280 | 104 | name: "afterdark", |
| 281 | 105 | light: false, |
| 282 | 106 | colors: &[ |
| 283 | − NamedColor { | |
| 284 | − role: "accent", | |
| 285 | − rgb: [0xFD, 0xF2, 0xC6], | |
| 286 | − }, | |
| 287 | − NamedColor { | |
| 288 | − role: "accent-content", | |
| 289 | − rgb: [0x04, 0x03, 0x01], | |
| 290 | − }, | |
| 291 | − NamedColor { | |
| 292 | − role: "base-100", | |
| 293 | − rgb: [0x20, 0x1E, 0x66], | |
| 294 | − }, | |
| 295 | − NamedColor { | |
| 296 | − role: "base-200", | |
| 297 | − rgb: [0x16, 0x0E, 0x57], | |
| 298 | − }, | |
| 299 | − NamedColor { | |
| 300 | − role: "base-300", | |
| 301 | − rgb: [0x0E, 0x00, 0x48], | |
| 302 | − }, | |
| 303 | − NamedColor { | |
| 304 | − role: "base-content", | |
| 305 | − rgb: [0xEF, 0xF6, 0xFF], | |
| 306 | − }, | |
| 307 | − NamedColor { | |
| 308 | − role: "error", | |
| 309 | − rgb: [0xFD, 0xA6, 0xA5], | |
| 310 | − }, | |
| 311 | − NamedColor { | |
| 312 | − role: "info", | |
| 313 | − rgb: [0x7E, 0xD4, 0xFC], | |
| 314 | − }, | |
| 315 | − NamedColor { | |
| 316 | − role: "neutral", | |
| 317 | − rgb: [0x39, 0x36, 0x80], | |
| 318 | − }, | |
| 319 | − NamedColor { | |
| 320 | − role: "neutral-content", | |
| 321 | − rgb: [0xF7, 0xF8, 0xFF], | |
| 322 | − }, | |
| 323 | − NamedColor { | |
| 324 | − role: "primary", | |
| 325 | − rgb: [0x7B, 0x78, 0xB4], | |
| 326 | − }, | |
| 327 | − NamedColor { | |
| 328 | − role: "primary-content", | |
| 329 | − rgb: [0x03, 0x03, 0x06], | |
| 330 | − }, | |
| 331 | − NamedColor { | |
| 332 | − role: "secondary", | |
| 333 | − rgb: [0xAD, 0xAC, 0xD6], | |
| 334 | − }, | |
| 335 | − NamedColor { | |
| 336 | − role: "secondary-content", | |
| 337 | − rgb: [0x03, 0x03, 0x06], | |
| 338 | − }, | |
| 339 | − NamedColor { | |
| 340 | − role: "success", | |
| 341 | − rgb: [0xA6, 0xF1, 0xCE], | |
| 342 | − }, | |
| 343 | − NamedColor { | |
| 344 | − role: "warning", | |
| 345 | − rgb: [0xFF, 0xF2, 0x8C], | |
| 346 | − }, | |
| 107 | + NamedColor { role: "accent", rgb: [0xFD, 0xF2, 0xC6] }, | |
| 108 | + NamedColor { role: "accent-content", rgb: [0x04, 0x03, 0x01] }, | |
| 109 | + NamedColor { role: "base-100", rgb: [0x20, 0x1E, 0x66] }, | |
| 110 | + NamedColor { role: "base-200", rgb: [0x16, 0x0E, 0x57] }, | |
| 111 | + NamedColor { role: "base-300", rgb: [0x0E, 0x00, 0x48] }, | |
| 112 | + NamedColor { role: "base-content", rgb: [0xEF, 0xF6, 0xFF] }, | |
| 113 | + NamedColor { role: "error", rgb: [0xFD, 0xA6, 0xA5] }, | |
| 114 | + NamedColor { role: "info", rgb: [0x7E, 0xD4, 0xFC] }, | |
| 115 | + NamedColor { role: "neutral", rgb: [0x39, 0x36, 0x80] }, | |
| 116 | + NamedColor { role: "neutral-content", rgb: [0xF7, 0xF8, 0xFF] }, | |
| 117 | + NamedColor { role: "primary", rgb: [0x7B, 0x78, 0xB4] }, | |
| 118 | + NamedColor { role: "primary-content", rgb: [0x03, 0x03, 0x06] }, | |
| 119 | + NamedColor { role: "secondary", rgb: [0xAD, 0xAC, 0xD6] }, | |
| 120 | + NamedColor { role: "secondary-content", rgb: [0x03, 0x03, 0x06] }, | |
| 121 | + NamedColor { role: "success", rgb: [0xA6, 0xF1, 0xCE] }, | |
| 122 | + NamedColor { role: "warning", rgb: [0xFF, 0xF2, 0x8C] }, | |
| 347 | 123 | ], |
| 348 | 124 | }, |
| 349 | 125 | Theme { |
| 350 | 126 | name: "forest", |
| 351 | 127 | light: false, |
| 352 | 128 | colors: &[ |
| 353 | − NamedColor { | |
| 354 | − role: "accent", | |
| 355 | − rgb: [0xFD, 0xF2, 0xC6], | |
| 356 | − }, | |
| 357 | − NamedColor { | |
| 358 | − role: "accent-content", | |
| 359 | − rgb: [0x04, 0x03, 0x01], | |
| 360 | − }, | |
| 361 | − NamedColor { | |
| 362 | − role: "base-100", | |
| 363 | − rgb: [0x06, 0x2F, 0x17], | |
| 364 | − }, | |
| 365 | − NamedColor { | |
| 366 | − role: "base-200", | |
| 367 | − rgb: [0x00, 0x22, 0x0B], | |
| 368 | − }, | |
| 369 | − NamedColor { | |
| 370 | − role: "base-300", | |
| 371 | − rgb: [0x00, 0x16, 0x03], | |
| 372 | − }, | |
| 373 | − NamedColor { | |
| 374 | − role: "base-content", | |
| 375 | − rgb: [0xE0, 0xFF, 0xE9], | |
| 376 | − }, | |
| 377 | − NamedColor { | |
| 378 | − role: "error", | |
| 379 | − rgb: [0xFD, 0xA6, 0xA5], | |
| 380 | − }, | |
| 381 | − NamedColor { | |
| 382 | − role: "info", | |
| 383 | − rgb: [0x7E, 0xD4, 0xFC], | |
| 384 | − }, | |
| 385 | − NamedColor { | |
| 386 | − role: "neutral", | |
| 387 | − rgb: [0x18, 0x66, 0x34], | |
| 388 | − }, | |
| 389 | − NamedColor { | |
| 390 | − role: "neutral-content", | |
| 391 | − rgb: [0xF4, 0xFA, 0xF5], | |
| 392 | − }, | |
| 393 | − NamedColor { | |
| 394 | − role: "primary", | |
| 395 | − rgb: [0x48, 0xDE, 0x81], | |
| 396 | − }, | |
| 397 | − NamedColor { | |
| 398 | − role: "primary-content", | |
| 399 | − rgb: [0x02, 0x04, 0x02], | |
| 400 | − }, | |
| 401 | − NamedColor { | |
| 402 | − role: "secondary", | |
| 403 | − rgb: [0x87, 0xEE, 0xAB], | |
| 404 | − }, | |
| 405 | − NamedColor { | |
| 406 | − role: "secondary-content", | |
| 407 | − rgb: [0x02, 0x04, 0x02], | |
| 408 | − }, | |
| 409 | − NamedColor { | |
| 410 | − role: "success", | |
| 411 | − rgb: [0xA6, 0xF1, 0xCE], | |
| 412 | − }, | |
| 413 | − NamedColor { | |
| 414 | − role: "warning", | |
| 415 | − rgb: [0xFF, 0xF2, 0x8C], | |
| 416 | − }, | |
| 129 | + NamedColor { role: "accent", rgb: [0xFD, 0xF2, 0xC6] }, | |
| 130 | + NamedColor { role: "accent-content", rgb: [0x04, 0x03, 0x01] }, | |
| 131 | + NamedColor { role: "base-100", rgb: [0x06, 0x2F, 0x17] }, | |
| 132 | + NamedColor { role: "base-200", rgb: [0x00, 0x22, 0x0B] }, | |
| 133 | + NamedColor { role: "base-300", rgb: [0x00, 0x16, 0x03] }, | |
| 134 | + NamedColor { role: "base-content", rgb: [0xE0, 0xFF, 0xE9] }, | |
| 135 | + NamedColor { role: "error", rgb: [0xFD, 0xA6, 0xA5] }, | |
| 136 | + NamedColor { role: "info", rgb: [0x7E, 0xD4, 0xFC] }, | |
| 137 | + NamedColor { role: "neutral", rgb: [0x18, 0x66, 0x34] }, | |
| 138 | + NamedColor { role: "neutral-content", rgb: [0xF4, 0xFA, 0xF5] }, | |
| 139 | + NamedColor { role: "primary", rgb: [0x48, 0xDE, 0x81] }, | |
| 140 | + NamedColor { role: "primary-content", rgb: [0x02, 0x04, 0x02] }, | |
| 141 | + NamedColor { role: "secondary", rgb: [0x87, 0xEE, 0xAB] }, | |
| 142 | + NamedColor { role: "secondary-content", rgb: [0x02, 0x04, 0x02] }, | |
| 143 | + NamedColor { role: "success", rgb: [0xA6, 0xF1, 0xCE] }, | |
| 144 | + NamedColor { role: "warning", rgb: [0xFF, 0xF2, 0x8C] }, | |
| 417 | 145 | ], |
| 418 | 146 | }, |
| 419 | 147 | Theme { |
| 420 | 148 | name: "sky", |
| 421 | 149 | light: false, |
| 422 | 150 | colors: &[ |
| 423 | − NamedColor { | |
| 424 | − role: "accent", | |
| 425 | − rgb: [0xFD, 0xF2, 0xC6], | |
| 426 | − }, | |
| 427 | − NamedColor { | |
| 428 | − role: "accent-content", | |
| 429 | − rgb: [0x04, 0x03, 0x01], | |
| 430 | − }, | |
| 431 | − NamedColor { | |
| 432 | − role: "base-100", | |
| 433 | − rgb: [0x07, 0x2E, 0x48], | |
| 434 | − }, | |
| 435 | − NamedColor { | |
| 436 | − role: "base-200", | |
| 437 | − rgb: [0x00, 0x21, 0x3A], | |
| 438 | − }, | |
| 439 | − NamedColor { | |
| 440 | − role: "base-300", | |
| 441 | − rgb: [0x00, 0x15, 0x2D], | |
| 442 | − }, | |
| 443 | − NamedColor { | |
| 444 | − role: "base-content", | |
| 445 | − rgb: [0xDC, 0xFD, 0xFF], | |
| 446 | − }, | |
| 447 | − NamedColor { | |
| 448 | − role: "error", | |
| 449 | − rgb: [0xFD, 0xA6, 0xA5], | |
| 450 | − }, | |
| 451 | − NamedColor { | |
| 452 | − role: "info", | |
| 453 | − rgb: [0x7E, 0xD4, 0xFC], | |
| 454 | − }, | |
| 455 | − NamedColor { | |
| 456 | − role: "neutral", | |
| 457 | − rgb: [0x0B, 0x4A, 0x6E], | |
| 458 | − }, | |
| 459 | − NamedColor { | |
| 460 | − role: "neutral-content", | |
| 461 | − rgb: [0xF3, 0xF9, 0xFF], | |
| 462 | − }, | |
| 463 | − NamedColor { | |
| 464 | − role: "primary", | |
| 465 | − rgb: [0x37, 0xBC, 0xF7], | |
| 466 | − }, | |
| 467 | − NamedColor { | |
| 468 | − role: "primary-content", | |
| 469 | − rgb: [0x02, 0x04, 0x05], | |
| 470 | − }, | |
| 471 | − NamedColor { | |
| 472 | − role: "secondary", | |
| 473 | − rgb: [0x7E, 0xD4, 0xFC], | |
| 474 | − }, | |
| 475 | − NamedColor { | |
| 476 | − role: "secondary-content", | |
| 477 | − rgb: [0x02, 0x04, 0x05], | |
| 478 | − }, | |
| 479 | − NamedColor { | |
| 480 | − role: "success", | |
| 481 | − rgb: [0xA6, 0xF1, 0xCE], | |
| 482 | − }, | |
| 483 | − NamedColor { | |
| 484 | − role: "warning", | |
| 485 | − rgb: [0xFF, 0xF2, 0x8C], | |
| 486 | − }, | |
| 151 | + NamedColor { role: "accent", rgb: [0xFD, 0xF2, 0xC6] }, | |
| 152 | + NamedColor { role: "accent-content", rgb: [0x04, 0x03, 0x01] }, | |
| 153 | + NamedColor { role: "base-100", rgb: [0x07, 0x2E, 0x48] }, | |
| 154 | + NamedColor { role: "base-200", rgb: [0x00, 0x21, 0x3A] }, | |
| 155 | + NamedColor { role: "base-300", rgb: [0x00, 0x15, 0x2D] }, | |
| 156 | + NamedColor { role: "base-content", rgb: [0xDC, 0xFD, 0xFF] }, | |
| 157 | + NamedColor { role: "error", rgb: [0xFD, 0xA6, 0xA5] }, | |
| 158 | + NamedColor { role: "info", rgb: [0x7E, 0xD4, 0xFC] }, | |
| 159 | + NamedColor { role: "neutral", rgb: [0x0B, 0x4A, 0x6E] }, | |
| 160 | + NamedColor { role: "neutral-content", rgb: [0xF3, 0xF9, 0xFF] }, | |
| 161 | + NamedColor { role: "primary", rgb: [0x37, 0xBC, 0xF7] }, | |
| 162 | + NamedColor { role: "primary-content", rgb: [0x02, 0x04, 0x05] }, | |
| 163 | + NamedColor { role: "secondary", rgb: [0x7E, 0xD4, 0xFC] }, | |
| 164 | + NamedColor { role: "secondary-content", rgb: [0x02, 0x04, 0x05] }, | |
| 165 | + NamedColor { role: "success", rgb: [0xA6, 0xF1, 0xCE] }, | |
| 166 | + NamedColor { role: "warning", rgb: [0xFF, 0xF2, 0x8C] }, | |
| 487 | 167 | ], |
| 488 | 168 | }, |
| 489 | 169 | Theme { |
| 490 | 170 | name: "clays", |
| 491 | 171 | light: false, |
| 492 | 172 | colors: &[ |
| 493 | − NamedColor { | |
| 494 | − role: "accent", | |
| 495 | − rgb: [0xFD, 0xF2, 0xC6], | |
| 496 | − }, | |
| 497 | − NamedColor { | |
| 498 | − role: "accent-content", | |
| 499 | − rgb: [0x04, 0x03, 0x01], | |
| 500 | − }, | |
| 501 | − NamedColor { | |
| 502 | − role: "base-100", | |
| 503 | − rgb: [0x45, 0x1A, 0x03], | |
| 504 | − }, | |
| 505 | − NamedColor { | |
| 506 | − role: "base-200", | |
| 507 | − rgb: [0x37, 0x0D, 0x00], | |
| 508 | − }, | |
| 509 | − NamedColor { | |
| 510 | − role: "base-300", | |
| 511 | − rgb: [0x29, 0x02, 0x00], | |
| 512 | − }, | |
| 513 | − NamedColor { | |
| 514 | − role: "base-content", | |
| 515 | − rgb: [0xFF, 0xEF, 0xDD], | |
| 516 | − }, | |
| 517 | − NamedColor { | |
| 518 | − role: "error", | |
| 519 | − rgb: [0xFD, 0xA6, 0xA5], | |
| 520 | − }, | |
| 521 | − NamedColor { | |
| 522 | − role: "info", | |
| 523 | − rgb: [0x7E, 0xD4, 0xFC], | |
| 524 | − }, | |
| 525 | − NamedColor { | |
| 526 | − role: "neutral", | |
| 527 | − rgb: [0x91, 0x3F, 0x0D], | |
| 528 | − }, | |
| 529 | − NamedColor { | |
| 530 | − role: "neutral-content", | |
| 531 | − rgb: [0xFF, 0xF7, 0xF3], | |
| 532 | − }, | |
| 533 | − NamedColor { | |
| 534 | − role: "primary", | |
| 535 | − rgb: [0xDA, 0x78, 0x0E], | |
| 536 | − }, | |
| 537 | − NamedColor { | |
| 538 | − role: "primary-content", | |
| 539 | − rgb: [0x05, 0x03, 0x02], | |
| 540 | − }, | |
| 541 | − NamedColor { | |
| 542 | − role: "secondary", | |
| 543 | − rgb: [0xF6, 0x9E, 0x0B], | |
| 544 | − }, | |
| 545 | − NamedColor { | |
| 546 | − role: "secondary-content", | |
| 547 | − rgb: [0x05, 0x03, 0x02], | |
| 548 | − }, | |
| 549 | − NamedColor { | |
| 550 | − role: "success", | |
| 551 | − rgb: [0xA6, 0xF1, 0xCE], | |
| 552 | − }, | |
| 553 | − NamedColor { | |
| 554 | − role: "warning", | |
| 555 | − rgb: [0xFF, 0xF2, 0x8C], | |
| 556 | − }, | |
| 173 | + NamedColor { role: "accent", rgb: [0xFD, 0xF2, 0xC6] }, | |
| 174 | + NamedColor { role: "accent-content", rgb: [0x04, 0x03, 0x01] }, | |
| 175 | + NamedColor { role: "base-100", rgb: [0x45, 0x1A, 0x03] }, | |
| 176 | + NamedColor { role: "base-200", rgb: [0x37, 0x0D, 0x00] }, | |
| 177 | + NamedColor { role: "base-300", rgb: [0x29, 0x02, 0x00] }, | |
| 178 | + NamedColor { role: "base-content", rgb: [0xFF, 0xEF, 0xDD] }, | |
| 179 | + NamedColor { role: "error", rgb: [0xFD, 0xA6, 0xA5] }, | |
| 180 | + NamedColor { role: "info", rgb: [0x7E, 0xD4, 0xFC] }, | |
| 181 | + NamedColor { role: "neutral", rgb: [0x91, 0x3F, 0x0D] }, | |
| 182 | + NamedColor { role: "neutral-content", rgb: [0xFF, 0xF7, 0xF3] }, | |
| 183 | + NamedColor { role: "primary", rgb: [0xDA, 0x78, 0x0E] }, | |
| 184 | + NamedColor { role: "primary-content", rgb: [0x05, 0x03, 0x02] }, | |
| 185 | + NamedColor { role: "secondary", rgb: [0xF6, 0x9E, 0x0B] }, | |
| 186 | + NamedColor { role: "secondary-content", rgb: [0x05, 0x03, 0x02] }, | |
| 187 | + NamedColor { role: "success", rgb: [0xA6, 0xF1, 0xCE] }, | |
| 188 | + NamedColor { role: "warning", rgb: [0xFF, 0xF2, 0x8C] }, | |
| 557 | 189 | ], |
| 558 | 190 | }, |
| 559 | 191 | Theme { |
| 560 | 192 | name: "stones", |
| 561 | 193 | light: false, |
| 562 | 194 | colors: &[ |
| 563 | − NamedColor { | |
| 564 | − role: "accent", | |
| 565 | − rgb: [0xFD, 0xF2, 0xC6], | |
| 566 | − }, | |
| 567 | − NamedColor { | |
| 568 | − role: "accent-content", | |
| 569 | − rgb: [0x04, 0x03, 0x01], | |
| 570 | − }, | |
| 571 | − NamedColor { | |
| 572 | − role: "base-100", | |
| 573 | − rgb: [0x29, 0x25, 0x24], | |
| 574 | − }, | |
| 575 | − NamedColor { | |
| 576 | − role: "base-200", | |
| 577 | − rgb: [0x1D, 0x1A, 0x19], | |
| 578 | − }, | |
| 579 | − NamedColor { | |
| 580 | − role: "base-300", | |
| 581 | − rgb: [0x12, 0x0F, 0x0E], | |
| 582 | − }, | |
| 583 | − NamedColor { | |
| 584 | − role: "base-content", | |
| 585 | − rgb: [0xFF, 0xED, 0xE3], | |
| 586 | − }, | |
| 587 | − NamedColor { | |
| 588 | − role: "error", | |
| 589 | − rgb: [0xFD, 0xA6, 0xA5], | |
| 590 | − }, | |
| 591 | − NamedColor { | |
| 592 | − role: "info", | |
| 593 | − rgb: [0x7E, 0xD4, 0xFC], | |
| 594 | − }, | |
| 595 | − NamedColor { | |
| 596 | − role: "neutral", | |
| 597 | − rgb: [0x56, 0x52, 0x4D], | |
| 598 | − }, | |
| 599 | − NamedColor { | |
| 600 | − role: "neutral-content", | |
| 601 | − rgb: [0xFD, 0xF8, 0xF1], | |
| 602 | − }, | |
| 603 | − NamedColor { | |
| 604 | − role: "primary", | |
| 605 | − rgb: [0x6B, 0x72, 0x7F], | |
| 606 | − }, | |
| 607 | − NamedColor { | |
| 608 | − role: "primary-content", | |
| 609 | − rgb: [0x02, 0x03, 0x06], | |
| 610 | − }, | |
| 611 | − NamedColor { | |
| 612 | − role: "secondary", | |
| 613 | − rgb: [0x9B, 0xA2, 0xAE], | |
| 614 | − }, | |
| 615 | − NamedColor { | |
| 616 | − role: "secondary-content", | |
| 617 | − rgb: [0x02, 0x03, 0x06], | |
| 618 | − }, | |
| 619 | − NamedColor { | |
| 620 | − role: "success", | |
| 621 | − rgb: [0xA6, 0xF1, 0xCE], | |
| 622 | − }, | |
| 623 | − NamedColor { | |
| 624 | − role: "warning", | |
| 625 | − rgb: [0xFF, 0xF2, 0x8C], | |
| 626 | − }, | |
| 195 | + NamedColor { role: "accent", rgb: [0xFD, 0xF2, 0xC6] }, | |
| 196 | + NamedColor { role: "accent-content", rgb: [0x04, 0x03, 0x01] }, | |
| 197 | + NamedColor { role: "base-100", rgb: [0x29, 0x25, 0x24] }, | |
| 198 | + NamedColor { role: "base-200", rgb: [0x1D, 0x1A, 0x19] }, | |
| 199 | + NamedColor { role: "base-300", rgb: [0x12, 0x0F, 0x0E] }, | |
| 200 | + NamedColor { role: "base-content", rgb: [0xFF, 0xED, 0xE3] }, | |
| 201 | + NamedColor { role: "error", rgb: [0xFD, 0xA6, 0xA5] }, | |
| 202 | + NamedColor { role: "info", rgb: [0x7E, 0xD4, 0xFC] }, | |
| 203 | + NamedColor { role: "neutral", rgb: [0x56, 0x52, 0x4D] }, | |
| 204 | + NamedColor { role: "neutral-content", rgb: [0xFD, 0xF8, 0xF1] }, | |
| 205 | + NamedColor { role: "primary", rgb: [0x6B, 0x72, 0x7F] }, | |
| 206 | + NamedColor { role: "primary-content", rgb: [0x02, 0x03, 0x06] }, | |
| 207 | + NamedColor { role: "secondary", rgb: [0x9B, 0xA2, 0xAE] }, | |
| 208 | + NamedColor { role: "secondary-content", rgb: [0x02, 0x03, 0x06] }, | |
| 209 | + NamedColor { role: "success", rgb: [0xA6, 0xF1, 0xCE] }, | |
| 210 | + NamedColor { role: "warning", rgb: [0xFF, 0xF2, 0x8C] }, | |
| 211 | + ], | |
| 212 | + }, | |
| 213 | + Theme { | |
| 214 | + name: "blueprint", | |
| 215 | + light: false, | |
| 216 | + colors: &[ | |
| 217 | + NamedColor { role: "accent", rgb: [0xFD, 0xF2, 0xC6] }, | |
| 218 | + NamedColor { role: "accent-content", rgb: [0x04, 0x03, 0x01] }, | |
| 219 | + NamedColor { role: "base-100", rgb: [0x00, 0x26, 0x61] }, | |
| 220 | + NamedColor { role: "base-200", rgb: [0x00, 0x1C, 0x51] }, | |
| 221 | + NamedColor { role: "base-300", rgb: [0x00, 0x12, 0x41] }, | |
| 222 | + NamedColor { role: "base-content", rgb: [0xC2, 0xE7, 0xFE] }, | |
| 223 | + NamedColor { role: "error", rgb: [0xFD, 0xA6, 0xA5] }, | |
| 224 | + NamedColor { role: "info", rgb: [0x7E, 0xD4, 0xFC] }, | |
| 225 | + NamedColor { role: "neutral", rgb: [0x00, 0x44, 0x9A] }, | |
| 226 | + NamedColor { role: "neutral-content", rgb: [0xC2, 0xE7, 0xFE] }, | |
| 227 | + NamedColor { role: "primary", rgb: [0x0E, 0x9D, 0xFF] }, | |
| 228 | + NamedColor { role: "primary-content", rgb: [0x00, 0x0C, 0x1F] }, | |
| 229 | + NamedColor { role: "secondary", rgb: [0x86, 0xCD, 0xFF] }, | |
| 230 | + NamedColor { role: "secondary-content", rgb: [0x00, 0x0D, 0x1E] }, | |
| 231 | + NamedColor { role: "success", rgb: [0xA6, 0xF1, 0xCE] }, | |
| 232 | + NamedColor { role: "warning", rgb: [0xFF, 0xF2, 0x8C] }, | |
| 627 | 233 | ], |
| 628 | 234 | }, |
| 629 | 235 | ]; |
modified
tests/theming.rs
+33
−0
@@ -102,3 +102,36 @@ fn switching_theme_is_idempotent() {
| 102 | 102 | (s.spec().fg_color.rgb, s.spec().bg_a.rgb, s.spec().bg_b.rgb) |
| 103 | 103 | ); |
| 104 | 104 | } |
| 105 | + | |
| 106 | +#[test] | |
| 107 | +fn blueprint_is_available_and_distinct() { | |
| 108 | + let bp = palette::THEMES[index_of("blueprint")]; | |
| 109 | + assert!(!bp.light, "blueprint is a dark scheme"); | |
| 110 | + // The blues that make it a blueprint, from the waxx stylesheet. | |
| 111 | + assert_eq!(bp.get("base-100").unwrap().rgb, [0x00, 0x26, 0x61]); | |
| 112 | + assert_eq!(bp.get("primary").unwrap().rgb, [0x0E, 0x9D, 0xFF]); | |
| 113 | + | |
| 114 | + let mut s = Studio::new(); | |
| 115 | + s.set_theme(index_of("blueprint")); | |
| 116 | + assert_eq!( | |
| 117 | + s.spec().bg_a.rgb, | |
| 118 | + [0x0E, 0x9D, 0xFF], | |
| 119 | + "primary should apply" | |
| 120 | + ); | |
| 121 | +} | |
| 122 | + | |
| 123 | +#[test] | |
| 124 | +fn every_theme_defines_the_roles_the_defaults_use() { | |
| 125 | + // set_theme falls back when a role is missing; these three should never | |
| 126 | + // need the fallback, or the default configuration renders differently | |
| 127 | + // depending on which palette you happen to be on. | |
| 128 | + for theme in palette::THEMES.iter() { | |
| 129 | + for role in ["primary", "accent", "base-200"] { | |
| 130 | + assert!( | |
| 131 | + theme.get(role).is_some(), | |
| 132 | + "{} is missing {role}", | |
| 133 | + theme.name | |
| 134 | + ); | |
| 135 | + } | |
| 136 | + } | |
| 137 | +} |
modified
tools/regen_palettes.py
+59
−11
@@ -5,9 +5,15 @@ The neiam palette lives in dms as daisyUI themes; the Casabeza palette was
| 5 | 5 | recovered from the cbzauth APK after the source loss. Neither is retyped by |
| 6 | 6 | hand here — run this after either moves and the tool follows. |
| 7 | 7 | |
| 8 | − tools/regen_palettes.py [--dms PATH] [--check] | |
| 8 | + tools/regen_palettes.py [--source PATH ...] [--check] | |
| 9 | 9 | |
| 10 | 10 | --check exits non-zero if the generated file is stale, for CI. |
| 11 | + | |
| 12 | +Several sites carry the same daisyUI themes, and one of them (waxx) also | |
| 13 | +defines `blueprint`, so more than one stylesheet is read and the results are | |
| 14 | +merged by theme name. The shared themes are identical between sources; where | |
| 15 | +they ever diverge, the earlier source in the list wins and the difference is | |
| 16 | +reported rather than silently resolved. | |
| 11 | 17 | """ |
| 12 | 18 | import argparse |
| 13 | 19 | import math |
@@ -16,7 +22,15 @@ import re
| 16 | 22 | import sys |
| 17 | 23 | |
| 18 | 24 | HERE = pathlib.Path(__file__).resolve().parent.parent |
| 19 | −DEFAULT_DMS = pathlib.Path.home() / "Development/projects/dms/assets/f/css/style.css" | |
| 25 | +PROJECTS = pathlib.Path.home() / "Development/projects" | |
| 26 | + | |
| 27 | +# Ordered: the first stylesheet to define a theme wins. dms leads because it is | |
| 28 | +# the palette's home; waxx follows because it is where `blueprint` lives. | |
| 29 | +DEFAULT_SOURCES = [ | |
| 30 | + PROJECTS / "dms/assets/f/css/style.css", | |
| 31 | + PROJECTS / "waxx/assets/css/app.css", | |
| 32 | + PROJECTS / "gitgud/assets/css/app.css", | |
| 33 | +] | |
| 20 | 34 | OUT = HERE / "src/palette/generated.rs" |
| 21 | 35 | |
| 22 | 36 | # Semantic roles worth exposing as icon colours. daisyUI defines more, but |
@@ -130,7 +144,11 @@ def render(themes):
| 130 | 144 | "", |
| 131 | 145 | "use super::{NamedColor, Theme};", |
| 132 | 146 | "", |
| 133 | − f"pub const THEMES: &[Theme] = &[", | |
| 147 | + "// rustfmt would explode each NamedColor across four lines, which makes a", | |
| 148 | + "// colour table far harder to scan — and CI enforces `cargo fmt --check`,", | |
| 149 | + "// so without this a regenerate would turn the build red.", | |
| 150 | + "#[rustfmt::skip]", | |
| 151 | + "pub const THEMES: &[Theme] = &[", | |
| 134 | 152 | ] |
| 135 | 153 | for t in themes: |
| 136 | 154 | out.append(" Theme {") |
@@ -150,18 +168,48 @@ def render(themes):
| 150 | 168 | |
| 151 | 169 | def main(): |
| 152 | 170 | ap = argparse.ArgumentParser() |
| 153 | − ap.add_argument("--dms", type=pathlib.Path, default=DEFAULT_DMS) | |
| 171 | + ap.add_argument( | |
| 172 | + "--source", | |
| 173 | + type=pathlib.Path, | |
| 174 | + action="append", | |
| 175 | + dest="sources", | |
| 176 | + help="a daisyUI stylesheet to read; repeatable, first wins on conflict", | |
| 177 | + ) | |
| 154 | 178 | ap.add_argument("--check", action="store_true") |
| 155 | 179 | args = ap.parse_args() |
| 156 | 180 | |
| 181 | + sources = args.sources or DEFAULT_SOURCES | |
| 182 | + | |
| 157 | 183 | themes = [CASABEZA, CASABEZA_LIGHT] |
| 158 | − if args.dms.exists(): | |
| 159 | − found = parse_dms(args.dms) | |
| 160 | − themes += found | |
| 161 | − print(f"dms: {len(found)} themes from {args.dms}", file=sys.stderr) | |
| 162 | − else: | |
| 163 | − print(f"dms stylesheet not found at {args.dms}; " | |
| 164 | − f"emitting Casabeza only", file=sys.stderr) | |
| 184 | + seen = {t["name"] for t in themes} | |
| 185 | + | |
| 186 | + for src in sources: | |
| 187 | + if not src.exists(): | |
| 188 | + print(f"skipping missing source {src}", file=sys.stderr) | |
| 189 | + continue | |
| 190 | + added, dupes, conflicts = [], [], [] | |
| 191 | + for t in parse_dms(src): | |
| 192 | + if t["name"] in seen: | |
| 193 | + previous = next(x for x in themes if x["name"] == t["name"]) | |
| 194 | + if previous["colors"] != t["colors"]: | |
| 195 | + conflicts.append(t["name"]) | |
| 196 | + else: | |
| 197 | + dupes.append(t["name"]) | |
| 198 | + continue | |
| 199 | + themes.append(t) | |
| 200 | + seen.add(t["name"]) | |
| 201 | + added.append(t["name"]) | |
| 202 | + note = f"{src}: +{len(added)}" | |
| 203 | + if added: | |
| 204 | + note += f" ({', '.join(added)})" | |
| 205 | + if dupes: | |
| 206 | + note += f", {len(dupes)} already defined" | |
| 207 | + if conflicts: | |
| 208 | + note += f", DIFFERS from earlier source: {', '.join(conflicts)}" | |
| 209 | + print(note, file=sys.stderr) | |
| 210 | + | |
| 211 | + if len(themes) == 2: | |
| 212 | + print("no stylesheets found; emitting Casabeza only", file=sys.stderr) | |
| 165 | 213 | |
| 166 | 214 | text = render(themes) |
| 167 | 215 | OUT.parent.mkdir(parents=True, exist_ok=True) |
Parents: b869c97