├── .devcontainer └── devcontainer.json ├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── LICENSE ├── README.md ├── jsconfig.json ├── package-lock.json ├── package.json ├── playwright.config.js ├── src ├── app.html ├── app.scss ├── hooks.server.js ├── lib │ ├── components │ │ ├── EditAssignment.svelte │ │ ├── FakeAssignment.svelte │ │ ├── PeriodSelect.svelte │ │ └── Spinner.svelte │ ├── js │ │ ├── parseData.js │ │ └── utils.js │ └── stores │ │ ├── oldAssignments.js │ │ ├── session.js │ │ └── settings.js ├── routes │ ├── +layout.server.js │ ├── +layout.svelte │ ├── +page.server.js │ ├── +page.svelte │ ├── assignments │ │ ├── +page.server.js │ │ └── +page.svelte │ ├── course │ │ └── [courseIndex] │ │ │ ├── +page.server.js │ │ │ └── +page.svelte │ ├── data │ │ └── +server.js │ ├── grades │ │ ├── +page.server.js │ │ └── +page.svelte │ ├── login │ │ ├── +page.server.js │ │ ├── +page.svelte │ │ └── +server.js │ ├── logout │ │ └── +server.js │ └── settings │ │ ├── +page.server.js │ │ └── +page.svelte ├── service-worker.js └── variables.scss ├── static ├── apple-icon-180.png ├── bootstrap-icons │ ├── bootstrap-icons.css │ ├── bootstrap-icons.woff │ └── bootstrap-icons.woff2 ├── favicon.png ├── font │ ├── font.css │ ├── outfit-200.woff2 │ ├── outfit-300.woff2 │ ├── outfit-400.woff2 │ ├── outfit-500.woff2 │ └── outfit-600.woff2 ├── icons │ ├── favicon-svelte.png │ ├── moon.png │ └── moon.svg ├── img │ └── backdrop.jpg ├── manifest-icon-192.maskable.png ├── manifest-icon-512.maskable.png ├── manifest.json └── themes │ ├── glass.css │ ├── light.css │ ├── night.css │ └── olivia.css ├── svelte.config.js └── vite.config.js /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Node.js", 3 | "image": "mcr.microsoft.com/devcontainers/javascript-node:16", 4 | "portsAttributes": { 5 | "5173": { 6 | "label": "public" 7 | } 8 | }, 9 | 10 | // Features to add to the dev container. More info: https://containers.dev/implementors/features. 11 | // "features": {}, 12 | 13 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 14 | "forwardPorts": [5173] 15 | 16 | // Use 'postCreateCommand' to run commands after the container is created. 17 | // "postCreateCommand": "yarn install", 18 | 19 | // Configure tool-specific properties. 20 | // "customizations": {}, 21 | 22 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. 23 | // "remoteUser": "root" 24 | } 25 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['eslint:recommended', 'prettier'], 4 | plugins: ['svelte3'], 5 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 6 | parserOptions: { 7 | sourceType: 'module', 8 | ecmaVersion: 2020 9 | }, 10 | env: { 11 | browser: true, 12 | es2017: true, 13 | node: true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | .vercel 10 | .output 11 | /responses 12 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "tabWidth": 4, 4 | "semi": false, 5 | "singleQuote": true, 6 | "trailingComma": "none", 7 | "printWidth": 100, 8 | "plugins": ["prettier-plugin-svelte"], 9 | "pluginSearchDirs": ["."], 10 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 11 | } 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 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 | 635 | Copyright (C) 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 . 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 | Copyright (C) 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 | . 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 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gradenight 2 | 3 | A better looking and easier to use version of StudentVue using [StudentVue.js](https://github.com/StudentVue/StudentVue.js) and [Sveltekit](https://kit.svelte.dev). 4 | 5 | This app stores your login info as a cookie in your browser and nowhere else. If you don't trust me, feel free to fork and run it yourself on netlify or vercel. 6 | 7 | ## features 8 | - clean design 9 | - fancy graphs 10 | - create fake assignments and see impact on grade 11 | - edit assignments and see impact on grade 12 | - color-coded scores and percentages 13 | - themes 14 | 15 | ![image](https://user-images.githubusercontent.com/34758569/156866029-5837c698-fc16-476e-b7a0-63c38d485449.png) 16 | 17 | ![image](https://user-images.githubusercontent.com/34758569/156866013-fce15e25-c5f3-498b-9e7c-9188e8ab87ac.png) 18 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": false, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gradenight", 3 | "version": "1.3.1", 4 | "scripts": { 5 | "dev": "vite dev", 6 | "build": "vite build", 7 | "preview": "vite preview", 8 | "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", 9 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch", 10 | "lint": "prettier --plugin-search-dir . --check .", 11 | "format": "prettier --plugin-search-dir . --write ." 12 | }, 13 | "devDependencies": { 14 | "@playwright/test": "1.25.0", 15 | "@sveltejs/adapter-auto": "^1.0.0-next.91", 16 | "@sveltejs/kit": "next", 17 | "eslint": "^7.32.0", 18 | "eslint-config-prettier": "^8.3.0", 19 | "eslint-plugin-svelte3": "^3.2.1", 20 | "prettier": "^2.4.1", 21 | "prettier-plugin-svelte": "^2.4.0", 22 | "pwa-asset-generator": "^6.2.1", 23 | "sass": "^1.55.0", 24 | "svelte": "^3.44.0", 25 | "svelte-preprocess": "^4.10.1", 26 | "vite": "^4.0.0" 27 | }, 28 | "dependencies": { 29 | "chart.js": "^3.7.0", 30 | "cookie": "^0.4.1", 31 | "studentvue.js": "^0.1.1" 32 | }, 33 | "engines": { 34 | "node": ">=16.0.0" 35 | }, 36 | "type": "module" 37 | } 38 | -------------------------------------------------------------------------------- /playwright.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('@playwright/test').PlaywrightTestConfig} */ 2 | const config = { 3 | webServer: { 4 | command: 'npm run build && npm run preview', 5 | port: 4173 6 | } 7 | } 8 | 9 | export default config 10 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 30 | 31 | %sveltekit.head% 32 | 33 | 34 |
%sveltekit.body%
35 | 36 | 37 | -------------------------------------------------------------------------------- /src/app.scss: -------------------------------------------------------------------------------- 1 | /* Write your global styles here, in SCSS syntax. Variables and mixins from the src/variables.scss file are available here without importing */ 2 | 3 | :root { 4 | font-family: 'Outfit', sans-serif; 5 | font-weight: 300; 6 | font-size: 100%; 7 | } 8 | 9 | // @media (max-width: 800px) { 10 | // :root { 11 | // font-size: 90%; 12 | // } 13 | // } 14 | 15 | * { 16 | box-sizing: border-box; 17 | scrollbar-width: thin; 18 | } 19 | 20 | html { 21 | height: 100%; 22 | } 23 | 24 | body { 25 | height: 100%; 26 | margin: 0; 27 | background: var(--bg-color-1); 28 | color: var(--font-color); 29 | overflow: hidden; 30 | } 31 | 32 | #svelte { 33 | height: 100%; 34 | display: flex; 35 | padding: $spacing; 36 | } 37 | 38 | @media (max-width: $breakpoint-phone) { 39 | #svelte { 40 | flex-direction: column-reverse; 41 | } 42 | } 43 | 44 | ::placeholder, 45 | ::-webkit-input-placeholder { 46 | color: var(--font-color-2); 47 | } 48 | 49 | ::-webkit-scrollbar { 50 | width: 10px; 51 | } 52 | ::-webkit-scrollbar-track { 53 | background: transparent; 54 | } 55 | ::-webkit-scrollbar-thumb { 56 | background: var(--bg-color-2-5); 57 | } 58 | ::-webkit-scrollbar-thumb:hover { 59 | background: var(--bg-color-3); 60 | } 61 | ::-webkit-scrollbar-thumb:active { 62 | background: var(--bg-color-3-5); 63 | } 64 | 65 | button, 66 | a, 67 | input, 68 | select, 69 | option { 70 | font: inherit; 71 | color: inherit; 72 | border: none; 73 | outline: none; 74 | } 75 | 76 | input { 77 | background: var(--bg-color-1); 78 | padding: $spacing-small; 79 | border-radius: $roundness-small; 80 | &:focus { 81 | outline: 2px solid var(--bg-color-3-5); 82 | } 83 | } 84 | 85 | button { 86 | background: var(--bg-color-1); 87 | padding: $spacing-small; 88 | border-radius: $roundness-small; 89 | &:hover { 90 | background: var(--bg-color-1-5); 91 | cursor: pointer; 92 | } 93 | &:active { 94 | transform: scale(0.95); 95 | } 96 | } 97 | 98 | select { 99 | padding: $spacing-small; 100 | border-radius: $roundness-small; 101 | } 102 | 103 | p { 104 | margin: $spacing-small 0; 105 | } 106 | 107 | h1 { 108 | color: var(--accent-color); 109 | line-height: 40px; 110 | margin-top: calc($spacing-small + 5px); 111 | margin-bottom: 0; 112 | } 113 | 114 | @media (max-width: $breakpoint-phone) { 115 | h1 { 116 | font-size: 1.75rem; 117 | } 118 | } 119 | 120 | h2 { 121 | color: var(--accent-color); 122 | margin-top: 0; 123 | margin-bottom: $spacing-small; 124 | } 125 | 126 | h3 { 127 | color: var(--accent-color); 128 | margin-top: $spacing; 129 | margin-bottom: $spacing-small; 130 | } 131 | 132 | table { 133 | width: 100%; 134 | border-spacing: 0px; 135 | } 136 | 137 | td { 138 | padding: 0; 139 | } 140 | 141 | .grid-heading-container { 142 | display: flex; 143 | margin-bottom: $spacing; 144 | } 145 | 146 | .heading-container { 147 | display: flex; 148 | align-items: center; 149 | margin-bottom: $spacing-small; 150 | & h2 { 151 | margin: 0; 152 | } 153 | } 154 | 155 | .link { 156 | text-decoration: none; 157 | display: inline-block; 158 | &:hover { 159 | color: var(--font-color-2); 160 | } 161 | &:active { 162 | color: var(--font-color-3); 163 | transform: scale(0.95); 164 | } 165 | *:hover { 166 | color: var(--font-color-2); 167 | } 168 | *:active { 169 | color: var(--font-color-3); 170 | transform: scale(0.95); 171 | } 172 | } 173 | 174 | tr.fake { 175 | color: var(--font-color-2); 176 | } 177 | -------------------------------------------------------------------------------- /src/hooks.server.js: -------------------------------------------------------------------------------- 1 | import cookie from 'cookie' 2 | 3 | export const handle = async ({ event, resolve }) => { 4 | const authCookie = event.cookies.get('auth') 5 | 6 | if (authCookie) { 7 | const auth = authCookie.split(':') 8 | event.locals.user = { 9 | username: auth[0], 10 | password: auth[1], 11 | districtUrl: auth[2] 12 | } 13 | } 14 | 15 | const response = await resolve(event) 16 | return response 17 | } 18 | -------------------------------------------------------------------------------- /src/lib/components/EditAssignment.svelte: -------------------------------------------------------------------------------- 1 | 76 | 77 | {#if shown} 78 |
{}} 82 | transition:fade={{ duration: 200 }} 83 | > 84 | 135 |
136 | {/if} 137 | 138 | 188 | -------------------------------------------------------------------------------- /src/lib/components/FakeAssignment.svelte: -------------------------------------------------------------------------------- 1 | 74 | 75 | {#if shown} 76 | 77 |
78 | 118 |
119 | {/if} 120 | 121 | 172 | -------------------------------------------------------------------------------- /src/lib/components/PeriodSelect.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 24 | -------------------------------------------------------------------------------- /src/lib/components/Spinner.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 |
10 |
11 | 12 | 37 | -------------------------------------------------------------------------------- /src/lib/js/parseData.js: -------------------------------------------------------------------------------- 1 | import { getColor, fourToPercent, percentToLetter } from './utils.js' 2 | 3 | export function parseData(session, oldAssignments) { 4 | for (let period of session.periods) { 5 | let grades = [] 6 | let assignments = [] 7 | 8 | for (let [index, course] of period.Courses.Course.entries()) { 9 | course.Title = course.Title.replace(/ \([\s\S]*?\)/g, '') 10 | course.index = index 11 | course.chartData = [] 12 | 13 | course.fourPoint = false 14 | if (course.Marks.Mark && course.Marks.Mark.CalculatedScoreString !== 'N/A') { 15 | if ( 16 | course.Marks.Mark.Assignments.Assignment && 17 | Array.isArray(course.Marks.Mark.Assignments.Assignment) && 18 | course.Marks.Mark.Assignments.Assignment[0].ScoreType === 'Rubric 0-4' 19 | ) { 20 | course.fourPoint = true 21 | } 22 | } 23 | 24 | if (course.Marks.Mark && course.Marks.Mark.Assignments.Assignment) { 25 | if (!Array.isArray(course.Marks.Mark.Assignments.Assignment)) { 26 | course.Marks.Mark.Assignments.Assignment = [ 27 | course.Marks.Mark.Assignments.Assignment 28 | ] 29 | } 30 | 31 | course.scoreTypes = {} 32 | if (course.Marks.Mark.GradeCalculationSummary.AssignmentGradeCalc) { 33 | let gradeCalc = course.Marks.Mark.GradeCalculationSummary.AssignmentGradeCalc 34 | if (!Array.isArray(gradeCalc)) { 35 | gradeCalc = [gradeCalc] 36 | } 37 | for (let type of gradeCalc) { 38 | if (parseInt(type.Weight) !== 100.0) { 39 | course.scoreTypes[type.Type] = { 40 | score: 0, 41 | total: 0, 42 | weight: parseInt(type.Weight) 43 | } 44 | } 45 | } 46 | } else { 47 | course.scoreTypes.All = { 48 | score: 0, 49 | total: 0, 50 | weight: 100 51 | } 52 | } 53 | 54 | for (let assignment of [...course.Marks.Mark.Assignments.Assignment].reverse()) { 55 | assignment.Measure = assignment.Measure.replace('&', '&') 56 | assignment.course = course.Title 57 | assignment.courseIndex = index 58 | assignment.style = null 59 | assignment.scorePercent = -1 60 | if (assignment.Points.includes('Points Possible')) { 61 | assignment.percent = '?' 62 | assignment.score = 'Not Graded' 63 | } else { 64 | assignment.percent = '-' 65 | assignment.score = assignment.Points 66 | } 67 | if (oldAssignments) { 68 | if (assignment.new !== true) { 69 | assignment.new = !oldAssignments.has(assignment.GradebookID) 70 | } 71 | oldAssignments.add(assignment.GradebookID) 72 | } 73 | 74 | if (assignment.Points.includes(' / ') || assignment.edited) { 75 | if (assignment.Points.includes(' / ')) { 76 | let split = assignment.Points.split(' / ') 77 | assignment.pointsOriginal = parseFloat(split[0]) 78 | assignment.totalOriginal = parseFloat(split[1]) 79 | if (!assignment.edited) { 80 | assignment.points = assignment.pointsOriginal 81 | assignment.total = assignment.totalOriginal 82 | } 83 | } 84 | assignment.score = assignment.points + ' / ' + assignment.total 85 | 86 | if ( 87 | (assignment.points === 0 && assignment.total === 0) || 88 | assignment.Notes.toLowerCase().includes('not for grading') 89 | ) { 90 | assignment.scorePercent = -1 91 | assignment.percent = '-' 92 | } else { 93 | assignment.scorePercent = (assignment.points / assignment.total) * 100 94 | assignment.percent = assignment.scorePercent 95 | ? assignment.scorePercent.toFixed(1) + '%' 96 | : '0.0%' 97 | 98 | if (course.Marks.Mark.GradeCalculationSummary.AssignmentGradeCalc) { 99 | if (course.scoreTypes[assignment.Type]) { 100 | course.scoreTypes[assignment.Type].score += assignment.points 101 | course.scoreTypes[assignment.Type].total += assignment.total 102 | } 103 | } else { 104 | course.scoreTypes.All.score += assignment.points 105 | course.scoreTypes.All.total += assignment.total 106 | } 107 | 108 | let date = new Date(assignment.DueDate) 109 | let scoreSum = 0 110 | let totalSum = 0 111 | 112 | for (let type of Object.values(course.scoreTypes)) { 113 | if (type.total > 0) { 114 | scoreSum += (type.score / type.total) * type.weight 115 | totalSum += type.weight 116 | } 117 | } 118 | 119 | let color = getColor((scoreSum / totalSum) * 100) 120 | let grade = (scoreSum / totalSum) * (course.fourPoint ? 4 : 100) 121 | 122 | if ( 123 | course.chartData.length > 0 && 124 | course.chartData[course.chartData.length - 1].x === 125 | Math.floor(date / 8.64e7) 126 | ) { 127 | course.chartData[course.chartData.length - 1].y = grade 128 | course.chartData[course.chartData.length - 1].color = color 129 | } else { 130 | course.chartData.push({ 131 | x: Math.floor(date / 8.64e7), 132 | y: grade, 133 | color: color 134 | }) 135 | } 136 | } 137 | assignment.style = `color: ${getColor(assignment.scorePercent)};` 138 | } 139 | assignments.push(assignment) 140 | } 141 | 142 | let totalWeight = 0 143 | for (let type of Object.values(course.scoreTypes)) { 144 | if (type.total === 0) { 145 | type.weight = 0 146 | } 147 | totalWeight += type.weight 148 | } 149 | for (let type of Object.values(course.scoreTypes)) { 150 | type.weight = ((type.weight / totalWeight) * 100).toFixed(1) 151 | let percent = type.total ? type.score / type.total : 0 152 | type.scorePercent = (percent * type.weight).toFixed(1) 153 | type.color = type.style = `color: ${percent ? getColor(percent * 100) : 0};` 154 | } 155 | } 156 | 157 | course.scorePercent = -1 158 | course.score = '-' 159 | course.scoreString = course.Marks.Mark ? course.Marks.Mark.CalculatedScoreString : 'N/A' 160 | if (course.chartData.length > 0) { 161 | course.scorePercent = course.chartData[course.chartData.length - 1].y 162 | course.score = course.scorePercent.toFixed(1) 163 | if (course.fourPoint) { 164 | course.scorePercent = fourToPercent(course.scorePercent) 165 | } else { 166 | course.score += '%' 167 | } 168 | grades.push(course.scorePercent) 169 | course.scoreString = percentToLetter(course.scorePercent) 170 | } 171 | course.color = getColor(course.scorePercent) 172 | course.style = `color: ${course.color};` 173 | } 174 | 175 | let averageRaw = -1 176 | if (grades.length > 0) averageRaw = grades.reduce((a, b) => a + b) / grades.length 177 | 178 | period.averageStyle = `color: ${getColor(averageRaw)};` 179 | period.average = averageRaw >= 0 ? averageRaw.toFixed(1) + '%' : '-' 180 | 181 | period.days = Math.round((new Date(period.ReportingPeriod.EndDate) - new Date()) / 86400000) 182 | assignments.sort((a, b) => new Date(b.DueDate) - new Date(a.DueDate)) 183 | period.assignments = assignments 184 | period.week = getWeek(period.assignments) 185 | } 186 | } 187 | 188 | function getWeek(assignments) { 189 | const now = new Date() 190 | const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()) 191 | const lastSunday = new Date(today.setDate(today.getDate() - today.getDay())) 192 | let week = assignments.filter((a) => { 193 | return new Date(a.DueDate) > lastSunday && a.scorePercent >= 0 194 | }) 195 | let average = -1 196 | if (week.length > 0) 197 | average = (week.reduce((a, b) => a + b.scorePercent, 0) / week.length).toFixed(1) 198 | return { 199 | average: average >= 0 ? average + '%' : '-', 200 | averageStyle: `color: ${getColor(average)};`, 201 | length: week.length 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /src/lib/js/utils.js: -------------------------------------------------------------------------------- 1 | import { get } from 'svelte/store' 2 | import { settings } from '../stores/settings.js' 3 | 4 | const lightThemes = ['light'] 5 | 6 | export function getColor(percent) { 7 | const isLight = lightThemes.indexOf(get(settings).theme) !== -1 8 | if (percent < 0) return null 9 | let hue = 0 10 | let sat = isLight ? 1 : 0.8 11 | let light = isLight ? 0.35 : 0.6 12 | if (percent >= 60) hue = 4 * (percent - 60) 13 | else light = (percent / 5 + (isLight ? 23 : 48)) / 100 14 | return HSLtoRGB(hue, sat, light) 15 | } 16 | 17 | export function fourToPercent(grade) { 18 | if (grade === 4.0) return 100 19 | else if (grade === 0) return 0 20 | else return grade * 10 + 55 21 | } 22 | 23 | export function percentToLetter(grade) { 24 | if (grade >= 90) return 'A' 25 | else if (grade >= 80) return 'B' 26 | else if (grade >= 70) return 'C' 27 | else if (grade >= 60) return 'D' 28 | else return 'F' 29 | } 30 | 31 | export function HSLtoRGB(h, s, l) { 32 | let a = s * Math.min(l, 1 - l) 33 | let f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1) 34 | return `rgb(${f(0) * 255}, ${f(8) * 255}, ${f(4) * 255})` 35 | } 36 | -------------------------------------------------------------------------------- /src/lib/stores/oldAssignments.js: -------------------------------------------------------------------------------- 1 | import { browser } from '$app/environment' 2 | import { writable } from 'svelte/store' 3 | 4 | const defaultStr = '' 5 | 6 | const initialStr = browser 7 | ? window.localStorage.getItem('oldAssignments') ?? defaultStr 8 | : defaultStr 9 | 10 | export const oldAssignments = writable(new Set(initialStr.split(','))) 11 | 12 | oldAssignments.subscribe((value) => { 13 | if (browser) { 14 | window.localStorage.setItem('oldAssignments', Array.from(value).join(',')) 15 | } 16 | }) 17 | -------------------------------------------------------------------------------- /src/lib/stores/session.js: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store' 2 | 3 | export const session = writable({}) 4 | -------------------------------------------------------------------------------- /src/lib/stores/settings.js: -------------------------------------------------------------------------------- 1 | import { browser } from '$app/environment' 2 | import { writable } from 'svelte/store' 3 | 4 | const defaultSettings = { 5 | theme: 'night' 6 | } 7 | 8 | const initial = browser 9 | ? JSON.parse(window.localStorage.getItem('settings')) ?? defaultSettings 10 | : defaultSettings 11 | 12 | export const settings = writable(initial) 13 | 14 | settings.subscribe((value) => { 15 | if (browser) { 16 | window.localStorage.setItem('settings', JSON.stringify(value)) 17 | } 18 | }) 19 | -------------------------------------------------------------------------------- /src/routes/+layout.server.js: -------------------------------------------------------------------------------- 1 | /** @type {import('./$types').PageServerLoad} */ 2 | export async function load({ locals, url }) { 3 | console.log('layout server load') 4 | return { ...locals, url: url.href } 5 | } 6 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | {#if data.user} 68 | {#if $session.gradebook && $session.student} 69 | 91 |
92 | {#key data.url} 93 |
98 | 99 |
100 | {/key} 101 |
102 | {:else} 103 |
104 |
105 | 106 |
Fetching student info...
107 |
108 |
109 | {/if} 110 | {:else} 111 | 118 | {/if} 119 | 120 | 251 | -------------------------------------------------------------------------------- /src/routes/+page.server.js: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit' 2 | 3 | /** @type {import('./$types').PageLoad} */ 4 | export async function load({ params, locals }) { 5 | console.log('page server load') 6 | if (!locals.user) { 7 | console.log('redirect') 8 | throw redirect(302, '/login') 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | Gradenight 10 | 11 | 12 |
13 |

Good {greeting}, {$session.student.FormattedName.split(' ')[0]}!

14 |
15 | profile 16 |

{$session.student.FormattedName.split(' ')[0]}

17 |
18 |
19 |

20 | {$session.gradebook.average} 21 |

22 |
Average grade
 
23 |
24 |
25 |

26 | {$session.gradebook.week.average} 27 |

28 |
Average grade
this week
29 |
30 |
31 |

{$session.gradebook.week.length}

32 |
33 | {$session.gradebook.week.length === 1 ? 'Assignment' : 'Assignments'} 34 |
this week 35 |
36 |
37 |
38 |

39 | {$session.gradebook.days} 40 |

41 |
42 | {$session.days === 1 ? 'Day' : 'Days'} left in 43 |
{$session.gradebook.ReportingPeriod.GradePeriod} 44 |
45 |
46 |
47 |

Grades

48 | 49 | {#each $session.gradebook.Courses.Course as course, index} 50 | 51 | 52 | 53 | 54 | 55 | {/each} 56 |
{course.Title}{course.scoreString}{course.score}
57 |
58 |
59 |
60 |

Assignments

61 | 62 | {#each $session.gradebook.assignments as assignment} 63 | {#if assignment.scorePercent >= 0} 64 | 65 | 71 | 74 | 75 | {/if} 76 | {/each} 77 |
69 | {assignment.Measure} 70 | 72 | {assignment.score} 73 |
78 |
79 |
80 |
81 | 82 | 308 | -------------------------------------------------------------------------------- /src/routes/assignments/+page.server.js: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit' 2 | 3 | /** @type {import('./$types').PageLoad} */ 4 | export async function load({ params, locals }) { 5 | console.log('assignments server load') 6 | if (!locals.user) { 7 | console.log('redirect to login') 8 | throw redirect(302, '/login') 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/routes/assignments/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | Assignments 8 | 9 | 10 |
11 |
12 |

Assignments

13 | 14 |
15 |
16 |
17 | 18 | {#each $session.selected.assignments as assignment} 19 | 20 | 23 | 28 | 29 | 32 | 35 | 36 | {/each} 37 |
21 | {assignment.Measure} 22 | 24 | 25 | {assignment.course} 26 | 27 | {assignment.DueDate} 30 | {assignment.score} 31 | 33 | {assignment.percent} 34 |
38 |
39 |
40 |
41 | 42 | 110 | -------------------------------------------------------------------------------- /src/routes/course/[courseIndex]/+page.server.js: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit' 2 | 3 | /** @type {import('./$types').PageLoad} */ 4 | export async function load({ params, locals }) { 5 | console.log('course server load') 6 | if (!locals.user) { 7 | console.log('redirect to login') 8 | throw redirect(302, '/login') 9 | } 10 | return { 11 | courseIndex: params.courseIndex 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/routes/course/[courseIndex]/+page.svelte: -------------------------------------------------------------------------------- 1 | 130 | 131 | 132 | {course.Title} 133 | 134 | 135 |
136 |
137 |

{course.Title}

138 | 139 |
140 |
141 |

142 | {course.scoreString} 143 |

144 |
{course.score}
145 |
146 |
147 |
148 | 149 |
150 |
151 |
152 |
153 |

Summary

154 | 155 | {#each Object.entries(course.scoreTypes) as [name, type]} 156 | 157 | 158 | 161 | 162 | 163 | 164 | {/each} 165 | 166 | 167 | 171 | 172 | 173 |
{name} 159 | {Math.round(type.score * 10) / 10} / {type.total} 160 | {type.scorePercent}%{type.weight}%
Total 168 | 169 | {course.scorePercent.toFixed(1)}% 170 | 100.0%
174 |
175 |
176 |
177 |
178 |
179 |

Assignments

180 | 183 |
184 | 185 | {#if course.Marks.Mark.Assignments.Assignment} 186 | {#each course.Marks.Mark.Assignments.Assignment as assignment, index} 187 | editAssignment.show(index)} 191 | > 192 | 198 | 199 | 200 | 203 | 206 | 207 | {/each} 208 | {/if} 209 |
196 | {assignment.Measure} 197 | {assignment.Type}{assignment.DueDate} 201 | {assignment.score} 202 | 204 | {assignment.percent} 205 |
210 |
211 |
212 |
213 | 214 | 215 | 216 | 424 | -------------------------------------------------------------------------------- /src/routes/data/+server.js: -------------------------------------------------------------------------------- 1 | import { login } from 'studentvue.js' 2 | import * as cookie from 'cookie' 3 | 4 | export async function GET({ locals }) { 5 | console.log('get data') 6 | 7 | let result 8 | 9 | try { 10 | let client = await login( 11 | Buffer.from(locals.user.districtUrl, 'base64').toString('ascii'), 12 | Buffer.from(locals.user.username, 'base64').toString('ascii'), 13 | Buffer.from(locals.user.password, 'base64').toString('ascii') 14 | ) 15 | // let student = JSON.parse(await client.getStudentInfo()).StudentInfo 16 | // let gradebook = JSON.parse(await client.getGradebook()).Gradebook 17 | result = await Promise.all([ 18 | client.getStudentInfo().then((value) => JSON.parse(value).StudentInfo), 19 | client.getGradebook(0).then((value) => JSON.parse(value).Gradebook), 20 | client.getGradebook(1).then((value) => JSON.parse(value).Gradebook), 21 | client.getGradebook(2).then((value) => JSON.parse(value).Gradebook), 22 | client.getGradebook(3).then((value) => JSON.parse(value).Gradebook) 23 | ]) 24 | 25 | if (!result[0]) { 26 | throw new Error('No data returned') 27 | } 28 | } catch (error) { 29 | console.log(error) 30 | return new Response(null, { 31 | status: 401, 32 | headers: { 33 | 'Set-cookie': cookie.serialize('auth', '', { 34 | httpOnly: true, 35 | sameSite: 'strict', 36 | path: '/', 37 | expires: new Date(0) 38 | }) 39 | } 40 | }) 41 | } 42 | 43 | console.log('logged in') 44 | 45 | const currentPeriod = 46 | result[1].ReportingPeriods.ReportPeriod.length - 47 | 1 - 48 | result[1].ReportingPeriods.ReportPeriod.slice() 49 | .reverse() 50 | .findIndex((period) => { 51 | return new Date() > new Date(period.StartDate) 52 | }) 53 | 54 | return new Response( 55 | JSON.stringify({ 56 | student: result.shift(), 57 | periods: result, 58 | currentPeriod, 59 | periodDates: result[1].ReportingPeriods.ReportPeriod 60 | }), 61 | { 62 | headers: { 63 | 'Content-Type': 'application/json' 64 | } 65 | } 66 | ) 67 | } 68 | -------------------------------------------------------------------------------- /src/routes/grades/+page.server.js: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit' 2 | 3 | /** @type {import('./$types').PageLoad} */ 4 | export async function load({ params, locals }) { 5 | console.log('grades server load') 6 | if (!locals.user) { 7 | console.log('redirect to login') 8 | throw redirect(302, '/login') 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/routes/grades/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | Grades 8 | 9 | 10 |
11 |
12 |

Grades

13 | 14 |
15 |
16 | 17 | {#each $session.selected.Courses.Course as course, index} 18 | 19 | 20 | 21 | 22 | 23 | 24 | {/each} 25 |
{course.Title}{course.Staff} {course.scoreString} {course.score}
26 |
27 |
28 | 29 | 95 | -------------------------------------------------------------------------------- /src/routes/login/+page.server.js: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit' 2 | 3 | /** @type {import('./$types').PageLoad} */ 4 | export async function load({ params, locals }) { 5 | console.log('login server load') 6 | if (locals.user) { 7 | console.log('redirect to home') 8 | throw redirect(302, '/') 9 | } 10 | return {} 11 | } 12 | -------------------------------------------------------------------------------- /src/routes/login/+page.svelte: -------------------------------------------------------------------------------- 1 | 60 | 61 | 62 | Login 63 | 64 | 65 |
66 |
67 |

Login

68 | 69 | 70 | 71 |
72 | {#if error} 73 | {error} 74 | {:else} 75 | Your login info will not be saved anywhere except your browser.
76 | You can see all the code on the 77 | github. 78 | {/if} 79 |
80 | 87 |
88 |
89 | 90 | 136 | -------------------------------------------------------------------------------- /src/routes/login/+server.js: -------------------------------------------------------------------------------- 1 | import { login } from 'studentvue.js' 2 | import cookie from 'cookie' 3 | 4 | export async function POST({ request }) { 5 | console.log('post login') 6 | 7 | const body = await request.json() 8 | let result 9 | 10 | try { 11 | let client = await login(body.districtUrl, body.username, body.password) 12 | result = await Promise.all([ 13 | client.getStudentInfo().then((value) => JSON.parse(value).StudentInfo), 14 | client.getGradebook(0).then((value) => JSON.parse(value).Gradebook), 15 | client.getGradebook(1).then((value) => JSON.parse(value).Gradebook), 16 | client.getGradebook(2).then((value) => JSON.parse(value).Gradebook), 17 | client.getGradebook(3).then((value) => JSON.parse(value).Gradebook) 18 | ]) 19 | 20 | if (!result[0]) { 21 | throw new Error('No data returned') 22 | } 23 | } catch (error) { 24 | console.log(error) 25 | return new Response(null, { 26 | status: 401 27 | }) 28 | } 29 | 30 | const currentPeriod = 31 | result[1].ReportingPeriods.ReportPeriod.length - 32 | 1 - 33 | result[1].ReportingPeriods.ReportPeriod.slice() 34 | .reverse() 35 | .findIndex((period) => { 36 | return new Date() > new Date(period.StartDate) 37 | }) 38 | 39 | return new Response( 40 | JSON.stringify({ 41 | student: result.shift(), 42 | periods: result, 43 | currentPeriod 44 | }), 45 | { 46 | headers: { 47 | 'Set-Cookie': cookie.serialize( 48 | 'auth', 49 | Buffer.from(body.username).toString('base64') + 50 | ':' + 51 | Buffer.from(body.password).toString('base64') + 52 | ':' + 53 | Buffer.from(body.districtUrl).toString('base64'), 54 | { 55 | httpOnly: true, 56 | maxAge: 60 * 60 * 24 * 30, 57 | sameSite: 'strict', 58 | path: '/' 59 | } 60 | ) 61 | } 62 | } 63 | ) 64 | } 65 | -------------------------------------------------------------------------------- /src/routes/logout/+server.js: -------------------------------------------------------------------------------- 1 | import cookie from 'cookie' 2 | 3 | export async function POST() { 4 | return new Response(null, { 5 | headers: { 6 | 'Set-cookie': cookie.serialize('auth', '', { 7 | httpOnly: true, 8 | sameSite: 'strict', 9 | path: '/', 10 | expires: new Date(0) 11 | }) 12 | } 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /src/routes/settings/+page.server.js: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit' 2 | 3 | /** @type {import('./$types').PageLoad} */ 4 | export async function load({ params, locals }) { 5 | console.log('settings server load') 6 | if (!locals.user) { 7 | console.log('redirect to login') 8 | throw redirect(302, '/login') 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/routes/settings/+page.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 | Settings 26 | 27 | 28 |
29 |

Settings

30 |
31 |

Account

32 | 33 |

Theme

34 |
{$settings.theme.charAt(0).toUpperCase() + $settings.theme.substring(1)}
35 |
36 |
57 |
58 |
59 | 60 | 100 | -------------------------------------------------------------------------------- /src/service-worker.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import { build, files, version } from '$service-worker' 4 | 5 | self.addEventListener('fetch', (event) => { 6 | return 7 | }) 8 | -------------------------------------------------------------------------------- /src/variables.scss: -------------------------------------------------------------------------------- 1 | /* Variables and mixins declared here will be available in all other SCSS files */ 2 | $spacing: 20px; 3 | $spacing-small: 10px; 4 | $roundness: 20px; 5 | $roundness-small: 12px; 6 | $breakpoint-phone: 480px; 7 | 8 | @mixin box { 9 | background: var(--bg-color-2); 10 | border: var(--border); 11 | backdrop-filter: var(--filter); 12 | border-radius: $roundness; 13 | padding: $spacing; 14 | } 15 | 16 | @mixin nowrap { 17 | overflow: hidden; 18 | white-space: nowrap; 19 | text-overflow: ellipsis; 20 | } 21 | -------------------------------------------------------------------------------- /static/apple-icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/apple-icon-180.png -------------------------------------------------------------------------------- /static/bootstrap-icons/bootstrap-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'bootstrap-icons'; 3 | src: url('/bootstrap-icons/bootstrap-icons.woff2?30af91bf14e37666a085fb8a161ff36d') 4 | format('woff2'), 5 | url('/bootstrap-icons/bootstrap-icons.woff?30af91bf14e37666a085fb8a161ff36d') format('woff'); 6 | } 7 | 8 | .bi::before, 9 | [class^='bi-']::before, 10 | [class*=' bi-']::before { 11 | display: inline-block; 12 | font-family: bootstrap-icons !important; 13 | font-style: normal; 14 | font-weight: normal !important; 15 | font-variant: normal; 16 | text-transform: none; 17 | line-height: 1; 18 | vertical-align: -0.125em; 19 | -webkit-font-smoothing: antialiased; 20 | -moz-osx-font-smoothing: grayscale; 21 | } 22 | 23 | .bi-123::before { 24 | content: '\f67f'; 25 | } 26 | .bi-alarm-fill::before { 27 | content: '\f101'; 28 | } 29 | .bi-alarm::before { 30 | content: '\f102'; 31 | } 32 | .bi-align-bottom::before { 33 | content: '\f103'; 34 | } 35 | .bi-align-center::before { 36 | content: '\f104'; 37 | } 38 | .bi-align-end::before { 39 | content: '\f105'; 40 | } 41 | .bi-align-middle::before { 42 | content: '\f106'; 43 | } 44 | .bi-align-start::before { 45 | content: '\f107'; 46 | } 47 | .bi-align-top::before { 48 | content: '\f108'; 49 | } 50 | .bi-alt::before { 51 | content: '\f109'; 52 | } 53 | .bi-app-indicator::before { 54 | content: '\f10a'; 55 | } 56 | .bi-app::before { 57 | content: '\f10b'; 58 | } 59 | .bi-archive-fill::before { 60 | content: '\f10c'; 61 | } 62 | .bi-archive::before { 63 | content: '\f10d'; 64 | } 65 | .bi-arrow-90deg-down::before { 66 | content: '\f10e'; 67 | } 68 | .bi-arrow-90deg-left::before { 69 | content: '\f10f'; 70 | } 71 | .bi-arrow-90deg-right::before { 72 | content: '\f110'; 73 | } 74 | .bi-arrow-90deg-up::before { 75 | content: '\f111'; 76 | } 77 | .bi-arrow-bar-down::before { 78 | content: '\f112'; 79 | } 80 | .bi-arrow-bar-left::before { 81 | content: '\f113'; 82 | } 83 | .bi-arrow-bar-right::before { 84 | content: '\f114'; 85 | } 86 | .bi-arrow-bar-up::before { 87 | content: '\f115'; 88 | } 89 | .bi-arrow-clockwise::before { 90 | content: '\f116'; 91 | } 92 | .bi-arrow-counterclockwise::before { 93 | content: '\f117'; 94 | } 95 | .bi-arrow-down-circle-fill::before { 96 | content: '\f118'; 97 | } 98 | .bi-arrow-down-circle::before { 99 | content: '\f119'; 100 | } 101 | .bi-arrow-down-left-circle-fill::before { 102 | content: '\f11a'; 103 | } 104 | .bi-arrow-down-left-circle::before { 105 | content: '\f11b'; 106 | } 107 | .bi-arrow-down-left-square-fill::before { 108 | content: '\f11c'; 109 | } 110 | .bi-arrow-down-left-square::before { 111 | content: '\f11d'; 112 | } 113 | .bi-arrow-down-left::before { 114 | content: '\f11e'; 115 | } 116 | .bi-arrow-down-right-circle-fill::before { 117 | content: '\f11f'; 118 | } 119 | .bi-arrow-down-right-circle::before { 120 | content: '\f120'; 121 | } 122 | .bi-arrow-down-right-square-fill::before { 123 | content: '\f121'; 124 | } 125 | .bi-arrow-down-right-square::before { 126 | content: '\f122'; 127 | } 128 | .bi-arrow-down-right::before { 129 | content: '\f123'; 130 | } 131 | .bi-arrow-down-short::before { 132 | content: '\f124'; 133 | } 134 | .bi-arrow-down-square-fill::before { 135 | content: '\f125'; 136 | } 137 | .bi-arrow-down-square::before { 138 | content: '\f126'; 139 | } 140 | .bi-arrow-down-up::before { 141 | content: '\f127'; 142 | } 143 | .bi-arrow-down::before { 144 | content: '\f128'; 145 | } 146 | .bi-arrow-left-circle-fill::before { 147 | content: '\f129'; 148 | } 149 | .bi-arrow-left-circle::before { 150 | content: '\f12a'; 151 | } 152 | .bi-arrow-left-right::before { 153 | content: '\f12b'; 154 | } 155 | .bi-arrow-left-short::before { 156 | content: '\f12c'; 157 | } 158 | .bi-arrow-left-square-fill::before { 159 | content: '\f12d'; 160 | } 161 | .bi-arrow-left-square::before { 162 | content: '\f12e'; 163 | } 164 | .bi-arrow-left::before { 165 | content: '\f12f'; 166 | } 167 | .bi-arrow-repeat::before { 168 | content: '\f130'; 169 | } 170 | .bi-arrow-return-left::before { 171 | content: '\f131'; 172 | } 173 | .bi-arrow-return-right::before { 174 | content: '\f132'; 175 | } 176 | .bi-arrow-right-circle-fill::before { 177 | content: '\f133'; 178 | } 179 | .bi-arrow-right-circle::before { 180 | content: '\f134'; 181 | } 182 | .bi-arrow-right-short::before { 183 | content: '\f135'; 184 | } 185 | .bi-arrow-right-square-fill::before { 186 | content: '\f136'; 187 | } 188 | .bi-arrow-right-square::before { 189 | content: '\f137'; 190 | } 191 | .bi-arrow-right::before { 192 | content: '\f138'; 193 | } 194 | .bi-arrow-up-circle-fill::before { 195 | content: '\f139'; 196 | } 197 | .bi-arrow-up-circle::before { 198 | content: '\f13a'; 199 | } 200 | .bi-arrow-up-left-circle-fill::before { 201 | content: '\f13b'; 202 | } 203 | .bi-arrow-up-left-circle::before { 204 | content: '\f13c'; 205 | } 206 | .bi-arrow-up-left-square-fill::before { 207 | content: '\f13d'; 208 | } 209 | .bi-arrow-up-left-square::before { 210 | content: '\f13e'; 211 | } 212 | .bi-arrow-up-left::before { 213 | content: '\f13f'; 214 | } 215 | .bi-arrow-up-right-circle-fill::before { 216 | content: '\f140'; 217 | } 218 | .bi-arrow-up-right-circle::before { 219 | content: '\f141'; 220 | } 221 | .bi-arrow-up-right-square-fill::before { 222 | content: '\f142'; 223 | } 224 | .bi-arrow-up-right-square::before { 225 | content: '\f143'; 226 | } 227 | .bi-arrow-up-right::before { 228 | content: '\f144'; 229 | } 230 | .bi-arrow-up-short::before { 231 | content: '\f145'; 232 | } 233 | .bi-arrow-up-square-fill::before { 234 | content: '\f146'; 235 | } 236 | .bi-arrow-up-square::before { 237 | content: '\f147'; 238 | } 239 | .bi-arrow-up::before { 240 | content: '\f148'; 241 | } 242 | .bi-arrows-angle-contract::before { 243 | content: '\f149'; 244 | } 245 | .bi-arrows-angle-expand::before { 246 | content: '\f14a'; 247 | } 248 | .bi-arrows-collapse::before { 249 | content: '\f14b'; 250 | } 251 | .bi-arrows-expand::before { 252 | content: '\f14c'; 253 | } 254 | .bi-arrows-fullscreen::before { 255 | content: '\f14d'; 256 | } 257 | .bi-arrows-move::before { 258 | content: '\f14e'; 259 | } 260 | .bi-aspect-ratio-fill::before { 261 | content: '\f14f'; 262 | } 263 | .bi-aspect-ratio::before { 264 | content: '\f150'; 265 | } 266 | .bi-asterisk::before { 267 | content: '\f151'; 268 | } 269 | .bi-at::before { 270 | content: '\f152'; 271 | } 272 | .bi-award-fill::before { 273 | content: '\f153'; 274 | } 275 | .bi-award::before { 276 | content: '\f154'; 277 | } 278 | .bi-back::before { 279 | content: '\f155'; 280 | } 281 | .bi-backspace-fill::before { 282 | content: '\f156'; 283 | } 284 | .bi-backspace-reverse-fill::before { 285 | content: '\f157'; 286 | } 287 | .bi-backspace-reverse::before { 288 | content: '\f158'; 289 | } 290 | .bi-backspace::before { 291 | content: '\f159'; 292 | } 293 | .bi-badge-3d-fill::before { 294 | content: '\f15a'; 295 | } 296 | .bi-badge-3d::before { 297 | content: '\f15b'; 298 | } 299 | .bi-badge-4k-fill::before { 300 | content: '\f15c'; 301 | } 302 | .bi-badge-4k::before { 303 | content: '\f15d'; 304 | } 305 | .bi-badge-8k-fill::before { 306 | content: '\f15e'; 307 | } 308 | .bi-badge-8k::before { 309 | content: '\f15f'; 310 | } 311 | .bi-badge-ad-fill::before { 312 | content: '\f160'; 313 | } 314 | .bi-badge-ad::before { 315 | content: '\f161'; 316 | } 317 | .bi-badge-ar-fill::before { 318 | content: '\f162'; 319 | } 320 | .bi-badge-ar::before { 321 | content: '\f163'; 322 | } 323 | .bi-badge-cc-fill::before { 324 | content: '\f164'; 325 | } 326 | .bi-badge-cc::before { 327 | content: '\f165'; 328 | } 329 | .bi-badge-hd-fill::before { 330 | content: '\f166'; 331 | } 332 | .bi-badge-hd::before { 333 | content: '\f167'; 334 | } 335 | .bi-badge-tm-fill::before { 336 | content: '\f168'; 337 | } 338 | .bi-badge-tm::before { 339 | content: '\f169'; 340 | } 341 | .bi-badge-vo-fill::before { 342 | content: '\f16a'; 343 | } 344 | .bi-badge-vo::before { 345 | content: '\f16b'; 346 | } 347 | .bi-badge-vr-fill::before { 348 | content: '\f16c'; 349 | } 350 | .bi-badge-vr::before { 351 | content: '\f16d'; 352 | } 353 | .bi-badge-wc-fill::before { 354 | content: '\f16e'; 355 | } 356 | .bi-badge-wc::before { 357 | content: '\f16f'; 358 | } 359 | .bi-bag-check-fill::before { 360 | content: '\f170'; 361 | } 362 | .bi-bag-check::before { 363 | content: '\f171'; 364 | } 365 | .bi-bag-dash-fill::before { 366 | content: '\f172'; 367 | } 368 | .bi-bag-dash::before { 369 | content: '\f173'; 370 | } 371 | .bi-bag-fill::before { 372 | content: '\f174'; 373 | } 374 | .bi-bag-plus-fill::before { 375 | content: '\f175'; 376 | } 377 | .bi-bag-plus::before { 378 | content: '\f176'; 379 | } 380 | .bi-bag-x-fill::before { 381 | content: '\f177'; 382 | } 383 | .bi-bag-x::before { 384 | content: '\f178'; 385 | } 386 | .bi-bag::before { 387 | content: '\f179'; 388 | } 389 | .bi-bar-chart-fill::before { 390 | content: '\f17a'; 391 | } 392 | .bi-bar-chart-line-fill::before { 393 | content: '\f17b'; 394 | } 395 | .bi-bar-chart-line::before { 396 | content: '\f17c'; 397 | } 398 | .bi-bar-chart-steps::before { 399 | content: '\f17d'; 400 | } 401 | .bi-bar-chart::before { 402 | content: '\f17e'; 403 | } 404 | .bi-basket-fill::before { 405 | content: '\f17f'; 406 | } 407 | .bi-basket::before { 408 | content: '\f180'; 409 | } 410 | .bi-basket2-fill::before { 411 | content: '\f181'; 412 | } 413 | .bi-basket2::before { 414 | content: '\f182'; 415 | } 416 | .bi-basket3-fill::before { 417 | content: '\f183'; 418 | } 419 | .bi-basket3::before { 420 | content: '\f184'; 421 | } 422 | .bi-battery-charging::before { 423 | content: '\f185'; 424 | } 425 | .bi-battery-full::before { 426 | content: '\f186'; 427 | } 428 | .bi-battery-half::before { 429 | content: '\f187'; 430 | } 431 | .bi-battery::before { 432 | content: '\f188'; 433 | } 434 | .bi-bell-fill::before { 435 | content: '\f189'; 436 | } 437 | .bi-bell::before { 438 | content: '\f18a'; 439 | } 440 | .bi-bezier::before { 441 | content: '\f18b'; 442 | } 443 | .bi-bezier2::before { 444 | content: '\f18c'; 445 | } 446 | .bi-bicycle::before { 447 | content: '\f18d'; 448 | } 449 | .bi-binoculars-fill::before { 450 | content: '\f18e'; 451 | } 452 | .bi-binoculars::before { 453 | content: '\f18f'; 454 | } 455 | .bi-blockquote-left::before { 456 | content: '\f190'; 457 | } 458 | .bi-blockquote-right::before { 459 | content: '\f191'; 460 | } 461 | .bi-book-fill::before { 462 | content: '\f192'; 463 | } 464 | .bi-book-half::before { 465 | content: '\f193'; 466 | } 467 | .bi-book::before { 468 | content: '\f194'; 469 | } 470 | .bi-bookmark-check-fill::before { 471 | content: '\f195'; 472 | } 473 | .bi-bookmark-check::before { 474 | content: '\f196'; 475 | } 476 | .bi-bookmark-dash-fill::before { 477 | content: '\f197'; 478 | } 479 | .bi-bookmark-dash::before { 480 | content: '\f198'; 481 | } 482 | .bi-bookmark-fill::before { 483 | content: '\f199'; 484 | } 485 | .bi-bookmark-heart-fill::before { 486 | content: '\f19a'; 487 | } 488 | .bi-bookmark-heart::before { 489 | content: '\f19b'; 490 | } 491 | .bi-bookmark-plus-fill::before { 492 | content: '\f19c'; 493 | } 494 | .bi-bookmark-plus::before { 495 | content: '\f19d'; 496 | } 497 | .bi-bookmark-star-fill::before { 498 | content: '\f19e'; 499 | } 500 | .bi-bookmark-star::before { 501 | content: '\f19f'; 502 | } 503 | .bi-bookmark-x-fill::before { 504 | content: '\f1a0'; 505 | } 506 | .bi-bookmark-x::before { 507 | content: '\f1a1'; 508 | } 509 | .bi-bookmark::before { 510 | content: '\f1a2'; 511 | } 512 | .bi-bookmarks-fill::before { 513 | content: '\f1a3'; 514 | } 515 | .bi-bookmarks::before { 516 | content: '\f1a4'; 517 | } 518 | .bi-bookshelf::before { 519 | content: '\f1a5'; 520 | } 521 | .bi-bootstrap-fill::before { 522 | content: '\f1a6'; 523 | } 524 | .bi-bootstrap-reboot::before { 525 | content: '\f1a7'; 526 | } 527 | .bi-bootstrap::before { 528 | content: '\f1a8'; 529 | } 530 | .bi-border-all::before { 531 | content: '\f1a9'; 532 | } 533 | .bi-border-bottom::before { 534 | content: '\f1aa'; 535 | } 536 | .bi-border-center::before { 537 | content: '\f1ab'; 538 | } 539 | .bi-border-inner::before { 540 | content: '\f1ac'; 541 | } 542 | .bi-border-left::before { 543 | content: '\f1ad'; 544 | } 545 | .bi-border-middle::before { 546 | content: '\f1ae'; 547 | } 548 | .bi-border-outer::before { 549 | content: '\f1af'; 550 | } 551 | .bi-border-right::before { 552 | content: '\f1b0'; 553 | } 554 | .bi-border-style::before { 555 | content: '\f1b1'; 556 | } 557 | .bi-border-top::before { 558 | content: '\f1b2'; 559 | } 560 | .bi-border-width::before { 561 | content: '\f1b3'; 562 | } 563 | .bi-border::before { 564 | content: '\f1b4'; 565 | } 566 | .bi-bounding-box-circles::before { 567 | content: '\f1b5'; 568 | } 569 | .bi-bounding-box::before { 570 | content: '\f1b6'; 571 | } 572 | .bi-box-arrow-down-left::before { 573 | content: '\f1b7'; 574 | } 575 | .bi-box-arrow-down-right::before { 576 | content: '\f1b8'; 577 | } 578 | .bi-box-arrow-down::before { 579 | content: '\f1b9'; 580 | } 581 | .bi-box-arrow-in-down-left::before { 582 | content: '\f1ba'; 583 | } 584 | .bi-box-arrow-in-down-right::before { 585 | content: '\f1bb'; 586 | } 587 | .bi-box-arrow-in-down::before { 588 | content: '\f1bc'; 589 | } 590 | .bi-box-arrow-in-left::before { 591 | content: '\f1bd'; 592 | } 593 | .bi-box-arrow-in-right::before { 594 | content: '\f1be'; 595 | } 596 | .bi-box-arrow-in-up-left::before { 597 | content: '\f1bf'; 598 | } 599 | .bi-box-arrow-in-up-right::before { 600 | content: '\f1c0'; 601 | } 602 | .bi-box-arrow-in-up::before { 603 | content: '\f1c1'; 604 | } 605 | .bi-box-arrow-left::before { 606 | content: '\f1c2'; 607 | } 608 | .bi-box-arrow-right::before { 609 | content: '\f1c3'; 610 | } 611 | .bi-box-arrow-up-left::before { 612 | content: '\f1c4'; 613 | } 614 | .bi-box-arrow-up-right::before { 615 | content: '\f1c5'; 616 | } 617 | .bi-box-arrow-up::before { 618 | content: '\f1c6'; 619 | } 620 | .bi-box-seam::before { 621 | content: '\f1c7'; 622 | } 623 | .bi-box::before { 624 | content: '\f1c8'; 625 | } 626 | .bi-braces::before { 627 | content: '\f1c9'; 628 | } 629 | .bi-bricks::before { 630 | content: '\f1ca'; 631 | } 632 | .bi-briefcase-fill::before { 633 | content: '\f1cb'; 634 | } 635 | .bi-briefcase::before { 636 | content: '\f1cc'; 637 | } 638 | .bi-brightness-alt-high-fill::before { 639 | content: '\f1cd'; 640 | } 641 | .bi-brightness-alt-high::before { 642 | content: '\f1ce'; 643 | } 644 | .bi-brightness-alt-low-fill::before { 645 | content: '\f1cf'; 646 | } 647 | .bi-brightness-alt-low::before { 648 | content: '\f1d0'; 649 | } 650 | .bi-brightness-high-fill::before { 651 | content: '\f1d1'; 652 | } 653 | .bi-brightness-high::before { 654 | content: '\f1d2'; 655 | } 656 | .bi-brightness-low-fill::before { 657 | content: '\f1d3'; 658 | } 659 | .bi-brightness-low::before { 660 | content: '\f1d4'; 661 | } 662 | .bi-broadcast-pin::before { 663 | content: '\f1d5'; 664 | } 665 | .bi-broadcast::before { 666 | content: '\f1d6'; 667 | } 668 | .bi-brush-fill::before { 669 | content: '\f1d7'; 670 | } 671 | .bi-brush::before { 672 | content: '\f1d8'; 673 | } 674 | .bi-bucket-fill::before { 675 | content: '\f1d9'; 676 | } 677 | .bi-bucket::before { 678 | content: '\f1da'; 679 | } 680 | .bi-bug-fill::before { 681 | content: '\f1db'; 682 | } 683 | .bi-bug::before { 684 | content: '\f1dc'; 685 | } 686 | .bi-building::before { 687 | content: '\f1dd'; 688 | } 689 | .bi-bullseye::before { 690 | content: '\f1de'; 691 | } 692 | .bi-calculator-fill::before { 693 | content: '\f1df'; 694 | } 695 | .bi-calculator::before { 696 | content: '\f1e0'; 697 | } 698 | .bi-calendar-check-fill::before { 699 | content: '\f1e1'; 700 | } 701 | .bi-calendar-check::before { 702 | content: '\f1e2'; 703 | } 704 | .bi-calendar-date-fill::before { 705 | content: '\f1e3'; 706 | } 707 | .bi-calendar-date::before { 708 | content: '\f1e4'; 709 | } 710 | .bi-calendar-day-fill::before { 711 | content: '\f1e5'; 712 | } 713 | .bi-calendar-day::before { 714 | content: '\f1e6'; 715 | } 716 | .bi-calendar-event-fill::before { 717 | content: '\f1e7'; 718 | } 719 | .bi-calendar-event::before { 720 | content: '\f1e8'; 721 | } 722 | .bi-calendar-fill::before { 723 | content: '\f1e9'; 724 | } 725 | .bi-calendar-minus-fill::before { 726 | content: '\f1ea'; 727 | } 728 | .bi-calendar-minus::before { 729 | content: '\f1eb'; 730 | } 731 | .bi-calendar-month-fill::before { 732 | content: '\f1ec'; 733 | } 734 | .bi-calendar-month::before { 735 | content: '\f1ed'; 736 | } 737 | .bi-calendar-plus-fill::before { 738 | content: '\f1ee'; 739 | } 740 | .bi-calendar-plus::before { 741 | content: '\f1ef'; 742 | } 743 | .bi-calendar-range-fill::before { 744 | content: '\f1f0'; 745 | } 746 | .bi-calendar-range::before { 747 | content: '\f1f1'; 748 | } 749 | .bi-calendar-week-fill::before { 750 | content: '\f1f2'; 751 | } 752 | .bi-calendar-week::before { 753 | content: '\f1f3'; 754 | } 755 | .bi-calendar-x-fill::before { 756 | content: '\f1f4'; 757 | } 758 | .bi-calendar-x::before { 759 | content: '\f1f5'; 760 | } 761 | .bi-calendar::before { 762 | content: '\f1f6'; 763 | } 764 | .bi-calendar2-check-fill::before { 765 | content: '\f1f7'; 766 | } 767 | .bi-calendar2-check::before { 768 | content: '\f1f8'; 769 | } 770 | .bi-calendar2-date-fill::before { 771 | content: '\f1f9'; 772 | } 773 | .bi-calendar2-date::before { 774 | content: '\f1fa'; 775 | } 776 | .bi-calendar2-day-fill::before { 777 | content: '\f1fb'; 778 | } 779 | .bi-calendar2-day::before { 780 | content: '\f1fc'; 781 | } 782 | .bi-calendar2-event-fill::before { 783 | content: '\f1fd'; 784 | } 785 | .bi-calendar2-event::before { 786 | content: '\f1fe'; 787 | } 788 | .bi-calendar2-fill::before { 789 | content: '\f1ff'; 790 | } 791 | .bi-calendar2-minus-fill::before { 792 | content: '\f200'; 793 | } 794 | .bi-calendar2-minus::before { 795 | content: '\f201'; 796 | } 797 | .bi-calendar2-month-fill::before { 798 | content: '\f202'; 799 | } 800 | .bi-calendar2-month::before { 801 | content: '\f203'; 802 | } 803 | .bi-calendar2-plus-fill::before { 804 | content: '\f204'; 805 | } 806 | .bi-calendar2-plus::before { 807 | content: '\f205'; 808 | } 809 | .bi-calendar2-range-fill::before { 810 | content: '\f206'; 811 | } 812 | .bi-calendar2-range::before { 813 | content: '\f207'; 814 | } 815 | .bi-calendar2-week-fill::before { 816 | content: '\f208'; 817 | } 818 | .bi-calendar2-week::before { 819 | content: '\f209'; 820 | } 821 | .bi-calendar2-x-fill::before { 822 | content: '\f20a'; 823 | } 824 | .bi-calendar2-x::before { 825 | content: '\f20b'; 826 | } 827 | .bi-calendar2::before { 828 | content: '\f20c'; 829 | } 830 | .bi-calendar3-event-fill::before { 831 | content: '\f20d'; 832 | } 833 | .bi-calendar3-event::before { 834 | content: '\f20e'; 835 | } 836 | .bi-calendar3-fill::before { 837 | content: '\f20f'; 838 | } 839 | .bi-calendar3-range-fill::before { 840 | content: '\f210'; 841 | } 842 | .bi-calendar3-range::before { 843 | content: '\f211'; 844 | } 845 | .bi-calendar3-week-fill::before { 846 | content: '\f212'; 847 | } 848 | .bi-calendar3-week::before { 849 | content: '\f213'; 850 | } 851 | .bi-calendar3::before { 852 | content: '\f214'; 853 | } 854 | .bi-calendar4-event::before { 855 | content: '\f215'; 856 | } 857 | .bi-calendar4-range::before { 858 | content: '\f216'; 859 | } 860 | .bi-calendar4-week::before { 861 | content: '\f217'; 862 | } 863 | .bi-calendar4::before { 864 | content: '\f218'; 865 | } 866 | .bi-camera-fill::before { 867 | content: '\f219'; 868 | } 869 | .bi-camera-reels-fill::before { 870 | content: '\f21a'; 871 | } 872 | .bi-camera-reels::before { 873 | content: '\f21b'; 874 | } 875 | .bi-camera-video-fill::before { 876 | content: '\f21c'; 877 | } 878 | .bi-camera-video-off-fill::before { 879 | content: '\f21d'; 880 | } 881 | .bi-camera-video-off::before { 882 | content: '\f21e'; 883 | } 884 | .bi-camera-video::before { 885 | content: '\f21f'; 886 | } 887 | .bi-camera::before { 888 | content: '\f220'; 889 | } 890 | .bi-camera2::before { 891 | content: '\f221'; 892 | } 893 | .bi-capslock-fill::before { 894 | content: '\f222'; 895 | } 896 | .bi-capslock::before { 897 | content: '\f223'; 898 | } 899 | .bi-card-checklist::before { 900 | content: '\f224'; 901 | } 902 | .bi-card-heading::before { 903 | content: '\f225'; 904 | } 905 | .bi-card-image::before { 906 | content: '\f226'; 907 | } 908 | .bi-card-list::before { 909 | content: '\f227'; 910 | } 911 | .bi-card-text::before { 912 | content: '\f228'; 913 | } 914 | .bi-caret-down-fill::before { 915 | content: '\f229'; 916 | } 917 | .bi-caret-down-square-fill::before { 918 | content: '\f22a'; 919 | } 920 | .bi-caret-down-square::before { 921 | content: '\f22b'; 922 | } 923 | .bi-caret-down::before { 924 | content: '\f22c'; 925 | } 926 | .bi-caret-left-fill::before { 927 | content: '\f22d'; 928 | } 929 | .bi-caret-left-square-fill::before { 930 | content: '\f22e'; 931 | } 932 | .bi-caret-left-square::before { 933 | content: '\f22f'; 934 | } 935 | .bi-caret-left::before { 936 | content: '\f230'; 937 | } 938 | .bi-caret-right-fill::before { 939 | content: '\f231'; 940 | } 941 | .bi-caret-right-square-fill::before { 942 | content: '\f232'; 943 | } 944 | .bi-caret-right-square::before { 945 | content: '\f233'; 946 | } 947 | .bi-caret-right::before { 948 | content: '\f234'; 949 | } 950 | .bi-caret-up-fill::before { 951 | content: '\f235'; 952 | } 953 | .bi-caret-up-square-fill::before { 954 | content: '\f236'; 955 | } 956 | .bi-caret-up-square::before { 957 | content: '\f237'; 958 | } 959 | .bi-caret-up::before { 960 | content: '\f238'; 961 | } 962 | .bi-cart-check-fill::before { 963 | content: '\f239'; 964 | } 965 | .bi-cart-check::before { 966 | content: '\f23a'; 967 | } 968 | .bi-cart-dash-fill::before { 969 | content: '\f23b'; 970 | } 971 | .bi-cart-dash::before { 972 | content: '\f23c'; 973 | } 974 | .bi-cart-fill::before { 975 | content: '\f23d'; 976 | } 977 | .bi-cart-plus-fill::before { 978 | content: '\f23e'; 979 | } 980 | .bi-cart-plus::before { 981 | content: '\f23f'; 982 | } 983 | .bi-cart-x-fill::before { 984 | content: '\f240'; 985 | } 986 | .bi-cart-x::before { 987 | content: '\f241'; 988 | } 989 | .bi-cart::before { 990 | content: '\f242'; 991 | } 992 | .bi-cart2::before { 993 | content: '\f243'; 994 | } 995 | .bi-cart3::before { 996 | content: '\f244'; 997 | } 998 | .bi-cart4::before { 999 | content: '\f245'; 1000 | } 1001 | .bi-cash-stack::before { 1002 | content: '\f246'; 1003 | } 1004 | .bi-cash::before { 1005 | content: '\f247'; 1006 | } 1007 | .bi-cast::before { 1008 | content: '\f248'; 1009 | } 1010 | .bi-chat-dots-fill::before { 1011 | content: '\f249'; 1012 | } 1013 | .bi-chat-dots::before { 1014 | content: '\f24a'; 1015 | } 1016 | .bi-chat-fill::before { 1017 | content: '\f24b'; 1018 | } 1019 | .bi-chat-left-dots-fill::before { 1020 | content: '\f24c'; 1021 | } 1022 | .bi-chat-left-dots::before { 1023 | content: '\f24d'; 1024 | } 1025 | .bi-chat-left-fill::before { 1026 | content: '\f24e'; 1027 | } 1028 | .bi-chat-left-quote-fill::before { 1029 | content: '\f24f'; 1030 | } 1031 | .bi-chat-left-quote::before { 1032 | content: '\f250'; 1033 | } 1034 | .bi-chat-left-text-fill::before { 1035 | content: '\f251'; 1036 | } 1037 | .bi-chat-left-text::before { 1038 | content: '\f252'; 1039 | } 1040 | .bi-chat-left::before { 1041 | content: '\f253'; 1042 | } 1043 | .bi-chat-quote-fill::before { 1044 | content: '\f254'; 1045 | } 1046 | .bi-chat-quote::before { 1047 | content: '\f255'; 1048 | } 1049 | .bi-chat-right-dots-fill::before { 1050 | content: '\f256'; 1051 | } 1052 | .bi-chat-right-dots::before { 1053 | content: '\f257'; 1054 | } 1055 | .bi-chat-right-fill::before { 1056 | content: '\f258'; 1057 | } 1058 | .bi-chat-right-quote-fill::before { 1059 | content: '\f259'; 1060 | } 1061 | .bi-chat-right-quote::before { 1062 | content: '\f25a'; 1063 | } 1064 | .bi-chat-right-text-fill::before { 1065 | content: '\f25b'; 1066 | } 1067 | .bi-chat-right-text::before { 1068 | content: '\f25c'; 1069 | } 1070 | .bi-chat-right::before { 1071 | content: '\f25d'; 1072 | } 1073 | .bi-chat-square-dots-fill::before { 1074 | content: '\f25e'; 1075 | } 1076 | .bi-chat-square-dots::before { 1077 | content: '\f25f'; 1078 | } 1079 | .bi-chat-square-fill::before { 1080 | content: '\f260'; 1081 | } 1082 | .bi-chat-square-quote-fill::before { 1083 | content: '\f261'; 1084 | } 1085 | .bi-chat-square-quote::before { 1086 | content: '\f262'; 1087 | } 1088 | .bi-chat-square-text-fill::before { 1089 | content: '\f263'; 1090 | } 1091 | .bi-chat-square-text::before { 1092 | content: '\f264'; 1093 | } 1094 | .bi-chat-square::before { 1095 | content: '\f265'; 1096 | } 1097 | .bi-chat-text-fill::before { 1098 | content: '\f266'; 1099 | } 1100 | .bi-chat-text::before { 1101 | content: '\f267'; 1102 | } 1103 | .bi-chat::before { 1104 | content: '\f268'; 1105 | } 1106 | .bi-check-all::before { 1107 | content: '\f269'; 1108 | } 1109 | .bi-check-circle-fill::before { 1110 | content: '\f26a'; 1111 | } 1112 | .bi-check-circle::before { 1113 | content: '\f26b'; 1114 | } 1115 | .bi-check-square-fill::before { 1116 | content: '\f26c'; 1117 | } 1118 | .bi-check-square::before { 1119 | content: '\f26d'; 1120 | } 1121 | .bi-check::before { 1122 | content: '\f26e'; 1123 | } 1124 | .bi-check2-all::before { 1125 | content: '\f26f'; 1126 | } 1127 | .bi-check2-circle::before { 1128 | content: '\f270'; 1129 | } 1130 | .bi-check2-square::before { 1131 | content: '\f271'; 1132 | } 1133 | .bi-check2::before { 1134 | content: '\f272'; 1135 | } 1136 | .bi-chevron-bar-contract::before { 1137 | content: '\f273'; 1138 | } 1139 | .bi-chevron-bar-down::before { 1140 | content: '\f274'; 1141 | } 1142 | .bi-chevron-bar-expand::before { 1143 | content: '\f275'; 1144 | } 1145 | .bi-chevron-bar-left::before { 1146 | content: '\f276'; 1147 | } 1148 | .bi-chevron-bar-right::before { 1149 | content: '\f277'; 1150 | } 1151 | .bi-chevron-bar-up::before { 1152 | content: '\f278'; 1153 | } 1154 | .bi-chevron-compact-down::before { 1155 | content: '\f279'; 1156 | } 1157 | .bi-chevron-compact-left::before { 1158 | content: '\f27a'; 1159 | } 1160 | .bi-chevron-compact-right::before { 1161 | content: '\f27b'; 1162 | } 1163 | .bi-chevron-compact-up::before { 1164 | content: '\f27c'; 1165 | } 1166 | .bi-chevron-contract::before { 1167 | content: '\f27d'; 1168 | } 1169 | .bi-chevron-double-down::before { 1170 | content: '\f27e'; 1171 | } 1172 | .bi-chevron-double-left::before { 1173 | content: '\f27f'; 1174 | } 1175 | .bi-chevron-double-right::before { 1176 | content: '\f280'; 1177 | } 1178 | .bi-chevron-double-up::before { 1179 | content: '\f281'; 1180 | } 1181 | .bi-chevron-down::before { 1182 | content: '\f282'; 1183 | } 1184 | .bi-chevron-expand::before { 1185 | content: '\f283'; 1186 | } 1187 | .bi-chevron-left::before { 1188 | content: '\f284'; 1189 | } 1190 | .bi-chevron-right::before { 1191 | content: '\f285'; 1192 | } 1193 | .bi-chevron-up::before { 1194 | content: '\f286'; 1195 | } 1196 | .bi-circle-fill::before { 1197 | content: '\f287'; 1198 | } 1199 | .bi-circle-half::before { 1200 | content: '\f288'; 1201 | } 1202 | .bi-circle-square::before { 1203 | content: '\f289'; 1204 | } 1205 | .bi-circle::before { 1206 | content: '\f28a'; 1207 | } 1208 | .bi-clipboard-check::before { 1209 | content: '\f28b'; 1210 | } 1211 | .bi-clipboard-data::before { 1212 | content: '\f28c'; 1213 | } 1214 | .bi-clipboard-minus::before { 1215 | content: '\f28d'; 1216 | } 1217 | .bi-clipboard-plus::before { 1218 | content: '\f28e'; 1219 | } 1220 | .bi-clipboard-x::before { 1221 | content: '\f28f'; 1222 | } 1223 | .bi-clipboard::before { 1224 | content: '\f290'; 1225 | } 1226 | .bi-clock-fill::before { 1227 | content: '\f291'; 1228 | } 1229 | .bi-clock-history::before { 1230 | content: '\f292'; 1231 | } 1232 | .bi-clock::before { 1233 | content: '\f293'; 1234 | } 1235 | .bi-cloud-arrow-down-fill::before { 1236 | content: '\f294'; 1237 | } 1238 | .bi-cloud-arrow-down::before { 1239 | content: '\f295'; 1240 | } 1241 | .bi-cloud-arrow-up-fill::before { 1242 | content: '\f296'; 1243 | } 1244 | .bi-cloud-arrow-up::before { 1245 | content: '\f297'; 1246 | } 1247 | .bi-cloud-check-fill::before { 1248 | content: '\f298'; 1249 | } 1250 | .bi-cloud-check::before { 1251 | content: '\f299'; 1252 | } 1253 | .bi-cloud-download-fill::before { 1254 | content: '\f29a'; 1255 | } 1256 | .bi-cloud-download::before { 1257 | content: '\f29b'; 1258 | } 1259 | .bi-cloud-drizzle-fill::before { 1260 | content: '\f29c'; 1261 | } 1262 | .bi-cloud-drizzle::before { 1263 | content: '\f29d'; 1264 | } 1265 | .bi-cloud-fill::before { 1266 | content: '\f29e'; 1267 | } 1268 | .bi-cloud-fog-fill::before { 1269 | content: '\f29f'; 1270 | } 1271 | .bi-cloud-fog::before { 1272 | content: '\f2a0'; 1273 | } 1274 | .bi-cloud-fog2-fill::before { 1275 | content: '\f2a1'; 1276 | } 1277 | .bi-cloud-fog2::before { 1278 | content: '\f2a2'; 1279 | } 1280 | .bi-cloud-hail-fill::before { 1281 | content: '\f2a3'; 1282 | } 1283 | .bi-cloud-hail::before { 1284 | content: '\f2a4'; 1285 | } 1286 | .bi-cloud-haze-1::before { 1287 | content: '\f2a5'; 1288 | } 1289 | .bi-cloud-haze-fill::before { 1290 | content: '\f2a6'; 1291 | } 1292 | .bi-cloud-haze::before { 1293 | content: '\f2a7'; 1294 | } 1295 | .bi-cloud-haze2-fill::before { 1296 | content: '\f2a8'; 1297 | } 1298 | .bi-cloud-lightning-fill::before { 1299 | content: '\f2a9'; 1300 | } 1301 | .bi-cloud-lightning-rain-fill::before { 1302 | content: '\f2aa'; 1303 | } 1304 | .bi-cloud-lightning-rain::before { 1305 | content: '\f2ab'; 1306 | } 1307 | .bi-cloud-lightning::before { 1308 | content: '\f2ac'; 1309 | } 1310 | .bi-cloud-minus-fill::before { 1311 | content: '\f2ad'; 1312 | } 1313 | .bi-cloud-minus::before { 1314 | content: '\f2ae'; 1315 | } 1316 | .bi-cloud-moon-fill::before { 1317 | content: '\f2af'; 1318 | } 1319 | .bi-cloud-moon::before { 1320 | content: '\f2b0'; 1321 | } 1322 | .bi-cloud-plus-fill::before { 1323 | content: '\f2b1'; 1324 | } 1325 | .bi-cloud-plus::before { 1326 | content: '\f2b2'; 1327 | } 1328 | .bi-cloud-rain-fill::before { 1329 | content: '\f2b3'; 1330 | } 1331 | .bi-cloud-rain-heavy-fill::before { 1332 | content: '\f2b4'; 1333 | } 1334 | .bi-cloud-rain-heavy::before { 1335 | content: '\f2b5'; 1336 | } 1337 | .bi-cloud-rain::before { 1338 | content: '\f2b6'; 1339 | } 1340 | .bi-cloud-slash-fill::before { 1341 | content: '\f2b7'; 1342 | } 1343 | .bi-cloud-slash::before { 1344 | content: '\f2b8'; 1345 | } 1346 | .bi-cloud-sleet-fill::before { 1347 | content: '\f2b9'; 1348 | } 1349 | .bi-cloud-sleet::before { 1350 | content: '\f2ba'; 1351 | } 1352 | .bi-cloud-snow-fill::before { 1353 | content: '\f2bb'; 1354 | } 1355 | .bi-cloud-snow::before { 1356 | content: '\f2bc'; 1357 | } 1358 | .bi-cloud-sun-fill::before { 1359 | content: '\f2bd'; 1360 | } 1361 | .bi-cloud-sun::before { 1362 | content: '\f2be'; 1363 | } 1364 | .bi-cloud-upload-fill::before { 1365 | content: '\f2bf'; 1366 | } 1367 | .bi-cloud-upload::before { 1368 | content: '\f2c0'; 1369 | } 1370 | .bi-cloud::before { 1371 | content: '\f2c1'; 1372 | } 1373 | .bi-clouds-fill::before { 1374 | content: '\f2c2'; 1375 | } 1376 | .bi-clouds::before { 1377 | content: '\f2c3'; 1378 | } 1379 | .bi-cloudy-fill::before { 1380 | content: '\f2c4'; 1381 | } 1382 | .bi-cloudy::before { 1383 | content: '\f2c5'; 1384 | } 1385 | .bi-code-slash::before { 1386 | content: '\f2c6'; 1387 | } 1388 | .bi-code-square::before { 1389 | content: '\f2c7'; 1390 | } 1391 | .bi-code::before { 1392 | content: '\f2c8'; 1393 | } 1394 | .bi-collection-fill::before { 1395 | content: '\f2c9'; 1396 | } 1397 | .bi-collection-play-fill::before { 1398 | content: '\f2ca'; 1399 | } 1400 | .bi-collection-play::before { 1401 | content: '\f2cb'; 1402 | } 1403 | .bi-collection::before { 1404 | content: '\f2cc'; 1405 | } 1406 | .bi-columns-gap::before { 1407 | content: '\f2cd'; 1408 | } 1409 | .bi-columns::before { 1410 | content: '\f2ce'; 1411 | } 1412 | .bi-command::before { 1413 | content: '\f2cf'; 1414 | } 1415 | .bi-compass-fill::before { 1416 | content: '\f2d0'; 1417 | } 1418 | .bi-compass::before { 1419 | content: '\f2d1'; 1420 | } 1421 | .bi-cone-striped::before { 1422 | content: '\f2d2'; 1423 | } 1424 | .bi-cone::before { 1425 | content: '\f2d3'; 1426 | } 1427 | .bi-controller::before { 1428 | content: '\f2d4'; 1429 | } 1430 | .bi-cpu-fill::before { 1431 | content: '\f2d5'; 1432 | } 1433 | .bi-cpu::before { 1434 | content: '\f2d6'; 1435 | } 1436 | .bi-credit-card-2-back-fill::before { 1437 | content: '\f2d7'; 1438 | } 1439 | .bi-credit-card-2-back::before { 1440 | content: '\f2d8'; 1441 | } 1442 | .bi-credit-card-2-front-fill::before { 1443 | content: '\f2d9'; 1444 | } 1445 | .bi-credit-card-2-front::before { 1446 | content: '\f2da'; 1447 | } 1448 | .bi-credit-card-fill::before { 1449 | content: '\f2db'; 1450 | } 1451 | .bi-credit-card::before { 1452 | content: '\f2dc'; 1453 | } 1454 | .bi-crop::before { 1455 | content: '\f2dd'; 1456 | } 1457 | .bi-cup-fill::before { 1458 | content: '\f2de'; 1459 | } 1460 | .bi-cup-straw::before { 1461 | content: '\f2df'; 1462 | } 1463 | .bi-cup::before { 1464 | content: '\f2e0'; 1465 | } 1466 | .bi-cursor-fill::before { 1467 | content: '\f2e1'; 1468 | } 1469 | .bi-cursor-text::before { 1470 | content: '\f2e2'; 1471 | } 1472 | .bi-cursor::before { 1473 | content: '\f2e3'; 1474 | } 1475 | .bi-dash-circle-dotted::before { 1476 | content: '\f2e4'; 1477 | } 1478 | .bi-dash-circle-fill::before { 1479 | content: '\f2e5'; 1480 | } 1481 | .bi-dash-circle::before { 1482 | content: '\f2e6'; 1483 | } 1484 | .bi-dash-square-dotted::before { 1485 | content: '\f2e7'; 1486 | } 1487 | .bi-dash-square-fill::before { 1488 | content: '\f2e8'; 1489 | } 1490 | .bi-dash-square::before { 1491 | content: '\f2e9'; 1492 | } 1493 | .bi-dash::before { 1494 | content: '\f2ea'; 1495 | } 1496 | .bi-diagram-2-fill::before { 1497 | content: '\f2eb'; 1498 | } 1499 | .bi-diagram-2::before { 1500 | content: '\f2ec'; 1501 | } 1502 | .bi-diagram-3-fill::before { 1503 | content: '\f2ed'; 1504 | } 1505 | .bi-diagram-3::before { 1506 | content: '\f2ee'; 1507 | } 1508 | .bi-diamond-fill::before { 1509 | content: '\f2ef'; 1510 | } 1511 | .bi-diamond-half::before { 1512 | content: '\f2f0'; 1513 | } 1514 | .bi-diamond::before { 1515 | content: '\f2f1'; 1516 | } 1517 | .bi-dice-1-fill::before { 1518 | content: '\f2f2'; 1519 | } 1520 | .bi-dice-1::before { 1521 | content: '\f2f3'; 1522 | } 1523 | .bi-dice-2-fill::before { 1524 | content: '\f2f4'; 1525 | } 1526 | .bi-dice-2::before { 1527 | content: '\f2f5'; 1528 | } 1529 | .bi-dice-3-fill::before { 1530 | content: '\f2f6'; 1531 | } 1532 | .bi-dice-3::before { 1533 | content: '\f2f7'; 1534 | } 1535 | .bi-dice-4-fill::before { 1536 | content: '\f2f8'; 1537 | } 1538 | .bi-dice-4::before { 1539 | content: '\f2f9'; 1540 | } 1541 | .bi-dice-5-fill::before { 1542 | content: '\f2fa'; 1543 | } 1544 | .bi-dice-5::before { 1545 | content: '\f2fb'; 1546 | } 1547 | .bi-dice-6-fill::before { 1548 | content: '\f2fc'; 1549 | } 1550 | .bi-dice-6::before { 1551 | content: '\f2fd'; 1552 | } 1553 | .bi-disc-fill::before { 1554 | content: '\f2fe'; 1555 | } 1556 | .bi-disc::before { 1557 | content: '\f2ff'; 1558 | } 1559 | .bi-discord::before { 1560 | content: '\f300'; 1561 | } 1562 | .bi-display-fill::before { 1563 | content: '\f301'; 1564 | } 1565 | .bi-display::before { 1566 | content: '\f302'; 1567 | } 1568 | .bi-distribute-horizontal::before { 1569 | content: '\f303'; 1570 | } 1571 | .bi-distribute-vertical::before { 1572 | content: '\f304'; 1573 | } 1574 | .bi-door-closed-fill::before { 1575 | content: '\f305'; 1576 | } 1577 | .bi-door-closed::before { 1578 | content: '\f306'; 1579 | } 1580 | .bi-door-open-fill::before { 1581 | content: '\f307'; 1582 | } 1583 | .bi-door-open::before { 1584 | content: '\f308'; 1585 | } 1586 | .bi-dot::before { 1587 | content: '\f309'; 1588 | } 1589 | .bi-download::before { 1590 | content: '\f30a'; 1591 | } 1592 | .bi-droplet-fill::before { 1593 | content: '\f30b'; 1594 | } 1595 | .bi-droplet-half::before { 1596 | content: '\f30c'; 1597 | } 1598 | .bi-droplet::before { 1599 | content: '\f30d'; 1600 | } 1601 | .bi-earbuds::before { 1602 | content: '\f30e'; 1603 | } 1604 | .bi-easel-fill::before { 1605 | content: '\f30f'; 1606 | } 1607 | .bi-easel::before { 1608 | content: '\f310'; 1609 | } 1610 | .bi-egg-fill::before { 1611 | content: '\f311'; 1612 | } 1613 | .bi-egg-fried::before { 1614 | content: '\f312'; 1615 | } 1616 | .bi-egg::before { 1617 | content: '\f313'; 1618 | } 1619 | .bi-eject-fill::before { 1620 | content: '\f314'; 1621 | } 1622 | .bi-eject::before { 1623 | content: '\f315'; 1624 | } 1625 | .bi-emoji-angry-fill::before { 1626 | content: '\f316'; 1627 | } 1628 | .bi-emoji-angry::before { 1629 | content: '\f317'; 1630 | } 1631 | .bi-emoji-dizzy-fill::before { 1632 | content: '\f318'; 1633 | } 1634 | .bi-emoji-dizzy::before { 1635 | content: '\f319'; 1636 | } 1637 | .bi-emoji-expressionless-fill::before { 1638 | content: '\f31a'; 1639 | } 1640 | .bi-emoji-expressionless::before { 1641 | content: '\f31b'; 1642 | } 1643 | .bi-emoji-frown-fill::before { 1644 | content: '\f31c'; 1645 | } 1646 | .bi-emoji-frown::before { 1647 | content: '\f31d'; 1648 | } 1649 | .bi-emoji-heart-eyes-fill::before { 1650 | content: '\f31e'; 1651 | } 1652 | .bi-emoji-heart-eyes::before { 1653 | content: '\f31f'; 1654 | } 1655 | .bi-emoji-laughing-fill::before { 1656 | content: '\f320'; 1657 | } 1658 | .bi-emoji-laughing::before { 1659 | content: '\f321'; 1660 | } 1661 | .bi-emoji-neutral-fill::before { 1662 | content: '\f322'; 1663 | } 1664 | .bi-emoji-neutral::before { 1665 | content: '\f323'; 1666 | } 1667 | .bi-emoji-smile-fill::before { 1668 | content: '\f324'; 1669 | } 1670 | .bi-emoji-smile-upside-down-fill::before { 1671 | content: '\f325'; 1672 | } 1673 | .bi-emoji-smile-upside-down::before { 1674 | content: '\f326'; 1675 | } 1676 | .bi-emoji-smile::before { 1677 | content: '\f327'; 1678 | } 1679 | .bi-emoji-sunglasses-fill::before { 1680 | content: '\f328'; 1681 | } 1682 | .bi-emoji-sunglasses::before { 1683 | content: '\f329'; 1684 | } 1685 | .bi-emoji-wink-fill::before { 1686 | content: '\f32a'; 1687 | } 1688 | .bi-emoji-wink::before { 1689 | content: '\f32b'; 1690 | } 1691 | .bi-envelope-fill::before { 1692 | content: '\f32c'; 1693 | } 1694 | .bi-envelope-open-fill::before { 1695 | content: '\f32d'; 1696 | } 1697 | .bi-envelope-open::before { 1698 | content: '\f32e'; 1699 | } 1700 | .bi-envelope::before { 1701 | content: '\f32f'; 1702 | } 1703 | .bi-eraser-fill::before { 1704 | content: '\f330'; 1705 | } 1706 | .bi-eraser::before { 1707 | content: '\f331'; 1708 | } 1709 | .bi-exclamation-circle-fill::before { 1710 | content: '\f332'; 1711 | } 1712 | .bi-exclamation-circle::before { 1713 | content: '\f333'; 1714 | } 1715 | .bi-exclamation-diamond-fill::before { 1716 | content: '\f334'; 1717 | } 1718 | .bi-exclamation-diamond::before { 1719 | content: '\f335'; 1720 | } 1721 | .bi-exclamation-octagon-fill::before { 1722 | content: '\f336'; 1723 | } 1724 | .bi-exclamation-octagon::before { 1725 | content: '\f337'; 1726 | } 1727 | .bi-exclamation-square-fill::before { 1728 | content: '\f338'; 1729 | } 1730 | .bi-exclamation-square::before { 1731 | content: '\f339'; 1732 | } 1733 | .bi-exclamation-triangle-fill::before { 1734 | content: '\f33a'; 1735 | } 1736 | .bi-exclamation-triangle::before { 1737 | content: '\f33b'; 1738 | } 1739 | .bi-exclamation::before { 1740 | content: '\f33c'; 1741 | } 1742 | .bi-exclude::before { 1743 | content: '\f33d'; 1744 | } 1745 | .bi-eye-fill::before { 1746 | content: '\f33e'; 1747 | } 1748 | .bi-eye-slash-fill::before { 1749 | content: '\f33f'; 1750 | } 1751 | .bi-eye-slash::before { 1752 | content: '\f340'; 1753 | } 1754 | .bi-eye::before { 1755 | content: '\f341'; 1756 | } 1757 | .bi-eyedropper::before { 1758 | content: '\f342'; 1759 | } 1760 | .bi-eyeglasses::before { 1761 | content: '\f343'; 1762 | } 1763 | .bi-facebook::before { 1764 | content: '\f344'; 1765 | } 1766 | .bi-file-arrow-down-fill::before { 1767 | content: '\f345'; 1768 | } 1769 | .bi-file-arrow-down::before { 1770 | content: '\f346'; 1771 | } 1772 | .bi-file-arrow-up-fill::before { 1773 | content: '\f347'; 1774 | } 1775 | .bi-file-arrow-up::before { 1776 | content: '\f348'; 1777 | } 1778 | .bi-file-bar-graph-fill::before { 1779 | content: '\f349'; 1780 | } 1781 | .bi-file-bar-graph::before { 1782 | content: '\f34a'; 1783 | } 1784 | .bi-file-binary-fill::before { 1785 | content: '\f34b'; 1786 | } 1787 | .bi-file-binary::before { 1788 | content: '\f34c'; 1789 | } 1790 | .bi-file-break-fill::before { 1791 | content: '\f34d'; 1792 | } 1793 | .bi-file-break::before { 1794 | content: '\f34e'; 1795 | } 1796 | .bi-file-check-fill::before { 1797 | content: '\f34f'; 1798 | } 1799 | .bi-file-check::before { 1800 | content: '\f350'; 1801 | } 1802 | .bi-file-code-fill::before { 1803 | content: '\f351'; 1804 | } 1805 | .bi-file-code::before { 1806 | content: '\f352'; 1807 | } 1808 | .bi-file-diff-fill::before { 1809 | content: '\f353'; 1810 | } 1811 | .bi-file-diff::before { 1812 | content: '\f354'; 1813 | } 1814 | .bi-file-earmark-arrow-down-fill::before { 1815 | content: '\f355'; 1816 | } 1817 | .bi-file-earmark-arrow-down::before { 1818 | content: '\f356'; 1819 | } 1820 | .bi-file-earmark-arrow-up-fill::before { 1821 | content: '\f357'; 1822 | } 1823 | .bi-file-earmark-arrow-up::before { 1824 | content: '\f358'; 1825 | } 1826 | .bi-file-earmark-bar-graph-fill::before { 1827 | content: '\f359'; 1828 | } 1829 | .bi-file-earmark-bar-graph::before { 1830 | content: '\f35a'; 1831 | } 1832 | .bi-file-earmark-binary-fill::before { 1833 | content: '\f35b'; 1834 | } 1835 | .bi-file-earmark-binary::before { 1836 | content: '\f35c'; 1837 | } 1838 | .bi-file-earmark-break-fill::before { 1839 | content: '\f35d'; 1840 | } 1841 | .bi-file-earmark-break::before { 1842 | content: '\f35e'; 1843 | } 1844 | .bi-file-earmark-check-fill::before { 1845 | content: '\f35f'; 1846 | } 1847 | .bi-file-earmark-check::before { 1848 | content: '\f360'; 1849 | } 1850 | .bi-file-earmark-code-fill::before { 1851 | content: '\f361'; 1852 | } 1853 | .bi-file-earmark-code::before { 1854 | content: '\f362'; 1855 | } 1856 | .bi-file-earmark-diff-fill::before { 1857 | content: '\f363'; 1858 | } 1859 | .bi-file-earmark-diff::before { 1860 | content: '\f364'; 1861 | } 1862 | .bi-file-earmark-easel-fill::before { 1863 | content: '\f365'; 1864 | } 1865 | .bi-file-earmark-easel::before { 1866 | content: '\f366'; 1867 | } 1868 | .bi-file-earmark-excel-fill::before { 1869 | content: '\f367'; 1870 | } 1871 | .bi-file-earmark-excel::before { 1872 | content: '\f368'; 1873 | } 1874 | .bi-file-earmark-fill::before { 1875 | content: '\f369'; 1876 | } 1877 | .bi-file-earmark-font-fill::before { 1878 | content: '\f36a'; 1879 | } 1880 | .bi-file-earmark-font::before { 1881 | content: '\f36b'; 1882 | } 1883 | .bi-file-earmark-image-fill::before { 1884 | content: '\f36c'; 1885 | } 1886 | .bi-file-earmark-image::before { 1887 | content: '\f36d'; 1888 | } 1889 | .bi-file-earmark-lock-fill::before { 1890 | content: '\f36e'; 1891 | } 1892 | .bi-file-earmark-lock::before { 1893 | content: '\f36f'; 1894 | } 1895 | .bi-file-earmark-lock2-fill::before { 1896 | content: '\f370'; 1897 | } 1898 | .bi-file-earmark-lock2::before { 1899 | content: '\f371'; 1900 | } 1901 | .bi-file-earmark-medical-fill::before { 1902 | content: '\f372'; 1903 | } 1904 | .bi-file-earmark-medical::before { 1905 | content: '\f373'; 1906 | } 1907 | .bi-file-earmark-minus-fill::before { 1908 | content: '\f374'; 1909 | } 1910 | .bi-file-earmark-minus::before { 1911 | content: '\f375'; 1912 | } 1913 | .bi-file-earmark-music-fill::before { 1914 | content: '\f376'; 1915 | } 1916 | .bi-file-earmark-music::before { 1917 | content: '\f377'; 1918 | } 1919 | .bi-file-earmark-person-fill::before { 1920 | content: '\f378'; 1921 | } 1922 | .bi-file-earmark-person::before { 1923 | content: '\f379'; 1924 | } 1925 | .bi-file-earmark-play-fill::before { 1926 | content: '\f37a'; 1927 | } 1928 | .bi-file-earmark-play::before { 1929 | content: '\f37b'; 1930 | } 1931 | .bi-file-earmark-plus-fill::before { 1932 | content: '\f37c'; 1933 | } 1934 | .bi-file-earmark-plus::before { 1935 | content: '\f37d'; 1936 | } 1937 | .bi-file-earmark-post-fill::before { 1938 | content: '\f37e'; 1939 | } 1940 | .bi-file-earmark-post::before { 1941 | content: '\f37f'; 1942 | } 1943 | .bi-file-earmark-ppt-fill::before { 1944 | content: '\f380'; 1945 | } 1946 | .bi-file-earmark-ppt::before { 1947 | content: '\f381'; 1948 | } 1949 | .bi-file-earmark-richtext-fill::before { 1950 | content: '\f382'; 1951 | } 1952 | .bi-file-earmark-richtext::before { 1953 | content: '\f383'; 1954 | } 1955 | .bi-file-earmark-ruled-fill::before { 1956 | content: '\f384'; 1957 | } 1958 | .bi-file-earmark-ruled::before { 1959 | content: '\f385'; 1960 | } 1961 | .bi-file-earmark-slides-fill::before { 1962 | content: '\f386'; 1963 | } 1964 | .bi-file-earmark-slides::before { 1965 | content: '\f387'; 1966 | } 1967 | .bi-file-earmark-spreadsheet-fill::before { 1968 | content: '\f388'; 1969 | } 1970 | .bi-file-earmark-spreadsheet::before { 1971 | content: '\f389'; 1972 | } 1973 | .bi-file-earmark-text-fill::before { 1974 | content: '\f38a'; 1975 | } 1976 | .bi-file-earmark-text::before { 1977 | content: '\f38b'; 1978 | } 1979 | .bi-file-earmark-word-fill::before { 1980 | content: '\f38c'; 1981 | } 1982 | .bi-file-earmark-word::before { 1983 | content: '\f38d'; 1984 | } 1985 | .bi-file-earmark-x-fill::before { 1986 | content: '\f38e'; 1987 | } 1988 | .bi-file-earmark-x::before { 1989 | content: '\f38f'; 1990 | } 1991 | .bi-file-earmark-zip-fill::before { 1992 | content: '\f390'; 1993 | } 1994 | .bi-file-earmark-zip::before { 1995 | content: '\f391'; 1996 | } 1997 | .bi-file-earmark::before { 1998 | content: '\f392'; 1999 | } 2000 | .bi-file-easel-fill::before { 2001 | content: '\f393'; 2002 | } 2003 | .bi-file-easel::before { 2004 | content: '\f394'; 2005 | } 2006 | .bi-file-excel-fill::before { 2007 | content: '\f395'; 2008 | } 2009 | .bi-file-excel::before { 2010 | content: '\f396'; 2011 | } 2012 | .bi-file-fill::before { 2013 | content: '\f397'; 2014 | } 2015 | .bi-file-font-fill::before { 2016 | content: '\f398'; 2017 | } 2018 | .bi-file-font::before { 2019 | content: '\f399'; 2020 | } 2021 | .bi-file-image-fill::before { 2022 | content: '\f39a'; 2023 | } 2024 | .bi-file-image::before { 2025 | content: '\f39b'; 2026 | } 2027 | .bi-file-lock-fill::before { 2028 | content: '\f39c'; 2029 | } 2030 | .bi-file-lock::before { 2031 | content: '\f39d'; 2032 | } 2033 | .bi-file-lock2-fill::before { 2034 | content: '\f39e'; 2035 | } 2036 | .bi-file-lock2::before { 2037 | content: '\f39f'; 2038 | } 2039 | .bi-file-medical-fill::before { 2040 | content: '\f3a0'; 2041 | } 2042 | .bi-file-medical::before { 2043 | content: '\f3a1'; 2044 | } 2045 | .bi-file-minus-fill::before { 2046 | content: '\f3a2'; 2047 | } 2048 | .bi-file-minus::before { 2049 | content: '\f3a3'; 2050 | } 2051 | .bi-file-music-fill::before { 2052 | content: '\f3a4'; 2053 | } 2054 | .bi-file-music::before { 2055 | content: '\f3a5'; 2056 | } 2057 | .bi-file-person-fill::before { 2058 | content: '\f3a6'; 2059 | } 2060 | .bi-file-person::before { 2061 | content: '\f3a7'; 2062 | } 2063 | .bi-file-play-fill::before { 2064 | content: '\f3a8'; 2065 | } 2066 | .bi-file-play::before { 2067 | content: '\f3a9'; 2068 | } 2069 | .bi-file-plus-fill::before { 2070 | content: '\f3aa'; 2071 | } 2072 | .bi-file-plus::before { 2073 | content: '\f3ab'; 2074 | } 2075 | .bi-file-post-fill::before { 2076 | content: '\f3ac'; 2077 | } 2078 | .bi-file-post::before { 2079 | content: '\f3ad'; 2080 | } 2081 | .bi-file-ppt-fill::before { 2082 | content: '\f3ae'; 2083 | } 2084 | .bi-file-ppt::before { 2085 | content: '\f3af'; 2086 | } 2087 | .bi-file-richtext-fill::before { 2088 | content: '\f3b0'; 2089 | } 2090 | .bi-file-richtext::before { 2091 | content: '\f3b1'; 2092 | } 2093 | .bi-file-ruled-fill::before { 2094 | content: '\f3b2'; 2095 | } 2096 | .bi-file-ruled::before { 2097 | content: '\f3b3'; 2098 | } 2099 | .bi-file-slides-fill::before { 2100 | content: '\f3b4'; 2101 | } 2102 | .bi-file-slides::before { 2103 | content: '\f3b5'; 2104 | } 2105 | .bi-file-spreadsheet-fill::before { 2106 | content: '\f3b6'; 2107 | } 2108 | .bi-file-spreadsheet::before { 2109 | content: '\f3b7'; 2110 | } 2111 | .bi-file-text-fill::before { 2112 | content: '\f3b8'; 2113 | } 2114 | .bi-file-text::before { 2115 | content: '\f3b9'; 2116 | } 2117 | .bi-file-word-fill::before { 2118 | content: '\f3ba'; 2119 | } 2120 | .bi-file-word::before { 2121 | content: '\f3bb'; 2122 | } 2123 | .bi-file-x-fill::before { 2124 | content: '\f3bc'; 2125 | } 2126 | .bi-file-x::before { 2127 | content: '\f3bd'; 2128 | } 2129 | .bi-file-zip-fill::before { 2130 | content: '\f3be'; 2131 | } 2132 | .bi-file-zip::before { 2133 | content: '\f3bf'; 2134 | } 2135 | .bi-file::before { 2136 | content: '\f3c0'; 2137 | } 2138 | .bi-files-alt::before { 2139 | content: '\f3c1'; 2140 | } 2141 | .bi-files::before { 2142 | content: '\f3c2'; 2143 | } 2144 | .bi-film::before { 2145 | content: '\f3c3'; 2146 | } 2147 | .bi-filter-circle-fill::before { 2148 | content: '\f3c4'; 2149 | } 2150 | .bi-filter-circle::before { 2151 | content: '\f3c5'; 2152 | } 2153 | .bi-filter-left::before { 2154 | content: '\f3c6'; 2155 | } 2156 | .bi-filter-right::before { 2157 | content: '\f3c7'; 2158 | } 2159 | .bi-filter-square-fill::before { 2160 | content: '\f3c8'; 2161 | } 2162 | .bi-filter-square::before { 2163 | content: '\f3c9'; 2164 | } 2165 | .bi-filter::before { 2166 | content: '\f3ca'; 2167 | } 2168 | .bi-flag-fill::before { 2169 | content: '\f3cb'; 2170 | } 2171 | .bi-flag::before { 2172 | content: '\f3cc'; 2173 | } 2174 | .bi-flower1::before { 2175 | content: '\f3cd'; 2176 | } 2177 | .bi-flower2::before { 2178 | content: '\f3ce'; 2179 | } 2180 | .bi-flower3::before { 2181 | content: '\f3cf'; 2182 | } 2183 | .bi-folder-check::before { 2184 | content: '\f3d0'; 2185 | } 2186 | .bi-folder-fill::before { 2187 | content: '\f3d1'; 2188 | } 2189 | .bi-folder-minus::before { 2190 | content: '\f3d2'; 2191 | } 2192 | .bi-folder-plus::before { 2193 | content: '\f3d3'; 2194 | } 2195 | .bi-folder-symlink-fill::before { 2196 | content: '\f3d4'; 2197 | } 2198 | .bi-folder-symlink::before { 2199 | content: '\f3d5'; 2200 | } 2201 | .bi-folder-x::before { 2202 | content: '\f3d6'; 2203 | } 2204 | .bi-folder::before { 2205 | content: '\f3d7'; 2206 | } 2207 | .bi-folder2-open::before { 2208 | content: '\f3d8'; 2209 | } 2210 | .bi-folder2::before { 2211 | content: '\f3d9'; 2212 | } 2213 | .bi-fonts::before { 2214 | content: '\f3da'; 2215 | } 2216 | .bi-forward-fill::before { 2217 | content: '\f3db'; 2218 | } 2219 | .bi-forward::before { 2220 | content: '\f3dc'; 2221 | } 2222 | .bi-front::before { 2223 | content: '\f3dd'; 2224 | } 2225 | .bi-fullscreen-exit::before { 2226 | content: '\f3de'; 2227 | } 2228 | .bi-fullscreen::before { 2229 | content: '\f3df'; 2230 | } 2231 | .bi-funnel-fill::before { 2232 | content: '\f3e0'; 2233 | } 2234 | .bi-funnel::before { 2235 | content: '\f3e1'; 2236 | } 2237 | .bi-gear-fill::before { 2238 | content: '\f3e2'; 2239 | } 2240 | .bi-gear-wide-connected::before { 2241 | content: '\f3e3'; 2242 | } 2243 | .bi-gear-wide::before { 2244 | content: '\f3e4'; 2245 | } 2246 | .bi-gear::before { 2247 | content: '\f3e5'; 2248 | } 2249 | .bi-gem::before { 2250 | content: '\f3e6'; 2251 | } 2252 | .bi-geo-alt-fill::before { 2253 | content: '\f3e7'; 2254 | } 2255 | .bi-geo-alt::before { 2256 | content: '\f3e8'; 2257 | } 2258 | .bi-geo-fill::before { 2259 | content: '\f3e9'; 2260 | } 2261 | .bi-geo::before { 2262 | content: '\f3ea'; 2263 | } 2264 | .bi-gift-fill::before { 2265 | content: '\f3eb'; 2266 | } 2267 | .bi-gift::before { 2268 | content: '\f3ec'; 2269 | } 2270 | .bi-github::before { 2271 | content: '\f3ed'; 2272 | } 2273 | .bi-globe::before { 2274 | content: '\f3ee'; 2275 | } 2276 | .bi-globe2::before { 2277 | content: '\f3ef'; 2278 | } 2279 | .bi-google::before { 2280 | content: '\f3f0'; 2281 | } 2282 | .bi-graph-down::before { 2283 | content: '\f3f1'; 2284 | } 2285 | .bi-graph-up::before { 2286 | content: '\f3f2'; 2287 | } 2288 | .bi-grid-1x2-fill::before { 2289 | content: '\f3f3'; 2290 | } 2291 | .bi-grid-1x2::before { 2292 | content: '\f3f4'; 2293 | } 2294 | .bi-grid-3x2-gap-fill::before { 2295 | content: '\f3f5'; 2296 | } 2297 | .bi-grid-3x2-gap::before { 2298 | content: '\f3f6'; 2299 | } 2300 | .bi-grid-3x2::before { 2301 | content: '\f3f7'; 2302 | } 2303 | .bi-grid-3x3-gap-fill::before { 2304 | content: '\f3f8'; 2305 | } 2306 | .bi-grid-3x3-gap::before { 2307 | content: '\f3f9'; 2308 | } 2309 | .bi-grid-3x3::before { 2310 | content: '\f3fa'; 2311 | } 2312 | .bi-grid-fill::before { 2313 | content: '\f3fb'; 2314 | } 2315 | .bi-grid::before { 2316 | content: '\f3fc'; 2317 | } 2318 | .bi-grip-horizontal::before { 2319 | content: '\f3fd'; 2320 | } 2321 | .bi-grip-vertical::before { 2322 | content: '\f3fe'; 2323 | } 2324 | .bi-hammer::before { 2325 | content: '\f3ff'; 2326 | } 2327 | .bi-hand-index-fill::before { 2328 | content: '\f400'; 2329 | } 2330 | .bi-hand-index-thumb-fill::before { 2331 | content: '\f401'; 2332 | } 2333 | .bi-hand-index-thumb::before { 2334 | content: '\f402'; 2335 | } 2336 | .bi-hand-index::before { 2337 | content: '\f403'; 2338 | } 2339 | .bi-hand-thumbs-down-fill::before { 2340 | content: '\f404'; 2341 | } 2342 | .bi-hand-thumbs-down::before { 2343 | content: '\f405'; 2344 | } 2345 | .bi-hand-thumbs-up-fill::before { 2346 | content: '\f406'; 2347 | } 2348 | .bi-hand-thumbs-up::before { 2349 | content: '\f407'; 2350 | } 2351 | .bi-handbag-fill::before { 2352 | content: '\f408'; 2353 | } 2354 | .bi-handbag::before { 2355 | content: '\f409'; 2356 | } 2357 | .bi-hash::before { 2358 | content: '\f40a'; 2359 | } 2360 | .bi-hdd-fill::before { 2361 | content: '\f40b'; 2362 | } 2363 | .bi-hdd-network-fill::before { 2364 | content: '\f40c'; 2365 | } 2366 | .bi-hdd-network::before { 2367 | content: '\f40d'; 2368 | } 2369 | .bi-hdd-rack-fill::before { 2370 | content: '\f40e'; 2371 | } 2372 | .bi-hdd-rack::before { 2373 | content: '\f40f'; 2374 | } 2375 | .bi-hdd-stack-fill::before { 2376 | content: '\f410'; 2377 | } 2378 | .bi-hdd-stack::before { 2379 | content: '\f411'; 2380 | } 2381 | .bi-hdd::before { 2382 | content: '\f412'; 2383 | } 2384 | .bi-headphones::before { 2385 | content: '\f413'; 2386 | } 2387 | .bi-headset::before { 2388 | content: '\f414'; 2389 | } 2390 | .bi-heart-fill::before { 2391 | content: '\f415'; 2392 | } 2393 | .bi-heart-half::before { 2394 | content: '\f416'; 2395 | } 2396 | .bi-heart::before { 2397 | content: '\f417'; 2398 | } 2399 | .bi-heptagon-fill::before { 2400 | content: '\f418'; 2401 | } 2402 | .bi-heptagon-half::before { 2403 | content: '\f419'; 2404 | } 2405 | .bi-heptagon::before { 2406 | content: '\f41a'; 2407 | } 2408 | .bi-hexagon-fill::before { 2409 | content: '\f41b'; 2410 | } 2411 | .bi-hexagon-half::before { 2412 | content: '\f41c'; 2413 | } 2414 | .bi-hexagon::before { 2415 | content: '\f41d'; 2416 | } 2417 | .bi-hourglass-bottom::before { 2418 | content: '\f41e'; 2419 | } 2420 | .bi-hourglass-split::before { 2421 | content: '\f41f'; 2422 | } 2423 | .bi-hourglass-top::before { 2424 | content: '\f420'; 2425 | } 2426 | .bi-hourglass::before { 2427 | content: '\f421'; 2428 | } 2429 | .bi-house-door-fill::before { 2430 | content: '\f422'; 2431 | } 2432 | .bi-house-door::before { 2433 | content: '\f423'; 2434 | } 2435 | .bi-house-fill::before { 2436 | content: '\f424'; 2437 | } 2438 | .bi-house::before { 2439 | content: '\f425'; 2440 | } 2441 | .bi-hr::before { 2442 | content: '\f426'; 2443 | } 2444 | .bi-hurricane::before { 2445 | content: '\f427'; 2446 | } 2447 | .bi-image-alt::before { 2448 | content: '\f428'; 2449 | } 2450 | .bi-image-fill::before { 2451 | content: '\f429'; 2452 | } 2453 | .bi-image::before { 2454 | content: '\f42a'; 2455 | } 2456 | .bi-images::before { 2457 | content: '\f42b'; 2458 | } 2459 | .bi-inbox-fill::before { 2460 | content: '\f42c'; 2461 | } 2462 | .bi-inbox::before { 2463 | content: '\f42d'; 2464 | } 2465 | .bi-inboxes-fill::before { 2466 | content: '\f42e'; 2467 | } 2468 | .bi-inboxes::before { 2469 | content: '\f42f'; 2470 | } 2471 | .bi-info-circle-fill::before { 2472 | content: '\f430'; 2473 | } 2474 | .bi-info-circle::before { 2475 | content: '\f431'; 2476 | } 2477 | .bi-info-square-fill::before { 2478 | content: '\f432'; 2479 | } 2480 | .bi-info-square::before { 2481 | content: '\f433'; 2482 | } 2483 | .bi-info::before { 2484 | content: '\f434'; 2485 | } 2486 | .bi-input-cursor-text::before { 2487 | content: '\f435'; 2488 | } 2489 | .bi-input-cursor::before { 2490 | content: '\f436'; 2491 | } 2492 | .bi-instagram::before { 2493 | content: '\f437'; 2494 | } 2495 | .bi-intersect::before { 2496 | content: '\f438'; 2497 | } 2498 | .bi-journal-album::before { 2499 | content: '\f439'; 2500 | } 2501 | .bi-journal-arrow-down::before { 2502 | content: '\f43a'; 2503 | } 2504 | .bi-journal-arrow-up::before { 2505 | content: '\f43b'; 2506 | } 2507 | .bi-journal-bookmark-fill::before { 2508 | content: '\f43c'; 2509 | } 2510 | .bi-journal-bookmark::before { 2511 | content: '\f43d'; 2512 | } 2513 | .bi-journal-check::before { 2514 | content: '\f43e'; 2515 | } 2516 | .bi-journal-code::before { 2517 | content: '\f43f'; 2518 | } 2519 | .bi-journal-medical::before { 2520 | content: '\f440'; 2521 | } 2522 | .bi-journal-minus::before { 2523 | content: '\f441'; 2524 | } 2525 | .bi-journal-plus::before { 2526 | content: '\f442'; 2527 | } 2528 | .bi-journal-richtext::before { 2529 | content: '\f443'; 2530 | } 2531 | .bi-journal-text::before { 2532 | content: '\f444'; 2533 | } 2534 | .bi-journal-x::before { 2535 | content: '\f445'; 2536 | } 2537 | .bi-journal::before { 2538 | content: '\f446'; 2539 | } 2540 | .bi-journals::before { 2541 | content: '\f447'; 2542 | } 2543 | .bi-joystick::before { 2544 | content: '\f448'; 2545 | } 2546 | .bi-justify-left::before { 2547 | content: '\f449'; 2548 | } 2549 | .bi-justify-right::before { 2550 | content: '\f44a'; 2551 | } 2552 | .bi-justify::before { 2553 | content: '\f44b'; 2554 | } 2555 | .bi-kanban-fill::before { 2556 | content: '\f44c'; 2557 | } 2558 | .bi-kanban::before { 2559 | content: '\f44d'; 2560 | } 2561 | .bi-key-fill::before { 2562 | content: '\f44e'; 2563 | } 2564 | .bi-key::before { 2565 | content: '\f44f'; 2566 | } 2567 | .bi-keyboard-fill::before { 2568 | content: '\f450'; 2569 | } 2570 | .bi-keyboard::before { 2571 | content: '\f451'; 2572 | } 2573 | .bi-ladder::before { 2574 | content: '\f452'; 2575 | } 2576 | .bi-lamp-fill::before { 2577 | content: '\f453'; 2578 | } 2579 | .bi-lamp::before { 2580 | content: '\f454'; 2581 | } 2582 | .bi-laptop-fill::before { 2583 | content: '\f455'; 2584 | } 2585 | .bi-laptop::before { 2586 | content: '\f456'; 2587 | } 2588 | .bi-layer-backward::before { 2589 | content: '\f457'; 2590 | } 2591 | .bi-layer-forward::before { 2592 | content: '\f458'; 2593 | } 2594 | .bi-layers-fill::before { 2595 | content: '\f459'; 2596 | } 2597 | .bi-layers-half::before { 2598 | content: '\f45a'; 2599 | } 2600 | .bi-layers::before { 2601 | content: '\f45b'; 2602 | } 2603 | .bi-layout-sidebar-inset-reverse::before { 2604 | content: '\f45c'; 2605 | } 2606 | .bi-layout-sidebar-inset::before { 2607 | content: '\f45d'; 2608 | } 2609 | .bi-layout-sidebar-reverse::before { 2610 | content: '\f45e'; 2611 | } 2612 | .bi-layout-sidebar::before { 2613 | content: '\f45f'; 2614 | } 2615 | .bi-layout-split::before { 2616 | content: '\f460'; 2617 | } 2618 | .bi-layout-text-sidebar-reverse::before { 2619 | content: '\f461'; 2620 | } 2621 | .bi-layout-text-sidebar::before { 2622 | content: '\f462'; 2623 | } 2624 | .bi-layout-text-window-reverse::before { 2625 | content: '\f463'; 2626 | } 2627 | .bi-layout-text-window::before { 2628 | content: '\f464'; 2629 | } 2630 | .bi-layout-three-columns::before { 2631 | content: '\f465'; 2632 | } 2633 | .bi-layout-wtf::before { 2634 | content: '\f466'; 2635 | } 2636 | .bi-life-preserver::before { 2637 | content: '\f467'; 2638 | } 2639 | .bi-lightbulb-fill::before { 2640 | content: '\f468'; 2641 | } 2642 | .bi-lightbulb-off-fill::before { 2643 | content: '\f469'; 2644 | } 2645 | .bi-lightbulb-off::before { 2646 | content: '\f46a'; 2647 | } 2648 | .bi-lightbulb::before { 2649 | content: '\f46b'; 2650 | } 2651 | .bi-lightning-charge-fill::before { 2652 | content: '\f46c'; 2653 | } 2654 | .bi-lightning-charge::before { 2655 | content: '\f46d'; 2656 | } 2657 | .bi-lightning-fill::before { 2658 | content: '\f46e'; 2659 | } 2660 | .bi-lightning::before { 2661 | content: '\f46f'; 2662 | } 2663 | .bi-link-45deg::before { 2664 | content: '\f470'; 2665 | } 2666 | .bi-link::before { 2667 | content: '\f471'; 2668 | } 2669 | .bi-linkedin::before { 2670 | content: '\f472'; 2671 | } 2672 | .bi-list-check::before { 2673 | content: '\f473'; 2674 | } 2675 | .bi-list-nested::before { 2676 | content: '\f474'; 2677 | } 2678 | .bi-list-ol::before { 2679 | content: '\f475'; 2680 | } 2681 | .bi-list-stars::before { 2682 | content: '\f476'; 2683 | } 2684 | .bi-list-task::before { 2685 | content: '\f477'; 2686 | } 2687 | .bi-list-ul::before { 2688 | content: '\f478'; 2689 | } 2690 | .bi-list::before { 2691 | content: '\f479'; 2692 | } 2693 | .bi-lock-fill::before { 2694 | content: '\f47a'; 2695 | } 2696 | .bi-lock::before { 2697 | content: '\f47b'; 2698 | } 2699 | .bi-mailbox::before { 2700 | content: '\f47c'; 2701 | } 2702 | .bi-mailbox2::before { 2703 | content: '\f47d'; 2704 | } 2705 | .bi-map-fill::before { 2706 | content: '\f47e'; 2707 | } 2708 | .bi-map::before { 2709 | content: '\f47f'; 2710 | } 2711 | .bi-markdown-fill::before { 2712 | content: '\f480'; 2713 | } 2714 | .bi-markdown::before { 2715 | content: '\f481'; 2716 | } 2717 | .bi-mask::before { 2718 | content: '\f482'; 2719 | } 2720 | .bi-megaphone-fill::before { 2721 | content: '\f483'; 2722 | } 2723 | .bi-megaphone::before { 2724 | content: '\f484'; 2725 | } 2726 | .bi-menu-app-fill::before { 2727 | content: '\f485'; 2728 | } 2729 | .bi-menu-app::before { 2730 | content: '\f486'; 2731 | } 2732 | .bi-menu-button-fill::before { 2733 | content: '\f487'; 2734 | } 2735 | .bi-menu-button-wide-fill::before { 2736 | content: '\f488'; 2737 | } 2738 | .bi-menu-button-wide::before { 2739 | content: '\f489'; 2740 | } 2741 | .bi-menu-button::before { 2742 | content: '\f48a'; 2743 | } 2744 | .bi-menu-down::before { 2745 | content: '\f48b'; 2746 | } 2747 | .bi-menu-up::before { 2748 | content: '\f48c'; 2749 | } 2750 | .bi-mic-fill::before { 2751 | content: '\f48d'; 2752 | } 2753 | .bi-mic-mute-fill::before { 2754 | content: '\f48e'; 2755 | } 2756 | .bi-mic-mute::before { 2757 | content: '\f48f'; 2758 | } 2759 | .bi-mic::before { 2760 | content: '\f490'; 2761 | } 2762 | .bi-minecart-loaded::before { 2763 | content: '\f491'; 2764 | } 2765 | .bi-minecart::before { 2766 | content: '\f492'; 2767 | } 2768 | .bi-moisture::before { 2769 | content: '\f493'; 2770 | } 2771 | .bi-moon-fill::before { 2772 | content: '\f494'; 2773 | } 2774 | .bi-moon-stars-fill::before { 2775 | content: '\f495'; 2776 | } 2777 | .bi-moon-stars::before { 2778 | content: '\f496'; 2779 | } 2780 | .bi-moon::before { 2781 | content: '\f497'; 2782 | } 2783 | .bi-mouse-fill::before { 2784 | content: '\f498'; 2785 | } 2786 | .bi-mouse::before { 2787 | content: '\f499'; 2788 | } 2789 | .bi-mouse2-fill::before { 2790 | content: '\f49a'; 2791 | } 2792 | .bi-mouse2::before { 2793 | content: '\f49b'; 2794 | } 2795 | .bi-mouse3-fill::before { 2796 | content: '\f49c'; 2797 | } 2798 | .bi-mouse3::before { 2799 | content: '\f49d'; 2800 | } 2801 | .bi-music-note-beamed::before { 2802 | content: '\f49e'; 2803 | } 2804 | .bi-music-note-list::before { 2805 | content: '\f49f'; 2806 | } 2807 | .bi-music-note::before { 2808 | content: '\f4a0'; 2809 | } 2810 | .bi-music-player-fill::before { 2811 | content: '\f4a1'; 2812 | } 2813 | .bi-music-player::before { 2814 | content: '\f4a2'; 2815 | } 2816 | .bi-newspaper::before { 2817 | content: '\f4a3'; 2818 | } 2819 | .bi-node-minus-fill::before { 2820 | content: '\f4a4'; 2821 | } 2822 | .bi-node-minus::before { 2823 | content: '\f4a5'; 2824 | } 2825 | .bi-node-plus-fill::before { 2826 | content: '\f4a6'; 2827 | } 2828 | .bi-node-plus::before { 2829 | content: '\f4a7'; 2830 | } 2831 | .bi-nut-fill::before { 2832 | content: '\f4a8'; 2833 | } 2834 | .bi-nut::before { 2835 | content: '\f4a9'; 2836 | } 2837 | .bi-octagon-fill::before { 2838 | content: '\f4aa'; 2839 | } 2840 | .bi-octagon-half::before { 2841 | content: '\f4ab'; 2842 | } 2843 | .bi-octagon::before { 2844 | content: '\f4ac'; 2845 | } 2846 | .bi-option::before { 2847 | content: '\f4ad'; 2848 | } 2849 | .bi-outlet::before { 2850 | content: '\f4ae'; 2851 | } 2852 | .bi-paint-bucket::before { 2853 | content: '\f4af'; 2854 | } 2855 | .bi-palette-fill::before { 2856 | content: '\f4b0'; 2857 | } 2858 | .bi-palette::before { 2859 | content: '\f4b1'; 2860 | } 2861 | .bi-palette2::before { 2862 | content: '\f4b2'; 2863 | } 2864 | .bi-paperclip::before { 2865 | content: '\f4b3'; 2866 | } 2867 | .bi-paragraph::before { 2868 | content: '\f4b4'; 2869 | } 2870 | .bi-patch-check-fill::before { 2871 | content: '\f4b5'; 2872 | } 2873 | .bi-patch-check::before { 2874 | content: '\f4b6'; 2875 | } 2876 | .bi-patch-exclamation-fill::before { 2877 | content: '\f4b7'; 2878 | } 2879 | .bi-patch-exclamation::before { 2880 | content: '\f4b8'; 2881 | } 2882 | .bi-patch-minus-fill::before { 2883 | content: '\f4b9'; 2884 | } 2885 | .bi-patch-minus::before { 2886 | content: '\f4ba'; 2887 | } 2888 | .bi-patch-plus-fill::before { 2889 | content: '\f4bb'; 2890 | } 2891 | .bi-patch-plus::before { 2892 | content: '\f4bc'; 2893 | } 2894 | .bi-patch-question-fill::before { 2895 | content: '\f4bd'; 2896 | } 2897 | .bi-patch-question::before { 2898 | content: '\f4be'; 2899 | } 2900 | .bi-pause-btn-fill::before { 2901 | content: '\f4bf'; 2902 | } 2903 | .bi-pause-btn::before { 2904 | content: '\f4c0'; 2905 | } 2906 | .bi-pause-circle-fill::before { 2907 | content: '\f4c1'; 2908 | } 2909 | .bi-pause-circle::before { 2910 | content: '\f4c2'; 2911 | } 2912 | .bi-pause-fill::before { 2913 | content: '\f4c3'; 2914 | } 2915 | .bi-pause::before { 2916 | content: '\f4c4'; 2917 | } 2918 | .bi-peace-fill::before { 2919 | content: '\f4c5'; 2920 | } 2921 | .bi-peace::before { 2922 | content: '\f4c6'; 2923 | } 2924 | .bi-pen-fill::before { 2925 | content: '\f4c7'; 2926 | } 2927 | .bi-pen::before { 2928 | content: '\f4c8'; 2929 | } 2930 | .bi-pencil-fill::before { 2931 | content: '\f4c9'; 2932 | } 2933 | .bi-pencil-square::before { 2934 | content: '\f4ca'; 2935 | } 2936 | .bi-pencil::before { 2937 | content: '\f4cb'; 2938 | } 2939 | .bi-pentagon-fill::before { 2940 | content: '\f4cc'; 2941 | } 2942 | .bi-pentagon-half::before { 2943 | content: '\f4cd'; 2944 | } 2945 | .bi-pentagon::before { 2946 | content: '\f4ce'; 2947 | } 2948 | .bi-people-fill::before { 2949 | content: '\f4cf'; 2950 | } 2951 | .bi-people::before { 2952 | content: '\f4d0'; 2953 | } 2954 | .bi-percent::before { 2955 | content: '\f4d1'; 2956 | } 2957 | .bi-person-badge-fill::before { 2958 | content: '\f4d2'; 2959 | } 2960 | .bi-person-badge::before { 2961 | content: '\f4d3'; 2962 | } 2963 | .bi-person-bounding-box::before { 2964 | content: '\f4d4'; 2965 | } 2966 | .bi-person-check-fill::before { 2967 | content: '\f4d5'; 2968 | } 2969 | .bi-person-check::before { 2970 | content: '\f4d6'; 2971 | } 2972 | .bi-person-circle::before { 2973 | content: '\f4d7'; 2974 | } 2975 | .bi-person-dash-fill::before { 2976 | content: '\f4d8'; 2977 | } 2978 | .bi-person-dash::before { 2979 | content: '\f4d9'; 2980 | } 2981 | .bi-person-fill::before { 2982 | content: '\f4da'; 2983 | } 2984 | .bi-person-lines-fill::before { 2985 | content: '\f4db'; 2986 | } 2987 | .bi-person-plus-fill::before { 2988 | content: '\f4dc'; 2989 | } 2990 | .bi-person-plus::before { 2991 | content: '\f4dd'; 2992 | } 2993 | .bi-person-square::before { 2994 | content: '\f4de'; 2995 | } 2996 | .bi-person-x-fill::before { 2997 | content: '\f4df'; 2998 | } 2999 | .bi-person-x::before { 3000 | content: '\f4e0'; 3001 | } 3002 | .bi-person::before { 3003 | content: '\f4e1'; 3004 | } 3005 | .bi-phone-fill::before { 3006 | content: '\f4e2'; 3007 | } 3008 | .bi-phone-landscape-fill::before { 3009 | content: '\f4e3'; 3010 | } 3011 | .bi-phone-landscape::before { 3012 | content: '\f4e4'; 3013 | } 3014 | .bi-phone-vibrate-fill::before { 3015 | content: '\f4e5'; 3016 | } 3017 | .bi-phone-vibrate::before { 3018 | content: '\f4e6'; 3019 | } 3020 | .bi-phone::before { 3021 | content: '\f4e7'; 3022 | } 3023 | .bi-pie-chart-fill::before { 3024 | content: '\f4e8'; 3025 | } 3026 | .bi-pie-chart::before { 3027 | content: '\f4e9'; 3028 | } 3029 | .bi-pin-angle-fill::before { 3030 | content: '\f4ea'; 3031 | } 3032 | .bi-pin-angle::before { 3033 | content: '\f4eb'; 3034 | } 3035 | .bi-pin-fill::before { 3036 | content: '\f4ec'; 3037 | } 3038 | .bi-pin::before { 3039 | content: '\f4ed'; 3040 | } 3041 | .bi-pip-fill::before { 3042 | content: '\f4ee'; 3043 | } 3044 | .bi-pip::before { 3045 | content: '\f4ef'; 3046 | } 3047 | .bi-play-btn-fill::before { 3048 | content: '\f4f0'; 3049 | } 3050 | .bi-play-btn::before { 3051 | content: '\f4f1'; 3052 | } 3053 | .bi-play-circle-fill::before { 3054 | content: '\f4f2'; 3055 | } 3056 | .bi-play-circle::before { 3057 | content: '\f4f3'; 3058 | } 3059 | .bi-play-fill::before { 3060 | content: '\f4f4'; 3061 | } 3062 | .bi-play::before { 3063 | content: '\f4f5'; 3064 | } 3065 | .bi-plug-fill::before { 3066 | content: '\f4f6'; 3067 | } 3068 | .bi-plug::before { 3069 | content: '\f4f7'; 3070 | } 3071 | .bi-plus-circle-dotted::before { 3072 | content: '\f4f8'; 3073 | } 3074 | .bi-plus-circle-fill::before { 3075 | content: '\f4f9'; 3076 | } 3077 | .bi-plus-circle::before { 3078 | content: '\f4fa'; 3079 | } 3080 | .bi-plus-square-dotted::before { 3081 | content: '\f4fb'; 3082 | } 3083 | .bi-plus-square-fill::before { 3084 | content: '\f4fc'; 3085 | } 3086 | .bi-plus-square::before { 3087 | content: '\f4fd'; 3088 | } 3089 | .bi-plus::before { 3090 | content: '\f4fe'; 3091 | } 3092 | .bi-power::before { 3093 | content: '\f4ff'; 3094 | } 3095 | .bi-printer-fill::before { 3096 | content: '\f500'; 3097 | } 3098 | .bi-printer::before { 3099 | content: '\f501'; 3100 | } 3101 | .bi-puzzle-fill::before { 3102 | content: '\f502'; 3103 | } 3104 | .bi-puzzle::before { 3105 | content: '\f503'; 3106 | } 3107 | .bi-question-circle-fill::before { 3108 | content: '\f504'; 3109 | } 3110 | .bi-question-circle::before { 3111 | content: '\f505'; 3112 | } 3113 | .bi-question-diamond-fill::before { 3114 | content: '\f506'; 3115 | } 3116 | .bi-question-diamond::before { 3117 | content: '\f507'; 3118 | } 3119 | .bi-question-octagon-fill::before { 3120 | content: '\f508'; 3121 | } 3122 | .bi-question-octagon::before { 3123 | content: '\f509'; 3124 | } 3125 | .bi-question-square-fill::before { 3126 | content: '\f50a'; 3127 | } 3128 | .bi-question-square::before { 3129 | content: '\f50b'; 3130 | } 3131 | .bi-question::before { 3132 | content: '\f50c'; 3133 | } 3134 | .bi-rainbow::before { 3135 | content: '\f50d'; 3136 | } 3137 | .bi-receipt-cutoff::before { 3138 | content: '\f50e'; 3139 | } 3140 | .bi-receipt::before { 3141 | content: '\f50f'; 3142 | } 3143 | .bi-reception-0::before { 3144 | content: '\f510'; 3145 | } 3146 | .bi-reception-1::before { 3147 | content: '\f511'; 3148 | } 3149 | .bi-reception-2::before { 3150 | content: '\f512'; 3151 | } 3152 | .bi-reception-3::before { 3153 | content: '\f513'; 3154 | } 3155 | .bi-reception-4::before { 3156 | content: '\f514'; 3157 | } 3158 | .bi-record-btn-fill::before { 3159 | content: '\f515'; 3160 | } 3161 | .bi-record-btn::before { 3162 | content: '\f516'; 3163 | } 3164 | .bi-record-circle-fill::before { 3165 | content: '\f517'; 3166 | } 3167 | .bi-record-circle::before { 3168 | content: '\f518'; 3169 | } 3170 | .bi-record-fill::before { 3171 | content: '\f519'; 3172 | } 3173 | .bi-record::before { 3174 | content: '\f51a'; 3175 | } 3176 | .bi-record2-fill::before { 3177 | content: '\f51b'; 3178 | } 3179 | .bi-record2::before { 3180 | content: '\f51c'; 3181 | } 3182 | .bi-reply-all-fill::before { 3183 | content: '\f51d'; 3184 | } 3185 | .bi-reply-all::before { 3186 | content: '\f51e'; 3187 | } 3188 | .bi-reply-fill::before { 3189 | content: '\f51f'; 3190 | } 3191 | .bi-reply::before { 3192 | content: '\f520'; 3193 | } 3194 | .bi-rss-fill::before { 3195 | content: '\f521'; 3196 | } 3197 | .bi-rss::before { 3198 | content: '\f522'; 3199 | } 3200 | .bi-rulers::before { 3201 | content: '\f523'; 3202 | } 3203 | .bi-save-fill::before { 3204 | content: '\f524'; 3205 | } 3206 | .bi-save::before { 3207 | content: '\f525'; 3208 | } 3209 | .bi-save2-fill::before { 3210 | content: '\f526'; 3211 | } 3212 | .bi-save2::before { 3213 | content: '\f527'; 3214 | } 3215 | .bi-scissors::before { 3216 | content: '\f528'; 3217 | } 3218 | .bi-screwdriver::before { 3219 | content: '\f529'; 3220 | } 3221 | .bi-search::before { 3222 | content: '\f52a'; 3223 | } 3224 | .bi-segmented-nav::before { 3225 | content: '\f52b'; 3226 | } 3227 | .bi-server::before { 3228 | content: '\f52c'; 3229 | } 3230 | .bi-share-fill::before { 3231 | content: '\f52d'; 3232 | } 3233 | .bi-share::before { 3234 | content: '\f52e'; 3235 | } 3236 | .bi-shield-check::before { 3237 | content: '\f52f'; 3238 | } 3239 | .bi-shield-exclamation::before { 3240 | content: '\f530'; 3241 | } 3242 | .bi-shield-fill-check::before { 3243 | content: '\f531'; 3244 | } 3245 | .bi-shield-fill-exclamation::before { 3246 | content: '\f532'; 3247 | } 3248 | .bi-shield-fill-minus::before { 3249 | content: '\f533'; 3250 | } 3251 | .bi-shield-fill-plus::before { 3252 | content: '\f534'; 3253 | } 3254 | .bi-shield-fill-x::before { 3255 | content: '\f535'; 3256 | } 3257 | .bi-shield-fill::before { 3258 | content: '\f536'; 3259 | } 3260 | .bi-shield-lock-fill::before { 3261 | content: '\f537'; 3262 | } 3263 | .bi-shield-lock::before { 3264 | content: '\f538'; 3265 | } 3266 | .bi-shield-minus::before { 3267 | content: '\f539'; 3268 | } 3269 | .bi-shield-plus::before { 3270 | content: '\f53a'; 3271 | } 3272 | .bi-shield-shaded::before { 3273 | content: '\f53b'; 3274 | } 3275 | .bi-shield-slash-fill::before { 3276 | content: '\f53c'; 3277 | } 3278 | .bi-shield-slash::before { 3279 | content: '\f53d'; 3280 | } 3281 | .bi-shield-x::before { 3282 | content: '\f53e'; 3283 | } 3284 | .bi-shield::before { 3285 | content: '\f53f'; 3286 | } 3287 | .bi-shift-fill::before { 3288 | content: '\f540'; 3289 | } 3290 | .bi-shift::before { 3291 | content: '\f541'; 3292 | } 3293 | .bi-shop-window::before { 3294 | content: '\f542'; 3295 | } 3296 | .bi-shop::before { 3297 | content: '\f543'; 3298 | } 3299 | .bi-shuffle::before { 3300 | content: '\f544'; 3301 | } 3302 | .bi-signpost-2-fill::before { 3303 | content: '\f545'; 3304 | } 3305 | .bi-signpost-2::before { 3306 | content: '\f546'; 3307 | } 3308 | .bi-signpost-fill::before { 3309 | content: '\f547'; 3310 | } 3311 | .bi-signpost-split-fill::before { 3312 | content: '\f548'; 3313 | } 3314 | .bi-signpost-split::before { 3315 | content: '\f549'; 3316 | } 3317 | .bi-signpost::before { 3318 | content: '\f54a'; 3319 | } 3320 | .bi-sim-fill::before { 3321 | content: '\f54b'; 3322 | } 3323 | .bi-sim::before { 3324 | content: '\f54c'; 3325 | } 3326 | .bi-skip-backward-btn-fill::before { 3327 | content: '\f54d'; 3328 | } 3329 | .bi-skip-backward-btn::before { 3330 | content: '\f54e'; 3331 | } 3332 | .bi-skip-backward-circle-fill::before { 3333 | content: '\f54f'; 3334 | } 3335 | .bi-skip-backward-circle::before { 3336 | content: '\f550'; 3337 | } 3338 | .bi-skip-backward-fill::before { 3339 | content: '\f551'; 3340 | } 3341 | .bi-skip-backward::before { 3342 | content: '\f552'; 3343 | } 3344 | .bi-skip-end-btn-fill::before { 3345 | content: '\f553'; 3346 | } 3347 | .bi-skip-end-btn::before { 3348 | content: '\f554'; 3349 | } 3350 | .bi-skip-end-circle-fill::before { 3351 | content: '\f555'; 3352 | } 3353 | .bi-skip-end-circle::before { 3354 | content: '\f556'; 3355 | } 3356 | .bi-skip-end-fill::before { 3357 | content: '\f557'; 3358 | } 3359 | .bi-skip-end::before { 3360 | content: '\f558'; 3361 | } 3362 | .bi-skip-forward-btn-fill::before { 3363 | content: '\f559'; 3364 | } 3365 | .bi-skip-forward-btn::before { 3366 | content: '\f55a'; 3367 | } 3368 | .bi-skip-forward-circle-fill::before { 3369 | content: '\f55b'; 3370 | } 3371 | .bi-skip-forward-circle::before { 3372 | content: '\f55c'; 3373 | } 3374 | .bi-skip-forward-fill::before { 3375 | content: '\f55d'; 3376 | } 3377 | .bi-skip-forward::before { 3378 | content: '\f55e'; 3379 | } 3380 | .bi-skip-start-btn-fill::before { 3381 | content: '\f55f'; 3382 | } 3383 | .bi-skip-start-btn::before { 3384 | content: '\f560'; 3385 | } 3386 | .bi-skip-start-circle-fill::before { 3387 | content: '\f561'; 3388 | } 3389 | .bi-skip-start-circle::before { 3390 | content: '\f562'; 3391 | } 3392 | .bi-skip-start-fill::before { 3393 | content: '\f563'; 3394 | } 3395 | .bi-skip-start::before { 3396 | content: '\f564'; 3397 | } 3398 | .bi-slack::before { 3399 | content: '\f565'; 3400 | } 3401 | .bi-slash-circle-fill::before { 3402 | content: '\f566'; 3403 | } 3404 | .bi-slash-circle::before { 3405 | content: '\f567'; 3406 | } 3407 | .bi-slash-square-fill::before { 3408 | content: '\f568'; 3409 | } 3410 | .bi-slash-square::before { 3411 | content: '\f569'; 3412 | } 3413 | .bi-slash::before { 3414 | content: '\f56a'; 3415 | } 3416 | .bi-sliders::before { 3417 | content: '\f56b'; 3418 | } 3419 | .bi-smartwatch::before { 3420 | content: '\f56c'; 3421 | } 3422 | .bi-snow::before { 3423 | content: '\f56d'; 3424 | } 3425 | .bi-snow2::before { 3426 | content: '\f56e'; 3427 | } 3428 | .bi-snow3::before { 3429 | content: '\f56f'; 3430 | } 3431 | .bi-sort-alpha-down-alt::before { 3432 | content: '\f570'; 3433 | } 3434 | .bi-sort-alpha-down::before { 3435 | content: '\f571'; 3436 | } 3437 | .bi-sort-alpha-up-alt::before { 3438 | content: '\f572'; 3439 | } 3440 | .bi-sort-alpha-up::before { 3441 | content: '\f573'; 3442 | } 3443 | .bi-sort-down-alt::before { 3444 | content: '\f574'; 3445 | } 3446 | .bi-sort-down::before { 3447 | content: '\f575'; 3448 | } 3449 | .bi-sort-numeric-down-alt::before { 3450 | content: '\f576'; 3451 | } 3452 | .bi-sort-numeric-down::before { 3453 | content: '\f577'; 3454 | } 3455 | .bi-sort-numeric-up-alt::before { 3456 | content: '\f578'; 3457 | } 3458 | .bi-sort-numeric-up::before { 3459 | content: '\f579'; 3460 | } 3461 | .bi-sort-up-alt::before { 3462 | content: '\f57a'; 3463 | } 3464 | .bi-sort-up::before { 3465 | content: '\f57b'; 3466 | } 3467 | .bi-soundwave::before { 3468 | content: '\f57c'; 3469 | } 3470 | .bi-speaker-fill::before { 3471 | content: '\f57d'; 3472 | } 3473 | .bi-speaker::before { 3474 | content: '\f57e'; 3475 | } 3476 | .bi-speedometer::before { 3477 | content: '\f57f'; 3478 | } 3479 | .bi-speedometer2::before { 3480 | content: '\f580'; 3481 | } 3482 | .bi-spellcheck::before { 3483 | content: '\f581'; 3484 | } 3485 | .bi-square-fill::before { 3486 | content: '\f582'; 3487 | } 3488 | .bi-square-half::before { 3489 | content: '\f583'; 3490 | } 3491 | .bi-square::before { 3492 | content: '\f584'; 3493 | } 3494 | .bi-stack::before { 3495 | content: '\f585'; 3496 | } 3497 | .bi-star-fill::before { 3498 | content: '\f586'; 3499 | } 3500 | .bi-star-half::before { 3501 | content: '\f587'; 3502 | } 3503 | .bi-star::before { 3504 | content: '\f588'; 3505 | } 3506 | .bi-stars::before { 3507 | content: '\f589'; 3508 | } 3509 | .bi-stickies-fill::before { 3510 | content: '\f58a'; 3511 | } 3512 | .bi-stickies::before { 3513 | content: '\f58b'; 3514 | } 3515 | .bi-sticky-fill::before { 3516 | content: '\f58c'; 3517 | } 3518 | .bi-sticky::before { 3519 | content: '\f58d'; 3520 | } 3521 | .bi-stop-btn-fill::before { 3522 | content: '\f58e'; 3523 | } 3524 | .bi-stop-btn::before { 3525 | content: '\f58f'; 3526 | } 3527 | .bi-stop-circle-fill::before { 3528 | content: '\f590'; 3529 | } 3530 | .bi-stop-circle::before { 3531 | content: '\f591'; 3532 | } 3533 | .bi-stop-fill::before { 3534 | content: '\f592'; 3535 | } 3536 | .bi-stop::before { 3537 | content: '\f593'; 3538 | } 3539 | .bi-stoplights-fill::before { 3540 | content: '\f594'; 3541 | } 3542 | .bi-stoplights::before { 3543 | content: '\f595'; 3544 | } 3545 | .bi-stopwatch-fill::before { 3546 | content: '\f596'; 3547 | } 3548 | .bi-stopwatch::before { 3549 | content: '\f597'; 3550 | } 3551 | .bi-subtract::before { 3552 | content: '\f598'; 3553 | } 3554 | .bi-suit-club-fill::before { 3555 | content: '\f599'; 3556 | } 3557 | .bi-suit-club::before { 3558 | content: '\f59a'; 3559 | } 3560 | .bi-suit-diamond-fill::before { 3561 | content: '\f59b'; 3562 | } 3563 | .bi-suit-diamond::before { 3564 | content: '\f59c'; 3565 | } 3566 | .bi-suit-heart-fill::before { 3567 | content: '\f59d'; 3568 | } 3569 | .bi-suit-heart::before { 3570 | content: '\f59e'; 3571 | } 3572 | .bi-suit-spade-fill::before { 3573 | content: '\f59f'; 3574 | } 3575 | .bi-suit-spade::before { 3576 | content: '\f5a0'; 3577 | } 3578 | .bi-sun-fill::before { 3579 | content: '\f5a1'; 3580 | } 3581 | .bi-sun::before { 3582 | content: '\f5a2'; 3583 | } 3584 | .bi-sunglasses::before { 3585 | content: '\f5a3'; 3586 | } 3587 | .bi-sunrise-fill::before { 3588 | content: '\f5a4'; 3589 | } 3590 | .bi-sunrise::before { 3591 | content: '\f5a5'; 3592 | } 3593 | .bi-sunset-fill::before { 3594 | content: '\f5a6'; 3595 | } 3596 | .bi-sunset::before { 3597 | content: '\f5a7'; 3598 | } 3599 | .bi-symmetry-horizontal::before { 3600 | content: '\f5a8'; 3601 | } 3602 | .bi-symmetry-vertical::before { 3603 | content: '\f5a9'; 3604 | } 3605 | .bi-table::before { 3606 | content: '\f5aa'; 3607 | } 3608 | .bi-tablet-fill::before { 3609 | content: '\f5ab'; 3610 | } 3611 | .bi-tablet-landscape-fill::before { 3612 | content: '\f5ac'; 3613 | } 3614 | .bi-tablet-landscape::before { 3615 | content: '\f5ad'; 3616 | } 3617 | .bi-tablet::before { 3618 | content: '\f5ae'; 3619 | } 3620 | .bi-tag-fill::before { 3621 | content: '\f5af'; 3622 | } 3623 | .bi-tag::before { 3624 | content: '\f5b0'; 3625 | } 3626 | .bi-tags-fill::before { 3627 | content: '\f5b1'; 3628 | } 3629 | .bi-tags::before { 3630 | content: '\f5b2'; 3631 | } 3632 | .bi-telegram::before { 3633 | content: '\f5b3'; 3634 | } 3635 | .bi-telephone-fill::before { 3636 | content: '\f5b4'; 3637 | } 3638 | .bi-telephone-forward-fill::before { 3639 | content: '\f5b5'; 3640 | } 3641 | .bi-telephone-forward::before { 3642 | content: '\f5b6'; 3643 | } 3644 | .bi-telephone-inbound-fill::before { 3645 | content: '\f5b7'; 3646 | } 3647 | .bi-telephone-inbound::before { 3648 | content: '\f5b8'; 3649 | } 3650 | .bi-telephone-minus-fill::before { 3651 | content: '\f5b9'; 3652 | } 3653 | .bi-telephone-minus::before { 3654 | content: '\f5ba'; 3655 | } 3656 | .bi-telephone-outbound-fill::before { 3657 | content: '\f5bb'; 3658 | } 3659 | .bi-telephone-outbound::before { 3660 | content: '\f5bc'; 3661 | } 3662 | .bi-telephone-plus-fill::before { 3663 | content: '\f5bd'; 3664 | } 3665 | .bi-telephone-plus::before { 3666 | content: '\f5be'; 3667 | } 3668 | .bi-telephone-x-fill::before { 3669 | content: '\f5bf'; 3670 | } 3671 | .bi-telephone-x::before { 3672 | content: '\f5c0'; 3673 | } 3674 | .bi-telephone::before { 3675 | content: '\f5c1'; 3676 | } 3677 | .bi-terminal-fill::before { 3678 | content: '\f5c2'; 3679 | } 3680 | .bi-terminal::before { 3681 | content: '\f5c3'; 3682 | } 3683 | .bi-text-center::before { 3684 | content: '\f5c4'; 3685 | } 3686 | .bi-text-indent-left::before { 3687 | content: '\f5c5'; 3688 | } 3689 | .bi-text-indent-right::before { 3690 | content: '\f5c6'; 3691 | } 3692 | .bi-text-left::before { 3693 | content: '\f5c7'; 3694 | } 3695 | .bi-text-paragraph::before { 3696 | content: '\f5c8'; 3697 | } 3698 | .bi-text-right::before { 3699 | content: '\f5c9'; 3700 | } 3701 | .bi-textarea-resize::before { 3702 | content: '\f5ca'; 3703 | } 3704 | .bi-textarea-t::before { 3705 | content: '\f5cb'; 3706 | } 3707 | .bi-textarea::before { 3708 | content: '\f5cc'; 3709 | } 3710 | .bi-thermometer-half::before { 3711 | content: '\f5cd'; 3712 | } 3713 | .bi-thermometer-high::before { 3714 | content: '\f5ce'; 3715 | } 3716 | .bi-thermometer-low::before { 3717 | content: '\f5cf'; 3718 | } 3719 | .bi-thermometer-snow::before { 3720 | content: '\f5d0'; 3721 | } 3722 | .bi-thermometer-sun::before { 3723 | content: '\f5d1'; 3724 | } 3725 | .bi-thermometer::before { 3726 | content: '\f5d2'; 3727 | } 3728 | .bi-three-dots-vertical::before { 3729 | content: '\f5d3'; 3730 | } 3731 | .bi-three-dots::before { 3732 | content: '\f5d4'; 3733 | } 3734 | .bi-toggle-off::before { 3735 | content: '\f5d5'; 3736 | } 3737 | .bi-toggle-on::before { 3738 | content: '\f5d6'; 3739 | } 3740 | .bi-toggle2-off::before { 3741 | content: '\f5d7'; 3742 | } 3743 | .bi-toggle2-on::before { 3744 | content: '\f5d8'; 3745 | } 3746 | .bi-toggles::before { 3747 | content: '\f5d9'; 3748 | } 3749 | .bi-toggles2::before { 3750 | content: '\f5da'; 3751 | } 3752 | .bi-tools::before { 3753 | content: '\f5db'; 3754 | } 3755 | .bi-tornado::before { 3756 | content: '\f5dc'; 3757 | } 3758 | .bi-trash-fill::before { 3759 | content: '\f5dd'; 3760 | } 3761 | .bi-trash::before { 3762 | content: '\f5de'; 3763 | } 3764 | .bi-trash2-fill::before { 3765 | content: '\f5df'; 3766 | } 3767 | .bi-trash2::before { 3768 | content: '\f5e0'; 3769 | } 3770 | .bi-tree-fill::before { 3771 | content: '\f5e1'; 3772 | } 3773 | .bi-tree::before { 3774 | content: '\f5e2'; 3775 | } 3776 | .bi-triangle-fill::before { 3777 | content: '\f5e3'; 3778 | } 3779 | .bi-triangle-half::before { 3780 | content: '\f5e4'; 3781 | } 3782 | .bi-triangle::before { 3783 | content: '\f5e5'; 3784 | } 3785 | .bi-trophy-fill::before { 3786 | content: '\f5e6'; 3787 | } 3788 | .bi-trophy::before { 3789 | content: '\f5e7'; 3790 | } 3791 | .bi-tropical-storm::before { 3792 | content: '\f5e8'; 3793 | } 3794 | .bi-truck-flatbed::before { 3795 | content: '\f5e9'; 3796 | } 3797 | .bi-truck::before { 3798 | content: '\f5ea'; 3799 | } 3800 | .bi-tsunami::before { 3801 | content: '\f5eb'; 3802 | } 3803 | .bi-tv-fill::before { 3804 | content: '\f5ec'; 3805 | } 3806 | .bi-tv::before { 3807 | content: '\f5ed'; 3808 | } 3809 | .bi-twitch::before { 3810 | content: '\f5ee'; 3811 | } 3812 | .bi-twitter::before { 3813 | content: '\f5ef'; 3814 | } 3815 | .bi-type-bold::before { 3816 | content: '\f5f0'; 3817 | } 3818 | .bi-type-h1::before { 3819 | content: '\f5f1'; 3820 | } 3821 | .bi-type-h2::before { 3822 | content: '\f5f2'; 3823 | } 3824 | .bi-type-h3::before { 3825 | content: '\f5f3'; 3826 | } 3827 | .bi-type-italic::before { 3828 | content: '\f5f4'; 3829 | } 3830 | .bi-type-strikethrough::before { 3831 | content: '\f5f5'; 3832 | } 3833 | .bi-type-underline::before { 3834 | content: '\f5f6'; 3835 | } 3836 | .bi-type::before { 3837 | content: '\f5f7'; 3838 | } 3839 | .bi-ui-checks-grid::before { 3840 | content: '\f5f8'; 3841 | } 3842 | .bi-ui-checks::before { 3843 | content: '\f5f9'; 3844 | } 3845 | .bi-ui-radios-grid::before { 3846 | content: '\f5fa'; 3847 | } 3848 | .bi-ui-radios::before { 3849 | content: '\f5fb'; 3850 | } 3851 | .bi-umbrella-fill::before { 3852 | content: '\f5fc'; 3853 | } 3854 | .bi-umbrella::before { 3855 | content: '\f5fd'; 3856 | } 3857 | .bi-union::before { 3858 | content: '\f5fe'; 3859 | } 3860 | .bi-unlock-fill::before { 3861 | content: '\f5ff'; 3862 | } 3863 | .bi-unlock::before { 3864 | content: '\f600'; 3865 | } 3866 | .bi-upc-scan::before { 3867 | content: '\f601'; 3868 | } 3869 | .bi-upc::before { 3870 | content: '\f602'; 3871 | } 3872 | .bi-upload::before { 3873 | content: '\f603'; 3874 | } 3875 | .bi-vector-pen::before { 3876 | content: '\f604'; 3877 | } 3878 | .bi-view-list::before { 3879 | content: '\f605'; 3880 | } 3881 | .bi-view-stacked::before { 3882 | content: '\f606'; 3883 | } 3884 | .bi-vinyl-fill::before { 3885 | content: '\f607'; 3886 | } 3887 | .bi-vinyl::before { 3888 | content: '\f608'; 3889 | } 3890 | .bi-voicemail::before { 3891 | content: '\f609'; 3892 | } 3893 | .bi-volume-down-fill::before { 3894 | content: '\f60a'; 3895 | } 3896 | .bi-volume-down::before { 3897 | content: '\f60b'; 3898 | } 3899 | .bi-volume-mute-fill::before { 3900 | content: '\f60c'; 3901 | } 3902 | .bi-volume-mute::before { 3903 | content: '\f60d'; 3904 | } 3905 | .bi-volume-off-fill::before { 3906 | content: '\f60e'; 3907 | } 3908 | .bi-volume-off::before { 3909 | content: '\f60f'; 3910 | } 3911 | .bi-volume-up-fill::before { 3912 | content: '\f610'; 3913 | } 3914 | .bi-volume-up::before { 3915 | content: '\f611'; 3916 | } 3917 | .bi-vr::before { 3918 | content: '\f612'; 3919 | } 3920 | .bi-wallet-fill::before { 3921 | content: '\f613'; 3922 | } 3923 | .bi-wallet::before { 3924 | content: '\f614'; 3925 | } 3926 | .bi-wallet2::before { 3927 | content: '\f615'; 3928 | } 3929 | .bi-watch::before { 3930 | content: '\f616'; 3931 | } 3932 | .bi-water::before { 3933 | content: '\f617'; 3934 | } 3935 | .bi-whatsapp::before { 3936 | content: '\f618'; 3937 | } 3938 | .bi-wifi-1::before { 3939 | content: '\f619'; 3940 | } 3941 | .bi-wifi-2::before { 3942 | content: '\f61a'; 3943 | } 3944 | .bi-wifi-off::before { 3945 | content: '\f61b'; 3946 | } 3947 | .bi-wifi::before { 3948 | content: '\f61c'; 3949 | } 3950 | .bi-wind::before { 3951 | content: '\f61d'; 3952 | } 3953 | .bi-window-dock::before { 3954 | content: '\f61e'; 3955 | } 3956 | .bi-window-sidebar::before { 3957 | content: '\f61f'; 3958 | } 3959 | .bi-window::before { 3960 | content: '\f620'; 3961 | } 3962 | .bi-wrench::before { 3963 | content: '\f621'; 3964 | } 3965 | .bi-x-circle-fill::before { 3966 | content: '\f622'; 3967 | } 3968 | .bi-x-circle::before { 3969 | content: '\f623'; 3970 | } 3971 | .bi-x-diamond-fill::before { 3972 | content: '\f624'; 3973 | } 3974 | .bi-x-diamond::before { 3975 | content: '\f625'; 3976 | } 3977 | .bi-x-octagon-fill::before { 3978 | content: '\f626'; 3979 | } 3980 | .bi-x-octagon::before { 3981 | content: '\f627'; 3982 | } 3983 | .bi-x-square-fill::before { 3984 | content: '\f628'; 3985 | } 3986 | .bi-x-square::before { 3987 | content: '\f629'; 3988 | } 3989 | .bi-x::before { 3990 | content: '\f62a'; 3991 | } 3992 | .bi-youtube::before { 3993 | content: '\f62b'; 3994 | } 3995 | .bi-zoom-in::before { 3996 | content: '\f62c'; 3997 | } 3998 | .bi-zoom-out::before { 3999 | content: '\f62d'; 4000 | } 4001 | .bi-bank::before { 4002 | content: '\f62e'; 4003 | } 4004 | .bi-bank2::before { 4005 | content: '\f62f'; 4006 | } 4007 | .bi-bell-slash-fill::before { 4008 | content: '\f630'; 4009 | } 4010 | .bi-bell-slash::before { 4011 | content: '\f631'; 4012 | } 4013 | .bi-cash-coin::before { 4014 | content: '\f632'; 4015 | } 4016 | .bi-check-lg::before { 4017 | content: '\f633'; 4018 | } 4019 | .bi-coin::before { 4020 | content: '\f634'; 4021 | } 4022 | .bi-currency-bitcoin::before { 4023 | content: '\f635'; 4024 | } 4025 | .bi-currency-dollar::before { 4026 | content: '\f636'; 4027 | } 4028 | .bi-currency-euro::before { 4029 | content: '\f637'; 4030 | } 4031 | .bi-currency-exchange::before { 4032 | content: '\f638'; 4033 | } 4034 | .bi-currency-pound::before { 4035 | content: '\f639'; 4036 | } 4037 | .bi-currency-yen::before { 4038 | content: '\f63a'; 4039 | } 4040 | .bi-dash-lg::before { 4041 | content: '\f63b'; 4042 | } 4043 | .bi-exclamation-lg::before { 4044 | content: '\f63c'; 4045 | } 4046 | .bi-file-earmark-pdf-fill::before { 4047 | content: '\f63d'; 4048 | } 4049 | .bi-file-earmark-pdf::before { 4050 | content: '\f63e'; 4051 | } 4052 | .bi-file-pdf-fill::before { 4053 | content: '\f63f'; 4054 | } 4055 | .bi-file-pdf::before { 4056 | content: '\f640'; 4057 | } 4058 | .bi-gender-ambiguous::before { 4059 | content: '\f641'; 4060 | } 4061 | .bi-gender-female::before { 4062 | content: '\f642'; 4063 | } 4064 | .bi-gender-male::before { 4065 | content: '\f643'; 4066 | } 4067 | .bi-gender-trans::before { 4068 | content: '\f644'; 4069 | } 4070 | .bi-headset-vr::before { 4071 | content: '\f645'; 4072 | } 4073 | .bi-info-lg::before { 4074 | content: '\f646'; 4075 | } 4076 | .bi-mastodon::before { 4077 | content: '\f647'; 4078 | } 4079 | .bi-messenger::before { 4080 | content: '\f648'; 4081 | } 4082 | .bi-piggy-bank-fill::before { 4083 | content: '\f649'; 4084 | } 4085 | .bi-piggy-bank::before { 4086 | content: '\f64a'; 4087 | } 4088 | .bi-pin-map-fill::before { 4089 | content: '\f64b'; 4090 | } 4091 | .bi-pin-map::before { 4092 | content: '\f64c'; 4093 | } 4094 | .bi-plus-lg::before { 4095 | content: '\f64d'; 4096 | } 4097 | .bi-question-lg::before { 4098 | content: '\f64e'; 4099 | } 4100 | .bi-recycle::before { 4101 | content: '\f64f'; 4102 | } 4103 | .bi-reddit::before { 4104 | content: '\f650'; 4105 | } 4106 | .bi-safe-fill::before { 4107 | content: '\f651'; 4108 | } 4109 | .bi-safe2-fill::before { 4110 | content: '\f652'; 4111 | } 4112 | .bi-safe2::before { 4113 | content: '\f653'; 4114 | } 4115 | .bi-sd-card-fill::before { 4116 | content: '\f654'; 4117 | } 4118 | .bi-sd-card::before { 4119 | content: '\f655'; 4120 | } 4121 | .bi-skype::before { 4122 | content: '\f656'; 4123 | } 4124 | .bi-slash-lg::before { 4125 | content: '\f657'; 4126 | } 4127 | .bi-translate::before { 4128 | content: '\f658'; 4129 | } 4130 | .bi-x-lg::before { 4131 | content: '\f659'; 4132 | } 4133 | .bi-safe::before { 4134 | content: '\f65a'; 4135 | } 4136 | .bi-apple::before { 4137 | content: '\f65b'; 4138 | } 4139 | .bi-microsoft::before { 4140 | content: '\f65d'; 4141 | } 4142 | .bi-windows::before { 4143 | content: '\f65e'; 4144 | } 4145 | .bi-behance::before { 4146 | content: '\f65c'; 4147 | } 4148 | .bi-dribbble::before { 4149 | content: '\f65f'; 4150 | } 4151 | .bi-line::before { 4152 | content: '\f660'; 4153 | } 4154 | .bi-medium::before { 4155 | content: '\f661'; 4156 | } 4157 | .bi-paypal::before { 4158 | content: '\f662'; 4159 | } 4160 | .bi-pinterest::before { 4161 | content: '\f663'; 4162 | } 4163 | .bi-signal::before { 4164 | content: '\f664'; 4165 | } 4166 | .bi-snapchat::before { 4167 | content: '\f665'; 4168 | } 4169 | .bi-spotify::before { 4170 | content: '\f666'; 4171 | } 4172 | .bi-stack-overflow::before { 4173 | content: '\f667'; 4174 | } 4175 | .bi-strava::before { 4176 | content: '\f668'; 4177 | } 4178 | .bi-wordpress::before { 4179 | content: '\f669'; 4180 | } 4181 | .bi-vimeo::before { 4182 | content: '\f66a'; 4183 | } 4184 | .bi-activity::before { 4185 | content: '\f66b'; 4186 | } 4187 | .bi-easel2-fill::before { 4188 | content: '\f66c'; 4189 | } 4190 | .bi-easel2::before { 4191 | content: '\f66d'; 4192 | } 4193 | .bi-easel3-fill::before { 4194 | content: '\f66e'; 4195 | } 4196 | .bi-easel3::before { 4197 | content: '\f66f'; 4198 | } 4199 | .bi-fan::before { 4200 | content: '\f670'; 4201 | } 4202 | .bi-fingerprint::before { 4203 | content: '\f671'; 4204 | } 4205 | .bi-graph-down-arrow::before { 4206 | content: '\f672'; 4207 | } 4208 | .bi-graph-up-arrow::before { 4209 | content: '\f673'; 4210 | } 4211 | .bi-hypnotize::before { 4212 | content: '\f674'; 4213 | } 4214 | .bi-magic::before { 4215 | content: '\f675'; 4216 | } 4217 | .bi-person-rolodex::before { 4218 | content: '\f676'; 4219 | } 4220 | .bi-person-video::before { 4221 | content: '\f677'; 4222 | } 4223 | .bi-person-video2::before { 4224 | content: '\f678'; 4225 | } 4226 | .bi-person-video3::before { 4227 | content: '\f679'; 4228 | } 4229 | .bi-person-workspace::before { 4230 | content: '\f67a'; 4231 | } 4232 | .bi-radioactive::before { 4233 | content: '\f67b'; 4234 | } 4235 | .bi-webcam-fill::before { 4236 | content: '\f67c'; 4237 | } 4238 | .bi-webcam::before { 4239 | content: '\f67d'; 4240 | } 4241 | .bi-yin-yang::before { 4242 | content: '\f67e'; 4243 | } 4244 | .bi-bandaid-fill::before { 4245 | content: '\f680'; 4246 | } 4247 | .bi-bandaid::before { 4248 | content: '\f681'; 4249 | } 4250 | .bi-bluetooth::before { 4251 | content: '\f682'; 4252 | } 4253 | .bi-body-text::before { 4254 | content: '\f683'; 4255 | } 4256 | .bi-boombox::before { 4257 | content: '\f684'; 4258 | } 4259 | .bi-boxes::before { 4260 | content: '\f685'; 4261 | } 4262 | .bi-dpad-fill::before { 4263 | content: '\f686'; 4264 | } 4265 | .bi-dpad::before { 4266 | content: '\f687'; 4267 | } 4268 | .bi-ear-fill::before { 4269 | content: '\f688'; 4270 | } 4271 | .bi-ear::before { 4272 | content: '\f689'; 4273 | } 4274 | .bi-envelope-check-1::before { 4275 | content: '\f68a'; 4276 | } 4277 | .bi-envelope-check-fill::before { 4278 | content: '\f68b'; 4279 | } 4280 | .bi-envelope-check::before { 4281 | content: '\f68c'; 4282 | } 4283 | .bi-envelope-dash-1::before { 4284 | content: '\f68d'; 4285 | } 4286 | .bi-envelope-dash-fill::before { 4287 | content: '\f68e'; 4288 | } 4289 | .bi-envelope-dash::before { 4290 | content: '\f68f'; 4291 | } 4292 | .bi-envelope-exclamation-1::before { 4293 | content: '\f690'; 4294 | } 4295 | .bi-envelope-exclamation-fill::before { 4296 | content: '\f691'; 4297 | } 4298 | .bi-envelope-exclamation::before { 4299 | content: '\f692'; 4300 | } 4301 | .bi-envelope-plus-fill::before { 4302 | content: '\f693'; 4303 | } 4304 | .bi-envelope-plus::before { 4305 | content: '\f694'; 4306 | } 4307 | .bi-envelope-slash-1::before { 4308 | content: '\f695'; 4309 | } 4310 | .bi-envelope-slash-fill::before { 4311 | content: '\f696'; 4312 | } 4313 | .bi-envelope-slash::before { 4314 | content: '\f697'; 4315 | } 4316 | .bi-envelope-x-1::before { 4317 | content: '\f698'; 4318 | } 4319 | .bi-envelope-x-fill::before { 4320 | content: '\f699'; 4321 | } 4322 | .bi-envelope-x::before { 4323 | content: '\f69a'; 4324 | } 4325 | .bi-explicit-fill::before { 4326 | content: '\f69b'; 4327 | } 4328 | .bi-explicit::before { 4329 | content: '\f69c'; 4330 | } 4331 | .bi-git::before { 4332 | content: '\f69d'; 4333 | } 4334 | .bi-infinity::before { 4335 | content: '\f69e'; 4336 | } 4337 | .bi-list-columns-reverse::before { 4338 | content: '\f69f'; 4339 | } 4340 | .bi-list-columns::before { 4341 | content: '\f6a0'; 4342 | } 4343 | .bi-meta::before { 4344 | content: '\f6a1'; 4345 | } 4346 | .bi-mortorboard-fill::before { 4347 | content: '\f6a2'; 4348 | } 4349 | .bi-mortorboard::before { 4350 | content: '\f6a3'; 4351 | } 4352 | .bi-nintendo-switch::before { 4353 | content: '\f6a4'; 4354 | } 4355 | .bi-pc-display-horizontal::before { 4356 | content: '\f6a5'; 4357 | } 4358 | .bi-pc-display::before { 4359 | content: '\f6a6'; 4360 | } 4361 | .bi-pc-horizontal::before { 4362 | content: '\f6a7'; 4363 | } 4364 | .bi-pc::before { 4365 | content: '\f6a8'; 4366 | } 4367 | .bi-playstation::before { 4368 | content: '\f6a9'; 4369 | } 4370 | .bi-plus-slash-minus::before { 4371 | content: '\f6aa'; 4372 | } 4373 | .bi-projector-fill::before { 4374 | content: '\f6ab'; 4375 | } 4376 | .bi-projector::before { 4377 | content: '\f6ac'; 4378 | } 4379 | .bi-qr-code-scan::before { 4380 | content: '\f6ad'; 4381 | } 4382 | .bi-qr-code::before { 4383 | content: '\f6ae'; 4384 | } 4385 | .bi-quora::before { 4386 | content: '\f6af'; 4387 | } 4388 | .bi-quote::before { 4389 | content: '\f6b0'; 4390 | } 4391 | .bi-robot::before { 4392 | content: '\f6b1'; 4393 | } 4394 | .bi-send-check-fill::before { 4395 | content: '\f6b2'; 4396 | } 4397 | .bi-send-check::before { 4398 | content: '\f6b3'; 4399 | } 4400 | .bi-send-dash-fill::before { 4401 | content: '\f6b4'; 4402 | } 4403 | .bi-send-dash::before { 4404 | content: '\f6b5'; 4405 | } 4406 | .bi-send-exclamation-1::before { 4407 | content: '\f6b6'; 4408 | } 4409 | .bi-send-exclamation-fill::before { 4410 | content: '\f6b7'; 4411 | } 4412 | .bi-send-exclamation::before { 4413 | content: '\f6b8'; 4414 | } 4415 | .bi-send-fill::before { 4416 | content: '\f6b9'; 4417 | } 4418 | .bi-send-plus-fill::before { 4419 | content: '\f6ba'; 4420 | } 4421 | .bi-send-plus::before { 4422 | content: '\f6bb'; 4423 | } 4424 | .bi-send-slash-fill::before { 4425 | content: '\f6bc'; 4426 | } 4427 | .bi-send-slash::before { 4428 | content: '\f6bd'; 4429 | } 4430 | .bi-send-x-fill::before { 4431 | content: '\f6be'; 4432 | } 4433 | .bi-send-x::before { 4434 | content: '\f6bf'; 4435 | } 4436 | .bi-send::before { 4437 | content: '\f6c0'; 4438 | } 4439 | .bi-steam::before { 4440 | content: '\f6c1'; 4441 | } 4442 | .bi-terminal-dash-1::before { 4443 | content: '\f6c2'; 4444 | } 4445 | .bi-terminal-dash::before { 4446 | content: '\f6c3'; 4447 | } 4448 | .bi-terminal-plus::before { 4449 | content: '\f6c4'; 4450 | } 4451 | .bi-terminal-split::before { 4452 | content: '\f6c5'; 4453 | } 4454 | .bi-ticket-detailed-fill::before { 4455 | content: '\f6c6'; 4456 | } 4457 | .bi-ticket-detailed::before { 4458 | content: '\f6c7'; 4459 | } 4460 | .bi-ticket-fill::before { 4461 | content: '\f6c8'; 4462 | } 4463 | .bi-ticket-perforated-fill::before { 4464 | content: '\f6c9'; 4465 | } 4466 | .bi-ticket-perforated::before { 4467 | content: '\f6ca'; 4468 | } 4469 | .bi-ticket::before { 4470 | content: '\f6cb'; 4471 | } 4472 | .bi-tiktok::before { 4473 | content: '\f6cc'; 4474 | } 4475 | .bi-window-dash::before { 4476 | content: '\f6cd'; 4477 | } 4478 | .bi-window-desktop::before { 4479 | content: '\f6ce'; 4480 | } 4481 | .bi-window-fullscreen::before { 4482 | content: '\f6cf'; 4483 | } 4484 | .bi-window-plus::before { 4485 | content: '\f6d0'; 4486 | } 4487 | .bi-window-split::before { 4488 | content: '\f6d1'; 4489 | } 4490 | .bi-window-stack::before { 4491 | content: '\f6d2'; 4492 | } 4493 | .bi-window-x::before { 4494 | content: '\f6d3'; 4495 | } 4496 | .bi-xbox::before { 4497 | content: '\f6d4'; 4498 | } 4499 | .bi-ethernet::before { 4500 | content: '\f6d5'; 4501 | } 4502 | .bi-hdmi-fill::before { 4503 | content: '\f6d6'; 4504 | } 4505 | .bi-hdmi::before { 4506 | content: '\f6d7'; 4507 | } 4508 | .bi-usb-c-fill::before { 4509 | content: '\f6d8'; 4510 | } 4511 | .bi-usb-c::before { 4512 | content: '\f6d9'; 4513 | } 4514 | .bi-usb-fill::before { 4515 | content: '\f6da'; 4516 | } 4517 | .bi-usb-plug-fill::before { 4518 | content: '\f6db'; 4519 | } 4520 | .bi-usb-plug::before { 4521 | content: '\f6dc'; 4522 | } 4523 | .bi-usb-symbol::before { 4524 | content: '\f6dd'; 4525 | } 4526 | .bi-usb::before { 4527 | content: '\f6de'; 4528 | } 4529 | .bi-boombox-fill::before { 4530 | content: '\f6df'; 4531 | } 4532 | .bi-displayport-1::before { 4533 | content: '\f6e0'; 4534 | } 4535 | .bi-displayport::before { 4536 | content: '\f6e1'; 4537 | } 4538 | .bi-gpu-card::before { 4539 | content: '\f6e2'; 4540 | } 4541 | .bi-memory::before { 4542 | content: '\f6e3'; 4543 | } 4544 | .bi-modem-fill::before { 4545 | content: '\f6e4'; 4546 | } 4547 | .bi-modem::before { 4548 | content: '\f6e5'; 4549 | } 4550 | .bi-motherboard-fill::before { 4551 | content: '\f6e6'; 4552 | } 4553 | .bi-motherboard::before { 4554 | content: '\f6e7'; 4555 | } 4556 | .bi-optical-audio-fill::before { 4557 | content: '\f6e8'; 4558 | } 4559 | .bi-optical-audio::before { 4560 | content: '\f6e9'; 4561 | } 4562 | .bi-pci-card::before { 4563 | content: '\f6ea'; 4564 | } 4565 | .bi-router-fill::before { 4566 | content: '\f6eb'; 4567 | } 4568 | .bi-router::before { 4569 | content: '\f6ec'; 4570 | } 4571 | .bi-ssd-fill::before { 4572 | content: '\f6ed'; 4573 | } 4574 | .bi-ssd::before { 4575 | content: '\f6ee'; 4576 | } 4577 | .bi-thunderbolt-fill::before { 4578 | content: '\f6ef'; 4579 | } 4580 | .bi-thunderbolt::before { 4581 | content: '\f6f0'; 4582 | } 4583 | .bi-usb-drive-fill::before { 4584 | content: '\f6f1'; 4585 | } 4586 | .bi-usb-drive::before { 4587 | content: '\f6f2'; 4588 | } 4589 | .bi-usb-micro-fill::before { 4590 | content: '\f6f3'; 4591 | } 4592 | .bi-usb-micro::before { 4593 | content: '\f6f4'; 4594 | } 4595 | .bi-usb-mini-fill::before { 4596 | content: '\f6f5'; 4597 | } 4598 | .bi-usb-mini::before { 4599 | content: '\f6f6'; 4600 | } 4601 | .bi-cloud-haze2::before { 4602 | content: '\f6f7'; 4603 | } 4604 | .bi-device-hdd-fill::before { 4605 | content: '\f6f8'; 4606 | } 4607 | .bi-device-hdd::before { 4608 | content: '\f6f9'; 4609 | } 4610 | .bi-device-ssd-fill::before { 4611 | content: '\f6fa'; 4612 | } 4613 | .bi-device-ssd::before { 4614 | content: '\f6fb'; 4615 | } 4616 | .bi-displayport-fill::before { 4617 | content: '\f6fc'; 4618 | } 4619 | .bi-mortarboard-fill::before { 4620 | content: '\f6fd'; 4621 | } 4622 | .bi-mortarboard::before { 4623 | content: '\f6fe'; 4624 | } 4625 | .bi-terminal-x::before { 4626 | content: '\f6ff'; 4627 | } 4628 | -------------------------------------------------------------------------------- /static/bootstrap-icons/bootstrap-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/bootstrap-icons/bootstrap-icons.woff -------------------------------------------------------------------------------- /static/bootstrap-icons/bootstrap-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/bootstrap-icons/bootstrap-icons.woff2 -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/favicon.png -------------------------------------------------------------------------------- /static/font/font.css: -------------------------------------------------------------------------------- 1 | /* latin */ 2 | @font-face { 3 | font-family: 'Outfit'; 4 | font-style: normal; 5 | font-weight: 200; 6 | font-display: swap; 7 | src: url(./outfit-200.woff2) format('woff2'); 8 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 9 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 10 | } 11 | /* latin */ 12 | @font-face { 13 | font-family: 'Outfit'; 14 | font-style: normal; 15 | font-weight: 300; 16 | font-display: swap; 17 | src: url(./outfit-300.woff2) format('woff2'); 18 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 19 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 20 | } 21 | /* latin */ 22 | @font-face { 23 | font-family: 'Outfit'; 24 | font-style: normal; 25 | font-weight: 400; 26 | font-display: swap; 27 | src: url(./outfit-400.woff2) format('woff2'); 28 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 29 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 30 | } 31 | /* latin */ 32 | @font-face { 33 | font-family: 'Outfit'; 34 | font-style: normal; 35 | font-weight: 500; 36 | font-display: swap; 37 | src: url(./outfit-500.woff2) format('woff2'); 38 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 39 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 40 | } 41 | /* latin */ 42 | @font-face { 43 | font-family: 'Outfit'; 44 | font-style: normal; 45 | font-weight: 600; 46 | font-display: swap; 47 | src: url(./outfit-600.woff2) format('woff2'); 48 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, 49 | U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 50 | } 51 | -------------------------------------------------------------------------------- /static/font/outfit-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/font/outfit-200.woff2 -------------------------------------------------------------------------------- /static/font/outfit-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/font/outfit-300.woff2 -------------------------------------------------------------------------------- /static/font/outfit-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/font/outfit-400.woff2 -------------------------------------------------------------------------------- /static/font/outfit-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/font/outfit-500.woff2 -------------------------------------------------------------------------------- /static/font/outfit-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/font/outfit-600.woff2 -------------------------------------------------------------------------------- /static/icons/favicon-svelte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/icons/favicon-svelte.png -------------------------------------------------------------------------------- /static/icons/moon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/icons/moon.png -------------------------------------------------------------------------------- /static/icons/moon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 39 | 41 | 49 | 54 | 58 | 59 | 60 | 64 | 70 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /static/img/backdrop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/img/backdrop.jpg -------------------------------------------------------------------------------- /static/manifest-icon-192.maskable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/manifest-icon-192.maskable.png -------------------------------------------------------------------------------- /static/manifest-icon-512.maskable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refact0r/gradenight/97194c3ec21feb776eb19915d1e75625ae7fa647/static/manifest-icon-512.maskable.png -------------------------------------------------------------------------------- /static/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Gradenight", 3 | "short_name": "Gradenight", 4 | "start_url": "/", 5 | "scope": "/", 6 | "icons": [ 7 | { 8 | "src": "/manifest-icon-192.maskable.png", 9 | "sizes": "192x192", 10 | "type": "image/png", 11 | "purpose": "any" 12 | }, 13 | { 14 | "src": "/manifest-icon-192.maskable.png", 15 | "sizes": "192x192", 16 | "type": "image/png", 17 | "purpose": "maskable" 18 | }, 19 | { 20 | "src": "/manifest-icon-512.maskable.png", 21 | "sizes": "512x512", 22 | "type": "image/png", 23 | "purpose": "any" 24 | }, 25 | { 26 | "src": "/manifest-icon-512.maskable.png", 27 | "sizes": "512x512", 28 | "type": "image/png", 29 | "purpose": "maskable" 30 | } 31 | ], 32 | "theme_color": "#13161b", 33 | "background_color": "#13161b", 34 | "display": "standalone" 35 | } 36 | -------------------------------------------------------------------------------- /static/themes/glass.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --bg-color-1: hsla(0deg 0% 100% / 10%); 3 | --bg-color-1-5: hsla(0deg 0% 100% / 5%); 4 | --bg-color-2: hsla(0deg 0% 100% / 20%); 5 | --bg-color-2-5: hsla(0deg 0% 100% / 25%); 6 | --bg-color-3: hsla(0deg 0% 100% / 30%); 7 | --bg-color-3-5: hsla(0deg 0% 100% / 30%); 8 | --font-color-3: hsla(0deg 0% 100% / 50%); 9 | --font-color-2: hsla(0deg 0% 100% / 70%); 10 | --font-color: hsl(0, 0%, 95%); 11 | --accent-color: hsl(0, 0%, 90%); 12 | --border: 1px solid hsla(0deg 0% 100% / 10%); 13 | --filter: blur(20px); 14 | } 15 | 16 | body { 17 | background-image: url(../img/backdrop.jpg) !important; 18 | background-size: cover !important; 19 | } 20 | 21 | .loading-container { 22 | background-image: url(../img/backdrop.jpg) !important; 23 | background-size: cover !important; 24 | } 25 | 26 | option { 27 | color: black !important; 28 | } 29 | 30 | ::-webkit-scrollbar-thumb { 31 | background: var(--bg-color-1-5); 32 | } 33 | ::-webkit-scrollbar-thumb:hover { 34 | background: var(--bg-color-1); 35 | } 36 | ::-webkit-scrollbar-thumb:active { 37 | background: var(--bg-color-2); 38 | } 39 | -------------------------------------------------------------------------------- /static/themes/light.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --bg-color-1: hsl(220, 30%, 86%); 3 | --bg-color-1-5: hsl(220, 40%, 90%); 4 | --bg-color-2: hsl(220, 50%, 94%); 5 | --bg-color-2-5: hsl(220, 40%, 90%); 6 | --bg-color-3: hsl(220, 30%, 82%); 7 | --bg-color-3-5: hsl(220, 30%, 78%); 8 | --font-color-3: hsl(220, 10%, 56%); 9 | --font-color-2: hsl(220, 10%, 36%); 10 | --font-color: hsl(220, 10%, 12%); 11 | --accent-color: hsl(220, 10%, 12%); 12 | } 13 | -------------------------------------------------------------------------------- /static/themes/night.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --bg-color-1: hsl(220, 18%, 9%); 3 | --bg-color-1-5: hsl(220, 18%, 11%); 4 | --bg-color-2: hsl(220, 18%, 13%); 5 | --bg-color-2-5: hsl(220, 18%, 16%); 6 | --bg-color-3: hsl(220, 18%, 19%); 7 | --bg-color-3-5: hsl(220, 18%, 22%); 8 | --font-color-3: hsl(220, 18%, 28%); 9 | --font-color-2: hsl(220, 18%, 38%); 10 | --font-color: hsl(220, 37%, 68%); 11 | --accent-color: hsl(220, 37%, 68%); 12 | } 13 | -------------------------------------------------------------------------------- /static/themes/olivia.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --bg-color-1: hsl(270deg 3% 10%); 3 | --bg-color-1-5: hsl(270deg 3% 11%); 4 | --bg-color-2: hsl(270deg 3% 12%); 5 | --bg-color-2-5: hsl(270deg 4% 13%); 6 | --bg-color-3: hsl(270deg 4% 14%); 7 | --bg-color-3-5: hsl(270deg 4% 15%); 8 | --font-color-3: hsl(0deg 11% 27%); 9 | --font-color-2: hsl(11deg 14% 44%); 10 | --font-color: hsl(24deg 16% 94%); 11 | --accent-color: hsl(17deg 50% 74%); 12 | } 13 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import auto from '@sveltejs/adapter-auto' 2 | import preprocess from 'svelte-preprocess' 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | preprocess: preprocess({ 7 | scss: { 8 | prependData: '@use "src/variables.scss" as *;' 9 | } 10 | }), 11 | kit: { 12 | adapter: auto() 13 | } 14 | } 15 | 16 | export default config 17 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite' 2 | 3 | /** @type {import('vite').UserConfig} */ 4 | const config = { 5 | plugins: [sveltekit()], 6 | 7 | css: { 8 | preprocessorOptions: { 9 | scss: { 10 | additionalData: '@use "src/variables.scss" as *;' 11 | } 12 | } 13 | } 14 | } 15 | 16 | export default config 17 | --------------------------------------------------------------------------------