v0 done, first push!

Changed files
+22679
errors
public
font
IBMPlexMono-Regular
IBMPlexSansJP-Bold
IBMPlexSansJP-Regular
garbage
prism
sayings
tailwind
views
+19
Dockerfile
··· 1 + # syntax=docker/dockerfile:1-labs 2 + FROM badgerati/pode:latest 3 + SHELL ["pwsh", "-c"] 4 + 5 + RUN apt-get update 6 + RUN apt-get install git -y 7 + 8 + RUN git clone https://github.com/helpimnotdrowning/Mizumiya --branch v0.2.0 /tmp/Mizumiya_repo 9 + RUN mkdir -p /usr/local/share/powershell/Modules/Mizumiya 10 + RUN cp -r /tmp/Mizumiya_repo/Mizumiya/* /usr/local/share/powershell/Modules/Mizumiya 11 + 12 + RUN Set-PSRepository -Name PSGallery -InstallationPolicy Trusted 13 + RUN Install-Module -Name PSParseHTML -RequiredVersion 2.0.2 14 + 15 + COPY . /app/NKK/ 16 + 17 + EXPOSE 8081 18 + WORKDIR /app/NKK 19 + CMD [ "pwsh", "-c", "./Server.ps1" ]
+175
LICENSE.external.md
··· 1 + # prism.js 2 + prism.js is distributed (vendored) under the following license (also 3 + available at <https://github.com/PrismJS/prism/blob/v2/license>): 4 + 5 + MIT LICENSE 6 + 7 + Copyright (c) 2012 Lea Verou 8 + 9 + Permission is hereby granted, free of charge, to any person obtaining a copy 10 + of this software and associated documentation files (the "Software"), to deal 11 + in the Software without restriction, including without limitation the rights 12 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 + copies of the Software, and to permit persons to whom the Software is 14 + furnished to do so, subject to the following conditions: 15 + 16 + The above copyright notice and this permission notice shall be included in 17 + all copies or substantial portions of the Software. 18 + 19 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 + THE SOFTWARE. 26 + 27 + # htmx 28 + htmx is distributed (vendored) under the following license (also available at 29 + <https://github.com/bigskysoftware/htmx/blob/master/LICENSE>): 30 + 31 + Zero-Clause BSD 32 + ============= 33 + 34 + Permission to use, copy, modify, and/or distribute this software for 35 + any purpose with or without fee is hereby granted. 36 + 37 + THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL 38 + WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 39 + OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE 40 + FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY 41 + DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 42 + AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 43 + OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 44 + 45 + # IBM Plex-family fonts 46 + The IBM Plex family of fonts is is distributed (vendored) and modified (split) 47 + under the following license (also available at 48 + <https://github.com/IBM/plex/blob/master/LICENSE.txt>): 49 + 50 + Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" 51 + 52 + This Font Software is licensed under the SIL Open Font License, Version 1.1. 53 + 54 + This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL 55 + 56 + 57 + ----------------------------------------------------------- 58 + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 59 + ----------------------------------------------------------- 60 + 61 + PREAMBLE 62 + The goals of the Open Font License (OFL) are to stimulate worldwide 63 + development of collaborative font projects, to support the font creation 64 + efforts of academic and linguistic communities, and to provide a free and 65 + open framework in which fonts may be shared and improved in partnership 66 + with others. 67 + 68 + The OFL allows the licensed fonts to be used, studied, modified and 69 + redistributed freely as long as they are not sold by themselves. The 70 + fonts, including any derivative works, can be bundled, embedded, 71 + redistributed and/or sold with any software provided that any reserved 72 + names are not used by derivative works. The fonts and derivatives, 73 + however, cannot be released under any other type of license. The 74 + requirement for fonts to remain under this license does not apply 75 + to any document created using the fonts or their derivatives. 76 + 77 + DEFINITIONS 78 + "Font Software" refers to the set of files released by the Copyright 79 + Holder(s) under this license and clearly marked as such. This may 80 + include source files, build scripts and documentation. 81 + 82 + "Reserved Font Name" refers to any names specified as such after the 83 + copyright statement(s). 84 + 85 + "Original Version" refers to the collection of Font Software components as 86 + distributed by the Copyright Holder(s). 87 + 88 + "Modified Version" refers to any derivative made by adding to, deleting, 89 + or substituting -- in part or in whole -- any of the components of the 90 + Original Version, by changing formats or by porting the Font Software to a 91 + new environment. 92 + 93 + "Author" refers to any designer, engineer, programmer, technical 94 + writer or other person who contributed to the Font Software. 95 + 96 + PERMISSION & CONDITIONS 97 + Permission is hereby granted, free of charge, to any person obtaining 98 + a copy of the Font Software, to use, study, copy, merge, embed, modify, 99 + redistribute, and sell modified and unmodified copies of the Font 100 + Software, subject to the following conditions: 101 + 102 + 1) Neither the Font Software nor any of its individual components, 103 + in Original or Modified Versions, may be sold by itself. 104 + 105 + 2) Original or Modified Versions of the Font Software may be bundled, 106 + redistributed and/or sold with any software, provided that each copy 107 + contains the above copyright notice and this license. These can be 108 + included either as stand-alone text files, human-readable headers or 109 + in the appropriate machine-readable metadata fields within text or 110 + binary files as long as those fields can be easily viewed by the user. 111 + 112 + 3) No Modified Version of the Font Software may use the Reserved Font 113 + Name(s) unless explicit written permission is granted by the corresponding 114 + Copyright Holder. This restriction only applies to the primary font name as 115 + presented to the users. 116 + 117 + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 118 + Software shall not be used to promote, endorse or advertise any 119 + Modified Version, except to acknowledge the contribution(s) of the 120 + Copyright Holder(s) and the Author(s) or with their explicit written 121 + permission. 122 + 123 + 5) The Font Software, modified or unmodified, in part or in whole, 124 + must be distributed entirely under this license, and must not be 125 + distributed under any other license. The requirement for fonts to 126 + remain under this license does not apply to any document created 127 + using the Font Software. 128 + 129 + TERMINATION 130 + This license becomes null and void if any of the above conditions are 131 + not met. 132 + 133 + DISCLAIMER 134 + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 135 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 136 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 137 + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 138 + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 139 + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 140 + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 141 + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 142 + OTHER DEALINGS IN THE FONT SOFTWARE. 143 + 144 + # Ancient One Dark "Violet" (AO-Dark) 145 + The Ancient One Dark "Violet" theme is reused under the following license 146 + (also available at 147 + <https://github.com/sigvt/ancient-one-dark/blob/master/LICENSE>): 148 + 149 + # The following license only covers themes/*-color-theme.json 150 + MIT License 151 + Copyright (c) 2021 uetchy 152 + 153 + Permission is hereby granted, free of charge, to any person obtaining a copy 154 + of this software and associated documentation files (the "Software"), to deal 155 + in the Software without restriction, including without limitation the rights 156 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 157 + copies of the Software, and to permit persons to whom the Software is 158 + furnished to do so, subject to the following conditions: 159 + 160 + The above copyright notice and this permission notice shall be included in all 161 + copies or substantial portions of the Software. 162 + 163 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 164 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 165 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 166 + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 167 + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 168 + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 169 + OR OTHER DEALINGS IN THE SOFTWARE. 170 + 171 + - Forks of this theme must not contain "Ancient One Dark" in their name. 172 + 173 + # Disclaimer 174 + "Ancient One Dark" is a work of fanfiction using characters from Hololive English, owned by Cover Corp. 175 + This work is not affiliated with Cover Corp.
+660
LICENSE.md
··· 1 + # GNU AFFERO GENERAL PUBLIC LICENSE 2 + 3 + Version 3, 19 November 2007 4 + 5 + Copyright (C) 2007 Free Software Foundation, Inc. 6 + <https://fsf.org/> 7 + 8 + Everyone is permitted to copy and distribute verbatim copies of this 9 + license document, but changing it is not allowed. 10 + 11 + ## Preamble 12 + 13 + The GNU Affero General Public License is a free, copyleft license for 14 + software and other kinds of works, specifically designed to ensure 15 + cooperation with the community in the case of network server software. 16 + 17 + The licenses for most software and other practical works are designed 18 + to take away your freedom to share and change the works. By contrast, 19 + our General Public Licenses are intended to guarantee your freedom to 20 + share and change all versions of a program--to make sure it remains 21 + free software for all its users. 22 + 23 + When we speak of free software, we are referring to freedom, not 24 + price. Our General Public Licenses are designed to make sure that you 25 + have the freedom to distribute copies of free software (and charge for 26 + them if you wish), that you receive source code or can get it if you 27 + want it, that you can change the software or use pieces of it in new 28 + free programs, and that you know you can do these things. 29 + 30 + Developers that use our General Public Licenses protect your rights 31 + with two steps: (1) assert copyright on the software, and (2) offer 32 + you this License which gives you legal permission to copy, distribute 33 + and/or modify the software. 34 + 35 + A secondary benefit of defending all users' freedom is that 36 + improvements made in alternate versions of the program, if they 37 + receive widespread use, become available for other developers to 38 + incorporate. Many developers of free software are heartened and 39 + encouraged by the resulting cooperation. However, in the case of 40 + software used on network servers, this result may fail to come about. 41 + The GNU General Public License permits making a modified version and 42 + letting the public access it on a server without ever releasing its 43 + source code to the public. 44 + 45 + The GNU Affero General Public License is designed specifically to 46 + ensure that, in such cases, the modified source code becomes available 47 + to the community. It requires the operator of a network server to 48 + provide the source code of the modified version running there to the 49 + users of that server. Therefore, public use of a modified version, on 50 + a publicly accessible server, gives the public access to the source 51 + code of the modified version. 52 + 53 + An older license, called the Affero General Public License and 54 + published by Affero, was designed to accomplish similar goals. This is 55 + a different license, not a version of the Affero GPL, but Affero has 56 + released a new version of the Affero GPL which permits relicensing 57 + under this license. 58 + 59 + The precise terms and conditions for copying, distribution and 60 + modification follow. 61 + 62 + ## TERMS AND CONDITIONS 63 + 64 + ### 0. Definitions. 65 + 66 + "This License" refers to version 3 of the GNU Affero General Public 67 + License. 68 + 69 + "Copyright" also means copyright-like laws that apply to other kinds 70 + of works, such as semiconductor masks. 71 + 72 + "The Program" refers to any copyrightable work licensed under this 73 + License. Each licensee is addressed as "you". "Licensees" and 74 + "recipients" may be individuals or organizations. 75 + 76 + To "modify" a work means to copy from or adapt all or part of the work 77 + in a fashion requiring copyright permission, other than the making of 78 + an exact copy. The resulting work is called a "modified version" of 79 + the earlier work or a work "based on" the earlier work. 80 + 81 + A "covered work" means either the unmodified Program or a work based 82 + on the Program. 83 + 84 + To "propagate" a work means to do anything with it that, without 85 + permission, would make you directly or secondarily liable for 86 + infringement under applicable copyright law, except executing it on a 87 + computer or modifying a private copy. Propagation includes copying, 88 + distribution (with or without modification), making available to the 89 + public, and in some countries other activities as well. 90 + 91 + To "convey" a work means any kind of propagation that enables other 92 + parties to make or receive copies. Mere interaction with a user 93 + through a computer network, with no transfer of a copy, is not 94 + conveying. 95 + 96 + An interactive user interface displays "Appropriate Legal Notices" to 97 + the extent that it includes a convenient and prominently visible 98 + feature that (1) displays an appropriate copyright notice, and (2) 99 + tells the user that there is no warranty for the work (except to the 100 + extent that warranties are provided), that licensees may convey the 101 + work under this License, and how to view a copy of this License. If 102 + the interface presents a list of user commands or options, such as a 103 + menu, a prominent item in the list meets this criterion. 104 + 105 + ### 1. Source Code. 106 + 107 + The "source code" for a work means the preferred form of the work for 108 + making modifications to it. "Object code" means any non-source form of 109 + a work. 110 + 111 + A "Standard Interface" means an interface that either is an official 112 + standard defined by a recognized standards body, or, in the case of 113 + interfaces specified for a particular programming language, one that 114 + is widely used among developers working in that language. 115 + 116 + The "System Libraries" of an executable work include anything, other 117 + than the work as a whole, that (a) is included in the normal form of 118 + packaging a Major Component, but which is not part of that Major 119 + Component, and (b) serves only to enable use of the work with that 120 + Major Component, or to implement a Standard Interface for which an 121 + implementation is available to the public in source code form. A 122 + "Major Component", in this context, means a major essential component 123 + (kernel, window system, and so on) of the specific operating system 124 + (if any) on which the executable work runs, or a compiler used to 125 + produce the work, or an object code interpreter used to run it. 126 + 127 + The "Corresponding Source" for a work in object code form means all 128 + the source code needed to generate, install, and (for an executable 129 + work) run the object code and to modify the work, including scripts to 130 + control those activities. However, it does not include the work's 131 + System Libraries, or general-purpose tools or generally available free 132 + programs which are used unmodified in performing those activities but 133 + which are not part of the work. For example, Corresponding Source 134 + includes interface definition files associated with source files for 135 + the work, and the source code for shared libraries and dynamically 136 + linked subprograms that the work is specifically designed to require, 137 + such as by intimate data communication or control flow between those 138 + subprograms and other parts of the work. 139 + 140 + The Corresponding Source need not include anything that users can 141 + regenerate automatically from other parts of the Corresponding Source. 142 + 143 + The Corresponding Source for a work in source code form is that same 144 + work. 145 + 146 + ### 2. Basic Permissions. 147 + 148 + All rights granted under this License are granted for the term of 149 + copyright on the Program, and are irrevocable provided the stated 150 + conditions are met. This License explicitly affirms your unlimited 151 + permission to run the unmodified Program. The output from running a 152 + covered work is covered by this License only if the output, given its 153 + content, constitutes a covered work. This License acknowledges your 154 + rights of fair use or other equivalent, as provided by copyright law. 155 + 156 + You may make, run and propagate covered works that you do not convey, 157 + without conditions so long as your license otherwise remains in force. 158 + You may convey covered works to others for the sole purpose of having 159 + them make modifications exclusively for you, or provide you with 160 + facilities for running those works, provided that you comply with the 161 + terms of this License in conveying all material for which you do not 162 + control copyright. Those thus making or running the covered works for 163 + you must do so exclusively on your behalf, under your direction and 164 + control, on terms that prohibit them from making any copies of your 165 + copyrighted material outside their relationship with you. 166 + 167 + Conveying under any other circumstances is permitted solely under the 168 + conditions stated below. Sublicensing is not allowed; section 10 makes 169 + it unnecessary. 170 + 171 + ### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 172 + 173 + No covered work shall be deemed part of an effective technological 174 + measure under any applicable law fulfilling obligations under article 175 + 11 of the WIPO copyright treaty adopted on 20 December 1996, or 176 + similar laws prohibiting or restricting circumvention of such 177 + measures. 178 + 179 + When you convey a covered work, you waive any legal power to forbid 180 + circumvention of technological measures to the extent such 181 + circumvention is effected by exercising rights under this License with 182 + respect to the covered work, and you disclaim any intention to limit 183 + operation or modification of the work as a means of enforcing, against 184 + the work's users, your or third parties' legal rights to forbid 185 + circumvention of technological measures. 186 + 187 + ### 4. Conveying Verbatim Copies. 188 + 189 + You may convey verbatim copies of the Program's source code as you 190 + receive it, in any medium, provided that you conspicuously and 191 + appropriately publish on each copy an appropriate copyright notice; 192 + keep intact all notices stating that this License and any 193 + non-permissive terms added in accord with section 7 apply to the code; 194 + keep intact all notices of the absence of any warranty; and give all 195 + recipients a copy of this License along with the Program. 196 + 197 + You may charge any price or no price for each copy that you convey, 198 + and you may offer support or warranty protection for a fee. 199 + 200 + ### 5. Conveying Modified Source Versions. 201 + 202 + You may convey a work based on the Program, or the modifications to 203 + produce it from the Program, in the form of source code under the 204 + terms of section 4, provided that you also meet all of these 205 + conditions: 206 + 207 + - a) The work must carry prominent notices stating that you modified 208 + it, and giving a relevant date. 209 + - b) The work must carry prominent notices stating that it is 210 + released under this License and any conditions added under 211 + section 7. This requirement modifies the requirement in section 4 212 + to "keep intact all notices". 213 + - c) You must license the entire work, as a whole, under this 214 + License to anyone who comes into possession of a copy. This 215 + License will therefore apply, along with any applicable section 7 216 + additional terms, to the whole of the work, and all its parts, 217 + regardless of how they are packaged. This License gives no 218 + permission to license the work in any other way, but it does not 219 + invalidate such permission if you have separately received it. 220 + - d) If the work has interactive user interfaces, each must display 221 + Appropriate Legal Notices; however, if the Program has interactive 222 + interfaces that do not display Appropriate Legal Notices, your 223 + work need not make them do so. 224 + 225 + A compilation of a covered work with other separate and independent 226 + works, which are not by their nature extensions of the covered work, 227 + and which are not combined with it such as to form a larger program, 228 + in or on a volume of a storage or distribution medium, is called an 229 + "aggregate" if the compilation and its resulting copyright are not 230 + used to limit the access or legal rights of the compilation's users 231 + beyond what the individual works permit. Inclusion of a covered work 232 + in an aggregate does not cause this License to apply to the other 233 + parts of the aggregate. 234 + 235 + ### 6. Conveying Non-Source Forms. 236 + 237 + You may convey a covered work in object code form under the terms of 238 + sections 4 and 5, provided that you also convey the machine-readable 239 + Corresponding Source under the terms of this License, in one of these 240 + ways: 241 + 242 + - a) Convey the object code in, or embodied in, a physical product 243 + (including a physical distribution medium), accompanied by the 244 + Corresponding Source fixed on a durable physical medium 245 + customarily used for software interchange. 246 + - b) Convey the object code in, or embodied in, a physical product 247 + (including a physical distribution medium), accompanied by a 248 + written offer, valid for at least three years and valid for as 249 + long as you offer spare parts or customer support for that product 250 + model, to give anyone who possesses the object code either (1) a 251 + copy of the Corresponding Source for all the software in the 252 + product that is covered by this License, on a durable physical 253 + medium customarily used for software interchange, for a price no 254 + more than your reasonable cost of physically performing this 255 + conveying of source, or (2) access to copy the Corresponding 256 + Source from a network server at no charge. 257 + - c) Convey individual copies of the object code with a copy of the 258 + written offer to provide the Corresponding Source. This 259 + alternative is allowed only occasionally and noncommercially, and 260 + only if you received the object code with such an offer, in accord 261 + with subsection 6b. 262 + - d) Convey the object code by offering access from a designated 263 + place (gratis or for a charge), and offer equivalent access to the 264 + Corresponding Source in the same way through the same place at no 265 + further charge. You need not require recipients to copy the 266 + Corresponding Source along with the object code. If the place to 267 + copy the object code is a network server, the Corresponding Source 268 + may be on a different server (operated by you or a third party) 269 + that supports equivalent copying facilities, provided you maintain 270 + clear directions next to the object code saying where to find the 271 + Corresponding Source. Regardless of what server hosts the 272 + Corresponding Source, you remain obligated to ensure that it is 273 + available for as long as needed to satisfy these requirements. 274 + - e) Convey the object code using peer-to-peer transmission, 275 + provided you inform other peers where the object code and 276 + Corresponding Source of the work are being offered to the general 277 + public at no charge under subsection 6d. 278 + 279 + A separable portion of the object code, whose source code is excluded 280 + from the Corresponding Source as a System Library, need not be 281 + included in conveying the object code work. 282 + 283 + A "User Product" is either (1) a "consumer product", which means any 284 + tangible personal property which is normally used for personal, 285 + family, or household purposes, or (2) anything designed or sold for 286 + incorporation into a dwelling. In determining whether a product is a 287 + consumer product, doubtful cases shall be resolved in favor of 288 + coverage. For a particular product received by a particular user, 289 + "normally used" refers to a typical or common use of that class of 290 + product, regardless of the status of the particular user or of the way 291 + in which the particular user actually uses, or expects or is expected 292 + to use, the product. A product is a consumer product regardless of 293 + whether the product has substantial commercial, industrial or 294 + non-consumer uses, unless such uses represent the only significant 295 + mode of use of the product. 296 + 297 + "Installation Information" for a User Product means any methods, 298 + procedures, authorization keys, or other information required to 299 + install and execute modified versions of a covered work in that User 300 + Product from a modified version of its Corresponding Source. The 301 + information must suffice to ensure that the continued functioning of 302 + the modified object code is in no case prevented or interfered with 303 + solely because modification has been made. 304 + 305 + If you convey an object code work under this section in, or with, or 306 + specifically for use in, a User Product, and the conveying occurs as 307 + part of a transaction in which the right of possession and use of the 308 + User Product is transferred to the recipient in perpetuity or for a 309 + fixed term (regardless of how the transaction is characterized), the 310 + Corresponding Source conveyed under this section must be accompanied 311 + by the Installation Information. But this requirement does not apply 312 + if neither you nor any third party retains the ability to install 313 + modified object code on the User Product (for example, the work has 314 + been installed in ROM). 315 + 316 + The requirement to provide Installation Information does not include a 317 + requirement to continue to provide support service, warranty, or 318 + updates for a work that has been modified or installed by the 319 + recipient, or for the User Product in which it has been modified or 320 + installed. Access to a network may be denied when the modification 321 + itself materially and adversely affects the operation of the network 322 + or violates the rules and protocols for communication across the 323 + network. 324 + 325 + Corresponding Source conveyed, and Installation Information provided, 326 + in accord with this section must be in a format that is publicly 327 + documented (and with an implementation available to the public in 328 + source code form), and must require no special password or key for 329 + unpacking, reading or copying. 330 + 331 + ### 7. Additional Terms. 332 + 333 + "Additional permissions" are terms that supplement the terms of this 334 + License by making exceptions from one or more of its conditions. 335 + Additional permissions that are applicable to the entire Program shall 336 + be treated as though they were included in this License, to the extent 337 + that they are valid under applicable law. If additional permissions 338 + apply only to part of the Program, that part may be used separately 339 + under those permissions, but the entire Program remains governed by 340 + this License without regard to the additional permissions. 341 + 342 + When you convey a copy of a covered work, you may at your option 343 + remove any additional permissions from that copy, or from any part of 344 + it. (Additional permissions may be written to require their own 345 + removal in certain cases when you modify the work.) You may place 346 + additional permissions on material, added by you to a covered work, 347 + for which you have or can give appropriate copyright permission. 348 + 349 + Notwithstanding any other provision of this License, for material you 350 + add to a covered work, you may (if authorized by the copyright holders 351 + of that material) supplement the terms of this License with terms: 352 + 353 + - a) Disclaiming warranty or limiting liability differently from the 354 + terms of sections 15 and 16 of this License; or 355 + - b) Requiring preservation of specified reasonable legal notices or 356 + author attributions in that material or in the Appropriate Legal 357 + Notices displayed by works containing it; or 358 + - c) Prohibiting misrepresentation of the origin of that material, 359 + or requiring that modified versions of such material be marked in 360 + reasonable ways as different from the original version; or 361 + - d) Limiting the use for publicity purposes of names of licensors 362 + or authors of the material; or 363 + - e) Declining to grant rights under trademark law for use of some 364 + trade names, trademarks, or service marks; or 365 + - f) Requiring indemnification of licensors and authors of that 366 + material by anyone who conveys the material (or modified versions 367 + of it) with contractual assumptions of liability to the recipient, 368 + for any liability that these contractual assumptions directly 369 + impose on those licensors and authors. 370 + 371 + All other non-permissive additional terms are considered "further 372 + restrictions" within the meaning of section 10. If the Program as you 373 + received it, or any part of it, contains a notice stating that it is 374 + governed by this License along with a term that is a further 375 + restriction, you may remove that term. If a license document contains 376 + a further restriction but permits relicensing or conveying under this 377 + License, you may add to a covered work material governed by the terms 378 + of that license document, provided that the further restriction does 379 + not survive such relicensing or conveying. 380 + 381 + If you add terms to a covered work in accord with this section, you 382 + must place, in the relevant source files, a statement of the 383 + additional terms that apply to those files, or a notice indicating 384 + where to find the applicable terms. 385 + 386 + Additional terms, permissive or non-permissive, may be stated in the 387 + form of a separately written license, or stated as exceptions; the 388 + above requirements apply either way. 389 + 390 + ### 8. Termination. 391 + 392 + You may not propagate or modify a covered work except as expressly 393 + provided under this License. Any attempt otherwise to propagate or 394 + modify it is void, and will automatically terminate your rights under 395 + this License (including any patent licenses granted under the third 396 + paragraph of section 11). 397 + 398 + However, if you cease all violation of this License, then your license 399 + from a particular copyright holder is reinstated (a) provisionally, 400 + unless and until the copyright holder explicitly and finally 401 + terminates your license, and (b) permanently, if the copyright holder 402 + fails to notify you of the violation by some reasonable means prior to 403 + 60 days after the cessation. 404 + 405 + Moreover, your license from a particular copyright holder is 406 + reinstated permanently if the copyright holder notifies you of the 407 + violation by some reasonable means, this is the first time you have 408 + received notice of violation of this License (for any work) from that 409 + copyright holder, and you cure the violation prior to 30 days after 410 + your receipt of the notice. 411 + 412 + Termination of your rights under this section does not terminate the 413 + licenses of parties who have received copies or rights from you under 414 + this License. If your rights have been terminated and not permanently 415 + reinstated, you do not qualify to receive new licenses for the same 416 + material under section 10. 417 + 418 + ### 9. Acceptance Not Required for Having Copies. 419 + 420 + You are not required to accept this License in order to receive or run 421 + a copy of the Program. Ancillary propagation of a covered work 422 + occurring solely as a consequence of using peer-to-peer transmission 423 + to receive a copy likewise does not require acceptance. However, 424 + nothing other than this License grants you permission to propagate or 425 + modify any covered work. These actions infringe copyright if you do 426 + not accept this License. Therefore, by modifying or propagating a 427 + covered work, you indicate your acceptance of this License to do so. 428 + 429 + ### 10. Automatic Licensing of Downstream Recipients. 430 + 431 + Each time you convey a covered work, the recipient automatically 432 + receives a license from the original licensors, to run, modify and 433 + propagate that work, subject to this License. You are not responsible 434 + for enforcing compliance by third parties with this License. 435 + 436 + An "entity transaction" is a transaction transferring control of an 437 + organization, or substantially all assets of one, or subdividing an 438 + organization, or merging organizations. If propagation of a covered 439 + work results from an entity transaction, each party to that 440 + transaction who receives a copy of the work also receives whatever 441 + licenses to the work the party's predecessor in interest had or could 442 + give under the previous paragraph, plus a right to possession of the 443 + Corresponding Source of the work from the predecessor in interest, if 444 + the predecessor has it or can get it with reasonable efforts. 445 + 446 + You may not impose any further restrictions on the exercise of the 447 + rights granted or affirmed under this License. For example, you may 448 + not impose a license fee, royalty, or other charge for exercise of 449 + rights granted under this License, and you may not initiate litigation 450 + (including a cross-claim or counterclaim in a lawsuit) alleging that 451 + any patent claim is infringed by making, using, selling, offering for 452 + sale, or importing the Program or any portion of it. 453 + 454 + ### 11. Patents. 455 + 456 + A "contributor" is a copyright holder who authorizes use under this 457 + License of the Program or a work on which the Program is based. The 458 + work thus licensed is called the contributor's "contributor version". 459 + 460 + A contributor's "essential patent claims" are all patent claims owned 461 + or controlled by the contributor, whether already acquired or 462 + hereafter acquired, that would be infringed by some manner, permitted 463 + by this License, of making, using, or selling its contributor version, 464 + but do not include claims that would be infringed only as a 465 + consequence of further modification of the contributor version. For 466 + purposes of this definition, "control" includes the right to grant 467 + patent sublicenses in a manner consistent with the requirements of 468 + this License. 469 + 470 + Each contributor grants you a non-exclusive, worldwide, royalty-free 471 + patent license under the contributor's essential patent claims, to 472 + make, use, sell, offer for sale, import and otherwise run, modify and 473 + propagate the contents of its contributor version. 474 + 475 + In the following three paragraphs, a "patent license" is any express 476 + agreement or commitment, however denominated, not to enforce a patent 477 + (such as an express permission to practice a patent or covenant not to 478 + sue for patent infringement). To "grant" such a patent license to a 479 + party means to make such an agreement or commitment not to enforce a 480 + patent against the party. 481 + 482 + If you convey a covered work, knowingly relying on a patent license, 483 + and the Corresponding Source of the work is not available for anyone 484 + to copy, free of charge and under the terms of this License, through a 485 + publicly available network server or other readily accessible means, 486 + then you must either (1) cause the Corresponding Source to be so 487 + available, or (2) arrange to deprive yourself of the benefit of the 488 + patent license for this particular work, or (3) arrange, in a manner 489 + consistent with the requirements of this License, to extend the patent 490 + license to downstream recipients. "Knowingly relying" means you have 491 + actual knowledge that, but for the patent license, your conveying the 492 + covered work in a country, or your recipient's use of the covered work 493 + in a country, would infringe one or more identifiable patents in that 494 + country that you have reason to believe are valid. 495 + 496 + If, pursuant to or in connection with a single transaction or 497 + arrangement, you convey, or propagate by procuring conveyance of, a 498 + covered work, and grant a patent license to some of the parties 499 + receiving the covered work authorizing them to use, propagate, modify 500 + or convey a specific copy of the covered work, then the patent license 501 + you grant is automatically extended to all recipients of the covered 502 + work and works based on it. 503 + 504 + A patent license is "discriminatory" if it does not include within the 505 + scope of its coverage, prohibits the exercise of, or is conditioned on 506 + the non-exercise of one or more of the rights that are specifically 507 + granted under this License. You may not convey a covered work if you 508 + are a party to an arrangement with a third party that is in the 509 + business of distributing software, under which you make payment to the 510 + third party based on the extent of your activity of conveying the 511 + work, and under which the third party grants, to any of the parties 512 + who would receive the covered work from you, a discriminatory patent 513 + license (a) in connection with copies of the covered work conveyed by 514 + you (or copies made from those copies), or (b) primarily for and in 515 + connection with specific products or compilations that contain the 516 + covered work, unless you entered into that arrangement, or that patent 517 + license was granted, prior to 28 March 2007. 518 + 519 + Nothing in this License shall be construed as excluding or limiting 520 + any implied license or other defenses to infringement that may 521 + otherwise be available to you under applicable patent law. 522 + 523 + ### 12. No Surrender of Others' Freedom. 524 + 525 + If conditions are imposed on you (whether by court order, agreement or 526 + otherwise) that contradict the conditions of this License, they do not 527 + excuse you from the conditions of this License. If you cannot convey a 528 + covered work so as to satisfy simultaneously your obligations under 529 + this License and any other pertinent obligations, then as a 530 + consequence you may not convey it at all. For example, if you agree to 531 + terms that obligate you to collect a royalty for further conveying 532 + from those to whom you convey the Program, the only way you could 533 + satisfy both those terms and this License would be to refrain entirely 534 + from conveying the Program. 535 + 536 + ### 13. Remote Network Interaction; Use with the GNU General Public License. 537 + 538 + Notwithstanding any other provision of this License, if you modify the 539 + Program, your modified version must prominently offer all users 540 + interacting with it remotely through a computer network (if your 541 + version supports such interaction) an opportunity to receive the 542 + Corresponding Source of your version by providing access to the 543 + Corresponding Source from a network server at no charge, through some 544 + standard or customary means of facilitating copying of software. This 545 + Corresponding Source shall include the Corresponding Source for any 546 + work covered by version 3 of the GNU General Public License that is 547 + incorporated pursuant to the following paragraph. 548 + 549 + Notwithstanding any other provision of this License, you have 550 + permission to link or combine any covered work with a work licensed 551 + under version 3 of the GNU General Public License into a single 552 + combined work, and to convey the resulting work. The terms of this 553 + License will continue to apply to the part which is the covered work, 554 + but the work with which it is combined will remain governed by version 555 + 3 of the GNU General Public License. 556 + 557 + ### 14. Revised Versions of this License. 558 + 559 + The Free Software Foundation may publish revised and/or new versions 560 + of the GNU Affero General Public License from time to time. Such new 561 + versions will be similar in spirit to the present version, but may 562 + differ in detail to address new problems or concerns. 563 + 564 + Each version is given a distinguishing version number. If the Program 565 + specifies that a certain numbered version of the GNU Affero General 566 + Public License "or any later version" applies to it, you have the 567 + option of following the terms and conditions either of that numbered 568 + version or of any later version published by the Free Software 569 + Foundation. If the Program does not specify a version number of the 570 + GNU Affero General Public License, you may choose any version ever 571 + published by the Free Software Foundation. 572 + 573 + If the Program specifies that a proxy can decide which future versions 574 + of the GNU Affero General Public License can be used, that proxy's 575 + public statement of acceptance of a version permanently authorizes you 576 + to choose that version for the Program. 577 + 578 + Later license versions may give you additional or different 579 + permissions. However, no additional obligations are imposed on any 580 + author or copyright holder as a result of your choosing to follow a 581 + later version. 582 + 583 + ### 15. Disclaimer of Warranty. 584 + 585 + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 586 + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 587 + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT 588 + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT 589 + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 590 + A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND 591 + PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE 592 + DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR 593 + CORRECTION. 594 + 595 + ### 16. Limitation of Liability. 596 + 597 + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 598 + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR 599 + CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 600 + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES 601 + ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT 602 + NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR 603 + LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM 604 + TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER 605 + PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 606 + 607 + ### 17. Interpretation of Sections 15 and 16. 608 + 609 + If the disclaimer of warranty and limitation of liability provided 610 + above cannot be given local legal effect according to their terms, 611 + reviewing courts shall apply local law that most closely approximates 612 + an absolute waiver of all civil liability in connection with the 613 + Program, unless a warranty or assumption of liability accompanies a 614 + copy of the Program in return for a fee. 615 + 616 + END OF TERMS AND CONDITIONS 617 + 618 + ## How to Apply These Terms to Your New Programs 619 + 620 + If you develop a new program, and you want it to be of the greatest 621 + possible use to the public, the best way to achieve this is to make it 622 + free software which everyone can redistribute and change under these 623 + terms. 624 + 625 + To do so, attach the following notices to the program. It is safest to 626 + attach them to the start of each source file to most effectively state 627 + the exclusion of warranty; and each file should have at least the 628 + "copyright" line and a pointer to where the full notice is found. 629 + 630 + <one line to give the program's name and a brief idea of what it does.> 631 + Copyright (C) <year> <name of author> 632 + 633 + This program is free software: you can redistribute it and/or modify 634 + it under the terms of the GNU Affero General Public License as 635 + published by the Free Software Foundation, either version 3 of the 636 + License, or (at your option) any later version. 637 + 638 + This program is distributed in the hope that it will be useful, 639 + but WITHOUT ANY WARRANTY; without even the implied warranty of 640 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 641 + GNU Affero General Public License for more details. 642 + 643 + You should have received a copy of the GNU Affero General Public License 644 + along with this program. If not, see <https://www.gnu.org/licenses/>. 645 + 646 + Also add information on how to contact you by electronic and paper 647 + mail. 648 + 649 + If your software can interact with users remotely through a computer 650 + network, you should also make sure that it provides a way for users to 651 + get its source. For example, if your program is a web application, its 652 + interface could display a "Source" link that leads users to an archive 653 + of the code. There are many ways you could offer source, and different 654 + solutions will be better for different programs; see section 13 for 655 + the specific requirements. 656 + 657 + You should also get your employer (if you work as a programmer) or 658 + school, if any, to sign a "copyright disclaimer" for the program, if 659 + necessary. For more information on this, and how to apply and follow 660 + the GNU AGPL, see <https://www.gnu.org/licenses/>.
+60
README.md
··· 1 + Personal homepage at [www.helpimnotdrowning.net](https://www.helpimnotdrowning.net/) 2 + 3 + Exposes port 8081 4 + 5 + Build container with 6 + ```pwsh 7 + sudo docker build -t helpimnotdrowning/nkk . 8 + ``` 9 + 10 + Run with the following compose definition: 11 + ```yml 12 + services: 13 + # ... 14 + helpimnotdrowning_net: 15 + image: helpimnotdrowning/nkk 16 + container_name: helpimnotdrowning_net 17 + restart: unless-stopped 18 + ports: 19 + - '8081:8081' 20 + ``` 21 + 22 + Dependencies are purposefully distributed unminified in support of the 23 + [#ViewSource affordance](https://htmx.org/essays/right-click-view-source/) 24 + (in-transit compression is great anyways!) 25 + 26 + Fonts at `public/font` generated with my `auto-font-splitter` script 27 + ([Forgejo](https://git.helpimnotdrowning.net/helpimnotdrowning/auto-font-splitter/), 28 + [GitHub](https://github.com/helpimnotdrowning/auto-font-splitter/)), using my 29 + fork of `font-splitter` 30 + ([Forgejo](https://git.helpimnotdrowning.net/helpimnotdrowning/font-splitter/), 31 + [GitHub](https://github.com/helpimnotdrowning/font-splitter)) 32 + 33 + Backend: PowerShell, [Pode](https://github.com/Badgerati/Pode), Mizumiya 34 + ([Forgejo](https://git.helpimnotdrowning.net/helpimnotdrowning/Mizumiya), 35 + [GitHub](https://github.com/helpimnotdrowning/Mizumiya)) 36 + 37 + Frontend: HTMX, Tailwind, prism.js (syntax highlighting) 38 + 39 + ## Licensing 40 + Site code and modifications to vendored library code (except the IBM Plex font; 41 + see below) is distrbuted under the AGPLv3 license ([LICENSE.md](LICENSE.md)) 42 + 43 + External licenses listed at [LICENSE.external.md](LICENSE.external.md): 44 + 45 + The [prism.js](https://prismjs.com/) library 46 + ([upstream](https://github.com/PrismJS/prism), local [library](public/prism.js), 47 + [syntax files](public/prism/grammars/)) is vendored under the MIT license. 48 + 49 + The [htmx](https://htmx.org/) library 50 + ([upstream](https://github.com/bigskysoftware/htmx), local 51 + [library](public/htmx.js)) is vendored under the BSD-0 license. 52 + 53 + Members of the [IBM Plex font](https://www.ibm.com/plex/) 54 + ([upstream](https://github.com/IBM/plex), local [font](public/font/)) family 55 + (Mono and Sans JP) are modified (split) and distributed under the OFL 1.1. 56 + 57 + The code theme used in the prism.js style is based off the 58 + [Ancient One Dark](https://github.com/sigvt/ancient-one-dark) (local 59 + [theme](tailwind/01.prismjs.tw.css)) "Violet" theme, which is licenced under the 60 + MIT license.
+108
Routes.ps1
··· 1 + <# 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + #> 17 + 18 + Import-Module Mizumiya 19 + Import-Module PSParseHTML -Function Optimize-HTML 20 + 21 + if (-not (Get-Command tailwindcss -ErrorAction SilentlyContinue)) { 22 + _warn "The tailwindcss binary is missing. Source styles will not be synced with the public style.css." 23 + _warn "This is only needed during development, don't worry about it in production" 24 + } else { 25 + Add-PodeFileWatcher -Path $PSScriptRoot -Exclude "$PSScriptRoot/public" -ScriptBlock { 26 + tailwindcss --input $PSScriptRoot/tailwind/style.tw.css --output $PSScriptRoot/public/style.css 27 + } 28 + } 29 + 30 + # Use-PodeScript -Path functions.ps1 # https://github.com/Badgerati/Pode/issues/1582 31 + Use-PodeScript -Path $PSScriptRoot/functions.ps1 32 + 33 + New-PodeLoggingMethod -Custom -ScriptBlock { 34 + param ($Item) 35 + 36 + $Date = $Item.UtcDate | Get-Date -Format s 37 + $Query = $Item.Request.Query -eq '-' ? '' : '?' + $Item.Request.Query 38 + 39 + $PrevCol = $PSStyle.Reset + $PSStyle.Foreground.BrightBlack 40 + switch ($Item.Response.StatusCode) { 41 + {$_ -ge 400} { $Col = $PSStyle.Foreground.BrightRed } 42 + {$_ -ge 500} { $Col = $PSStyle.Foreground.White + $PSStyle.Background.Red } 43 + default { $Col = '' } 44 + } 45 + 46 + $RequestLine = "$($Item.Host) $($Item.Request.Method) $($PSStyle.Foreground.White)$($Item.Request.Resource)$Query$PrevCol $($Item.Request.Protocol) by ""$($Item.Request.Agent)""" 47 + $ResponseLine = "$Col$($Item.Response.StatusCode) $($Item.Response.StatusDescription)$PrevCol $(_format_size $Item.Response.Size)" 48 + 49 + _request "$Date | $RequestLine >>> $ResponseLine" 50 + } | Enable-PodeRequestLogging -Raw 51 + 52 + New-PodeLoggingMethod -Custom -ScriptBlock { 53 + param ($Item) 54 + 55 + _warn "$($Item.Date | Get-Date -Format s) | $($Item.Level) ($($Item.Server):$($Item.ThreadId)) | $($Item.Category): $($Item.Message)" 56 + $Item.StackTrace -split "`n" | % { _warn $_ } 57 + } | Enable-PodeErrorLogging -Raw -Levels Error, Warning, Informational 58 + 59 + Add-PodeEndpoint -Address * -Port 8081 -Protocol HTTP 60 + 61 + Set-PodeViewEngine -Type Mizumiya -Extension ps1 -ScriptBlock { 62 + param ($Path, $Data) 63 + . ./functions.ps1 64 + 65 + ([String] (. $Path $Data)) | Optimize-HTML 66 + } 67 + 68 + Add-PodeRoute -Method GET -Path /random-splash -ScriptBlock { 69 + Write-PodeViewResponse -Path random_splash 70 + } 71 + 72 + Add-PodeRoute -Method GET -Path /sayings -ScriptBlock { 73 + Write-PodeViewResponse -Path sayings -Data @{ SayingsRoot = (Join-Path $PSScriptRoot 'sayings') } 74 + } 75 + 76 + Add-PodeRoute -Method GET -Path /sayings/img/* -ScriptBlock { 77 + # terminate with / to avoid something like .../NKK/... <-> .../NKKsomewhere/... 78 + $Root = $PSScriptRoot + '/' 79 + $Path = $WebEvent.Path 80 + $JoinedPath = Join-Path $Root $Path 81 + 82 + if (-not (_check_joinedpath_is_based $Root $JoinedPath)) { 83 + _warn "/sayings/img/*: query for $JoinedPath ($Path) refused!" 84 + Set-PodeResponseStatus -Code 404 85 + return 86 + } 87 + 88 + Write-PodeFileResponse -Path $JoinedPath 89 + } 90 + 91 + Add-PodeRoute -Method GET -Path /sayings/* -ScriptBlock { 92 + # terminate with / to avoid something like .../NKK/... <-> .../NKKsomewhere/... 93 + $Root = $PSScriptRoot + '/' 94 + $Path = $WebEvent.Path + '.md' 95 + $JoinedPath = Join-Path $Root $Path 96 + 97 + if (-not (_check_joinedpath_is_based $Root $JoinedPath)) { 98 + _warn "/sayings/*: query for $JoinedPath ($Path) refused!" 99 + Set-PodeResponseStatus -Code 404 100 + return 101 + } 102 + 103 + Write-PodeViewResponse -Path sayings_post -Data @{ Path=$JoinedPath } 104 + } 105 + 106 + Add-PodeRoute -Method GET -Path / -ScriptBlock { 107 + Write-PodeViewResponse -Path index 108 + }
+47
Server.ps1
··· 1 + #!/bin/pwsh 2 + <# 3 + This file is part of NKK. 4 + 5 + NKK is free software: you can redistribute it and/or modify it under the 6 + terms of the GNU Affero General Public License as published by the Free 7 + Software Foundation, either version 3 of the License, or (at your option) 8 + any later version. 9 + 10 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 11 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 13 + more details. 14 + 15 + You should have received a copy of the GNU Affero General Public License 16 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 17 + #> 18 + 19 + Import-Module Pode 20 + Import-Module Mizumiya 21 + 22 + # its called we do a little bit of trolling 23 + . (Get-Module Pode) { 24 + # TLDR: purposefully and painfully trample the safety of psd1 files 25 + # apparently, you can execute code in a module's scope, which allows us to 26 + # hot-patch away the little obstacle of not being able to use "dynamic 27 + # expressions" in the psd1 config file. the whole point of psd1 files is 28 + # that they are a *safe* way to load data in powershell format, but I don't 29 + # really care about that. personally, this feels akin to beating the runtime 30 + # over the head with a wrench 31 + # further reading: https://seeminglyscience.github.io/powershell/2017/09/30/invocation-operators-states-and-scopes 32 + function Import-PowerShellDataFile { 33 + [CmdletBinding()] 34 + param ( 35 + [String] $Path 36 + ) 37 + 38 + return (Invoke-Expression -Command (Get-Content -LiteralPath $Path -Raw) -ErrorAction Stop) 39 + } 40 + } 41 + 42 + . ./functions.ps1 43 + 44 + Start-PodeServer { 45 + # allow dynamic reload of routes without a full server restart (do Ctrl+R !) 46 + . ./Routes.ps1 47 + }
+50
errors/default.html.ps1
··· 1 + <# 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + #> 17 + 18 + $Root = $Data.Root 19 + $Path = $Data.Path 20 + 21 + doctype 22 + 23 + html -class 'from-red-300! to-red-500!' { 24 + head { 25 + link -Rel stylesheet -Href '/style.css' 26 + 27 + _scripts 28 + meta -Name darkreader-lock 29 + } 30 + 31 + body { 32 + _header 33 + 34 + div -Class "n-box text-center" { 35 + h1 { 36 + span -Class 'text-6xl' { $Data.Status.Code } 37 + br 38 + span -Class 'text-4xl' { $Data.Status.Description } 39 + } 40 + 41 + hr 42 + 43 + "OOPSIE WOOPSIE!! Uwu We made a fucky wucky!! A wittle fucko boingo! The code monkeys at our headquarters are working VEWY HAWD to fix this!" 44 + 45 + hr 46 + 47 + a -Href '/' -Class 'clickable p-4' { 'go home......' } 48 + } 49 + } 50 + }
+158
functions.ps1
··· 1 + <# 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + #> 17 + 18 + Import-Module Pode 19 + Import-Module Mizumiya 20 + 21 + function _log { 22 + param( 23 + [Parameter(ValueFromPipeline)] 24 + $Message, 25 + [ValidateSet('Request', 'Information', 'Warning', 'Fatal')] 26 + $Type 27 + ) 28 + 29 + switch ($Type) { 30 + 'Request' { 31 + $Style = $PSStyle.Foreground.BrightBlack 32 + } 33 + 34 + 'Information' { 35 + $Style = '' 36 + } 37 + 38 + 'Warning' { 39 + $Style = $PSStyle.Formatting.Warning 40 + } 41 + 42 + 'Fatal' { 43 + $Style = $PSStyle.Formatting.Error 44 + } 45 + } 46 + 47 + Write-Host "$Style[NKK/$Type] $Message$($PSStyle.Reset)" 48 + if ($Type -eq 'Fatal') { throw $Message } 49 + } 50 + 51 + function _request { 52 + param( 53 + [Parameter(ValueFromPipeline)] 54 + $Message 55 + ) 56 + 57 + _log -Type Request -Message $Message 58 + } 59 + 60 + function _info { 61 + param( 62 + [Parameter(ValueFromPipeline)] 63 + $Message 64 + ) 65 + 66 + _log -Type Information -Message $Message 67 + } 68 + 69 + function _warn { 70 + param( 71 + [Parameter(ValueFromPipeline)] 72 + $Message 73 + ) 74 + 75 + _log -Type Warning -Message $Message 76 + } 77 + 78 + function _fatal { 79 + param ( 80 + [Parameter(ValueFromPipeline)] 81 + $Message 82 + ) 83 + 84 + _log -Type Fatal $Message 85 + } 86 + 87 + function _get_splash { 88 + param ( $Index ) 89 + 90 + if ($Index -and $Index -gt 0) { 91 + return (Get-PodeConfig).NKK.Splashes | Select-Object -Index $Index | ConvertFrom-Markdown | % Html 92 + } 93 + 94 + return (Get-PodeConfig).NKK.Splashes | Get-Random | ConvertFrom-Markdown | % Html 95 + } 96 + 97 + function _format_size ([uint64] $size) { 98 + switch ($Size) { 99 + {$size -gt 1tb} { return '{0:n2} TiB' -f ($size/1tb) } 100 + {$size -gt 1gb} { return '{0:n2} GiB' -f ($size/1gb) } 101 + {$size -gt 1mb} { return '{0:n2} MiB' -f ($size/1mb) } 102 + {$size -gt 1kb} { return '{0:n2} KiB' -f ($size/1kb) } 103 + default { return "$size B" } 104 + } 105 + } 106 + 107 + function _check_joinedpath_is_based ($Root, $JoinedPath) { 108 + $Resolved = Get-Item -LiteralPath $JoinedPath -ErrorAction Ignore 109 + 110 + return ($null -ne $Resolved -and $Resolved.FullName.StartsWith($Root)) 111 + } 112 + 113 + function _scripts { 114 + script -Src /htmx.js 115 + # meta -Name htmx-config -Content (@{ scrollIntoViewOnBoost=$false; defaultHideShowStrategy='twDisplay' }|ConvertTo-Json -Compress) 116 + meta -Name htmx-config -Content (@{ scrollIntoViewOnBoost=$false }|ConvertTo-Json -Compress) 117 + } 118 + 119 + function _header { 120 + header -Class "n-box clear-n-box flex flex-row! items-center mb-1!" { 121 + # img -Class "rounded-md pfp" -Src https://avatars.githubusercontent.com/helpimnotdrowning -Alt "Profile picture" -Width 70 122 + img -Class "rounded-md pfp" -Src /user.webp -Alt "Profile picture" -Width 70 123 + 124 + div -Class "ms-6" { 125 + span -Class "text-4xl" { 'helpimnotdrowning' } 126 + div -Id splash -HxGet /random-splash ` 127 + -HxSwap innerText ` 128 + -HxTrigger 'load,click' ` 129 + { p 'missingno' } 130 + } 131 + } 132 + 133 + nav -Class 'n-box mt-2! w-full' { 134 + div { 135 + div -Class 'float-left flex gap-4' { 136 + a -Href / { 'Home' } 137 + a -Href /sayings { 'Posts' } 138 + } 139 + div -Class 'float-right' { 140 + a ` 141 + -Class 'text-blue-600 underline' ` 142 + -Href 'https://git.helpimnotdrowning.net/helpimnotdrowning/NKK' ` 143 + -Target _blank ` 144 + { 145 + 'running helpimnotdrowning/NKK' 146 + } 147 + } 148 + } 149 + } 150 + } 151 + 152 + function _parse_saying_header { 153 + param ([IO.FileInfo] $Path) 154 + $Data = Get-Content $Path | Select-Object -First 1 | ConvertFrom-Json -AsHashtable 155 + $Data.Path = (Join-Path /sayings $Path.BaseName) 156 + 157 + return $Data 158 + }
public/favicon.ico

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/001.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/002.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/003.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/004.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/005.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/006.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/007.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/008.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/009.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/010.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/011.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/012.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/013.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/014.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/015.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/016.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/017.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/018.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/019.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/020.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/021.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/022.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/023.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/024.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/025.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/026.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/027.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/028.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/029.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexMono-Regular/030.woff2

This is a binary file and will not be displayed.

+275
public/font/IBMPlexMono-Regular/IBMPlexMono-Regular.css
··· 1 + /** 2 + * Font Splitter 3 + * https://github.com/VdustR/font-splitter 4 + * forked https://github.com/helpimnotdrowning/font-splitter 5 + */ 6 + 7 + @font-face { 8 + font-family: IBM Plex Mono; 9 + font-style: normal; 10 + font-weight: 400; 11 + font-display: swap; 12 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/001.woff2) format('woff2'); 13 + unicode-range: U+0-7e; 14 + } 15 + 16 + @font-face { 17 + font-family: IBM Plex Mono; 18 + font-style: normal; 19 + font-weight: 400; 20 + font-display: swap; 21 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/002.woff2) format('woff2'); 22 + unicode-range: U+80-ff; 23 + } 24 + 25 + @font-face { 26 + font-family: IBM Plex Mono; 27 + font-style: normal; 28 + font-weight: 400; 29 + font-display: swap; 30 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/003.woff2) format('woff2'); 31 + unicode-range: U+100-17f; 32 + } 33 + 34 + @font-face { 35 + font-family: IBM Plex Mono; 36 + font-style: normal; 37 + font-weight: 400; 38 + font-display: swap; 39 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/004.woff2) format('woff2'); 40 + unicode-range: U+18f-237; 41 + } 42 + 43 + @font-face { 44 + font-family: IBM Plex Mono; 45 + font-style: normal; 46 + font-weight: 400; 47 + font-display: swap; 48 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/005.woff2) format('woff2'); 49 + unicode-range: U+259; 50 + } 51 + 52 + @font-face { 53 + font-family: IBM Plex Mono; 54 + font-style: normal; 55 + font-weight: 400; 56 + font-display: swap; 57 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/006.woff2) format('woff2'); 58 + unicode-range: U+2bb-2dd; 59 + } 60 + 61 + @font-face { 62 + font-family: IBM Plex Mono; 63 + font-style: normal; 64 + font-weight: 400; 65 + font-display: swap; 66 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/007.woff2) format('woff2'); 67 + unicode-range: U+300-328; 68 + } 69 + 70 + @font-face { 71 + font-family: IBM Plex Mono; 72 + font-style: normal; 73 + font-weight: 400; 74 + font-display: swap; 75 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/008.woff2) format('woff2'); 76 + unicode-range: U+3c0; 77 + } 78 + 79 + @font-face { 80 + font-family: IBM Plex Mono; 81 + font-style: normal; 82 + font-weight: 400; 83 + font-display: swap; 84 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/009.woff2) format('woff2'); 85 + unicode-range: U+400-4a7; 86 + } 87 + 88 + @font-face { 89 + font-family: IBM Plex Mono; 90 + font-style: normal; 91 + font-weight: 400; 92 + font-display: swap; 93 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/010.woff2) format('woff2'); 94 + unicode-range: U+4a8-4f9; 95 + } 96 + 97 + @font-face { 98 + font-family: IBM Plex Mono; 99 + font-style: normal; 100 + font-weight: 400; 101 + font-display: swap; 102 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/011.woff2) format('woff2'); 103 + unicode-range: U+524-525; 104 + } 105 + 106 + @font-face { 107 + font-family: IBM Plex Mono; 108 + font-style: normal; 109 + font-weight: 400; 110 + font-display: swap; 111 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/012.woff2) format('woff2'); 112 + unicode-range: U+e3f; 113 + } 114 + 115 + @font-face { 116 + font-family: IBM Plex Mono; 117 + font-style: normal; 118 + font-weight: 400; 119 + font-display: swap; 120 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/013.woff2) format('woff2'); 121 + unicode-range: U+1e80-1ef9; 122 + } 123 + 124 + @font-face { 125 + font-family: IBM Plex Mono; 126 + font-style: normal; 127 + font-weight: 400; 128 + font-display: swap; 129 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/014.woff2) format('woff2'); 130 + unicode-range: U+2000-205f; 131 + } 132 + 133 + @font-face { 134 + font-family: IBM Plex Mono; 135 + font-style: normal; 136 + font-weight: 400; 137 + font-display: swap; 138 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/015.woff2) format('woff2'); 139 + unicode-range: U+2070-2089; 140 + } 141 + 142 + @font-face { 143 + font-family: IBM Plex Mono; 144 + font-style: normal; 145 + font-weight: 400; 146 + font-display: swap; 147 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/016.woff2) format('woff2'); 148 + unicode-range: U+20a1-20bf; 149 + } 150 + 151 + @font-face { 152 + font-family: IBM Plex Mono; 153 + font-style: normal; 154 + font-weight: 400; 155 + font-display: swap; 156 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/017.woff2) format('woff2'); 157 + unicode-range: U+2113-212e; 158 + } 159 + 160 + @font-face { 161 + font-family: IBM Plex Mono; 162 + font-style: normal; 163 + font-weight: 400; 164 + font-display: swap; 165 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/018.woff2) format('woff2'); 166 + unicode-range: U+2150-215e; 167 + } 168 + 169 + @font-face { 170 + font-family: IBM Plex Mono; 171 + font-style: normal; 172 + font-weight: 400; 173 + font-display: swap; 174 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/019.woff2) format('woff2'); 175 + unicode-range: U+2190-21c6; 176 + } 177 + 178 + @font-face { 179 + font-family: IBM Plex Mono; 180 + font-style: normal; 181 + font-weight: 400; 182 + font-display: swap; 183 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/020.woff2) format('woff2'); 184 + unicode-range: U+2202-2265; 185 + } 186 + 187 + @font-face { 188 + font-family: IBM Plex Mono; 189 + font-style: normal; 190 + font-weight: 400; 191 + font-display: swap; 192 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/021.woff2) format('woff2'); 193 + unicode-range: U+2500-257f; 194 + } 195 + 196 + @font-face { 197 + font-family: IBM Plex Mono; 198 + font-style: normal; 199 + font-weight: 400; 200 + font-display: swap; 201 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/022.woff2) format('woff2'); 202 + unicode-range: U+2580-259f; 203 + } 204 + 205 + @font-face { 206 + font-family: IBM Plex Mono; 207 + font-style: normal; 208 + font-weight: 400; 209 + font-display: swap; 210 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/023.woff2) format('woff2'); 211 + unicode-range: U+25ca; 212 + } 213 + 214 + @font-face { 215 + font-family: IBM Plex Mono; 216 + font-style: normal; 217 + font-weight: 400; 218 + font-display: swap; 219 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/024.woff2) format('woff2'); 220 + unicode-range: U+2713-274c; 221 + } 222 + 223 + @font-face { 224 + font-family: IBM Plex Mono; 225 + font-style: normal; 226 + font-weight: 400; 227 + font-display: swap; 228 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/025.woff2) format('woff2'); 229 + unicode-range: U+2b0e-2b11; 230 + } 231 + 232 + @font-face { 233 + font-family: IBM Plex Mono; 234 + font-style: normal; 235 + font-weight: 400; 236 + font-display: swap; 237 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/026.woff2) format('woff2'); 238 + unicode-range: U+3000; 239 + } 240 + 241 + @font-face { 242 + font-family: IBM Plex Mono; 243 + font-style: normal; 244 + font-weight: 400; 245 + font-display: swap; 246 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/027.woff2) format('woff2'); 247 + unicode-range: U+f6d7-f6d8; 248 + } 249 + 250 + @font-face { 251 + font-family: IBM Plex Mono; 252 + font-style: normal; 253 + font-weight: 400; 254 + font-display: swap; 255 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/028.woff2) format('woff2'); 256 + unicode-range: U+fb01-fb02; 257 + } 258 + 259 + @font-face { 260 + font-family: IBM Plex Mono; 261 + font-style: normal; 262 + font-weight: 400; 263 + font-display: swap; 264 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/029.woff2) format('woff2'); 265 + unicode-range: U+feff; 266 + } 267 + 268 + @font-face { 269 + font-family: IBM Plex Mono; 270 + font-style: normal; 271 + font-weight: 400; 272 + font-display: swap; 273 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/030.woff2) format('woff2'); 274 + unicode-range: U+fffd; 275 + }
+30
public/font/IBMPlexMono-Regular/list
··· 1 + 1 IBMPlexMono-Regular.Basic-Latin.woff2 2 + 2 IBMPlexMono-Regular.Latin-1-Supplement.woff2 3 + 3 IBMPlexMono-Regular.Latin-Extended-A.woff2 4 + 4 IBMPlexMono-Regular.Latin-Extended-B.woff2 5 + 5 IBMPlexMono-Regular.IPA-Extensions.woff2 6 + 6 IBMPlexMono-Regular.Spacing-Modifier-Letters.woff2 7 + 7 IBMPlexMono-Regular.Combining-Diacritical-Marks.woff2 8 + 8 IBMPlexMono-Regular.Greek-and-Coptic.woff2 9 + 9 IBMPlexMono-Regular.Cyrillic-1.woff2 10 + 10 IBMPlexMono-Regular.Cyrillic-2.woff2 11 + 11 IBMPlexMono-Regular.Cyrillic-Supplement.woff2 12 + 12 IBMPlexMono-Regular.Thai.woff2 13 + 13 IBMPlexMono-Regular.Latin-Extended-Additional.woff2 14 + 14 IBMPlexMono-Regular.General-Punctuation.woff2 15 + 15 IBMPlexMono-Regular.Superscripts-and-Subscripts.woff2 16 + 16 IBMPlexMono-Regular.Currency-Symbols.woff2 17 + 17 IBMPlexMono-Regular.Letterlike-Symbols.woff2 18 + 18 IBMPlexMono-Regular.Number-Forms.woff2 19 + 19 IBMPlexMono-Regular.Arrows.woff2 20 + 20 IBMPlexMono-Regular.Mathematical-Operators.woff2 21 + 21 IBMPlexMono-Regular.Box-Drawing.woff2 22 + 22 IBMPlexMono-Regular.Block-Elements.woff2 23 + 23 IBMPlexMono-Regular.Geometric-Shapes.woff2 24 + 24 IBMPlexMono-Regular.Dingbats.woff2 25 + 25 IBMPlexMono-Regular.Miscellaneous-Symbols-and-Arrows.woff2 26 + 26 IBMPlexMono-Regular.CJK-Symbols-and-Punctuation.woff2 27 + 27 IBMPlexMono-Regular.Private-Use-Area.woff2 28 + 28 IBMPlexMono-Regular.Alphabetic-Presentation-Forms.woff2 29 + 29 IBMPlexMono-Regular.Arabic-Presentation-Forms-B.woff2 30 + 30 IBMPlexMono-Regular.Specials.woff2
public/font/IBMPlexSansJP-Bold/001.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/002.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/003.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/004.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/005.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/006.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/007.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/008.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/009.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/010.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/011.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/012.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/013.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/014.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/015.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/016.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/017.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/018.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/019.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/020.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/021.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/022.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/023.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/024.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/025.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/026.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/027.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/028.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/029.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/030.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/031.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/032.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/033.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/034.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/035.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/036.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/037.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/038.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/039.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/040.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/041.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/042.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/043.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/044.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/045.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/046.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/047.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/048.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/049.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/050.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/051.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/052.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/053.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/054.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/055.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/056.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/057.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/058.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/059.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/060.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/061.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/062.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/063.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/064.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/065.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/066.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/067.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/068.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/069.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/070.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/071.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/072.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/073.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/074.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/075.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/076.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/077.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/078.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/079.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/080.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/081.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/082.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/083.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/084.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/085.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/086.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/087.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/088.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/089.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/090.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/091.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/092.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/093.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/094.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/095.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/096.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/097.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/098.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/099.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/100.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/101.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/102.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/103.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/104.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/105.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/106.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/107.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/108.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/109.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/110.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/111.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/112.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/113.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/114.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/115.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/116.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/117.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/118.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/119.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/120.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/121.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/122.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/123.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/124.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/125.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/126.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/127.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/128.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/129.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/130.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/131.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/132.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/133.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/134.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/135.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/136.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/137.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/138.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/139.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/140.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/141.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/142.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/143.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/144.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/145.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/146.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/147.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/148.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/149.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/150.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/151.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/152.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/153.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/154.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/155.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/156.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Bold/157.woff2

This is a binary file and will not be displayed.

+1418
public/font/IBMPlexSansJP-Bold/IBMPlexSansJP-Bold.css
··· 1 + /** 2 + * Font Splitter 3 + * https://github.com/VdustR/font-splitter 4 + * forked https://github.com/helpimnotdrowning/font-splitter 5 + */ 6 + 7 + @font-face { 8 + font-family: IBM Plex Sans JP; 9 + font-style: normal; 10 + font-weight: 700; 11 + font-display: swap; 12 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/001.woff2) format('woff2'); 13 + unicode-range: U+20-7e; 14 + } 15 + 16 + @font-face { 17 + font-family: IBM Plex Sans JP; 18 + font-style: normal; 19 + font-weight: 700; 20 + font-display: swap; 21 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/002.woff2) format('woff2'); 22 + unicode-range: U+a0-ff; 23 + } 24 + 25 + @font-face { 26 + font-family: IBM Plex Sans JP; 27 + font-style: normal; 28 + font-weight: 700; 29 + font-display: swap; 30 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/003.woff2) format('woff2'); 31 + unicode-range: U+100-17e; 32 + } 33 + 34 + @font-face { 35 + font-family: IBM Plex Sans JP; 36 + font-style: normal; 37 + font-weight: 700; 38 + font-display: swap; 39 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/004.woff2) format('woff2'); 40 + unicode-range: U+192-237; 41 + } 42 + 43 + @font-face { 44 + font-family: IBM Plex Sans JP; 45 + font-style: normal; 46 + font-weight: 700; 47 + font-display: swap; 48 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/005.woff2) format('woff2'); 49 + unicode-range: U+250-2a2; 50 + } 51 + 52 + @font-face { 53 + font-family: IBM Plex Sans JP; 54 + font-style: normal; 55 + font-weight: 700; 56 + font-display: swap; 57 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/006.woff2) format('woff2'); 58 + unicode-range: U+2b0-2e9; 59 + } 60 + 61 + @font-face { 62 + font-family: IBM Plex Sans JP; 63 + font-style: normal; 64 + font-weight: 700; 65 + font-display: swap; 66 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/007.woff2) format('woff2'); 67 + unicode-range: U+300-361; 68 + } 69 + 70 + @font-face { 71 + font-family: IBM Plex Sans JP; 72 + font-style: normal; 73 + font-weight: 700; 74 + font-display: swap; 75 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/008.woff2) format('woff2'); 76 + unicode-range: U+384-3db; 77 + } 78 + 79 + @font-face { 80 + font-family: IBM Plex Sans JP; 81 + font-style: normal; 82 + font-weight: 700; 83 + font-display: swap; 84 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/009.woff2) format('woff2'); 85 + unicode-range: U+401-45f; 86 + } 87 + 88 + @font-face { 89 + font-family: IBM Plex Sans JP; 90 + font-style: normal; 91 + font-weight: 700; 92 + font-display: swap; 93 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/010.woff2) format('woff2'); 94 + unicode-range: U+1e3e-1ebd; 95 + } 96 + 97 + @font-face { 98 + font-family: IBM Plex Sans JP; 99 + font-style: normal; 100 + font-weight: 700; 101 + font-display: swap; 102 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/011.woff2) format('woff2'); 103 + unicode-range: U+1f70-1f73; 104 + } 105 + 106 + @font-face { 107 + font-family: IBM Plex Sans JP; 108 + font-style: normal; 109 + font-weight: 700; 110 + font-display: swap; 111 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/012.woff2) format('woff2'); 112 + unicode-range: U+2002-205d; 113 + } 114 + 115 + @font-face { 116 + font-family: IBM Plex Sans JP; 117 + font-style: normal; 118 + font-weight: 700; 119 + font-display: swap; 120 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/013.woff2) format('woff2'); 121 + unicode-range: U+2070-2089; 122 + } 123 + 124 + @font-face { 125 + font-family: IBM Plex Sans JP; 126 + font-style: normal; 127 + font-weight: 700; 128 + font-display: swap; 129 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/014.woff2) format('woff2'); 130 + unicode-range: U+20ac; 131 + } 132 + 133 + @font-face { 134 + font-family: IBM Plex Sans JP; 135 + font-style: normal; 136 + font-weight: 700; 137 + font-display: swap; 138 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/015.woff2) format('woff2'); 139 + unicode-range: U+20dd-20de; 140 + } 141 + 142 + @font-face { 143 + font-family: IBM Plex Sans JP; 144 + font-style: normal; 145 + font-weight: 700; 146 + font-display: swap; 147 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/016.woff2) format('woff2'); 148 + unicode-range: U+2100-213b; 149 + } 150 + 151 + @font-face { 152 + font-family: IBM Plex Sans JP; 153 + font-style: normal; 154 + font-weight: 700; 155 + font-display: swap; 156 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/017.woff2) format('woff2'); 157 + unicode-range: U+2150-2189; 158 + } 159 + 160 + @font-face { 161 + font-family: IBM Plex Sans JP; 162 + font-style: normal; 163 + font-weight: 700; 164 + font-display: swap; 165 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/018.woff2) format('woff2'); 166 + unicode-range: U+2190-21f5; 167 + } 168 + 169 + @font-face { 170 + font-family: IBM Plex Sans JP; 171 + font-style: normal; 172 + font-weight: 700; 173 + font-display: swap; 174 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/019.woff2) format('woff2'); 175 + unicode-range: U+2200-22db; 176 + } 177 + 178 + @font-face { 179 + font-family: IBM Plex Sans JP; 180 + font-style: normal; 181 + font-weight: 700; 182 + font-display: swap; 183 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/020.woff2) format('woff2'); 184 + unicode-range: U+2305-23ce; 185 + } 186 + 187 + @font-face { 188 + font-family: IBM Plex Sans JP; 189 + font-style: normal; 190 + font-weight: 700; 191 + font-display: swap; 192 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/021.woff2) format('woff2'); 193 + unicode-range: U+2423; 194 + } 195 + 196 + @font-face { 197 + font-family: IBM Plex Sans JP; 198 + font-style: normal; 199 + font-weight: 700; 200 + font-display: swap; 201 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/022.woff2) format('woff2'); 202 + unicode-range: U+2460-24e8; 203 + } 204 + 205 + @font-face { 206 + font-family: IBM Plex Sans JP; 207 + font-style: normal; 208 + font-weight: 700; 209 + font-display: swap; 210 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/023.woff2) format('woff2'); 211 + unicode-range: U+24e9-24ff; 212 + } 213 + 214 + @font-face { 215 + font-family: IBM Plex Sans JP; 216 + font-style: normal; 217 + font-weight: 700; 218 + font-display: swap; 219 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/024.woff2) format('woff2'); 220 + unicode-range: U+2500-2573; 221 + } 222 + 223 + @font-face { 224 + font-family: IBM Plex Sans JP; 225 + font-style: normal; 226 + font-weight: 700; 227 + font-display: swap; 228 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/025.woff2) format('woff2'); 229 + unicode-range: U+2581-2595; 230 + } 231 + 232 + @font-face { 233 + font-family: IBM Plex Sans JP; 234 + font-style: normal; 235 + font-weight: 700; 236 + font-display: swap; 237 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/026.woff2) format('woff2'); 238 + unicode-range: U+25a0-25ef; 239 + } 240 + 241 + @font-face { 242 + font-family: IBM Plex Sans JP; 243 + font-style: normal; 244 + font-weight: 700; 245 + font-display: swap; 246 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/027.woff2) format('woff2'); 247 + unicode-range: U+2600-26a0; 248 + } 249 + 250 + @font-face { 251 + font-family: IBM Plex Sans JP; 252 + font-style: normal; 253 + font-weight: 700; 254 + font-display: swap; 255 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/028.woff2) format('woff2'); 256 + unicode-range: U+2702-27a1; 257 + } 258 + 259 + @font-face { 260 + font-family: IBM Plex Sans JP; 261 + font-style: normal; 262 + font-weight: 700; 263 + font-display: swap; 264 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/029.woff2) format('woff2'); 265 + unicode-range: U+2934-2935; 266 + } 267 + 268 + @font-face { 269 + font-family: IBM Plex Sans JP; 270 + font-style: normal; 271 + font-weight: 700; 272 + font-display: swap; 273 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/030.woff2) format('woff2'); 274 + unicode-range: U+29bf-29fb; 275 + } 276 + 277 + @font-face { 278 + font-family: IBM Plex Sans JP; 279 + font-style: normal; 280 + font-weight: 700; 281 + font-display: swap; 282 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/031.woff2) format('woff2'); 283 + unicode-range: U+2b05-2b95; 284 + } 285 + 286 + @font-face { 287 + font-family: IBM Plex Sans JP; 288 + font-style: normal; 289 + font-weight: 700; 290 + font-display: swap; 291 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/032.woff2) format('woff2'); 292 + unicode-range: U+2e83-2ef2; 293 + } 294 + 295 + @font-face { 296 + font-family: IBM Plex Sans JP; 297 + font-style: normal; 298 + font-weight: 700; 299 + font-display: swap; 300 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/033.woff2) format('woff2'); 301 + unicode-range: U+2f00-2f7f; 302 + } 303 + 304 + @font-face { 305 + font-family: IBM Plex Sans JP; 306 + font-style: normal; 307 + font-weight: 700; 308 + font-display: swap; 309 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/034.woff2) format('woff2'); 310 + unicode-range: U+2f80-2fd5; 311 + } 312 + 313 + @font-face { 314 + font-family: IBM Plex Sans JP; 315 + font-style: normal; 316 + font-weight: 700; 317 + font-display: swap; 318 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/035.woff2) format('woff2'); 319 + unicode-range: U+3000-303d; 320 + } 321 + 322 + @font-face { 323 + font-family: IBM Plex Sans JP; 324 + font-style: normal; 325 + font-weight: 700; 326 + font-display: swap; 327 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/036.woff2) format('woff2'); 328 + unicode-range: U+3041-309f; 329 + } 330 + 331 + @font-face { 332 + font-family: IBM Plex Sans JP; 333 + font-style: normal; 334 + font-weight: 700; 335 + font-display: swap; 336 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/037.woff2) format('woff2'); 337 + unicode-range: U+30a0-30ff; 338 + } 339 + 340 + @font-face { 341 + font-family: IBM Plex Sans JP; 342 + font-style: normal; 343 + font-weight: 700; 344 + font-display: swap; 345 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/038.woff2) format('woff2'); 346 + unicode-range: U+3190-319f; 347 + } 348 + 349 + @font-face { 350 + font-family: IBM Plex Sans JP; 351 + font-style: normal; 352 + font-weight: 700; 353 + font-display: swap; 354 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/039.woff2) format('woff2'); 355 + unicode-range: U+31f0-31ff; 356 + } 357 + 358 + @font-face { 359 + font-family: IBM Plex Sans JP; 360 + font-style: normal; 361 + font-weight: 700; 362 + font-display: swap; 363 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/040.woff2) format('woff2'); 364 + unicode-range: U+3220-32dc; 365 + } 366 + 367 + @font-face { 368 + font-family: IBM Plex Sans JP; 369 + font-style: normal; 370 + font-weight: 700; 371 + font-display: swap; 372 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/041.woff2) format('woff2'); 373 + unicode-range: U+32dd-32ff; 374 + } 375 + 376 + @font-face { 377 + font-family: IBM Plex Sans JP; 378 + font-style: normal; 379 + font-weight: 700; 380 + font-display: swap; 381 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/042.woff2) format('woff2'); 382 + unicode-range: U+3300-33d4; 383 + } 384 + 385 + @font-face { 386 + font-family: IBM Plex Sans JP; 387 + font-style: normal; 388 + font-weight: 700; 389 + font-display: swap; 390 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/043.woff2) format('woff2'); 391 + unicode-range: U+33d7-33da; 392 + } 393 + 394 + @font-face { 395 + font-family: IBM Plex Sans JP; 396 + font-style: normal; 397 + font-weight: 700; 398 + font-display: swap; 399 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/044.woff2) format('woff2'); 400 + unicode-range: U+3402-41ee; 401 + } 402 + 403 + @font-face { 404 + font-family: IBM Plex Sans JP; 405 + font-style: normal; 406 + font-weight: 700; 407 + font-display: swap; 408 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/045.woff2) format('woff2'); 409 + unicode-range: U+41f3-4d77; 410 + } 411 + 412 + @font-face { 413 + font-family: IBM Plex Sans JP; 414 + font-style: normal; 415 + font-weight: 700; 416 + font-display: swap; 417 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/046.woff2) format('woff2'); 418 + unicode-range: U+4e00-4ec1; 419 + } 420 + 421 + @font-face { 422 + font-family: IBM Plex Sans JP; 423 + font-style: normal; 424 + font-weight: 700; 425 + font-display: swap; 426 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/047.woff2) format('woff2'); 427 + unicode-range: U+4ec2-4f78; 428 + } 429 + 430 + @font-face { 431 + font-family: IBM Plex Sans JP; 432 + font-style: normal; 433 + font-weight: 700; 434 + font-display: swap; 435 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/048.woff2) format('woff2'); 436 + unicode-range: U+4f79-501f; 437 + } 438 + 439 + @font-face { 440 + font-family: IBM Plex Sans JP; 441 + font-style: normal; 442 + font-weight: 700; 443 + font-display: swap; 444 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/049.woff2) format('woff2'); 445 + unicode-range: U+5021-50d9; 446 + } 447 + 448 + @font-face { 449 + font-family: IBM Plex Sans JP; 450 + font-style: normal; 451 + font-weight: 700; 452 + font-display: swap; 453 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/050.woff2) format('woff2'); 454 + unicode-range: U+50da-5183; 455 + } 456 + 457 + @font-face { 458 + font-family: IBM Plex Sans JP; 459 + font-style: normal; 460 + font-weight: 700; 461 + font-display: swap; 462 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/051.woff2) format('woff2'); 463 + unicode-range: U+5184-5231; 464 + } 465 + 466 + @font-face { 467 + font-family: IBM Plex Sans JP; 468 + font-style: normal; 469 + font-weight: 700; 470 + font-display: swap; 471 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/052.woff2) format('woff2'); 472 + unicode-range: U+5232-52df; 473 + } 474 + 475 + @font-face { 476 + font-family: IBM Plex Sans JP; 477 + font-style: normal; 478 + font-weight: 700; 479 + font-display: swap; 480 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/053.woff2) format('woff2'); 481 + unicode-range: U+52e0-537f; 482 + } 483 + 484 + @font-face { 485 + font-family: IBM Plex Sans JP; 486 + font-style: normal; 487 + font-weight: 700; 488 + font-display: swap; 489 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/054.woff2) format('woff2'); 490 + unicode-range: U+5382-5435; 491 + } 492 + 493 + @font-face { 494 + font-family: IBM Plex Sans JP; 495 + font-style: normal; 496 + font-weight: 700; 497 + font-display: swap; 498 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/055.woff2) format('woff2'); 499 + unicode-range: U+5436-54fe; 500 + } 501 + 502 + @font-face { 503 + font-family: IBM Plex Sans JP; 504 + font-style: normal; 505 + font-weight: 700; 506 + font-display: swap; 507 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/056.woff2) format('woff2'); 508 + unicode-range: U+54ff-55e3; 509 + } 510 + 511 + @font-face { 512 + font-family: IBM Plex Sans JP; 513 + font-style: normal; 514 + font-weight: 700; 515 + font-display: swap; 516 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/057.woff2) format('woff2'); 517 + unicode-range: U+55e4-56c5; 518 + } 519 + 520 + @font-face { 521 + font-family: IBM Plex Sans JP; 522 + font-style: normal; 523 + font-weight: 700; 524 + font-display: swap; 525 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/058.woff2) format('woff2'); 526 + unicode-range: U+56c8-577e; 527 + } 528 + 529 + @font-face { 530 + font-family: IBM Plex Sans JP; 531 + font-style: normal; 532 + font-weight: 700; 533 + font-display: swap; 534 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/059.woff2) format('woff2'); 535 + unicode-range: U+577f-5861; 536 + } 537 + 538 + @font-face { 539 + font-family: IBM Plex Sans JP; 540 + font-style: normal; 541 + font-weight: 700; 542 + font-display: swap; 543 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/060.woff2) format('woff2'); 544 + unicode-range: U+5862-5924; 545 + } 546 + 547 + @font-face { 548 + font-family: IBM Plex Sans JP; 549 + font-style: normal; 550 + font-weight: 700; 551 + font-display: swap; 552 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/061.woff2) format('woff2'); 553 + unicode-range: U+5925-59e6; 554 + } 555 + 556 + @font-face { 557 + font-family: IBM Plex Sans JP; 558 + font-style: normal; 559 + font-weight: 700; 560 + font-display: swap; 561 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/062.woff2) format('woff2'); 562 + unicode-range: U+59e7-5afd; 563 + } 564 + 565 + @font-face { 566 + font-family: IBM Plex Sans JP; 567 + font-style: normal; 568 + font-weight: 700; 569 + font-display: swap; 570 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/063.woff2) format('woff2'); 571 + unicode-range: U+5b00-5bcd; 572 + } 573 + 574 + @font-face { 575 + font-family: IBM Plex Sans JP; 576 + font-style: normal; 577 + font-weight: 700; 578 + font-display: swap; 579 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/064.woff2) format('woff2'); 580 + unicode-range: U+5bce-5c79; 581 + } 582 + 583 + @font-face { 584 + font-family: IBM Plex Sans JP; 585 + font-style: normal; 586 + font-weight: 700; 587 + font-display: swap; 588 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/065.woff2) format('woff2'); 589 + unicode-range: U+5c7a-5d79; 590 + } 591 + 592 + @font-face { 593 + font-family: IBM Plex Sans JP; 594 + font-style: normal; 595 + font-weight: 700; 596 + font-display: swap; 597 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/066.woff2) format('woff2'); 598 + unicode-range: U+5d7a-5e55; 599 + } 600 + 601 + @font-face { 602 + font-family: IBM Plex Sans JP; 603 + font-style: normal; 604 + font-weight: 700; 605 + font-display: swap; 606 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/067.woff2) format('woff2'); 607 + unicode-range: U+5e56-5f0c; 608 + } 609 + 610 + @font-face { 611 + font-family: IBM Plex Sans JP; 612 + font-style: normal; 613 + font-weight: 700; 614 + font-display: swap; 615 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/068.woff2) format('woff2'); 616 + unicode-range: U+5f0d-5fac; 617 + } 618 + 619 + @font-face { 620 + font-family: IBM Plex Sans JP; 621 + font-style: normal; 622 + font-weight: 700; 623 + font-display: swap; 624 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/069.woff2) format('woff2'); 625 + unicode-range: U+5fad-606b; 626 + } 627 + 628 + @font-face { 629 + font-family: IBM Plex Sans JP; 630 + font-style: normal; 631 + font-weight: 700; 632 + font-display: swap; 633 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/070.woff2) format('woff2'); 634 + unicode-range: U+606c-611c; 635 + } 636 + 637 + @font-face { 638 + font-family: IBM Plex Sans JP; 639 + font-style: normal; 640 + font-weight: 700; 641 + font-display: swap; 642 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/071.woff2) format('woff2'); 643 + unicode-range: U+611e-61de; 644 + } 645 + 646 + @font-face { 647 + font-family: IBM Plex Sans JP; 648 + font-style: normal; 649 + font-weight: 700; 650 + font-display: swap; 651 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/072.woff2) format('woff2'); 652 + unicode-range: U+61df-6294; 653 + } 654 + 655 + @font-face { 656 + font-family: IBM Plex Sans JP; 657 + font-style: normal; 658 + font-weight: 700; 659 + font-display: swap; 660 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/073.woff2) format('woff2'); 661 + unicode-range: U+6295-6366; 662 + } 663 + 664 + @font-face { 665 + font-family: IBM Plex Sans JP; 666 + font-style: normal; 667 + font-weight: 700; 668 + font-display: swap; 669 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/074.woff2) format('woff2'); 670 + unicode-range: U+6367-6430; 671 + } 672 + 673 + @font-face { 674 + font-family: IBM Plex Sans JP; 675 + font-style: normal; 676 + font-weight: 700; 677 + font-display: swap; 678 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/075.woff2) format('woff2'); 679 + unicode-range: U+6434-6516; 680 + } 681 + 682 + @font-face { 683 + font-family: IBM Plex Sans JP; 684 + font-style: normal; 685 + font-weight: 700; 686 + font-display: swap; 687 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/076.woff2) format('woff2'); 688 + unicode-range: U+6518-65d4; 689 + } 690 + 691 + @font-face { 692 + font-family: IBM Plex Sans JP; 693 + font-style: normal; 694 + font-weight: 700; 695 + font-display: swap; 696 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/077.woff2) format('woff2'); 697 + unicode-range: U+65d6-6679; 698 + } 699 + 700 + @font-face { 701 + font-family: IBM Plex Sans JP; 702 + font-style: normal; 703 + font-weight: 700; 704 + font-display: swap; 705 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/078.woff2) format('woff2'); 706 + unicode-range: U+667a-6738; 707 + } 708 + 709 + @font-face { 710 + font-family: IBM Plex Sans JP; 711 + font-style: normal; 712 + font-weight: 700; 713 + font-display: swap; 714 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/079.woff2) format('woff2'); 715 + unicode-range: U+673a-67ef; 716 + } 717 + 718 + @font-face { 719 + font-family: IBM Plex Sans JP; 720 + font-style: normal; 721 + font-weight: 700; 722 + font-display: swap; 723 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/080.woff2) format('woff2'); 724 + unicode-range: U+67f0-68ab; 725 + } 726 + 727 + @font-face { 728 + font-family: IBM Plex Sans JP; 729 + font-style: normal; 730 + font-weight: 700; 731 + font-display: swap; 732 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/081.woff2) format('woff2'); 733 + unicode-range: U+68ad-6965; 734 + } 735 + 736 + @font-face { 737 + font-family: IBM Plex Sans JP; 738 + font-style: normal; 739 + font-weight: 700; 740 + font-display: swap; 741 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/082.woff2) format('woff2'); 742 + unicode-range: U+6966-6a23; 743 + } 744 + 745 + @font-face { 746 + font-family: IBM Plex Sans JP; 747 + font-style: normal; 748 + font-weight: 700; 749 + font-display: swap; 750 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/083.woff2) format('woff2'); 751 + unicode-range: U+6a24-6b04; 752 + } 753 + 754 + @font-face { 755 + font-family: IBM Plex Sans JP; 756 + font-style: normal; 757 + font-weight: 700; 758 + font-display: swap; 759 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/084.woff2) format('woff2'); 760 + unicode-range: U+6b05-6bc3; 761 + } 762 + 763 + @font-face { 764 + font-family: IBM Plex Sans JP; 765 + font-style: normal; 766 + font-weight: 700; 767 + font-display: swap; 768 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/085.woff2) format('woff2'); 769 + unicode-range: U+6bc4-6c9a; 770 + } 771 + 772 + @font-face { 773 + font-family: IBM Plex Sans JP; 774 + font-style: normal; 775 + font-weight: 700; 776 + font-display: swap; 777 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/086.woff2) format('woff2'); 778 + unicode-range: U+6c9b-6d6c; 779 + } 780 + 781 + @font-face { 782 + font-family: IBM Plex Sans JP; 783 + font-style: normal; 784 + font-weight: 700; 785 + font-display: swap; 786 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/087.woff2) format('woff2'); 787 + unicode-range: U+6d6e-6e36; 788 + } 789 + 790 + @font-face { 791 + font-family: IBM Plex Sans JP; 792 + font-style: normal; 793 + font-weight: 700; 794 + font-display: swap; 795 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/088.woff2) format('woff2'); 796 + unicode-range: U+6e38-6f10; 797 + } 798 + 799 + @font-face { 800 + font-family: IBM Plex Sans JP; 801 + font-style: normal; 802 + font-weight: 700; 803 + font-display: swap; 804 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/089.woff2) format('woff2'); 805 + unicode-range: U+6f11-6fe9; 806 + } 807 + 808 + @font-face { 809 + font-family: IBM Plex Sans JP; 810 + font-style: normal; 811 + font-weight: 700; 812 + font-display: swap; 813 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/090.woff2) format('woff2'); 814 + unicode-range: U+6feb-70fd; 815 + } 816 + 817 + @font-face { 818 + font-family: IBM Plex Sans JP; 819 + font-style: normal; 820 + font-weight: 700; 821 + font-display: swap; 822 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/091.woff2) format('woff2'); 823 + unicode-range: U+7103-7208; 824 + } 825 + 826 + @font-face { 827 + font-family: IBM Plex Sans JP; 828 + font-style: normal; 829 + font-weight: 700; 830 + font-display: swap; 831 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/092.woff2) format('woff2'); 832 + unicode-range: U+7209-72e9; 833 + } 834 + 835 + @font-face { 836 + font-family: IBM Plex Sans JP; 837 + font-style: normal; 838 + font-weight: 700; 839 + font-display: swap; 840 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/093.woff2) format('woff2'); 841 + unicode-range: U+72ec-73bd; 842 + } 843 + 844 + @font-face { 845 + font-family: IBM Plex Sans JP; 846 + font-style: normal; 847 + font-weight: 700; 848 + font-display: swap; 849 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/094.woff2) format('woff2'); 850 + unicode-range: U+73bf-7491; 851 + } 852 + 853 + @font-face { 854 + font-family: IBM Plex Sans JP; 855 + font-style: normal; 856 + font-weight: 700; 857 + font-display: swap; 858 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/095.woff2) format('woff2'); 859 + unicode-range: U+7492-754f; 860 + } 861 + 862 + @font-face { 863 + font-family: IBM Plex Sans JP; 864 + font-style: normal; 865 + font-weight: 700; 866 + font-display: swap; 867 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/096.woff2) format('woff2'); 868 + unicode-range: U+7550-7601; 869 + } 870 + 871 + @font-face { 872 + font-family: IBM Plex Sans JP; 873 + font-style: normal; 874 + font-weight: 700; 875 + font-display: swap; 876 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/097.woff2) format('woff2'); 877 + unicode-range: U+7602-76b7; 878 + } 879 + 880 + @font-face { 881 + font-family: IBM Plex Sans JP; 882 + font-style: normal; 883 + font-weight: 700; 884 + font-display: swap; 885 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/098.woff2) format('woff2'); 886 + unicode-range: U+76b8-777e; 887 + } 888 + 889 + @font-face { 890 + font-family: IBM Plex Sans JP; 891 + font-style: normal; 892 + font-weight: 700; 893 + font-display: swap; 894 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/099.woff2) format('woff2'); 895 + unicode-range: U+777f-787c; 896 + } 897 + 898 + @font-face { 899 + font-family: IBM Plex Sans JP; 900 + font-style: normal; 901 + font-weight: 700; 902 + font-display: swap; 903 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/100.woff2) format('woff2'); 904 + unicode-range: U+787e-794f; 905 + } 906 + 907 + @font-face { 908 + font-family: IBM Plex Sans JP; 909 + font-style: normal; 910 + font-weight: 700; 911 + font-display: swap; 912 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/101.woff2) format('woff2'); 913 + unicode-range: U+7950-7a1a; 914 + } 915 + 916 + @font-face { 917 + font-family: IBM Plex Sans JP; 918 + font-style: normal; 919 + font-weight: 700; 920 + font-display: swap; 921 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/102.woff2) format('woff2'); 922 + unicode-range: U+7a1b-7adf; 923 + } 924 + 925 + @font-face { 926 + font-family: IBM Plex Sans JP; 927 + font-style: normal; 928 + font-weight: 700; 929 + font-display: swap; 930 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/103.woff2) format('woff2'); 931 + unicode-range: U+7ae0-7b9f; 932 + } 933 + 934 + @font-face { 935 + font-family: IBM Plex Sans JP; 936 + font-style: normal; 937 + font-weight: 700; 938 + font-display: swap; 939 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/104.woff2) format('woff2'); 940 + unicode-range: U+7ba0-7c60; 941 + } 942 + 943 + @font-face { 944 + font-family: IBM Plex Sans JP; 945 + font-style: normal; 946 + font-weight: 700; 947 + font-display: swap; 948 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/105.woff2) format('woff2'); 949 + unicode-range: U+7c61-7d1e; 950 + } 951 + 952 + @font-face { 953 + font-family: IBM Plex Sans JP; 954 + font-style: normal; 955 + font-weight: 700; 956 + font-display: swap; 957 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/106.woff2) format('woff2'); 958 + unicode-range: U+7d20-7dcd; 959 + } 960 + 961 + @font-face { 962 + font-family: IBM Plex Sans JP; 963 + font-style: normal; 964 + font-weight: 700; 965 + font-display: swap; 966 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/107.woff2) format('woff2'); 967 + unicode-range: U+7dce-7e89; 968 + } 969 + 970 + @font-face { 971 + font-family: IBM Plex Sans JP; 972 + font-style: normal; 973 + font-weight: 700; 974 + font-display: swap; 975 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/108.woff2) format('woff2'); 976 + unicode-range: U+7e8a-7fe5; 977 + } 978 + 979 + @font-face { 980 + font-family: IBM Plex Sans JP; 981 + font-style: normal; 982 + font-weight: 700; 983 + font-display: swap; 984 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/109.woff2) format('woff2'); 985 + unicode-range: U+7fe6-80ad; 986 + } 987 + 988 + @font-face { 989 + font-family: IBM Plex Sans JP; 990 + font-style: normal; 991 + font-weight: 700; 992 + font-display: swap; 993 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/110.woff2) format('woff2'); 994 + unicode-range: U+80af-8186; 995 + } 996 + 997 + @font-face { 998 + font-family: IBM Plex Sans JP; 999 + font-style: normal; 1000 + font-weight: 700; 1001 + font-display: swap; 1002 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/111.woff2) format('woff2'); 1003 + unicode-range: U+8188-8237; 1004 + } 1005 + 1006 + @font-face { 1007 + font-family: IBM Plex Sans JP; 1008 + font-style: normal; 1009 + font-weight: 700; 1010 + font-display: swap; 1011 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/112.woff2) format('woff2'); 1012 + unicode-range: U+8238-82f6; 1013 + } 1014 + 1015 + @font-face { 1016 + font-family: IBM Plex Sans JP; 1017 + font-style: normal; 1018 + font-weight: 700; 1019 + font-display: swap; 1020 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/113.woff2) format('woff2'); 1021 + unicode-range: U+82f7-83cc; 1022 + } 1023 + 1024 + @font-face { 1025 + font-family: IBM Plex Sans JP; 1026 + font-style: normal; 1027 + font-weight: 700; 1028 + font-display: swap; 1029 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/114.woff2) format('woff2'); 1030 + unicode-range: U+83ce-84b2; 1031 + } 1032 + 1033 + @font-face { 1034 + font-family: IBM Plex Sans JP; 1035 + font-style: normal; 1036 + font-weight: 700; 1037 + font-display: swap; 1038 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/115.woff2) format('woff2'); 1039 + unicode-range: U+84b4-8581; 1040 + } 1041 + 1042 + @font-face { 1043 + font-family: IBM Plex Sans JP; 1044 + font-style: normal; 1045 + font-weight: 700; 1046 + font-display: swap; 1047 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/116.woff2) format('woff2'); 1048 + unicode-range: U+8584-8654; 1049 + } 1050 + 1051 + @font-face { 1052 + font-family: IBM Plex Sans JP; 1053 + font-style: normal; 1054 + font-weight: 700; 1055 + font-display: swap; 1056 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/117.woff2) format('woff2'); 1057 + unicode-range: U+8655-871c; 1058 + } 1059 + 1060 + @font-face { 1061 + font-family: IBM Plex Sans JP; 1062 + font-style: normal; 1063 + font-weight: 700; 1064 + font-display: swap; 1065 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/118.woff2) format('woff2'); 1066 + unicode-range: U+871e-87f8; 1067 + } 1068 + 1069 + @font-face { 1070 + font-family: IBM Plex Sans JP; 1071 + font-style: normal; 1072 + font-weight: 700; 1073 + font-display: swap; 1074 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/119.woff2) format('woff2'); 1075 + unicode-range: U+87f9-88c0; 1076 + } 1077 + 1078 + @font-face { 1079 + font-family: IBM Plex Sans JP; 1080 + font-style: normal; 1081 + font-weight: 700; 1082 + font-display: swap; 1083 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/120.woff2) format('woff2'); 1084 + unicode-range: U+88c1-8988; 1085 + } 1086 + 1087 + @font-face { 1088 + font-family: IBM Plex Sans JP; 1089 + font-style: normal; 1090 + font-weight: 700; 1091 + font-display: swap; 1092 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/121.woff2) format('woff2'); 1093 + unicode-range: U+8989-8a58; 1094 + } 1095 + 1096 + @font-face { 1097 + font-family: IBM Plex Sans JP; 1098 + font-style: normal; 1099 + font-weight: 700; 1100 + font-display: swap; 1101 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/122.woff2) format('woff2'); 1102 + unicode-range: U+8a5b-8b02; 1103 + } 1104 + 1105 + @font-face { 1106 + font-family: IBM Plex Sans JP; 1107 + font-style: normal; 1108 + font-weight: 700; 1109 + font-display: swap; 1110 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/123.woff2) format('woff2'); 1111 + unicode-range: U+8b04-8c5a; 1112 + } 1113 + 1114 + @font-face { 1115 + font-family: IBM Plex Sans JP; 1116 + font-style: normal; 1117 + font-weight: 700; 1118 + font-display: swap; 1119 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/124.woff2) format('woff2'); 1120 + unicode-range: U+8c5b-8d0b; 1121 + } 1122 + 1123 + @font-face { 1124 + font-family: IBM Plex Sans JP; 1125 + font-style: normal; 1126 + font-weight: 700; 1127 + font-display: swap; 1128 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/125.woff2) format('woff2'); 1129 + unicode-range: U+8d0d-8e38; 1130 + } 1131 + 1132 + @font-face { 1133 + font-family: IBM Plex Sans JP; 1134 + font-style: normal; 1135 + font-weight: 700; 1136 + font-display: swap; 1137 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/126.woff2) format('woff2'); 1138 + unicode-range: U+8e39-8f0c; 1139 + } 1140 + 1141 + @font-face { 1142 + font-family: IBM Plex Sans JP; 1143 + font-style: normal; 1144 + font-weight: 700; 1145 + font-display: swap; 1146 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/127.woff2) format('woff2'); 1147 + unicode-range: U+8f0f-8feb; 1148 + } 1149 + 1150 + @font-face { 1151 + font-family: IBM Plex Sans JP; 1152 + font-style: normal; 1153 + font-weight: 700; 1154 + font-display: swap; 1155 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/128.woff2) format('woff2'); 1156 + unicode-range: U+8fed-908b; 1157 + } 1158 + 1159 + @font-face { 1160 + font-family: IBM Plex Sans JP; 1161 + font-style: normal; 1162 + font-weight: 700; 1163 + font-display: swap; 1164 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/129.woff2) format('woff2'); 1165 + unicode-range: U+908c-9165; 1166 + } 1167 + 1168 + @font-face { 1169 + font-family: IBM Plex Sans JP; 1170 + font-style: normal; 1171 + font-weight: 700; 1172 + font-display: swap; 1173 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/130.woff2) format('woff2'); 1174 + unicode-range: U+9167-9216; 1175 + } 1176 + 1177 + @font-face { 1178 + font-family: IBM Plex Sans JP; 1179 + font-style: normal; 1180 + font-weight: 700; 1181 + font-display: swap; 1182 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/131.woff2) format('woff2'); 1183 + unicode-range: U+9217-92d2; 1184 + } 1185 + 1186 + @font-face { 1187 + font-family: IBM Plex Sans JP; 1188 + font-style: normal; 1189 + font-weight: 700; 1190 + font-display: swap; 1191 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/132.woff2) format('woff2'); 1192 + unicode-range: U+92d3-939a; 1193 + } 1194 + 1195 + @font-face { 1196 + font-family: IBM Plex Sans JP; 1197 + font-style: normal; 1198 + font-weight: 700; 1199 + font-display: swap; 1200 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/133.woff2) format('woff2'); 1201 + unicode-range: U+939b-947e; 1202 + } 1203 + 1204 + @font-face { 1205 + font-family: IBM Plex Sans JP; 1206 + font-style: normal; 1207 + font-weight: 700; 1208 + font-display: swap; 1209 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/134.woff2) format('woff2'); 1210 + unicode-range: U+947f-965d; 1211 + } 1212 + 1213 + @font-face { 1214 + font-family: IBM Plex Sans JP; 1215 + font-style: normal; 1216 + font-weight: 700; 1217 + font-display: swap; 1218 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/135.woff2) format('woff2'); 1219 + unicode-range: U+965e-9713; 1220 + } 1221 + 1222 + @font-face { 1223 + font-family: IBM Plex Sans JP; 1224 + font-style: normal; 1225 + font-weight: 700; 1226 + font-display: swap; 1227 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/136.woff2) format('woff2'); 1228 + unicode-range: U+9714-97d1; 1229 + } 1230 + 1231 + @font-face { 1232 + font-family: IBM Plex Sans JP; 1233 + font-style: normal; 1234 + font-weight: 700; 1235 + font-display: swap; 1236 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/137.woff2) format('woff2'); 1237 + unicode-range: U+97d3-98c5; 1238 + } 1239 + 1240 + @font-face { 1241 + font-family: IBM Plex Sans JP; 1242 + font-style: normal; 1243 + font-weight: 700; 1244 + font-display: swap; 1245 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/138.woff2) format('woff2'); 1246 + unicode-range: U+98c6-99c4; 1247 + } 1248 + 1249 + @font-face { 1250 + font-family: IBM Plex Sans JP; 1251 + font-style: normal; 1252 + font-weight: 700; 1253 + font-display: swap; 1254 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/139.woff2) format('woff2'); 1255 + unicode-range: U+99c5-9ac8; 1256 + } 1257 + 1258 + @font-face { 1259 + font-family: IBM Plex Sans JP; 1260 + font-style: normal; 1261 + font-weight: 700; 1262 + font-display: swap; 1263 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/140.woff2) format('woff2'); 1264 + unicode-range: U+9ace-9b79; 1265 + } 1266 + 1267 + @font-face { 1268 + font-family: IBM Plex Sans JP; 1269 + font-style: normal; 1270 + font-weight: 700; 1271 + font-display: swap; 1272 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/141.woff2) format('woff2'); 1273 + unicode-range: U+9b7f-9c35; 1274 + } 1275 + 1276 + @font-face { 1277 + font-family: IBM Plex Sans JP; 1278 + font-style: normal; 1279 + font-weight: 700; 1280 + font-display: swap; 1281 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/142.woff2) format('woff2'); 1282 + unicode-range: U+9c36-9d6f; 1283 + } 1284 + 1285 + @font-face { 1286 + font-family: IBM Plex Sans JP; 1287 + font-style: normal; 1288 + font-weight: 700; 1289 + font-display: swap; 1290 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/143.woff2) format('woff2'); 1291 + unicode-range: U+9d70-9e9d; 1292 + } 1293 + 1294 + @font-face { 1295 + font-family: IBM Plex Sans JP; 1296 + font-style: normal; 1297 + font-weight: 700; 1298 + font-display: swap; 1299 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/144.woff2) format('woff2'); 1300 + unicode-range: U+9e9e-9f61; 1301 + } 1302 + 1303 + @font-face { 1304 + font-family: IBM Plex Sans JP; 1305 + font-style: normal; 1306 + font-weight: 700; 1307 + font-display: swap; 1308 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/145.woff2) format('woff2'); 1309 + unicode-range: U+9f62-9fb4; 1310 + } 1311 + 1312 + @font-face { 1313 + font-family: IBM Plex Sans JP; 1314 + font-style: normal; 1315 + font-weight: 700; 1316 + font-display: swap; 1317 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/146.woff2) format('woff2'); 1318 + unicode-range: U+f860-f87f; 1319 + } 1320 + 1321 + @font-face { 1322 + font-family: IBM Plex Sans JP; 1323 + font-style: normal; 1324 + font-weight: 700; 1325 + font-display: swap; 1326 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/147.woff2) format('woff2'); 1327 + unicode-range: U+f909-fa6a; 1328 + } 1329 + 1330 + @font-face { 1331 + font-family: IBM Plex Sans JP; 1332 + font-style: normal; 1333 + font-weight: 700; 1334 + font-display: swap; 1335 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/148.woff2) format('woff2'); 1336 + unicode-range: U+fb00-fb04; 1337 + } 1338 + 1339 + @font-face { 1340 + font-family: IBM Plex Sans JP; 1341 + font-style: normal; 1342 + font-weight: 700; 1343 + font-display: swap; 1344 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/149.woff2) format('woff2'); 1345 + unicode-range: U+fe10-fe19; 1346 + } 1347 + 1348 + @font-face { 1349 + font-family: IBM Plex Sans JP; 1350 + font-style: normal; 1351 + font-weight: 700; 1352 + font-display: swap; 1353 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/150.woff2) format('woff2'); 1354 + unicode-range: U+fe30-fe48; 1355 + } 1356 + 1357 + @font-face { 1358 + font-family: IBM Plex Sans JP; 1359 + font-style: normal; 1360 + font-weight: 700; 1361 + font-display: swap; 1362 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/151.woff2) format('woff2'); 1363 + unicode-range: U+ff01-ff80; 1364 + } 1365 + 1366 + @font-face { 1367 + font-family: IBM Plex Sans JP; 1368 + font-style: normal; 1369 + font-weight: 700; 1370 + font-display: swap; 1371 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/152.woff2) format('woff2'); 1372 + unicode-range: U+ff81-ffe8; 1373 + } 1374 + 1375 + @font-face { 1376 + font-family: IBM Plex Sans JP; 1377 + font-style: normal; 1378 + font-weight: 700; 1379 + font-display: swap; 1380 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/153.woff2) format('woff2'); 1381 + unicode-range: U+1f100; 1382 + } 1383 + 1384 + @font-face { 1385 + font-family: IBM Plex Sans JP; 1386 + font-style: normal; 1387 + font-weight: 700; 1388 + font-display: swap; 1389 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/154.woff2) format('woff2'); 1390 + unicode-range: U+2000b-23763; 1391 + } 1392 + 1393 + @font-face { 1394 + font-family: IBM Plex Sans JP; 1395 + font-style: normal; 1396 + font-weight: 700; 1397 + font-display: swap; 1398 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/155.woff2) format('woff2'); 1399 + unicode-range: U+23764-2770e; 1400 + } 1401 + 1402 + @font-face { 1403 + font-family: IBM Plex Sans JP; 1404 + font-style: normal; 1405 + font-weight: 700; 1406 + font-display: swap; 1407 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/156.woff2) format('woff2'); 1408 + unicode-range: U+27723-2a6b2; 1409 + } 1410 + 1411 + @font-face { 1412 + font-family: IBM Plex Sans JP; 1413 + font-style: normal; 1414 + font-weight: 700; 1415 + font-display: swap; 1416 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/157.woff2) format('woff2'); 1417 + unicode-range: U+2f804-2f9f4; 1418 + }
+157
public/font/IBMPlexSansJP-Bold/list
··· 1 + 1 IBMPlexSansJP-Bold.Basic-Latin.woff2 2 + 2 IBMPlexSansJP-Bold.Latin-1-Supplement.woff2 3 + 3 IBMPlexSansJP-Bold.Latin-Extended-A.woff2 4 + 4 IBMPlexSansJP-Bold.Latin-Extended-B.woff2 5 + 5 IBMPlexSansJP-Bold.IPA-Extensions.woff2 6 + 6 IBMPlexSansJP-Bold.Spacing-Modifier-Letters.woff2 7 + 7 IBMPlexSansJP-Bold.Combining-Diacritical-Marks.woff2 8 + 8 IBMPlexSansJP-Bold.Greek-and-Coptic.woff2 9 + 9 IBMPlexSansJP-Bold.Cyrillic.woff2 10 + 10 IBMPlexSansJP-Bold.Latin-Extended-Additional.woff2 11 + 11 IBMPlexSansJP-Bold.Greek-Extended.woff2 12 + 12 IBMPlexSansJP-Bold.General-Punctuation.woff2 13 + 13 IBMPlexSansJP-Bold.Superscripts-and-Subscripts.woff2 14 + 14 IBMPlexSansJP-Bold.Currency-Symbols.woff2 15 + 15 IBMPlexSansJP-Bold.Combining-Diacritical-Marks-for-Symbols.woff2 16 + 16 IBMPlexSansJP-Bold.Letterlike-Symbols.woff2 17 + 17 IBMPlexSansJP-Bold.Number-Forms.woff2 18 + 18 IBMPlexSansJP-Bold.Arrows.woff2 19 + 19 IBMPlexSansJP-Bold.Mathematical-Operators.woff2 20 + 20 IBMPlexSansJP-Bold.Miscellaneous-Technical.woff2 21 + 21 IBMPlexSansJP-Bold.Control-Pictures.woff2 22 + 22 IBMPlexSansJP-Bold.Enclosed-Alphanumerics-1.woff2 23 + 23 IBMPlexSansJP-Bold.Enclosed-Alphanumerics-2.woff2 24 + 24 IBMPlexSansJP-Bold.Box-Drawing.woff2 25 + 25 IBMPlexSansJP-Bold.Block-Elements.woff2 26 + 26 IBMPlexSansJP-Bold.Geometric-Shapes.woff2 27 + 27 IBMPlexSansJP-Bold.Miscellaneous-Symbols.woff2 28 + 28 IBMPlexSansJP-Bold.Dingbats.woff2 29 + 29 IBMPlexSansJP-Bold.Supplemental-Arrows-B.woff2 30 + 30 IBMPlexSansJP-Bold.Miscellaneous-Mathematical-Symbols-B.woff2 31 + 31 IBMPlexSansJP-Bold.Miscellaneous-Symbols-and-Arrows.woff2 32 + 32 IBMPlexSansJP-Bold.CJK-Radicals-Supplement.woff2 33 + 33 IBMPlexSansJP-Bold.Kangxi-Radicals-1.woff2 34 + 34 IBMPlexSansJP-Bold.Kangxi-Radicals-2.woff2 35 + 35 IBMPlexSansJP-Bold.CJK-Symbols-and-Punctuation.woff2 36 + 36 IBMPlexSansJP-Bold.Hiragana.woff2 37 + 37 IBMPlexSansJP-Bold.Katakana.woff2 38 + 38 IBMPlexSansJP-Bold.Kanbun.woff2 39 + 39 IBMPlexSansJP-Bold.Katakana-Phonetic-Extensions.woff2 40 + 40 IBMPlexSansJP-Bold.Enclosed-CJK-Letters-and-Months-1.woff2 41 + 41 IBMPlexSansJP-Bold.Enclosed-CJK-Letters-and-Months-2.woff2 42 + 42 IBMPlexSansJP-Bold.CJK-Compatibility-1.woff2 43 + 43 IBMPlexSansJP-Bold.CJK-Compatibility-2.woff2 44 + 44 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-Extension-A-1.woff2 45 + 45 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-Extension-A-2.woff2 46 + 46 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-001.woff2 47 + 47 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-002.woff2 48 + 48 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-003.woff2 49 + 49 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-004.woff2 50 + 50 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-005.woff2 51 + 51 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-006.woff2 52 + 52 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-007.woff2 53 + 53 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-008.woff2 54 + 54 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-009.woff2 55 + 55 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-010.woff2 56 + 56 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-011.woff2 57 + 57 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-012.woff2 58 + 58 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-013.woff2 59 + 59 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-014.woff2 60 + 60 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-015.woff2 61 + 61 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-016.woff2 62 + 62 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-017.woff2 63 + 63 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-018.woff2 64 + 64 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-019.woff2 65 + 65 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-020.woff2 66 + 66 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-021.woff2 67 + 67 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-022.woff2 68 + 68 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-023.woff2 69 + 69 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-024.woff2 70 + 70 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-025.woff2 71 + 71 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-026.woff2 72 + 72 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-027.woff2 73 + 73 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-028.woff2 74 + 74 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-029.woff2 75 + 75 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-030.woff2 76 + 76 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-031.woff2 77 + 77 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-032.woff2 78 + 78 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-033.woff2 79 + 79 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-034.woff2 80 + 80 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-035.woff2 81 + 81 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-036.woff2 82 + 82 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-037.woff2 83 + 83 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-038.woff2 84 + 84 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-039.woff2 85 + 85 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-040.woff2 86 + 86 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-041.woff2 87 + 87 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-042.woff2 88 + 88 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-043.woff2 89 + 89 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-044.woff2 90 + 90 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-045.woff2 91 + 91 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-046.woff2 92 + 92 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-047.woff2 93 + 93 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-048.woff2 94 + 94 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-049.woff2 95 + 95 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-050.woff2 96 + 96 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-051.woff2 97 + 97 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-052.woff2 98 + 98 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-053.woff2 99 + 99 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-054.woff2 100 + 100 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-055.woff2 101 + 101 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-056.woff2 102 + 102 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-057.woff2 103 + 103 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-058.woff2 104 + 104 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-059.woff2 105 + 105 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-060.woff2 106 + 106 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-061.woff2 107 + 107 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-062.woff2 108 + 108 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-063.woff2 109 + 109 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-064.woff2 110 + 110 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-065.woff2 111 + 111 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-066.woff2 112 + 112 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-067.woff2 113 + 113 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-068.woff2 114 + 114 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-069.woff2 115 + 115 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-070.woff2 116 + 116 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-071.woff2 117 + 117 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-072.woff2 118 + 118 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-073.woff2 119 + 119 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-074.woff2 120 + 120 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-075.woff2 121 + 121 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-076.woff2 122 + 122 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-077.woff2 123 + 123 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-078.woff2 124 + 124 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-079.woff2 125 + 125 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-080.woff2 126 + 126 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-081.woff2 127 + 127 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-082.woff2 128 + 128 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-083.woff2 129 + 129 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-084.woff2 130 + 130 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-085.woff2 131 + 131 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-086.woff2 132 + 132 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-087.woff2 133 + 133 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-088.woff2 134 + 134 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-089.woff2 135 + 135 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-090.woff2 136 + 136 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-091.woff2 137 + 137 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-092.woff2 138 + 138 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-093.woff2 139 + 139 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-094.woff2 140 + 140 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-095.woff2 141 + 141 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-096.woff2 142 + 142 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-097.woff2 143 + 143 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-098.woff2 144 + 144 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-099.woff2 145 + 145 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-100.woff2 146 + 146 IBMPlexSansJP-Bold.Private-Use-Area.woff2 147 + 147 IBMPlexSansJP-Bold.CJK-Compatibility-Ideographs.woff2 148 + 148 IBMPlexSansJP-Bold.Alphabetic-Presentation-Forms.woff2 149 + 149 IBMPlexSansJP-Bold.Vertical-Forms.woff2 150 + 150 IBMPlexSansJP-Bold.CJK-Compatibility-Forms.woff2 151 + 151 IBMPlexSansJP-Bold.Halfwidth-and-Fullwidth-Forms-1.woff2 152 + 152 IBMPlexSansJP-Bold.Halfwidth-and-Fullwidth-Forms-2.woff2 153 + 153 IBMPlexSansJP-Bold.Enclosed-Alphanumeric-Supplement.woff2 154 + 154 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-Extension-B-1.woff2 155 + 155 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-Extension-B-2.woff2 156 + 156 IBMPlexSansJP-Bold.CJK-Unified-Ideographs-Extension-B-3.woff2 157 + 157 IBMPlexSansJP-Bold.CJK-Compatibility-Ideographs-Supplement.woff2
public/font/IBMPlexSansJP-Regular/001.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/002.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/003.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/004.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/005.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/006.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/007.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/008.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/009.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/010.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/011.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/012.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/013.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/014.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/015.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/016.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/017.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/018.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/019.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/020.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/021.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/022.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/023.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/024.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/025.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/026.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/027.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/028.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/029.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/030.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/031.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/032.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/033.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/034.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/035.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/036.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/037.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/038.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/039.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/040.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/041.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/042.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/043.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/044.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/045.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/046.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/047.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/048.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/049.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/050.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/051.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/052.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/053.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/054.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/055.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/056.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/057.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/058.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/059.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/060.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/061.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/062.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/063.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/064.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/065.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/066.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/067.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/068.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/069.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/070.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/071.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/072.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/073.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/074.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/075.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/076.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/077.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/078.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/079.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/080.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/081.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/082.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/083.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/084.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/085.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/086.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/087.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/088.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/089.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/090.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/091.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/092.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/093.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/094.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/095.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/096.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/097.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/098.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/099.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/100.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/101.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/102.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/103.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/104.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/105.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/106.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/107.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/108.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/109.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/110.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/111.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/112.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/113.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/114.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/115.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/116.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/117.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/118.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/119.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/120.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/121.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/122.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/123.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/124.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/125.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/126.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/127.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/128.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/129.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/130.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/131.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/132.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/133.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/134.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/135.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/136.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/137.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/138.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/139.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/140.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/141.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/142.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/143.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/144.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/145.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/146.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/147.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/148.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/149.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/150.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/151.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/152.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/153.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/154.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/155.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/156.woff2

This is a binary file and will not be displayed.

public/font/IBMPlexSansJP-Regular/157.woff2

This is a binary file and will not be displayed.

+1418
public/font/IBMPlexSansJP-Regular/IBMPlexSansJP-Regular.css
··· 1 + /** 2 + * Font Splitter 3 + * https://github.com/VdustR/font-splitter 4 + * forked https://github.com/helpimnotdrowning/font-splitter 5 + */ 6 + 7 + @font-face { 8 + font-family: IBM Plex Sans JP; 9 + font-style: normal; 10 + font-weight: 400; 11 + font-display: swap; 12 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/001.woff2) format('woff2'); 13 + unicode-range: U+20-7e; 14 + } 15 + 16 + @font-face { 17 + font-family: IBM Plex Sans JP; 18 + font-style: normal; 19 + font-weight: 400; 20 + font-display: swap; 21 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/002.woff2) format('woff2'); 22 + unicode-range: U+a0-ff; 23 + } 24 + 25 + @font-face { 26 + font-family: IBM Plex Sans JP; 27 + font-style: normal; 28 + font-weight: 400; 29 + font-display: swap; 30 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/003.woff2) format('woff2'); 31 + unicode-range: U+100-17e; 32 + } 33 + 34 + @font-face { 35 + font-family: IBM Plex Sans JP; 36 + font-style: normal; 37 + font-weight: 400; 38 + font-display: swap; 39 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/004.woff2) format('woff2'); 40 + unicode-range: U+192-237; 41 + } 42 + 43 + @font-face { 44 + font-family: IBM Plex Sans JP; 45 + font-style: normal; 46 + font-weight: 400; 47 + font-display: swap; 48 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/005.woff2) format('woff2'); 49 + unicode-range: U+250-2a2; 50 + } 51 + 52 + @font-face { 53 + font-family: IBM Plex Sans JP; 54 + font-style: normal; 55 + font-weight: 400; 56 + font-display: swap; 57 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/006.woff2) format('woff2'); 58 + unicode-range: U+2b0-2e9; 59 + } 60 + 61 + @font-face { 62 + font-family: IBM Plex Sans JP; 63 + font-style: normal; 64 + font-weight: 400; 65 + font-display: swap; 66 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/007.woff2) format('woff2'); 67 + unicode-range: U+300-361; 68 + } 69 + 70 + @font-face { 71 + font-family: IBM Plex Sans JP; 72 + font-style: normal; 73 + font-weight: 400; 74 + font-display: swap; 75 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/008.woff2) format('woff2'); 76 + unicode-range: U+384-3db; 77 + } 78 + 79 + @font-face { 80 + font-family: IBM Plex Sans JP; 81 + font-style: normal; 82 + font-weight: 400; 83 + font-display: swap; 84 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/009.woff2) format('woff2'); 85 + unicode-range: U+401-45f; 86 + } 87 + 88 + @font-face { 89 + font-family: IBM Plex Sans JP; 90 + font-style: normal; 91 + font-weight: 400; 92 + font-display: swap; 93 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/010.woff2) format('woff2'); 94 + unicode-range: U+1e3e-1ebd; 95 + } 96 + 97 + @font-face { 98 + font-family: IBM Plex Sans JP; 99 + font-style: normal; 100 + font-weight: 400; 101 + font-display: swap; 102 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/011.woff2) format('woff2'); 103 + unicode-range: U+1f70-1f73; 104 + } 105 + 106 + @font-face { 107 + font-family: IBM Plex Sans JP; 108 + font-style: normal; 109 + font-weight: 400; 110 + font-display: swap; 111 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/012.woff2) format('woff2'); 112 + unicode-range: U+2002-205d; 113 + } 114 + 115 + @font-face { 116 + font-family: IBM Plex Sans JP; 117 + font-style: normal; 118 + font-weight: 400; 119 + font-display: swap; 120 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/013.woff2) format('woff2'); 121 + unicode-range: U+2070-2089; 122 + } 123 + 124 + @font-face { 125 + font-family: IBM Plex Sans JP; 126 + font-style: normal; 127 + font-weight: 400; 128 + font-display: swap; 129 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/014.woff2) format('woff2'); 130 + unicode-range: U+20ac; 131 + } 132 + 133 + @font-face { 134 + font-family: IBM Plex Sans JP; 135 + font-style: normal; 136 + font-weight: 400; 137 + font-display: swap; 138 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/015.woff2) format('woff2'); 139 + unicode-range: U+20dd-20de; 140 + } 141 + 142 + @font-face { 143 + font-family: IBM Plex Sans JP; 144 + font-style: normal; 145 + font-weight: 400; 146 + font-display: swap; 147 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/016.woff2) format('woff2'); 148 + unicode-range: U+2100-213b; 149 + } 150 + 151 + @font-face { 152 + font-family: IBM Plex Sans JP; 153 + font-style: normal; 154 + font-weight: 400; 155 + font-display: swap; 156 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/017.woff2) format('woff2'); 157 + unicode-range: U+2150-2189; 158 + } 159 + 160 + @font-face { 161 + font-family: IBM Plex Sans JP; 162 + font-style: normal; 163 + font-weight: 400; 164 + font-display: swap; 165 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/018.woff2) format('woff2'); 166 + unicode-range: U+2190-21f5; 167 + } 168 + 169 + @font-face { 170 + font-family: IBM Plex Sans JP; 171 + font-style: normal; 172 + font-weight: 400; 173 + font-display: swap; 174 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/019.woff2) format('woff2'); 175 + unicode-range: U+2200-22db; 176 + } 177 + 178 + @font-face { 179 + font-family: IBM Plex Sans JP; 180 + font-style: normal; 181 + font-weight: 400; 182 + font-display: swap; 183 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/020.woff2) format('woff2'); 184 + unicode-range: U+2305-23ce; 185 + } 186 + 187 + @font-face { 188 + font-family: IBM Plex Sans JP; 189 + font-style: normal; 190 + font-weight: 400; 191 + font-display: swap; 192 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/021.woff2) format('woff2'); 193 + unicode-range: U+2423; 194 + } 195 + 196 + @font-face { 197 + font-family: IBM Plex Sans JP; 198 + font-style: normal; 199 + font-weight: 400; 200 + font-display: swap; 201 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/022.woff2) format('woff2'); 202 + unicode-range: U+2460-24e8; 203 + } 204 + 205 + @font-face { 206 + font-family: IBM Plex Sans JP; 207 + font-style: normal; 208 + font-weight: 400; 209 + font-display: swap; 210 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/023.woff2) format('woff2'); 211 + unicode-range: U+24e9-24ff; 212 + } 213 + 214 + @font-face { 215 + font-family: IBM Plex Sans JP; 216 + font-style: normal; 217 + font-weight: 400; 218 + font-display: swap; 219 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/024.woff2) format('woff2'); 220 + unicode-range: U+2500-2573; 221 + } 222 + 223 + @font-face { 224 + font-family: IBM Plex Sans JP; 225 + font-style: normal; 226 + font-weight: 400; 227 + font-display: swap; 228 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/025.woff2) format('woff2'); 229 + unicode-range: U+2581-2595; 230 + } 231 + 232 + @font-face { 233 + font-family: IBM Plex Sans JP; 234 + font-style: normal; 235 + font-weight: 400; 236 + font-display: swap; 237 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/026.woff2) format('woff2'); 238 + unicode-range: U+25a0-25ef; 239 + } 240 + 241 + @font-face { 242 + font-family: IBM Plex Sans JP; 243 + font-style: normal; 244 + font-weight: 400; 245 + font-display: swap; 246 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/027.woff2) format('woff2'); 247 + unicode-range: U+2600-26a0; 248 + } 249 + 250 + @font-face { 251 + font-family: IBM Plex Sans JP; 252 + font-style: normal; 253 + font-weight: 400; 254 + font-display: swap; 255 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/028.woff2) format('woff2'); 256 + unicode-range: U+2702-27a1; 257 + } 258 + 259 + @font-face { 260 + font-family: IBM Plex Sans JP; 261 + font-style: normal; 262 + font-weight: 400; 263 + font-display: swap; 264 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/029.woff2) format('woff2'); 265 + unicode-range: U+2934-2935; 266 + } 267 + 268 + @font-face { 269 + font-family: IBM Plex Sans JP; 270 + font-style: normal; 271 + font-weight: 400; 272 + font-display: swap; 273 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/030.woff2) format('woff2'); 274 + unicode-range: U+29bf-29fb; 275 + } 276 + 277 + @font-face { 278 + font-family: IBM Plex Sans JP; 279 + font-style: normal; 280 + font-weight: 400; 281 + font-display: swap; 282 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/031.woff2) format('woff2'); 283 + unicode-range: U+2b05-2b95; 284 + } 285 + 286 + @font-face { 287 + font-family: IBM Plex Sans JP; 288 + font-style: normal; 289 + font-weight: 400; 290 + font-display: swap; 291 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/032.woff2) format('woff2'); 292 + unicode-range: U+2e83-2ef2; 293 + } 294 + 295 + @font-face { 296 + font-family: IBM Plex Sans JP; 297 + font-style: normal; 298 + font-weight: 400; 299 + font-display: swap; 300 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/033.woff2) format('woff2'); 301 + unicode-range: U+2f00-2f7f; 302 + } 303 + 304 + @font-face { 305 + font-family: IBM Plex Sans JP; 306 + font-style: normal; 307 + font-weight: 400; 308 + font-display: swap; 309 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/034.woff2) format('woff2'); 310 + unicode-range: U+2f80-2fd5; 311 + } 312 + 313 + @font-face { 314 + font-family: IBM Plex Sans JP; 315 + font-style: normal; 316 + font-weight: 400; 317 + font-display: swap; 318 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/035.woff2) format('woff2'); 319 + unicode-range: U+3000-303d; 320 + } 321 + 322 + @font-face { 323 + font-family: IBM Plex Sans JP; 324 + font-style: normal; 325 + font-weight: 400; 326 + font-display: swap; 327 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/036.woff2) format('woff2'); 328 + unicode-range: U+3041-309f; 329 + } 330 + 331 + @font-face { 332 + font-family: IBM Plex Sans JP; 333 + font-style: normal; 334 + font-weight: 400; 335 + font-display: swap; 336 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/037.woff2) format('woff2'); 337 + unicode-range: U+30a0-30ff; 338 + } 339 + 340 + @font-face { 341 + font-family: IBM Plex Sans JP; 342 + font-style: normal; 343 + font-weight: 400; 344 + font-display: swap; 345 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/038.woff2) format('woff2'); 346 + unicode-range: U+3190-319f; 347 + } 348 + 349 + @font-face { 350 + font-family: IBM Plex Sans JP; 351 + font-style: normal; 352 + font-weight: 400; 353 + font-display: swap; 354 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/039.woff2) format('woff2'); 355 + unicode-range: U+31f0-31ff; 356 + } 357 + 358 + @font-face { 359 + font-family: IBM Plex Sans JP; 360 + font-style: normal; 361 + font-weight: 400; 362 + font-display: swap; 363 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/040.woff2) format('woff2'); 364 + unicode-range: U+3220-32dc; 365 + } 366 + 367 + @font-face { 368 + font-family: IBM Plex Sans JP; 369 + font-style: normal; 370 + font-weight: 400; 371 + font-display: swap; 372 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/041.woff2) format('woff2'); 373 + unicode-range: U+32dd-32ff; 374 + } 375 + 376 + @font-face { 377 + font-family: IBM Plex Sans JP; 378 + font-style: normal; 379 + font-weight: 400; 380 + font-display: swap; 381 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/042.woff2) format('woff2'); 382 + unicode-range: U+3300-33d4; 383 + } 384 + 385 + @font-face { 386 + font-family: IBM Plex Sans JP; 387 + font-style: normal; 388 + font-weight: 400; 389 + font-display: swap; 390 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/043.woff2) format('woff2'); 391 + unicode-range: U+33d7-33da; 392 + } 393 + 394 + @font-face { 395 + font-family: IBM Plex Sans JP; 396 + font-style: normal; 397 + font-weight: 400; 398 + font-display: swap; 399 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/044.woff2) format('woff2'); 400 + unicode-range: U+3402-41ee; 401 + } 402 + 403 + @font-face { 404 + font-family: IBM Plex Sans JP; 405 + font-style: normal; 406 + font-weight: 400; 407 + font-display: swap; 408 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/045.woff2) format('woff2'); 409 + unicode-range: U+41f3-4d77; 410 + } 411 + 412 + @font-face { 413 + font-family: IBM Plex Sans JP; 414 + font-style: normal; 415 + font-weight: 400; 416 + font-display: swap; 417 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/046.woff2) format('woff2'); 418 + unicode-range: U+4e00-4ec1; 419 + } 420 + 421 + @font-face { 422 + font-family: IBM Plex Sans JP; 423 + font-style: normal; 424 + font-weight: 400; 425 + font-display: swap; 426 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/047.woff2) format('woff2'); 427 + unicode-range: U+4ec2-4f78; 428 + } 429 + 430 + @font-face { 431 + font-family: IBM Plex Sans JP; 432 + font-style: normal; 433 + font-weight: 400; 434 + font-display: swap; 435 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/048.woff2) format('woff2'); 436 + unicode-range: U+4f79-501f; 437 + } 438 + 439 + @font-face { 440 + font-family: IBM Plex Sans JP; 441 + font-style: normal; 442 + font-weight: 400; 443 + font-display: swap; 444 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/049.woff2) format('woff2'); 445 + unicode-range: U+5021-50d9; 446 + } 447 + 448 + @font-face { 449 + font-family: IBM Plex Sans JP; 450 + font-style: normal; 451 + font-weight: 400; 452 + font-display: swap; 453 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/050.woff2) format('woff2'); 454 + unicode-range: U+50da-5183; 455 + } 456 + 457 + @font-face { 458 + font-family: IBM Plex Sans JP; 459 + font-style: normal; 460 + font-weight: 400; 461 + font-display: swap; 462 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/051.woff2) format('woff2'); 463 + unicode-range: U+5184-5231; 464 + } 465 + 466 + @font-face { 467 + font-family: IBM Plex Sans JP; 468 + font-style: normal; 469 + font-weight: 400; 470 + font-display: swap; 471 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/052.woff2) format('woff2'); 472 + unicode-range: U+5232-52df; 473 + } 474 + 475 + @font-face { 476 + font-family: IBM Plex Sans JP; 477 + font-style: normal; 478 + font-weight: 400; 479 + font-display: swap; 480 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/053.woff2) format('woff2'); 481 + unicode-range: U+52e0-537f; 482 + } 483 + 484 + @font-face { 485 + font-family: IBM Plex Sans JP; 486 + font-style: normal; 487 + font-weight: 400; 488 + font-display: swap; 489 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/054.woff2) format('woff2'); 490 + unicode-range: U+5382-5435; 491 + } 492 + 493 + @font-face { 494 + font-family: IBM Plex Sans JP; 495 + font-style: normal; 496 + font-weight: 400; 497 + font-display: swap; 498 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/055.woff2) format('woff2'); 499 + unicode-range: U+5436-54fe; 500 + } 501 + 502 + @font-face { 503 + font-family: IBM Plex Sans JP; 504 + font-style: normal; 505 + font-weight: 400; 506 + font-display: swap; 507 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/056.woff2) format('woff2'); 508 + unicode-range: U+54ff-55e3; 509 + } 510 + 511 + @font-face { 512 + font-family: IBM Plex Sans JP; 513 + font-style: normal; 514 + font-weight: 400; 515 + font-display: swap; 516 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/057.woff2) format('woff2'); 517 + unicode-range: U+55e4-56c5; 518 + } 519 + 520 + @font-face { 521 + font-family: IBM Plex Sans JP; 522 + font-style: normal; 523 + font-weight: 400; 524 + font-display: swap; 525 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/058.woff2) format('woff2'); 526 + unicode-range: U+56c8-577e; 527 + } 528 + 529 + @font-face { 530 + font-family: IBM Plex Sans JP; 531 + font-style: normal; 532 + font-weight: 400; 533 + font-display: swap; 534 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/059.woff2) format('woff2'); 535 + unicode-range: U+577f-5861; 536 + } 537 + 538 + @font-face { 539 + font-family: IBM Plex Sans JP; 540 + font-style: normal; 541 + font-weight: 400; 542 + font-display: swap; 543 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/060.woff2) format('woff2'); 544 + unicode-range: U+5862-5924; 545 + } 546 + 547 + @font-face { 548 + font-family: IBM Plex Sans JP; 549 + font-style: normal; 550 + font-weight: 400; 551 + font-display: swap; 552 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/061.woff2) format('woff2'); 553 + unicode-range: U+5925-59e6; 554 + } 555 + 556 + @font-face { 557 + font-family: IBM Plex Sans JP; 558 + font-style: normal; 559 + font-weight: 400; 560 + font-display: swap; 561 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/062.woff2) format('woff2'); 562 + unicode-range: U+59e7-5afd; 563 + } 564 + 565 + @font-face { 566 + font-family: IBM Plex Sans JP; 567 + font-style: normal; 568 + font-weight: 400; 569 + font-display: swap; 570 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/063.woff2) format('woff2'); 571 + unicode-range: U+5b00-5bcd; 572 + } 573 + 574 + @font-face { 575 + font-family: IBM Plex Sans JP; 576 + font-style: normal; 577 + font-weight: 400; 578 + font-display: swap; 579 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/064.woff2) format('woff2'); 580 + unicode-range: U+5bce-5c79; 581 + } 582 + 583 + @font-face { 584 + font-family: IBM Plex Sans JP; 585 + font-style: normal; 586 + font-weight: 400; 587 + font-display: swap; 588 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/065.woff2) format('woff2'); 589 + unicode-range: U+5c7a-5d79; 590 + } 591 + 592 + @font-face { 593 + font-family: IBM Plex Sans JP; 594 + font-style: normal; 595 + font-weight: 400; 596 + font-display: swap; 597 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/066.woff2) format('woff2'); 598 + unicode-range: U+5d7a-5e55; 599 + } 600 + 601 + @font-face { 602 + font-family: IBM Plex Sans JP; 603 + font-style: normal; 604 + font-weight: 400; 605 + font-display: swap; 606 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/067.woff2) format('woff2'); 607 + unicode-range: U+5e56-5f0c; 608 + } 609 + 610 + @font-face { 611 + font-family: IBM Plex Sans JP; 612 + font-style: normal; 613 + font-weight: 400; 614 + font-display: swap; 615 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/068.woff2) format('woff2'); 616 + unicode-range: U+5f0d-5fac; 617 + } 618 + 619 + @font-face { 620 + font-family: IBM Plex Sans JP; 621 + font-style: normal; 622 + font-weight: 400; 623 + font-display: swap; 624 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/069.woff2) format('woff2'); 625 + unicode-range: U+5fad-606b; 626 + } 627 + 628 + @font-face { 629 + font-family: IBM Plex Sans JP; 630 + font-style: normal; 631 + font-weight: 400; 632 + font-display: swap; 633 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/070.woff2) format('woff2'); 634 + unicode-range: U+606c-611c; 635 + } 636 + 637 + @font-face { 638 + font-family: IBM Plex Sans JP; 639 + font-style: normal; 640 + font-weight: 400; 641 + font-display: swap; 642 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/071.woff2) format('woff2'); 643 + unicode-range: U+611e-61de; 644 + } 645 + 646 + @font-face { 647 + font-family: IBM Plex Sans JP; 648 + font-style: normal; 649 + font-weight: 400; 650 + font-display: swap; 651 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/072.woff2) format('woff2'); 652 + unicode-range: U+61df-6294; 653 + } 654 + 655 + @font-face { 656 + font-family: IBM Plex Sans JP; 657 + font-style: normal; 658 + font-weight: 400; 659 + font-display: swap; 660 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/073.woff2) format('woff2'); 661 + unicode-range: U+6295-6366; 662 + } 663 + 664 + @font-face { 665 + font-family: IBM Plex Sans JP; 666 + font-style: normal; 667 + font-weight: 400; 668 + font-display: swap; 669 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/074.woff2) format('woff2'); 670 + unicode-range: U+6367-6430; 671 + } 672 + 673 + @font-face { 674 + font-family: IBM Plex Sans JP; 675 + font-style: normal; 676 + font-weight: 400; 677 + font-display: swap; 678 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/075.woff2) format('woff2'); 679 + unicode-range: U+6434-6516; 680 + } 681 + 682 + @font-face { 683 + font-family: IBM Plex Sans JP; 684 + font-style: normal; 685 + font-weight: 400; 686 + font-display: swap; 687 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/076.woff2) format('woff2'); 688 + unicode-range: U+6518-65d4; 689 + } 690 + 691 + @font-face { 692 + font-family: IBM Plex Sans JP; 693 + font-style: normal; 694 + font-weight: 400; 695 + font-display: swap; 696 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/077.woff2) format('woff2'); 697 + unicode-range: U+65d6-6679; 698 + } 699 + 700 + @font-face { 701 + font-family: IBM Plex Sans JP; 702 + font-style: normal; 703 + font-weight: 400; 704 + font-display: swap; 705 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/078.woff2) format('woff2'); 706 + unicode-range: U+667a-6738; 707 + } 708 + 709 + @font-face { 710 + font-family: IBM Plex Sans JP; 711 + font-style: normal; 712 + font-weight: 400; 713 + font-display: swap; 714 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/079.woff2) format('woff2'); 715 + unicode-range: U+673a-67ef; 716 + } 717 + 718 + @font-face { 719 + font-family: IBM Plex Sans JP; 720 + font-style: normal; 721 + font-weight: 400; 722 + font-display: swap; 723 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/080.woff2) format('woff2'); 724 + unicode-range: U+67f0-68ab; 725 + } 726 + 727 + @font-face { 728 + font-family: IBM Plex Sans JP; 729 + font-style: normal; 730 + font-weight: 400; 731 + font-display: swap; 732 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/081.woff2) format('woff2'); 733 + unicode-range: U+68ad-6965; 734 + } 735 + 736 + @font-face { 737 + font-family: IBM Plex Sans JP; 738 + font-style: normal; 739 + font-weight: 400; 740 + font-display: swap; 741 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/082.woff2) format('woff2'); 742 + unicode-range: U+6966-6a23; 743 + } 744 + 745 + @font-face { 746 + font-family: IBM Plex Sans JP; 747 + font-style: normal; 748 + font-weight: 400; 749 + font-display: swap; 750 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/083.woff2) format('woff2'); 751 + unicode-range: U+6a24-6b04; 752 + } 753 + 754 + @font-face { 755 + font-family: IBM Plex Sans JP; 756 + font-style: normal; 757 + font-weight: 400; 758 + font-display: swap; 759 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/084.woff2) format('woff2'); 760 + unicode-range: U+6b05-6bc3; 761 + } 762 + 763 + @font-face { 764 + font-family: IBM Plex Sans JP; 765 + font-style: normal; 766 + font-weight: 400; 767 + font-display: swap; 768 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/085.woff2) format('woff2'); 769 + unicode-range: U+6bc4-6c9a; 770 + } 771 + 772 + @font-face { 773 + font-family: IBM Plex Sans JP; 774 + font-style: normal; 775 + font-weight: 400; 776 + font-display: swap; 777 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/086.woff2) format('woff2'); 778 + unicode-range: U+6c9b-6d6c; 779 + } 780 + 781 + @font-face { 782 + font-family: IBM Plex Sans JP; 783 + font-style: normal; 784 + font-weight: 400; 785 + font-display: swap; 786 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/087.woff2) format('woff2'); 787 + unicode-range: U+6d6e-6e36; 788 + } 789 + 790 + @font-face { 791 + font-family: IBM Plex Sans JP; 792 + font-style: normal; 793 + font-weight: 400; 794 + font-display: swap; 795 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/088.woff2) format('woff2'); 796 + unicode-range: U+6e38-6f10; 797 + } 798 + 799 + @font-face { 800 + font-family: IBM Plex Sans JP; 801 + font-style: normal; 802 + font-weight: 400; 803 + font-display: swap; 804 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/089.woff2) format('woff2'); 805 + unicode-range: U+6f11-6fe9; 806 + } 807 + 808 + @font-face { 809 + font-family: IBM Plex Sans JP; 810 + font-style: normal; 811 + font-weight: 400; 812 + font-display: swap; 813 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/090.woff2) format('woff2'); 814 + unicode-range: U+6feb-70fd; 815 + } 816 + 817 + @font-face { 818 + font-family: IBM Plex Sans JP; 819 + font-style: normal; 820 + font-weight: 400; 821 + font-display: swap; 822 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/091.woff2) format('woff2'); 823 + unicode-range: U+7103-7208; 824 + } 825 + 826 + @font-face { 827 + font-family: IBM Plex Sans JP; 828 + font-style: normal; 829 + font-weight: 400; 830 + font-display: swap; 831 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/092.woff2) format('woff2'); 832 + unicode-range: U+7209-72e9; 833 + } 834 + 835 + @font-face { 836 + font-family: IBM Plex Sans JP; 837 + font-style: normal; 838 + font-weight: 400; 839 + font-display: swap; 840 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/093.woff2) format('woff2'); 841 + unicode-range: U+72ec-73bd; 842 + } 843 + 844 + @font-face { 845 + font-family: IBM Plex Sans JP; 846 + font-style: normal; 847 + font-weight: 400; 848 + font-display: swap; 849 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/094.woff2) format('woff2'); 850 + unicode-range: U+73bf-7491; 851 + } 852 + 853 + @font-face { 854 + font-family: IBM Plex Sans JP; 855 + font-style: normal; 856 + font-weight: 400; 857 + font-display: swap; 858 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/095.woff2) format('woff2'); 859 + unicode-range: U+7492-754f; 860 + } 861 + 862 + @font-face { 863 + font-family: IBM Plex Sans JP; 864 + font-style: normal; 865 + font-weight: 400; 866 + font-display: swap; 867 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/096.woff2) format('woff2'); 868 + unicode-range: U+7550-7601; 869 + } 870 + 871 + @font-face { 872 + font-family: IBM Plex Sans JP; 873 + font-style: normal; 874 + font-weight: 400; 875 + font-display: swap; 876 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/097.woff2) format('woff2'); 877 + unicode-range: U+7602-76b7; 878 + } 879 + 880 + @font-face { 881 + font-family: IBM Plex Sans JP; 882 + font-style: normal; 883 + font-weight: 400; 884 + font-display: swap; 885 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/098.woff2) format('woff2'); 886 + unicode-range: U+76b8-777e; 887 + } 888 + 889 + @font-face { 890 + font-family: IBM Plex Sans JP; 891 + font-style: normal; 892 + font-weight: 400; 893 + font-display: swap; 894 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/099.woff2) format('woff2'); 895 + unicode-range: U+777f-787c; 896 + } 897 + 898 + @font-face { 899 + font-family: IBM Plex Sans JP; 900 + font-style: normal; 901 + font-weight: 400; 902 + font-display: swap; 903 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/100.woff2) format('woff2'); 904 + unicode-range: U+787e-794f; 905 + } 906 + 907 + @font-face { 908 + font-family: IBM Plex Sans JP; 909 + font-style: normal; 910 + font-weight: 400; 911 + font-display: swap; 912 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/101.woff2) format('woff2'); 913 + unicode-range: U+7950-7a1a; 914 + } 915 + 916 + @font-face { 917 + font-family: IBM Plex Sans JP; 918 + font-style: normal; 919 + font-weight: 400; 920 + font-display: swap; 921 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/102.woff2) format('woff2'); 922 + unicode-range: U+7a1b-7adf; 923 + } 924 + 925 + @font-face { 926 + font-family: IBM Plex Sans JP; 927 + font-style: normal; 928 + font-weight: 400; 929 + font-display: swap; 930 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/103.woff2) format('woff2'); 931 + unicode-range: U+7ae0-7b9f; 932 + } 933 + 934 + @font-face { 935 + font-family: IBM Plex Sans JP; 936 + font-style: normal; 937 + font-weight: 400; 938 + font-display: swap; 939 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/104.woff2) format('woff2'); 940 + unicode-range: U+7ba0-7c60; 941 + } 942 + 943 + @font-face { 944 + font-family: IBM Plex Sans JP; 945 + font-style: normal; 946 + font-weight: 400; 947 + font-display: swap; 948 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/105.woff2) format('woff2'); 949 + unicode-range: U+7c61-7d1e; 950 + } 951 + 952 + @font-face { 953 + font-family: IBM Plex Sans JP; 954 + font-style: normal; 955 + font-weight: 400; 956 + font-display: swap; 957 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/106.woff2) format('woff2'); 958 + unicode-range: U+7d20-7dcd; 959 + } 960 + 961 + @font-face { 962 + font-family: IBM Plex Sans JP; 963 + font-style: normal; 964 + font-weight: 400; 965 + font-display: swap; 966 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/107.woff2) format('woff2'); 967 + unicode-range: U+7dce-7e89; 968 + } 969 + 970 + @font-face { 971 + font-family: IBM Plex Sans JP; 972 + font-style: normal; 973 + font-weight: 400; 974 + font-display: swap; 975 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/108.woff2) format('woff2'); 976 + unicode-range: U+7e8a-7fe5; 977 + } 978 + 979 + @font-face { 980 + font-family: IBM Plex Sans JP; 981 + font-style: normal; 982 + font-weight: 400; 983 + font-display: swap; 984 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/109.woff2) format('woff2'); 985 + unicode-range: U+7fe6-80ad; 986 + } 987 + 988 + @font-face { 989 + font-family: IBM Plex Sans JP; 990 + font-style: normal; 991 + font-weight: 400; 992 + font-display: swap; 993 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/110.woff2) format('woff2'); 994 + unicode-range: U+80af-8186; 995 + } 996 + 997 + @font-face { 998 + font-family: IBM Plex Sans JP; 999 + font-style: normal; 1000 + font-weight: 400; 1001 + font-display: swap; 1002 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/111.woff2) format('woff2'); 1003 + unicode-range: U+8188-8237; 1004 + } 1005 + 1006 + @font-face { 1007 + font-family: IBM Plex Sans JP; 1008 + font-style: normal; 1009 + font-weight: 400; 1010 + font-display: swap; 1011 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/112.woff2) format('woff2'); 1012 + unicode-range: U+8238-82f6; 1013 + } 1014 + 1015 + @font-face { 1016 + font-family: IBM Plex Sans JP; 1017 + font-style: normal; 1018 + font-weight: 400; 1019 + font-display: swap; 1020 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/113.woff2) format('woff2'); 1021 + unicode-range: U+82f7-83cc; 1022 + } 1023 + 1024 + @font-face { 1025 + font-family: IBM Plex Sans JP; 1026 + font-style: normal; 1027 + font-weight: 400; 1028 + font-display: swap; 1029 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/114.woff2) format('woff2'); 1030 + unicode-range: U+83ce-84b2; 1031 + } 1032 + 1033 + @font-face { 1034 + font-family: IBM Plex Sans JP; 1035 + font-style: normal; 1036 + font-weight: 400; 1037 + font-display: swap; 1038 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/115.woff2) format('woff2'); 1039 + unicode-range: U+84b4-8581; 1040 + } 1041 + 1042 + @font-face { 1043 + font-family: IBM Plex Sans JP; 1044 + font-style: normal; 1045 + font-weight: 400; 1046 + font-display: swap; 1047 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/116.woff2) format('woff2'); 1048 + unicode-range: U+8584-8654; 1049 + } 1050 + 1051 + @font-face { 1052 + font-family: IBM Plex Sans JP; 1053 + font-style: normal; 1054 + font-weight: 400; 1055 + font-display: swap; 1056 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/117.woff2) format('woff2'); 1057 + unicode-range: U+8655-871c; 1058 + } 1059 + 1060 + @font-face { 1061 + font-family: IBM Plex Sans JP; 1062 + font-style: normal; 1063 + font-weight: 400; 1064 + font-display: swap; 1065 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/118.woff2) format('woff2'); 1066 + unicode-range: U+871e-87f8; 1067 + } 1068 + 1069 + @font-face { 1070 + font-family: IBM Plex Sans JP; 1071 + font-style: normal; 1072 + font-weight: 400; 1073 + font-display: swap; 1074 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/119.woff2) format('woff2'); 1075 + unicode-range: U+87f9-88c0; 1076 + } 1077 + 1078 + @font-face { 1079 + font-family: IBM Plex Sans JP; 1080 + font-style: normal; 1081 + font-weight: 400; 1082 + font-display: swap; 1083 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/120.woff2) format('woff2'); 1084 + unicode-range: U+88c1-8988; 1085 + } 1086 + 1087 + @font-face { 1088 + font-family: IBM Plex Sans JP; 1089 + font-style: normal; 1090 + font-weight: 400; 1091 + font-display: swap; 1092 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/121.woff2) format('woff2'); 1093 + unicode-range: U+8989-8a58; 1094 + } 1095 + 1096 + @font-face { 1097 + font-family: IBM Plex Sans JP; 1098 + font-style: normal; 1099 + font-weight: 400; 1100 + font-display: swap; 1101 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/122.woff2) format('woff2'); 1102 + unicode-range: U+8a5b-8b02; 1103 + } 1104 + 1105 + @font-face { 1106 + font-family: IBM Plex Sans JP; 1107 + font-style: normal; 1108 + font-weight: 400; 1109 + font-display: swap; 1110 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/123.woff2) format('woff2'); 1111 + unicode-range: U+8b04-8c5a; 1112 + } 1113 + 1114 + @font-face { 1115 + font-family: IBM Plex Sans JP; 1116 + font-style: normal; 1117 + font-weight: 400; 1118 + font-display: swap; 1119 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/124.woff2) format('woff2'); 1120 + unicode-range: U+8c5b-8d0b; 1121 + } 1122 + 1123 + @font-face { 1124 + font-family: IBM Plex Sans JP; 1125 + font-style: normal; 1126 + font-weight: 400; 1127 + font-display: swap; 1128 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/125.woff2) format('woff2'); 1129 + unicode-range: U+8d0d-8e38; 1130 + } 1131 + 1132 + @font-face { 1133 + font-family: IBM Plex Sans JP; 1134 + font-style: normal; 1135 + font-weight: 400; 1136 + font-display: swap; 1137 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/126.woff2) format('woff2'); 1138 + unicode-range: U+8e39-8f0c; 1139 + } 1140 + 1141 + @font-face { 1142 + font-family: IBM Plex Sans JP; 1143 + font-style: normal; 1144 + font-weight: 400; 1145 + font-display: swap; 1146 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/127.woff2) format('woff2'); 1147 + unicode-range: U+8f0f-8feb; 1148 + } 1149 + 1150 + @font-face { 1151 + font-family: IBM Plex Sans JP; 1152 + font-style: normal; 1153 + font-weight: 400; 1154 + font-display: swap; 1155 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/128.woff2) format('woff2'); 1156 + unicode-range: U+8fed-908b; 1157 + } 1158 + 1159 + @font-face { 1160 + font-family: IBM Plex Sans JP; 1161 + font-style: normal; 1162 + font-weight: 400; 1163 + font-display: swap; 1164 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/129.woff2) format('woff2'); 1165 + unicode-range: U+908c-9165; 1166 + } 1167 + 1168 + @font-face { 1169 + font-family: IBM Plex Sans JP; 1170 + font-style: normal; 1171 + font-weight: 400; 1172 + font-display: swap; 1173 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/130.woff2) format('woff2'); 1174 + unicode-range: U+9167-9216; 1175 + } 1176 + 1177 + @font-face { 1178 + font-family: IBM Plex Sans JP; 1179 + font-style: normal; 1180 + font-weight: 400; 1181 + font-display: swap; 1182 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/131.woff2) format('woff2'); 1183 + unicode-range: U+9217-92d2; 1184 + } 1185 + 1186 + @font-face { 1187 + font-family: IBM Plex Sans JP; 1188 + font-style: normal; 1189 + font-weight: 400; 1190 + font-display: swap; 1191 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/132.woff2) format('woff2'); 1192 + unicode-range: U+92d3-939a; 1193 + } 1194 + 1195 + @font-face { 1196 + font-family: IBM Plex Sans JP; 1197 + font-style: normal; 1198 + font-weight: 400; 1199 + font-display: swap; 1200 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/133.woff2) format('woff2'); 1201 + unicode-range: U+939b-947e; 1202 + } 1203 + 1204 + @font-face { 1205 + font-family: IBM Plex Sans JP; 1206 + font-style: normal; 1207 + font-weight: 400; 1208 + font-display: swap; 1209 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/134.woff2) format('woff2'); 1210 + unicode-range: U+947f-965d; 1211 + } 1212 + 1213 + @font-face { 1214 + font-family: IBM Plex Sans JP; 1215 + font-style: normal; 1216 + font-weight: 400; 1217 + font-display: swap; 1218 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/135.woff2) format('woff2'); 1219 + unicode-range: U+965e-9713; 1220 + } 1221 + 1222 + @font-face { 1223 + font-family: IBM Plex Sans JP; 1224 + font-style: normal; 1225 + font-weight: 400; 1226 + font-display: swap; 1227 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/136.woff2) format('woff2'); 1228 + unicode-range: U+9714-97d1; 1229 + } 1230 + 1231 + @font-face { 1232 + font-family: IBM Plex Sans JP; 1233 + font-style: normal; 1234 + font-weight: 400; 1235 + font-display: swap; 1236 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/137.woff2) format('woff2'); 1237 + unicode-range: U+97d3-98c5; 1238 + } 1239 + 1240 + @font-face { 1241 + font-family: IBM Plex Sans JP; 1242 + font-style: normal; 1243 + font-weight: 400; 1244 + font-display: swap; 1245 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/138.woff2) format('woff2'); 1246 + unicode-range: U+98c6-99c4; 1247 + } 1248 + 1249 + @font-face { 1250 + font-family: IBM Plex Sans JP; 1251 + font-style: normal; 1252 + font-weight: 400; 1253 + font-display: swap; 1254 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/139.woff2) format('woff2'); 1255 + unicode-range: U+99c5-9ac8; 1256 + } 1257 + 1258 + @font-face { 1259 + font-family: IBM Plex Sans JP; 1260 + font-style: normal; 1261 + font-weight: 400; 1262 + font-display: swap; 1263 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/140.woff2) format('woff2'); 1264 + unicode-range: U+9ace-9b79; 1265 + } 1266 + 1267 + @font-face { 1268 + font-family: IBM Plex Sans JP; 1269 + font-style: normal; 1270 + font-weight: 400; 1271 + font-display: swap; 1272 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/141.woff2) format('woff2'); 1273 + unicode-range: U+9b7f-9c35; 1274 + } 1275 + 1276 + @font-face { 1277 + font-family: IBM Plex Sans JP; 1278 + font-style: normal; 1279 + font-weight: 400; 1280 + font-display: swap; 1281 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/142.woff2) format('woff2'); 1282 + unicode-range: U+9c36-9d6f; 1283 + } 1284 + 1285 + @font-face { 1286 + font-family: IBM Plex Sans JP; 1287 + font-style: normal; 1288 + font-weight: 400; 1289 + font-display: swap; 1290 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/143.woff2) format('woff2'); 1291 + unicode-range: U+9d70-9e9d; 1292 + } 1293 + 1294 + @font-face { 1295 + font-family: IBM Plex Sans JP; 1296 + font-style: normal; 1297 + font-weight: 400; 1298 + font-display: swap; 1299 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/144.woff2) format('woff2'); 1300 + unicode-range: U+9e9e-9f61; 1301 + } 1302 + 1303 + @font-face { 1304 + font-family: IBM Plex Sans JP; 1305 + font-style: normal; 1306 + font-weight: 400; 1307 + font-display: swap; 1308 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/145.woff2) format('woff2'); 1309 + unicode-range: U+9f62-9fb4; 1310 + } 1311 + 1312 + @font-face { 1313 + font-family: IBM Plex Sans JP; 1314 + font-style: normal; 1315 + font-weight: 400; 1316 + font-display: swap; 1317 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/146.woff2) format('woff2'); 1318 + unicode-range: U+f860-f87f; 1319 + } 1320 + 1321 + @font-face { 1322 + font-family: IBM Plex Sans JP; 1323 + font-style: normal; 1324 + font-weight: 400; 1325 + font-display: swap; 1326 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/147.woff2) format('woff2'); 1327 + unicode-range: U+f909-fa6a; 1328 + } 1329 + 1330 + @font-face { 1331 + font-family: IBM Plex Sans JP; 1332 + font-style: normal; 1333 + font-weight: 400; 1334 + font-display: swap; 1335 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/148.woff2) format('woff2'); 1336 + unicode-range: U+fb00-fb04; 1337 + } 1338 + 1339 + @font-face { 1340 + font-family: IBM Plex Sans JP; 1341 + font-style: normal; 1342 + font-weight: 400; 1343 + font-display: swap; 1344 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/149.woff2) format('woff2'); 1345 + unicode-range: U+fe10-fe19; 1346 + } 1347 + 1348 + @font-face { 1349 + font-family: IBM Plex Sans JP; 1350 + font-style: normal; 1351 + font-weight: 400; 1352 + font-display: swap; 1353 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/150.woff2) format('woff2'); 1354 + unicode-range: U+fe30-fe48; 1355 + } 1356 + 1357 + @font-face { 1358 + font-family: IBM Plex Sans JP; 1359 + font-style: normal; 1360 + font-weight: 400; 1361 + font-display: swap; 1362 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/151.woff2) format('woff2'); 1363 + unicode-range: U+ff01-ff80; 1364 + } 1365 + 1366 + @font-face { 1367 + font-family: IBM Plex Sans JP; 1368 + font-style: normal; 1369 + font-weight: 400; 1370 + font-display: swap; 1371 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/152.woff2) format('woff2'); 1372 + unicode-range: U+ff81-ffe8; 1373 + } 1374 + 1375 + @font-face { 1376 + font-family: IBM Plex Sans JP; 1377 + font-style: normal; 1378 + font-weight: 400; 1379 + font-display: swap; 1380 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/153.woff2) format('woff2'); 1381 + unicode-range: U+1f100; 1382 + } 1383 + 1384 + @font-face { 1385 + font-family: IBM Plex Sans JP; 1386 + font-style: normal; 1387 + font-weight: 400; 1388 + font-display: swap; 1389 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/154.woff2) format('woff2'); 1390 + unicode-range: U+2000b-23763; 1391 + } 1392 + 1393 + @font-face { 1394 + font-family: IBM Plex Sans JP; 1395 + font-style: normal; 1396 + font-weight: 400; 1397 + font-display: swap; 1398 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/155.woff2) format('woff2'); 1399 + unicode-range: U+23764-2770e; 1400 + } 1401 + 1402 + @font-face { 1403 + font-family: IBM Plex Sans JP; 1404 + font-style: normal; 1405 + font-weight: 400; 1406 + font-display: swap; 1407 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/156.woff2) format('woff2'); 1408 + unicode-range: U+27723-2a6b2; 1409 + } 1410 + 1411 + @font-face { 1412 + font-family: IBM Plex Sans JP; 1413 + font-style: normal; 1414 + font-weight: 400; 1415 + font-display: swap; 1416 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/157.woff2) format('woff2'); 1417 + unicode-range: U+2f804-2f9f4; 1418 + }
+157
public/font/IBMPlexSansJP-Regular/list
··· 1 + 1 IBMPlexSansJP-Regular.Basic-Latin.woff2 2 + 2 IBMPlexSansJP-Regular.Latin-1-Supplement.woff2 3 + 3 IBMPlexSansJP-Regular.Latin-Extended-A.woff2 4 + 4 IBMPlexSansJP-Regular.Latin-Extended-B.woff2 5 + 5 IBMPlexSansJP-Regular.IPA-Extensions.woff2 6 + 6 IBMPlexSansJP-Regular.Spacing-Modifier-Letters.woff2 7 + 7 IBMPlexSansJP-Regular.Combining-Diacritical-Marks.woff2 8 + 8 IBMPlexSansJP-Regular.Greek-and-Coptic.woff2 9 + 9 IBMPlexSansJP-Regular.Cyrillic.woff2 10 + 10 IBMPlexSansJP-Regular.Latin-Extended-Additional.woff2 11 + 11 IBMPlexSansJP-Regular.Greek-Extended.woff2 12 + 12 IBMPlexSansJP-Regular.General-Punctuation.woff2 13 + 13 IBMPlexSansJP-Regular.Superscripts-and-Subscripts.woff2 14 + 14 IBMPlexSansJP-Regular.Currency-Symbols.woff2 15 + 15 IBMPlexSansJP-Regular.Combining-Diacritical-Marks-for-Symbols.woff2 16 + 16 IBMPlexSansJP-Regular.Letterlike-Symbols.woff2 17 + 17 IBMPlexSansJP-Regular.Number-Forms.woff2 18 + 18 IBMPlexSansJP-Regular.Arrows.woff2 19 + 19 IBMPlexSansJP-Regular.Mathematical-Operators.woff2 20 + 20 IBMPlexSansJP-Regular.Miscellaneous-Technical.woff2 21 + 21 IBMPlexSansJP-Regular.Control-Pictures.woff2 22 + 22 IBMPlexSansJP-Regular.Enclosed-Alphanumerics-1.woff2 23 + 23 IBMPlexSansJP-Regular.Enclosed-Alphanumerics-2.woff2 24 + 24 IBMPlexSansJP-Regular.Box-Drawing.woff2 25 + 25 IBMPlexSansJP-Regular.Block-Elements.woff2 26 + 26 IBMPlexSansJP-Regular.Geometric-Shapes.woff2 27 + 27 IBMPlexSansJP-Regular.Miscellaneous-Symbols.woff2 28 + 28 IBMPlexSansJP-Regular.Dingbats.woff2 29 + 29 IBMPlexSansJP-Regular.Supplemental-Arrows-B.woff2 30 + 30 IBMPlexSansJP-Regular.Miscellaneous-Mathematical-Symbols-B.woff2 31 + 31 IBMPlexSansJP-Regular.Miscellaneous-Symbols-and-Arrows.woff2 32 + 32 IBMPlexSansJP-Regular.CJK-Radicals-Supplement.woff2 33 + 33 IBMPlexSansJP-Regular.Kangxi-Radicals-1.woff2 34 + 34 IBMPlexSansJP-Regular.Kangxi-Radicals-2.woff2 35 + 35 IBMPlexSansJP-Regular.CJK-Symbols-and-Punctuation.woff2 36 + 36 IBMPlexSansJP-Regular.Hiragana.woff2 37 + 37 IBMPlexSansJP-Regular.Katakana.woff2 38 + 38 IBMPlexSansJP-Regular.Kanbun.woff2 39 + 39 IBMPlexSansJP-Regular.Katakana-Phonetic-Extensions.woff2 40 + 40 IBMPlexSansJP-Regular.Enclosed-CJK-Letters-and-Months-1.woff2 41 + 41 IBMPlexSansJP-Regular.Enclosed-CJK-Letters-and-Months-2.woff2 42 + 42 IBMPlexSansJP-Regular.CJK-Compatibility-1.woff2 43 + 43 IBMPlexSansJP-Regular.CJK-Compatibility-2.woff2 44 + 44 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-Extension-A-1.woff2 45 + 45 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-Extension-A-2.woff2 46 + 46 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-001.woff2 47 + 47 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-002.woff2 48 + 48 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-003.woff2 49 + 49 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-004.woff2 50 + 50 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-005.woff2 51 + 51 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-006.woff2 52 + 52 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-007.woff2 53 + 53 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-008.woff2 54 + 54 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-009.woff2 55 + 55 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-010.woff2 56 + 56 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-011.woff2 57 + 57 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-012.woff2 58 + 58 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-013.woff2 59 + 59 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-014.woff2 60 + 60 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-015.woff2 61 + 61 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-016.woff2 62 + 62 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-017.woff2 63 + 63 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-018.woff2 64 + 64 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-019.woff2 65 + 65 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-020.woff2 66 + 66 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-021.woff2 67 + 67 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-022.woff2 68 + 68 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-023.woff2 69 + 69 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-024.woff2 70 + 70 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-025.woff2 71 + 71 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-026.woff2 72 + 72 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-027.woff2 73 + 73 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-028.woff2 74 + 74 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-029.woff2 75 + 75 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-030.woff2 76 + 76 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-031.woff2 77 + 77 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-032.woff2 78 + 78 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-033.woff2 79 + 79 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-034.woff2 80 + 80 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-035.woff2 81 + 81 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-036.woff2 82 + 82 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-037.woff2 83 + 83 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-038.woff2 84 + 84 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-039.woff2 85 + 85 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-040.woff2 86 + 86 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-041.woff2 87 + 87 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-042.woff2 88 + 88 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-043.woff2 89 + 89 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-044.woff2 90 + 90 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-045.woff2 91 + 91 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-046.woff2 92 + 92 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-047.woff2 93 + 93 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-048.woff2 94 + 94 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-049.woff2 95 + 95 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-050.woff2 96 + 96 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-051.woff2 97 + 97 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-052.woff2 98 + 98 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-053.woff2 99 + 99 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-054.woff2 100 + 100 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-055.woff2 101 + 101 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-056.woff2 102 + 102 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-057.woff2 103 + 103 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-058.woff2 104 + 104 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-059.woff2 105 + 105 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-060.woff2 106 + 106 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-061.woff2 107 + 107 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-062.woff2 108 + 108 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-063.woff2 109 + 109 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-064.woff2 110 + 110 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-065.woff2 111 + 111 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-066.woff2 112 + 112 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-067.woff2 113 + 113 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-068.woff2 114 + 114 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-069.woff2 115 + 115 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-070.woff2 116 + 116 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-071.woff2 117 + 117 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-072.woff2 118 + 118 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-073.woff2 119 + 119 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-074.woff2 120 + 120 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-075.woff2 121 + 121 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-076.woff2 122 + 122 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-077.woff2 123 + 123 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-078.woff2 124 + 124 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-079.woff2 125 + 125 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-080.woff2 126 + 126 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-081.woff2 127 + 127 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-082.woff2 128 + 128 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-083.woff2 129 + 129 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-084.woff2 130 + 130 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-085.woff2 131 + 131 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-086.woff2 132 + 132 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-087.woff2 133 + 133 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-088.woff2 134 + 134 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-089.woff2 135 + 135 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-090.woff2 136 + 136 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-091.woff2 137 + 137 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-092.woff2 138 + 138 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-093.woff2 139 + 139 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-094.woff2 140 + 140 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-095.woff2 141 + 141 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-096.woff2 142 + 142 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-097.woff2 143 + 143 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-098.woff2 144 + 144 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-099.woff2 145 + 145 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-100.woff2 146 + 146 IBMPlexSansJP-Regular.Private-Use-Area.woff2 147 + 147 IBMPlexSansJP-Regular.CJK-Compatibility-Ideographs.woff2 148 + 148 IBMPlexSansJP-Regular.Alphabetic-Presentation-Forms.woff2 149 + 149 IBMPlexSansJP-Regular.Vertical-Forms.woff2 150 + 150 IBMPlexSansJP-Regular.CJK-Compatibility-Forms.woff2 151 + 151 IBMPlexSansJP-Regular.Halfwidth-and-Fullwidth-Forms-1.woff2 152 + 152 IBMPlexSansJP-Regular.Halfwidth-and-Fullwidth-Forms-2.woff2 153 + 153 IBMPlexSansJP-Regular.Enclosed-Alphanumeric-Supplement.woff2 154 + 154 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-Extension-B-1.woff2 155 + 155 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-Extension-B-2.woff2 156 + 156 IBMPlexSansJP-Regular.CJK-Unified-Ideographs-Extension-B-3.woff2 157 + 157 IBMPlexSansJP-Regular.CJK-Compatibility-Ideographs-Supplement.woff2
public/garbage/bugs_when_you_lift_up_a_rock.jpg

This is a binary file and will not be displayed.

public/garbage/my_pages.png

This is a binary file and will not be displayed.

+5261
public/htmx.js
··· 1 + var htmx = (function() { 2 + 'use strict' 3 + 4 + // Public API 5 + const htmx = { 6 + // Tsc madness here, assigning the functions directly results in an invalid TypeScript output, but reassigning is fine 7 + /* Event processing */ 8 + /** @type {typeof onLoadHelper} */ 9 + onLoad: null, 10 + /** @type {typeof processNode} */ 11 + process: null, 12 + /** @type {typeof addEventListenerImpl} */ 13 + on: null, 14 + /** @type {typeof removeEventListenerImpl} */ 15 + off: null, 16 + /** @type {typeof triggerEvent} */ 17 + trigger: null, 18 + /** @type {typeof ajaxHelper} */ 19 + ajax: null, 20 + /* DOM querying helpers */ 21 + /** @type {typeof find} */ 22 + find: null, 23 + /** @type {typeof findAll} */ 24 + findAll: null, 25 + /** @type {typeof closest} */ 26 + closest: null, 27 + /** 28 + * Returns the input values that would resolve for a given element via the htmx value resolution mechanism 29 + * 30 + * @see https://htmx.org/api/#values 31 + * 32 + * @param {Element} elt the element to resolve values on 33 + * @param {HttpVerb} type the request type (e.g. **get** or **post**) non-GET's will include the enclosing form of the element. Defaults to **post** 34 + * @returns {Object} 35 + */ 36 + values: function(elt, type) { 37 + const inputValues = getInputValues(elt, type || 'post') 38 + return inputValues.values 39 + }, 40 + /* DOM manipulation helpers */ 41 + /** @type {typeof removeElement} */ 42 + remove: null, 43 + /** @type {typeof addClassToElement} */ 44 + addClass: null, 45 + /** @type {typeof removeClassFromElement} */ 46 + removeClass: null, 47 + /** @type {typeof toggleClassOnElement} */ 48 + toggleClass: null, 49 + /** @type {typeof takeClassForElement} */ 50 + takeClass: null, 51 + /** @type {typeof swap} */ 52 + swap: null, 53 + /* Extension entrypoints */ 54 + /** @type {typeof defineExtension} */ 55 + defineExtension: null, 56 + /** @type {typeof removeExtension} */ 57 + removeExtension: null, 58 + /* Debugging */ 59 + /** @type {typeof logAll} */ 60 + logAll: null, 61 + /** @type {typeof logNone} */ 62 + logNone: null, 63 + /* Debugging */ 64 + /** 65 + * The logger htmx uses to log with 66 + * 67 + * @see https://htmx.org/api/#logger 68 + */ 69 + logger: null, 70 + /** 71 + * A property holding the configuration htmx uses at runtime. 72 + * 73 + * Note that using a [meta tag](https://htmx.org/docs/#config) is the preferred mechanism for setting these properties. 74 + * 75 + * @see https://htmx.org/api/#config 76 + */ 77 + config: { 78 + /** 79 + * Whether to use history. 80 + * @type boolean 81 + * @default true 82 + */ 83 + historyEnabled: true, 84 + /** 85 + * The number of pages to keep in **localStorage** for history support. 86 + * @type number 87 + * @default 10 88 + */ 89 + historyCacheSize: 10, 90 + /** 91 + * @type boolean 92 + * @default false 93 + */ 94 + refreshOnHistoryMiss: false, 95 + /** 96 + * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted. 97 + * @type HtmxSwapStyle 98 + * @default 'innerHTML' 99 + */ 100 + defaultSwapStyle: 'innerHTML', 101 + /** 102 + * The default delay between receiving a response from the server and doing the swap. 103 + * @type number 104 + * @default 0 105 + */ 106 + defaultSwapDelay: 0, 107 + /** 108 + * The default delay between completing the content swap and settling attributes. 109 + * @type number 110 + * @default 20 111 + */ 112 + defaultSettleDelay: 20, 113 + /** 114 + * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present. 115 + * @type boolean 116 + * @default true 117 + */ 118 + includeIndicatorStyles: true, 119 + /** 120 + * The class to place on indicators when a request is in flight. 121 + * @type string 122 + * @default 'htmx-indicator' 123 + */ 124 + indicatorClass: 'htmx-indicator', 125 + /** 126 + * The class to place on triggering elements when a request is in flight. 127 + * @type string 128 + * @default 'htmx-request' 129 + */ 130 + requestClass: 'htmx-request', 131 + /** 132 + * The class to temporarily place on elements that htmx has added to the DOM. 133 + * @type string 134 + * @default 'htmx-added' 135 + */ 136 + addedClass: 'htmx-added', 137 + /** 138 + * The class to place on target elements when htmx is in the settling phase. 139 + * @type string 140 + * @default 'htmx-settling' 141 + */ 142 + settlingClass: 'htmx-settling', 143 + /** 144 + * The class to place on target elements when htmx is in the swapping phase. 145 + * @type string 146 + * @default 'htmx-swapping' 147 + */ 148 + swappingClass: 'htmx-swapping', 149 + /** 150 + * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility. 151 + * @type boolean 152 + * @default true 153 + */ 154 + allowEval: true, 155 + /** 156 + * If set to false, disables the interpretation of script tags. 157 + * @type boolean 158 + * @default true 159 + */ 160 + allowScriptTags: true, 161 + /** 162 + * If set, the nonce will be added to inline scripts. 163 + * @type string 164 + * @default '' 165 + */ 166 + inlineScriptNonce: '', 167 + /** 168 + * If set, the nonce will be added to inline styles. 169 + * @type string 170 + * @default '' 171 + */ 172 + inlineStyleNonce: '', 173 + /** 174 + * The attributes to settle during the settling phase. 175 + * @type string[] 176 + * @default ['class', 'style', 'width', 'height'] 177 + */ 178 + attributesToSettle: ['class', 'style', 'width', 'height'], 179 + /** 180 + * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates. 181 + * @type boolean 182 + * @default false 183 + */ 184 + withCredentials: false, 185 + /** 186 + * @type number 187 + * @default 0 188 + */ 189 + timeout: 0, 190 + /** 191 + * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**. 192 + * @type {'full-jitter' | ((retryCount:number) => number)} 193 + * @default "full-jitter" 194 + */ 195 + wsReconnectDelay: 'full-jitter', 196 + /** 197 + * The type of binary data being received over the WebSocket connection 198 + * @type BinaryType 199 + * @default 'blob' 200 + */ 201 + wsBinaryType: 'blob', 202 + /** 203 + * @type string 204 + * @default '[hx-disable], [data-hx-disable]' 205 + */ 206 + disableSelector: '[hx-disable], [data-hx-disable]', 207 + /** 208 + * @type {'auto' | 'instant' | 'smooth'} 209 + * @default 'instant' 210 + */ 211 + scrollBehavior: 'instant', 212 + /** 213 + * If the focused element should be scrolled into view. 214 + * @type boolean 215 + * @default false 216 + */ 217 + defaultFocusScroll: false, 218 + /** 219 + * If set to true htmx will include a cache-busting parameter in GET requests to avoid caching partial responses by the browser 220 + * @type boolean 221 + * @default false 222 + */ 223 + getCacheBusterParam: false, 224 + /** 225 + * If set to true, htmx will use the View Transition API when swapping in new content. 226 + * @type boolean 227 + * @default false 228 + */ 229 + globalViewTransitions: false, 230 + /** 231 + * htmx will format requests with these methods by encoding their parameters in the URL, not the request body 232 + * @type {(HttpVerb)[]} 233 + * @default ['get', 'delete'] 234 + */ 235 + methodsThatUseUrlParams: ['get', 'delete'], 236 + /** 237 + * If set to true, disables htmx-based requests to non-origin hosts. 238 + * @type boolean 239 + * @default false 240 + */ 241 + selfRequestsOnly: true, 242 + /** 243 + * If set to true htmx will not update the title of the document when a title tag is found in new content 244 + * @type boolean 245 + * @default false 246 + */ 247 + ignoreTitle: false, 248 + /** 249 + * Whether the target of a boosted element is scrolled into the viewport. 250 + * @type boolean 251 + * @default true 252 + */ 253 + scrollIntoViewOnBoost: true, 254 + /** 255 + * The cache to store evaluated trigger specifications into. 256 + * You may define a simple object to use a never-clearing cache, or implement your own system using a [proxy object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy) 257 + * @type {Object|null} 258 + * @default null 259 + */ 260 + triggerSpecsCache: null, 261 + /** @type boolean */ 262 + disableInheritance: false, 263 + /** @type HtmxResponseHandlingConfig[] */ 264 + responseHandling: [ 265 + { code: '204', swap: false }, 266 + { code: '[23]..', swap: true }, 267 + { code: '[45]..', swap: false, error: true } 268 + ], 269 + /** 270 + * Whether to process OOB swaps on elements that are nested within the main response element. 271 + * @type boolean 272 + * @default true 273 + */ 274 + allowNestedOobSwaps: true 275 + }, 276 + /** @type {typeof parseInterval} */ 277 + parseInterval: null, 278 + /** @type {typeof internalEval} */ 279 + _: null, 280 + version: '2.0.4' 281 + } 282 + // Tsc madness part 2 283 + htmx.onLoad = onLoadHelper 284 + htmx.process = processNode 285 + htmx.on = addEventListenerImpl 286 + htmx.off = removeEventListenerImpl 287 + htmx.trigger = triggerEvent 288 + htmx.ajax = ajaxHelper 289 + htmx.find = find 290 + htmx.findAll = findAll 291 + htmx.closest = closest 292 + htmx.remove = removeElement 293 + htmx.addClass = addClassToElement 294 + htmx.removeClass = removeClassFromElement 295 + htmx.toggleClass = toggleClassOnElement 296 + htmx.takeClass = takeClassForElement 297 + htmx.swap = swap 298 + htmx.defineExtension = defineExtension 299 + htmx.removeExtension = removeExtension 300 + htmx.logAll = logAll 301 + htmx.logNone = logNone 302 + htmx.parseInterval = parseInterval 303 + htmx._ = internalEval 304 + 305 + const internalAPI = { 306 + addTriggerHandler, 307 + bodyContains, 308 + canAccessLocalStorage, 309 + findThisElement, 310 + filterValues, 311 + swap, 312 + hasAttribute, 313 + getAttributeValue, 314 + getClosestAttributeValue, 315 + getClosestMatch, 316 + getExpressionVars, 317 + getHeaders, 318 + getInputValues, 319 + getInternalData, 320 + getSwapSpecification, 321 + getTriggerSpecs, 322 + getTarget, 323 + makeFragment, 324 + mergeObjects, 325 + makeSettleInfo, 326 + oobSwap, 327 + querySelectorExt, 328 + settleImmediately, 329 + shouldCancel, 330 + triggerEvent, 331 + triggerErrorEvent, 332 + withExtensions 333 + } 334 + 335 + const VERBS = ['get', 'post', 'put', 'delete', 'patch'] 336 + const VERB_SELECTOR = VERBS.map(function(verb) { 337 + return '[hx-' + verb + '], [data-hx-' + verb + ']' 338 + }).join(', ') 339 + 340 + //= =================================================================== 341 + // Utilities 342 + //= =================================================================== 343 + 344 + /** 345 + * Parses an interval string consistent with the way htmx does. Useful for plugins that have timing-related attributes. 346 + * 347 + * Caution: Accepts an int followed by either **s** or **ms**. All other values use **parseFloat** 348 + * 349 + * @see https://htmx.org/api/#parseInterval 350 + * 351 + * @param {string} str timing string 352 + * @returns {number|undefined} 353 + */ 354 + function parseInterval(str) { 355 + if (str == undefined) { 356 + return undefined 357 + } 358 + 359 + let interval = NaN 360 + if (str.slice(-2) == 'ms') { 361 + interval = parseFloat(str.slice(0, -2)) 362 + } else if (str.slice(-1) == 's') { 363 + interval = parseFloat(str.slice(0, -1)) * 1000 364 + } else if (str.slice(-1) == 'm') { 365 + interval = parseFloat(str.slice(0, -1)) * 1000 * 60 366 + } else { 367 + interval = parseFloat(str) 368 + } 369 + return isNaN(interval) ? undefined : interval 370 + } 371 + 372 + /** 373 + * @param {Node} elt 374 + * @param {string} name 375 + * @returns {(string | null)} 376 + */ 377 + function getRawAttribute(elt, name) { 378 + return elt instanceof Element && elt.getAttribute(name) 379 + } 380 + 381 + /** 382 + * @param {Element} elt 383 + * @param {string} qualifiedName 384 + * @returns {boolean} 385 + */ 386 + // resolve with both hx and data-hx prefixes 387 + function hasAttribute(elt, qualifiedName) { 388 + return !!elt.hasAttribute && (elt.hasAttribute(qualifiedName) || 389 + elt.hasAttribute('data-' + qualifiedName)) 390 + } 391 + 392 + /** 393 + * 394 + * @param {Node} elt 395 + * @param {string} qualifiedName 396 + * @returns {(string | null)} 397 + */ 398 + function getAttributeValue(elt, qualifiedName) { 399 + return getRawAttribute(elt, qualifiedName) || getRawAttribute(elt, 'data-' + qualifiedName) 400 + } 401 + 402 + /** 403 + * @param {Node} elt 404 + * @returns {Node | null} 405 + */ 406 + function parentElt(elt) { 407 + const parent = elt.parentElement 408 + if (!parent && elt.parentNode instanceof ShadowRoot) return elt.parentNode 409 + return parent 410 + } 411 + 412 + /** 413 + * @returns {Document} 414 + */ 415 + function getDocument() { 416 + return document 417 + } 418 + 419 + /** 420 + * @param {Node} elt 421 + * @param {boolean} global 422 + * @returns {Node|Document} 423 + */ 424 + function getRootNode(elt, global) { 425 + return elt.getRootNode ? elt.getRootNode({ composed: global }) : getDocument() 426 + } 427 + 428 + /** 429 + * @param {Node} elt 430 + * @param {(e:Node) => boolean} condition 431 + * @returns {Node | null} 432 + */ 433 + function getClosestMatch(elt, condition) { 434 + while (elt && !condition(elt)) { 435 + elt = parentElt(elt) 436 + } 437 + 438 + return elt || null 439 + } 440 + 441 + /** 442 + * @param {Element} initialElement 443 + * @param {Element} ancestor 444 + * @param {string} attributeName 445 + * @returns {string|null} 446 + */ 447 + function getAttributeValueWithDisinheritance(initialElement, ancestor, attributeName) { 448 + const attributeValue = getAttributeValue(ancestor, attributeName) 449 + const disinherit = getAttributeValue(ancestor, 'hx-disinherit') 450 + var inherit = getAttributeValue(ancestor, 'hx-inherit') 451 + if (initialElement !== ancestor) { 452 + if (htmx.config.disableInheritance) { 453 + if (inherit && (inherit === '*' || inherit.split(' ').indexOf(attributeName) >= 0)) { 454 + return attributeValue 455 + } else { 456 + return null 457 + } 458 + } 459 + if (disinherit && (disinherit === '*' || disinherit.split(' ').indexOf(attributeName) >= 0)) { 460 + return 'unset' 461 + } 462 + } 463 + return attributeValue 464 + } 465 + 466 + /** 467 + * @param {Element} elt 468 + * @param {string} attributeName 469 + * @returns {string | null} 470 + */ 471 + function getClosestAttributeValue(elt, attributeName) { 472 + let closestAttr = null 473 + getClosestMatch(elt, function(e) { 474 + return !!(closestAttr = getAttributeValueWithDisinheritance(elt, asElement(e), attributeName)) 475 + }) 476 + if (closestAttr !== 'unset') { 477 + return closestAttr 478 + } 479 + } 480 + 481 + /** 482 + * @param {Node} elt 483 + * @param {string} selector 484 + * @returns {boolean} 485 + */ 486 + function matches(elt, selector) { 487 + // @ts-ignore: non-standard properties for browser compatibility 488 + // noinspection JSUnresolvedVariable 489 + const matchesFunction = elt instanceof Element && (elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector) 490 + return !!matchesFunction && matchesFunction.call(elt, selector) 491 + } 492 + 493 + /** 494 + * @param {string} str 495 + * @returns {string} 496 + */ 497 + function getStartTag(str) { 498 + const tagMatcher = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i 499 + const match = tagMatcher.exec(str) 500 + if (match) { 501 + return match[1].toLowerCase() 502 + } else { 503 + return '' 504 + } 505 + } 506 + 507 + /** 508 + * @param {string} resp 509 + * @returns {Document} 510 + */ 511 + function parseHTML(resp) { 512 + const parser = new DOMParser() 513 + return parser.parseFromString(resp, 'text/html') 514 + } 515 + 516 + /** 517 + * @param {DocumentFragment} fragment 518 + * @param {Node} elt 519 + */ 520 + function takeChildrenFor(fragment, elt) { 521 + while (elt.childNodes.length > 0) { 522 + fragment.append(elt.childNodes[0]) 523 + } 524 + } 525 + 526 + /** 527 + * @param {HTMLScriptElement} script 528 + * @returns {HTMLScriptElement} 529 + */ 530 + function duplicateScript(script) { 531 + const newScript = getDocument().createElement('script') 532 + forEach(script.attributes, function(attr) { 533 + newScript.setAttribute(attr.name, attr.value) 534 + }) 535 + newScript.textContent = script.textContent 536 + newScript.async = false 537 + if (htmx.config.inlineScriptNonce) { 538 + newScript.nonce = htmx.config.inlineScriptNonce 539 + } 540 + return newScript 541 + } 542 + 543 + /** 544 + * @param {HTMLScriptElement} script 545 + * @returns {boolean} 546 + */ 547 + function isJavaScriptScriptNode(script) { 548 + return script.matches('script') && (script.type === 'text/javascript' || script.type === 'module' || script.type === '') 549 + } 550 + 551 + /** 552 + * we have to make new copies of script tags that we are going to insert because 553 + * SOME browsers (not saying who, but it involves an element and an animal) don't 554 + * execute scripts created in <template> tags when they are inserted into the DOM 555 + * and all the others do lmao 556 + * @param {DocumentFragment} fragment 557 + */ 558 + function normalizeScriptTags(fragment) { 559 + Array.from(fragment.querySelectorAll('script')).forEach(/** @param {HTMLScriptElement} script */ (script) => { 560 + if (isJavaScriptScriptNode(script)) { 561 + const newScript = duplicateScript(script) 562 + const parent = script.parentNode 563 + try { 564 + parent.insertBefore(newScript, script) 565 + } catch (e) { 566 + logError(e) 567 + } finally { 568 + script.remove() 569 + } 570 + } 571 + }) 572 + } 573 + 574 + /** 575 + * @typedef {DocumentFragment & {title?: string}} DocumentFragmentWithTitle 576 + * @description a document fragment representing the response HTML, including 577 + * a `title` property for any title information found 578 + */ 579 + 580 + /** 581 + * @param {string} response HTML 582 + * @returns {DocumentFragmentWithTitle} 583 + */ 584 + function makeFragment(response) { 585 + // strip head tag to determine shape of response we are dealing with 586 + const responseWithNoHead = response.replace(/<head(\s[^>]*)?>[\s\S]*?<\/head>/i, '') 587 + const startTag = getStartTag(responseWithNoHead) 588 + /** @type DocumentFragmentWithTitle */ 589 + let fragment 590 + if (startTag === 'html') { 591 + // if it is a full document, parse it and return the body 592 + fragment = /** @type DocumentFragmentWithTitle */ (new DocumentFragment()) 593 + const doc = parseHTML(response) 594 + takeChildrenFor(fragment, doc.body) 595 + fragment.title = doc.title 596 + } else if (startTag === 'body') { 597 + // parse body w/o wrapping in template 598 + fragment = /** @type DocumentFragmentWithTitle */ (new DocumentFragment()) 599 + const doc = parseHTML(responseWithNoHead) 600 + takeChildrenFor(fragment, doc.body) 601 + fragment.title = doc.title 602 + } else { 603 + // otherwise we have non-body partial HTML content, so wrap it in a template to maximize parsing flexibility 604 + const doc = parseHTML('<body><template class="internal-htmx-wrapper">' + responseWithNoHead + '</template></body>') 605 + fragment = /** @type DocumentFragmentWithTitle */ (doc.querySelector('template').content) 606 + // extract title into fragment for later processing 607 + fragment.title = doc.title 608 + 609 + // for legacy reasons we support a title tag at the root level of non-body responses, so we need to handle it 610 + var titleElement = fragment.querySelector('title') 611 + if (titleElement && titleElement.parentNode === fragment) { 612 + titleElement.remove() 613 + fragment.title = titleElement.innerText 614 + } 615 + } 616 + if (fragment) { 617 + if (htmx.config.allowScriptTags) { 618 + normalizeScriptTags(fragment) 619 + } else { 620 + // remove all script tags if scripts are disabled 621 + fragment.querySelectorAll('script').forEach((script) => script.remove()) 622 + } 623 + } 624 + return fragment 625 + } 626 + 627 + /** 628 + * @param {Function} func 629 + */ 630 + function maybeCall(func) { 631 + if (func) { 632 + func() 633 + } 634 + } 635 + 636 + /** 637 + * @param {any} o 638 + * @param {string} type 639 + * @returns 640 + */ 641 + function isType(o, type) { 642 + return Object.prototype.toString.call(o) === '[object ' + type + ']' 643 + } 644 + 645 + /** 646 + * @param {*} o 647 + * @returns {o is Function} 648 + */ 649 + function isFunction(o) { 650 + return typeof o === 'function' 651 + } 652 + 653 + /** 654 + * @param {*} o 655 + * @returns {o is Object} 656 + */ 657 + function isRawObject(o) { 658 + return isType(o, 'Object') 659 + } 660 + 661 + /** 662 + * @typedef {Object} OnHandler 663 + * @property {(keyof HTMLElementEventMap)|string} event 664 + * @property {EventListener} listener 665 + */ 666 + 667 + /** 668 + * @typedef {Object} ListenerInfo 669 + * @property {string} trigger 670 + * @property {EventListener} listener 671 + * @property {EventTarget} on 672 + */ 673 + 674 + /** 675 + * @typedef {Object} HtmxNodeInternalData 676 + * Element data 677 + * @property {number} [initHash] 678 + * @property {boolean} [boosted] 679 + * @property {OnHandler[]} [onHandlers] 680 + * @property {number} [timeout] 681 + * @property {ListenerInfo[]} [listenerInfos] 682 + * @property {boolean} [cancelled] 683 + * @property {boolean} [triggeredOnce] 684 + * @property {number} [delayed] 685 + * @property {number|null} [throttle] 686 + * @property {WeakMap<HtmxTriggerSpecification,WeakMap<EventTarget,string>>} [lastValue] 687 + * @property {boolean} [loaded] 688 + * @property {string} [path] 689 + * @property {string} [verb] 690 + * @property {boolean} [polling] 691 + * @property {HTMLButtonElement|HTMLInputElement|null} [lastButtonClicked] 692 + * @property {number} [requestCount] 693 + * @property {XMLHttpRequest} [xhr] 694 + * @property {(() => void)[]} [queuedRequests] 695 + * @property {boolean} [abortable] 696 + * @property {boolean} [firstInitCompleted] 697 + * 698 + * Event data 699 + * @property {HtmxTriggerSpecification} [triggerSpec] 700 + * @property {EventTarget[]} [handledFor] 701 + */ 702 + 703 + /** 704 + * getInternalData retrieves "private" data stored by htmx within an element 705 + * @param {EventTarget|Event} elt 706 + * @returns {HtmxNodeInternalData} 707 + */ 708 + function getInternalData(elt) { 709 + const dataProp = 'htmx-internal-data' 710 + let data = elt[dataProp] 711 + if (!data) { 712 + data = elt[dataProp] = {} 713 + } 714 + return data 715 + } 716 + 717 + /** 718 + * toArray converts an ArrayLike object into a real array. 719 + * @template T 720 + * @param {ArrayLike<T>} arr 721 + * @returns {T[]} 722 + */ 723 + function toArray(arr) { 724 + const returnArr = [] 725 + if (arr) { 726 + for (let i = 0; i < arr.length; i++) { 727 + returnArr.push(arr[i]) 728 + } 729 + } 730 + return returnArr 731 + } 732 + 733 + /** 734 + * @template T 735 + * @param {T[]|NamedNodeMap|HTMLCollection|HTMLFormControlsCollection|ArrayLike<T>} arr 736 + * @param {(T) => void} func 737 + */ 738 + function forEach(arr, func) { 739 + if (arr) { 740 + for (let i = 0; i < arr.length; i++) { 741 + func(arr[i]) 742 + } 743 + } 744 + } 745 + 746 + /** 747 + * @param {Element} el 748 + * @returns {boolean} 749 + */ 750 + function isScrolledIntoView(el) { 751 + const rect = el.getBoundingClientRect() 752 + const elemTop = rect.top 753 + const elemBottom = rect.bottom 754 + return elemTop < window.innerHeight && elemBottom >= 0 755 + } 756 + 757 + /** 758 + * Checks whether the element is in the document (includes shadow roots). 759 + * This function this is a slight misnomer; it will return true even for elements in the head. 760 + * 761 + * @param {Node} elt 762 + * @returns {boolean} 763 + */ 764 + function bodyContains(elt) { 765 + return elt.getRootNode({ composed: true }) === document 766 + } 767 + 768 + /** 769 + * @param {string} trigger 770 + * @returns {string[]} 771 + */ 772 + function splitOnWhitespace(trigger) { 773 + return trigger.trim().split(/\s+/) 774 + } 775 + 776 + /** 777 + * mergeObjects takes all the keys from 778 + * obj2 and duplicates them into obj1 779 + * @template T1 780 + * @template T2 781 + * @param {T1} obj1 782 + * @param {T2} obj2 783 + * @returns {T1 & T2} 784 + */ 785 + function mergeObjects(obj1, obj2) { 786 + for (const key in obj2) { 787 + if (obj2.hasOwnProperty(key)) { 788 + // @ts-ignore tsc doesn't seem to properly handle types merging 789 + obj1[key] = obj2[key] 790 + } 791 + } 792 + // @ts-ignore tsc doesn't seem to properly handle types merging 793 + return obj1 794 + } 795 + 796 + /** 797 + * @param {string} jString 798 + * @returns {any|null} 799 + */ 800 + function parseJSON(jString) { 801 + try { 802 + return JSON.parse(jString) 803 + } catch (error) { 804 + logError(error) 805 + return null 806 + } 807 + } 808 + 809 + /** 810 + * @returns {boolean} 811 + */ 812 + function canAccessLocalStorage() { 813 + const test = 'htmx:localStorageTest' 814 + try { 815 + localStorage.setItem(test, test) 816 + localStorage.removeItem(test) 817 + return true 818 + } catch (e) { 819 + return false 820 + } 821 + } 822 + 823 + /** 824 + * @param {string} path 825 + * @returns {string} 826 + */ 827 + function normalizePath(path) { 828 + try { 829 + const url = new URL(path) 830 + if (url) { 831 + path = url.pathname + url.search 832 + } 833 + // remove trailing slash, unless index page 834 + if (!(/^\/$/.test(path))) { 835 + path = path.replace(/\/+$/, '') 836 + } 837 + return path 838 + } catch (e) { 839 + // be kind to IE11, which doesn't support URL() 840 + return path 841 + } 842 + } 843 + 844 + //= ========================================================================================= 845 + // public API 846 + //= ========================================================================================= 847 + 848 + /** 849 + * @param {string} str 850 + * @returns {any} 851 + */ 852 + function internalEval(str) { 853 + return maybeEval(getDocument().body, function() { 854 + return eval(str) 855 + }) 856 + } 857 + 858 + /** 859 + * Adds a callback for the **htmx:load** event. This can be used to process new content, for example initializing the content with a javascript library 860 + * 861 + * @see https://htmx.org/api/#onLoad 862 + * 863 + * @param {(elt: Node) => void} callback the callback to call on newly loaded content 864 + * @returns {EventListener} 865 + */ 866 + function onLoadHelper(callback) { 867 + const value = htmx.on('htmx:load', /** @param {CustomEvent} evt */ function(evt) { 868 + callback(evt.detail.elt) 869 + }) 870 + return value 871 + } 872 + 873 + /** 874 + * Log all htmx events, useful for debugging. 875 + * 876 + * @see https://htmx.org/api/#logAll 877 + */ 878 + function logAll() { 879 + htmx.logger = function(elt, event, data) { 880 + if (console) { 881 + console.log(event, elt, data) 882 + } 883 + } 884 + } 885 + 886 + function logNone() { 887 + htmx.logger = null 888 + } 889 + 890 + /** 891 + * Finds an element matching the selector 892 + * 893 + * @see https://htmx.org/api/#find 894 + * 895 + * @param {ParentNode|string} eltOrSelector the root element to find the matching element in, inclusive | the selector to match 896 + * @param {string} [selector] the selector to match 897 + * @returns {Element|null} 898 + */ 899 + function find(eltOrSelector, selector) { 900 + if (typeof eltOrSelector !== 'string') { 901 + return eltOrSelector.querySelector(selector) 902 + } else { 903 + return find(getDocument(), eltOrSelector) 904 + } 905 + } 906 + 907 + /** 908 + * Finds all elements matching the selector 909 + * 910 + * @see https://htmx.org/api/#findAll 911 + * 912 + * @param {ParentNode|string} eltOrSelector the root element to find the matching elements in, inclusive | the selector to match 913 + * @param {string} [selector] the selector to match 914 + * @returns {NodeListOf<Element>} 915 + */ 916 + function findAll(eltOrSelector, selector) { 917 + if (typeof eltOrSelector !== 'string') { 918 + return eltOrSelector.querySelectorAll(selector) 919 + } else { 920 + return findAll(getDocument(), eltOrSelector) 921 + } 922 + } 923 + 924 + /** 925 + * @returns Window 926 + */ 927 + function getWindow() { 928 + return window 929 + } 930 + 931 + /** 932 + * Removes an element from the DOM 933 + * 934 + * @see https://htmx.org/api/#remove 935 + * 936 + * @param {Node} elt 937 + * @param {number} [delay] 938 + */ 939 + function removeElement(elt, delay) { 940 + elt = resolveTarget(elt) 941 + if (delay) { 942 + getWindow().setTimeout(function() { 943 + removeElement(elt) 944 + elt = null 945 + }, delay) 946 + } else { 947 + parentElt(elt).removeChild(elt) 948 + } 949 + } 950 + 951 + /** 952 + * @param {any} elt 953 + * @return {Element|null} 954 + */ 955 + function asElement(elt) { 956 + return elt instanceof Element ? elt : null 957 + } 958 + 959 + /** 960 + * @param {any} elt 961 + * @return {HTMLElement|null} 962 + */ 963 + function asHtmlElement(elt) { 964 + return elt instanceof HTMLElement ? elt : null 965 + } 966 + 967 + /** 968 + * @param {any} value 969 + * @return {string|null} 970 + */ 971 + function asString(value) { 972 + return typeof value === 'string' ? value : null 973 + } 974 + 975 + /** 976 + * @param {EventTarget} elt 977 + * @return {ParentNode|null} 978 + */ 979 + function asParentNode(elt) { 980 + return elt instanceof Element || elt instanceof Document || elt instanceof DocumentFragment ? elt : null 981 + } 982 + 983 + /** 984 + * This method adds a class to the given element. 985 + * 986 + * @see https://htmx.org/api/#addClass 987 + * 988 + * @param {Element|string} elt the element to add the class to 989 + * @param {string} clazz the class to add 990 + * @param {number} [delay] the delay (in milliseconds) before class is added 991 + */ 992 + function addClassToElement(elt, clazz, delay) { 993 + elt = asElement(resolveTarget(elt)) 994 + if (!elt) { 995 + return 996 + } 997 + if (delay) { 998 + getWindow().setTimeout(function() { 999 + addClassToElement(elt, clazz) 1000 + elt = null 1001 + }, delay) 1002 + } else { 1003 + elt.classList && elt.classList.add(clazz) 1004 + } 1005 + } 1006 + 1007 + /** 1008 + * Removes a class from the given element 1009 + * 1010 + * @see https://htmx.org/api/#removeClass 1011 + * 1012 + * @param {Node|string} node element to remove the class from 1013 + * @param {string} clazz the class to remove 1014 + * @param {number} [delay] the delay (in milliseconds before class is removed) 1015 + */ 1016 + function removeClassFromElement(node, clazz, delay) { 1017 + let elt = asElement(resolveTarget(node)) 1018 + if (!elt) { 1019 + return 1020 + } 1021 + if (delay) { 1022 + getWindow().setTimeout(function() { 1023 + removeClassFromElement(elt, clazz) 1024 + elt = null 1025 + }, delay) 1026 + } else { 1027 + if (elt.classList) { 1028 + elt.classList.remove(clazz) 1029 + // if there are no classes left, remove the class attribute 1030 + if (elt.classList.length === 0) { 1031 + elt.removeAttribute('class') 1032 + } 1033 + } 1034 + } 1035 + } 1036 + 1037 + /** 1038 + * Toggles the given class on an element 1039 + * 1040 + * @see https://htmx.org/api/#toggleClass 1041 + * 1042 + * @param {Element|string} elt the element to toggle the class on 1043 + * @param {string} clazz the class to toggle 1044 + */ 1045 + function toggleClassOnElement(elt, clazz) { 1046 + elt = resolveTarget(elt) 1047 + elt.classList.toggle(clazz) 1048 + } 1049 + 1050 + /** 1051 + * Takes the given class from its siblings, so that among its siblings, only the given element will have the class. 1052 + * 1053 + * @see https://htmx.org/api/#takeClass 1054 + * 1055 + * @param {Node|string} elt the element that will take the class 1056 + * @param {string} clazz the class to take 1057 + */ 1058 + function takeClassForElement(elt, clazz) { 1059 + elt = resolveTarget(elt) 1060 + forEach(elt.parentElement.children, function(child) { 1061 + removeClassFromElement(child, clazz) 1062 + }) 1063 + addClassToElement(asElement(elt), clazz) 1064 + } 1065 + 1066 + /** 1067 + * Finds the closest matching element in the given elements parentage, inclusive of the element 1068 + * 1069 + * @see https://htmx.org/api/#closest 1070 + * 1071 + * @param {Element|string} elt the element to find the selector from 1072 + * @param {string} selector the selector to find 1073 + * @returns {Element|null} 1074 + */ 1075 + function closest(elt, selector) { 1076 + elt = asElement(resolveTarget(elt)) 1077 + if (elt && elt.closest) { 1078 + return elt.closest(selector) 1079 + } else { 1080 + // TODO remove when IE goes away 1081 + do { 1082 + if (elt == null || matches(elt, selector)) { 1083 + return elt 1084 + } 1085 + } 1086 + while (elt = elt && asElement(parentElt(elt))) 1087 + return null 1088 + } 1089 + } 1090 + 1091 + /** 1092 + * @param {string} str 1093 + * @param {string} prefix 1094 + * @returns {boolean} 1095 + */ 1096 + function startsWith(str, prefix) { 1097 + return str.substring(0, prefix.length) === prefix 1098 + } 1099 + 1100 + /** 1101 + * @param {string} str 1102 + * @param {string} suffix 1103 + * @returns {boolean} 1104 + */ 1105 + function endsWith(str, suffix) { 1106 + return str.substring(str.length - suffix.length) === suffix 1107 + } 1108 + 1109 + /** 1110 + * @param {string} selector 1111 + * @returns {string} 1112 + */ 1113 + function normalizeSelector(selector) { 1114 + const trimmedSelector = selector.trim() 1115 + if (startsWith(trimmedSelector, '<') && endsWith(trimmedSelector, '/>')) { 1116 + return trimmedSelector.substring(1, trimmedSelector.length - 2) 1117 + } else { 1118 + return trimmedSelector 1119 + } 1120 + } 1121 + 1122 + /** 1123 + * @param {Node|Element|Document|string} elt 1124 + * @param {string} selector 1125 + * @param {boolean=} global 1126 + * @returns {(Node|Window)[]} 1127 + */ 1128 + function querySelectorAllExt(elt, selector, global) { 1129 + if (selector.indexOf('global ') === 0) { 1130 + return querySelectorAllExt(elt, selector.slice(7), true) 1131 + } 1132 + 1133 + elt = resolveTarget(elt) 1134 + 1135 + const parts = [] 1136 + { 1137 + let chevronsCount = 0 1138 + let offset = 0 1139 + for (let i = 0; i < selector.length; i++) { 1140 + const char = selector[i] 1141 + if (char === ',' && chevronsCount === 0) { 1142 + parts.push(selector.substring(offset, i)) 1143 + offset = i + 1 1144 + continue 1145 + } 1146 + if (char === '<') { 1147 + chevronsCount++ 1148 + } else if (char === '/' && i < selector.length - 1 && selector[i + 1] === '>') { 1149 + chevronsCount-- 1150 + } 1151 + } 1152 + if (offset < selector.length) { 1153 + parts.push(selector.substring(offset)) 1154 + } 1155 + } 1156 + 1157 + const result = [] 1158 + const unprocessedParts = [] 1159 + while (parts.length > 0) { 1160 + const selector = normalizeSelector(parts.shift()) 1161 + let item 1162 + if (selector.indexOf('closest ') === 0) { 1163 + item = closest(asElement(elt), normalizeSelector(selector.substr(8))) 1164 + } else if (selector.indexOf('find ') === 0) { 1165 + item = find(asParentNode(elt), normalizeSelector(selector.substr(5))) 1166 + } else if (selector === 'next' || selector === 'nextElementSibling') { 1167 + item = asElement(elt).nextElementSibling 1168 + } else if (selector.indexOf('next ') === 0) { 1169 + item = scanForwardQuery(elt, normalizeSelector(selector.substr(5)), !!global) 1170 + } else if (selector === 'previous' || selector === 'previousElementSibling') { 1171 + item = asElement(elt).previousElementSibling 1172 + } else if (selector.indexOf('previous ') === 0) { 1173 + item = scanBackwardsQuery(elt, normalizeSelector(selector.substr(9)), !!global) 1174 + } else if (selector === 'document') { 1175 + item = document 1176 + } else if (selector === 'window') { 1177 + item = window 1178 + } else if (selector === 'body') { 1179 + item = document.body 1180 + } else if (selector === 'root') { 1181 + item = getRootNode(elt, !!global) 1182 + } else if (selector === 'host') { 1183 + item = (/** @type ShadowRoot */(elt.getRootNode())).host 1184 + } else { 1185 + unprocessedParts.push(selector) 1186 + } 1187 + 1188 + if (item) { 1189 + result.push(item) 1190 + } 1191 + } 1192 + 1193 + if (unprocessedParts.length > 0) { 1194 + const standardSelector = unprocessedParts.join(',') 1195 + const rootNode = asParentNode(getRootNode(elt, !!global)) 1196 + result.push(...toArray(rootNode.querySelectorAll(standardSelector))) 1197 + } 1198 + 1199 + return result 1200 + } 1201 + 1202 + /** 1203 + * @param {Node} start 1204 + * @param {string} match 1205 + * @param {boolean} global 1206 + * @returns {Element} 1207 + */ 1208 + var scanForwardQuery = function(start, match, global) { 1209 + const results = asParentNode(getRootNode(start, global)).querySelectorAll(match) 1210 + for (let i = 0; i < results.length; i++) { 1211 + const elt = results[i] 1212 + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_PRECEDING) { 1213 + return elt 1214 + } 1215 + } 1216 + } 1217 + 1218 + /** 1219 + * @param {Node} start 1220 + * @param {string} match 1221 + * @param {boolean} global 1222 + * @returns {Element} 1223 + */ 1224 + var scanBackwardsQuery = function(start, match, global) { 1225 + const results = asParentNode(getRootNode(start, global)).querySelectorAll(match) 1226 + for (let i = results.length - 1; i >= 0; i--) { 1227 + const elt = results[i] 1228 + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_FOLLOWING) { 1229 + return elt 1230 + } 1231 + } 1232 + } 1233 + 1234 + /** 1235 + * @param {Node|string} eltOrSelector 1236 + * @param {string=} selector 1237 + * @returns {Node|Window} 1238 + */ 1239 + function querySelectorExt(eltOrSelector, selector) { 1240 + if (typeof eltOrSelector !== 'string') { 1241 + return querySelectorAllExt(eltOrSelector, selector)[0] 1242 + } else { 1243 + return querySelectorAllExt(getDocument().body, eltOrSelector)[0] 1244 + } 1245 + } 1246 + 1247 + /** 1248 + * @template {EventTarget} T 1249 + * @param {T|string} eltOrSelector 1250 + * @param {T} [context] 1251 + * @returns {Element|T|null} 1252 + */ 1253 + function resolveTarget(eltOrSelector, context) { 1254 + if (typeof eltOrSelector === 'string') { 1255 + return find(asParentNode(context) || document, eltOrSelector) 1256 + } else { 1257 + return eltOrSelector 1258 + } 1259 + } 1260 + 1261 + /** 1262 + * @typedef {keyof HTMLElementEventMap|string} AnyEventName 1263 + */ 1264 + 1265 + /** 1266 + * @typedef {Object} EventArgs 1267 + * @property {EventTarget} target 1268 + * @property {AnyEventName} event 1269 + * @property {EventListener} listener 1270 + * @property {Object|boolean} options 1271 + */ 1272 + 1273 + /** 1274 + * @param {EventTarget|AnyEventName} arg1 1275 + * @param {AnyEventName|EventListener} arg2 1276 + * @param {EventListener|Object|boolean} [arg3] 1277 + * @param {Object|boolean} [arg4] 1278 + * @returns {EventArgs} 1279 + */ 1280 + function processEventArgs(arg1, arg2, arg3, arg4) { 1281 + if (isFunction(arg2)) { 1282 + return { 1283 + target: getDocument().body, 1284 + event: asString(arg1), 1285 + listener: arg2, 1286 + options: arg3 1287 + } 1288 + } else { 1289 + return { 1290 + target: resolveTarget(arg1), 1291 + event: asString(arg2), 1292 + listener: arg3, 1293 + options: arg4 1294 + } 1295 + } 1296 + } 1297 + 1298 + /** 1299 + * Adds an event listener to an element 1300 + * 1301 + * @see https://htmx.org/api/#on 1302 + * 1303 + * @param {EventTarget|string} arg1 the element to add the listener to | the event name to add the listener for 1304 + * @param {string|EventListener} arg2 the event name to add the listener for | the listener to add 1305 + * @param {EventListener|Object|boolean} [arg3] the listener to add | options to add 1306 + * @param {Object|boolean} [arg4] options to add 1307 + * @returns {EventListener} 1308 + */ 1309 + function addEventListenerImpl(arg1, arg2, arg3, arg4) { 1310 + ready(function() { 1311 + const eventArgs = processEventArgs(arg1, arg2, arg3, arg4) 1312 + eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener, eventArgs.options) 1313 + }) 1314 + const b = isFunction(arg2) 1315 + return b ? arg2 : arg3 1316 + } 1317 + 1318 + /** 1319 + * Removes an event listener from an element 1320 + * 1321 + * @see https://htmx.org/api/#off 1322 + * 1323 + * @param {EventTarget|string} arg1 the element to remove the listener from | the event name to remove the listener from 1324 + * @param {string|EventListener} arg2 the event name to remove the listener from | the listener to remove 1325 + * @param {EventListener} [arg3] the listener to remove 1326 + * @returns {EventListener} 1327 + */ 1328 + function removeEventListenerImpl(arg1, arg2, arg3) { 1329 + ready(function() { 1330 + const eventArgs = processEventArgs(arg1, arg2, arg3) 1331 + eventArgs.target.removeEventListener(eventArgs.event, eventArgs.listener) 1332 + }) 1333 + return isFunction(arg2) ? arg2 : arg3 1334 + } 1335 + 1336 + //= =================================================================== 1337 + // Node processing 1338 + //= =================================================================== 1339 + 1340 + const DUMMY_ELT = getDocument().createElement('output') // dummy element for bad selectors 1341 + /** 1342 + * @param {Element} elt 1343 + * @param {string} attrName 1344 + * @returns {(Node|Window)[]} 1345 + */ 1346 + function findAttributeTargets(elt, attrName) { 1347 + const attrTarget = getClosestAttributeValue(elt, attrName) 1348 + if (attrTarget) { 1349 + if (attrTarget === 'this') { 1350 + return [findThisElement(elt, attrName)] 1351 + } else { 1352 + const result = querySelectorAllExt(elt, attrTarget) 1353 + if (result.length === 0) { 1354 + logError('The selector "' + attrTarget + '" on ' + attrName + ' returned no matches!') 1355 + return [DUMMY_ELT] 1356 + } else { 1357 + return result 1358 + } 1359 + } 1360 + } 1361 + } 1362 + 1363 + /** 1364 + * @param {Element} elt 1365 + * @param {string} attribute 1366 + * @returns {Element|null} 1367 + */ 1368 + function findThisElement(elt, attribute) { 1369 + return asElement(getClosestMatch(elt, function(elt) { 1370 + return getAttributeValue(asElement(elt), attribute) != null 1371 + })) 1372 + } 1373 + 1374 + /** 1375 + * @param {Element} elt 1376 + * @returns {Node|Window|null} 1377 + */ 1378 + function getTarget(elt) { 1379 + const targetStr = getClosestAttributeValue(elt, 'hx-target') 1380 + if (targetStr) { 1381 + if (targetStr === 'this') { 1382 + return findThisElement(elt, 'hx-target') 1383 + } else { 1384 + return querySelectorExt(elt, targetStr) 1385 + } 1386 + } else { 1387 + const data = getInternalData(elt) 1388 + if (data.boosted) { 1389 + return getDocument().body 1390 + } else { 1391 + return elt 1392 + } 1393 + } 1394 + } 1395 + 1396 + /** 1397 + * @param {string} name 1398 + * @returns {boolean} 1399 + */ 1400 + function shouldSettleAttribute(name) { 1401 + const attributesToSettle = htmx.config.attributesToSettle 1402 + for (let i = 0; i < attributesToSettle.length; i++) { 1403 + if (name === attributesToSettle[i]) { 1404 + return true 1405 + } 1406 + } 1407 + return false 1408 + } 1409 + 1410 + /** 1411 + * @param {Element} mergeTo 1412 + * @param {Element} mergeFrom 1413 + */ 1414 + function cloneAttributes(mergeTo, mergeFrom) { 1415 + forEach(mergeTo.attributes, function(attr) { 1416 + if (!mergeFrom.hasAttribute(attr.name) && shouldSettleAttribute(attr.name)) { 1417 + mergeTo.removeAttribute(attr.name) 1418 + } 1419 + }) 1420 + forEach(mergeFrom.attributes, function(attr) { 1421 + if (shouldSettleAttribute(attr.name)) { 1422 + mergeTo.setAttribute(attr.name, attr.value) 1423 + } 1424 + }) 1425 + } 1426 + 1427 + /** 1428 + * @param {HtmxSwapStyle} swapStyle 1429 + * @param {Element} target 1430 + * @returns {boolean} 1431 + */ 1432 + function isInlineSwap(swapStyle, target) { 1433 + const extensions = getExtensions(target) 1434 + for (let i = 0; i < extensions.length; i++) { 1435 + const extension = extensions[i] 1436 + try { 1437 + if (extension.isInlineSwap(swapStyle)) { 1438 + return true 1439 + } 1440 + } catch (e) { 1441 + logError(e) 1442 + } 1443 + } 1444 + return swapStyle === 'outerHTML' 1445 + } 1446 + 1447 + /** 1448 + * @param {string} oobValue 1449 + * @param {Element} oobElement 1450 + * @param {HtmxSettleInfo} settleInfo 1451 + * @param {Node|Document} [rootNode] 1452 + * @returns 1453 + */ 1454 + function oobSwap(oobValue, oobElement, settleInfo, rootNode) { 1455 + rootNode = rootNode || getDocument() 1456 + let selector = '#' + getRawAttribute(oobElement, 'id') 1457 + /** @type HtmxSwapStyle */ 1458 + let swapStyle = 'outerHTML' 1459 + if (oobValue === 'true') { 1460 + // do nothing 1461 + } else if (oobValue.indexOf(':') > 0) { 1462 + swapStyle = oobValue.substring(0, oobValue.indexOf(':')) 1463 + selector = oobValue.substring(oobValue.indexOf(':') + 1) 1464 + } else { 1465 + swapStyle = oobValue 1466 + } 1467 + oobElement.removeAttribute('hx-swap-oob') 1468 + oobElement.removeAttribute('data-hx-swap-oob') 1469 + 1470 + const targets = querySelectorAllExt(rootNode, selector, false) 1471 + if (targets) { 1472 + forEach( 1473 + targets, 1474 + function(target) { 1475 + let fragment 1476 + const oobElementClone = oobElement.cloneNode( true) 1477 + fragment = getDocument().createDocumentFragment() 1478 + fragment.appendChild(oobElementClone) 1479 + if (!isInlineSwap(swapStyle, target)) { 1480 + fragment = asParentNode(oobElementClone) // if this is not an inline swap, we use the content of the node, not the node itself 1481 + } 1482 + 1483 + const beforeSwapDetails = { shouldSwap: true, target, fragment } 1484 + if (!triggerEvent(target, 'htmx:oobBeforeSwap', beforeSwapDetails)) return 1485 + 1486 + target = beforeSwapDetails.target // allow re-targeting 1487 + if (beforeSwapDetails.shouldSwap) { 1488 + handlePreservedElements(fragment) 1489 + swapWithStyle(swapStyle, target, target, fragment, settleInfo) 1490 + restorePreservedElements() 1491 + } 1492 + forEach(settleInfo.elts, function(elt) { 1493 + triggerEvent(elt, 'htmx:oobAfterSwap', beforeSwapDetails) 1494 + }) 1495 + } 1496 + ) 1497 + oobElement.parentNode.removeChild(oobElement) 1498 + } else { 1499 + oobElement.parentNode.removeChild(oobElement) 1500 + triggerErrorEvent(getDocument().body, 'htmx:oobErrorNoTarget', { content: oobElement }) 1501 + } 1502 + return oobValue 1503 + } 1504 + 1505 + function restorePreservedElements() { 1506 + const pantry = find('#--htmx-preserve-pantry--') 1507 + if (pantry) { 1508 + for (const preservedElt of [...pantry.children]) { 1509 + const existingElement = find('#' + preservedElt.id) 1510 + // @ts-ignore - use proposed moveBefore feature 1511 + existingElement.parentNode.moveBefore(preservedElt, existingElement) 1512 + existingElement.remove() 1513 + } 1514 + pantry.remove() 1515 + } 1516 + } 1517 + 1518 + /** 1519 + * @param {DocumentFragment|ParentNode} fragment 1520 + */ 1521 + function handlePreservedElements(fragment) { 1522 + forEach(findAll(fragment, '[hx-preserve], [data-hx-preserve]'), function(preservedElt) { 1523 + const id = getAttributeValue(preservedElt, 'id') 1524 + const existingElement = getDocument().getElementById(id) 1525 + if (existingElement != null) { 1526 + if (preservedElt.moveBefore) { // if the moveBefore API exists, use it 1527 + // get or create a storage spot for stuff 1528 + let pantry = find('#--htmx-preserve-pantry--') 1529 + if (pantry == null) { 1530 + getDocument().body.insertAdjacentHTML('afterend', "<div id='--htmx-preserve-pantry--'></div>") 1531 + pantry = find('#--htmx-preserve-pantry--') 1532 + } 1533 + // @ts-ignore - use proposed moveBefore feature 1534 + pantry.moveBefore(existingElement, null) 1535 + } else { 1536 + preservedElt.parentNode.replaceChild(existingElement, preservedElt) 1537 + } 1538 + } 1539 + }) 1540 + } 1541 + 1542 + /** 1543 + * @param {Node} parentNode 1544 + * @param {ParentNode} fragment 1545 + * @param {HtmxSettleInfo} settleInfo 1546 + */ 1547 + function handleAttributes(parentNode, fragment, settleInfo) { 1548 + forEach(fragment.querySelectorAll('[id]'), function(newNode) { 1549 + const id = getRawAttribute(newNode, 'id') 1550 + if (id && id.length > 0) { 1551 + const normalizedId = id.replace("'", "\\'") 1552 + const normalizedTag = newNode.tagName.replace(':', '\\:') 1553 + const parentElt = asParentNode(parentNode) 1554 + const oldNode = parentElt && parentElt.querySelector(normalizedTag + "[id='" + normalizedId + "']") 1555 + if (oldNode && oldNode !== parentElt) { 1556 + const newAttributes = newNode.cloneNode() 1557 + cloneAttributes(newNode, oldNode) 1558 + settleInfo.tasks.push(function() { 1559 + cloneAttributes(newNode, newAttributes) 1560 + }) 1561 + } 1562 + } 1563 + }) 1564 + } 1565 + 1566 + /** 1567 + * @param {Node} child 1568 + * @returns {HtmxSettleTask} 1569 + */ 1570 + function makeAjaxLoadTask(child) { 1571 + return function() { 1572 + removeClassFromElement(child, htmx.config.addedClass) 1573 + processNode(asElement(child)) 1574 + processFocus(asParentNode(child)) 1575 + triggerEvent(child, 'htmx:load') 1576 + } 1577 + } 1578 + 1579 + /** 1580 + * @param {ParentNode} child 1581 + */ 1582 + function processFocus(child) { 1583 + const autofocus = '[autofocus]' 1584 + const autoFocusedElt = asHtmlElement(matches(child, autofocus) ? child : child.querySelector(autofocus)) 1585 + if (autoFocusedElt != null) { 1586 + autoFocusedElt.focus() 1587 + } 1588 + } 1589 + 1590 + /** 1591 + * @param {Node} parentNode 1592 + * @param {Node} insertBefore 1593 + * @param {ParentNode} fragment 1594 + * @param {HtmxSettleInfo} settleInfo 1595 + */ 1596 + function insertNodesBefore(parentNode, insertBefore, fragment, settleInfo) { 1597 + handleAttributes(parentNode, fragment, settleInfo) 1598 + while (fragment.childNodes.length > 0) { 1599 + const child = fragment.firstChild 1600 + addClassToElement(asElement(child), htmx.config.addedClass) 1601 + parentNode.insertBefore(child, insertBefore) 1602 + if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) { 1603 + settleInfo.tasks.push(makeAjaxLoadTask(child)) 1604 + } 1605 + } 1606 + } 1607 + 1608 + /** 1609 + * based on https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0, 1610 + * derived from Java's string hashcode implementation 1611 + * @param {string} string 1612 + * @param {number} hash 1613 + * @returns {number} 1614 + */ 1615 + function stringHash(string, hash) { 1616 + let char = 0 1617 + while (char < string.length) { 1618 + hash = (hash << 5) - hash + string.charCodeAt(char++) | 0 // bitwise or ensures we have a 32-bit int 1619 + } 1620 + return hash 1621 + } 1622 + 1623 + /** 1624 + * @param {Element} elt 1625 + * @returns {number} 1626 + */ 1627 + function attributeHash(elt) { 1628 + let hash = 0 1629 + // IE fix 1630 + if (elt.attributes) { 1631 + for (let i = 0; i < elt.attributes.length; i++) { 1632 + const attribute = elt.attributes[i] 1633 + if (attribute.value) { // only include attributes w/ actual values (empty is same as non-existent) 1634 + hash = stringHash(attribute.name, hash) 1635 + hash = stringHash(attribute.value, hash) 1636 + } 1637 + } 1638 + } 1639 + return hash 1640 + } 1641 + 1642 + /** 1643 + * @param {EventTarget} elt 1644 + */ 1645 + function deInitOnHandlers(elt) { 1646 + const internalData = getInternalData(elt) 1647 + if (internalData.onHandlers) { 1648 + for (let i = 0; i < internalData.onHandlers.length; i++) { 1649 + const handlerInfo = internalData.onHandlers[i] 1650 + removeEventListenerImpl(elt, handlerInfo.event, handlerInfo.listener) 1651 + } 1652 + delete internalData.onHandlers 1653 + } 1654 + } 1655 + 1656 + /** 1657 + * @param {Node} element 1658 + */ 1659 + function deInitNode(element) { 1660 + const internalData = getInternalData(element) 1661 + if (internalData.timeout) { 1662 + clearTimeout(internalData.timeout) 1663 + } 1664 + if (internalData.listenerInfos) { 1665 + forEach(internalData.listenerInfos, function(info) { 1666 + if (info.on) { 1667 + removeEventListenerImpl(info.on, info.trigger, info.listener) 1668 + } 1669 + }) 1670 + } 1671 + deInitOnHandlers(element) 1672 + forEach(Object.keys(internalData), function(key) { if (key !== 'firstInitCompleted') delete internalData[key] }) 1673 + } 1674 + 1675 + /** 1676 + * @param {Node} element 1677 + */ 1678 + function cleanUpElement(element) { 1679 + triggerEvent(element, 'htmx:beforeCleanupElement') 1680 + deInitNode(element) 1681 + // @ts-ignore IE11 code 1682 + // noinspection JSUnresolvedReference 1683 + if (element.children) { // IE 1684 + // @ts-ignore 1685 + forEach(element.children, function(child) { cleanUpElement(child) }) 1686 + } 1687 + } 1688 + 1689 + /** 1690 + * @param {Node} target 1691 + * @param {ParentNode} fragment 1692 + * @param {HtmxSettleInfo} settleInfo 1693 + */ 1694 + function swapOuterHTML(target, fragment, settleInfo) { 1695 + if (target instanceof Element && target.tagName === 'BODY') { // special case the body to innerHTML because DocumentFragments can't contain a body elt unfortunately 1696 + return swapInnerHTML(target, fragment, settleInfo) 1697 + } 1698 + /** @type {Node} */ 1699 + let newElt 1700 + const eltBeforeNewContent = target.previousSibling 1701 + const parentNode = parentElt(target) 1702 + if (!parentNode) { // when parent node disappears, we can't do anything 1703 + return 1704 + } 1705 + insertNodesBefore(parentNode, target, fragment, settleInfo) 1706 + if (eltBeforeNewContent == null) { 1707 + newElt = parentNode.firstChild 1708 + } else { 1709 + newElt = eltBeforeNewContent.nextSibling 1710 + } 1711 + settleInfo.elts = settleInfo.elts.filter(function(e) { return e !== target }) 1712 + // scan through all newly added content and add all elements to the settle info so we trigger 1713 + // events properly on them 1714 + while (newElt && newElt !== target) { 1715 + if (newElt instanceof Element) { 1716 + settleInfo.elts.push(newElt) 1717 + } 1718 + newElt = newElt.nextSibling 1719 + } 1720 + cleanUpElement(target) 1721 + if (target instanceof Element) { 1722 + target.remove() 1723 + } else { 1724 + target.parentNode.removeChild(target) 1725 + } 1726 + } 1727 + 1728 + /** 1729 + * @param {Node} target 1730 + * @param {ParentNode} fragment 1731 + * @param {HtmxSettleInfo} settleInfo 1732 + */ 1733 + function swapAfterBegin(target, fragment, settleInfo) { 1734 + return insertNodesBefore(target, target.firstChild, fragment, settleInfo) 1735 + } 1736 + 1737 + /** 1738 + * @param {Node} target 1739 + * @param {ParentNode} fragment 1740 + * @param {HtmxSettleInfo} settleInfo 1741 + */ 1742 + function swapBeforeBegin(target, fragment, settleInfo) { 1743 + return insertNodesBefore(parentElt(target), target, fragment, settleInfo) 1744 + } 1745 + 1746 + /** 1747 + * @param {Node} target 1748 + * @param {ParentNode} fragment 1749 + * @param {HtmxSettleInfo} settleInfo 1750 + */ 1751 + function swapBeforeEnd(target, fragment, settleInfo) { 1752 + return insertNodesBefore(target, null, fragment, settleInfo) 1753 + } 1754 + 1755 + /** 1756 + * @param {Node} target 1757 + * @param {ParentNode} fragment 1758 + * @param {HtmxSettleInfo} settleInfo 1759 + */ 1760 + function swapAfterEnd(target, fragment, settleInfo) { 1761 + return insertNodesBefore(parentElt(target), target.nextSibling, fragment, settleInfo) 1762 + } 1763 + 1764 + /** 1765 + * @param {Node} target 1766 + */ 1767 + function swapDelete(target) { 1768 + cleanUpElement(target) 1769 + const parent = parentElt(target) 1770 + if (parent) { 1771 + return parent.removeChild(target) 1772 + } 1773 + } 1774 + 1775 + /** 1776 + * @param {Node} target 1777 + * @param {ParentNode} fragment 1778 + * @param {HtmxSettleInfo} settleInfo 1779 + */ 1780 + function swapInnerHTML(target, fragment, settleInfo) { 1781 + const firstChild = target.firstChild 1782 + insertNodesBefore(target, firstChild, fragment, settleInfo) 1783 + if (firstChild) { 1784 + while (firstChild.nextSibling) { 1785 + cleanUpElement(firstChild.nextSibling) 1786 + target.removeChild(firstChild.nextSibling) 1787 + } 1788 + cleanUpElement(firstChild) 1789 + target.removeChild(firstChild) 1790 + } 1791 + } 1792 + 1793 + /** 1794 + * @param {HtmxSwapStyle} swapStyle 1795 + * @param {Element} elt 1796 + * @param {Node} target 1797 + * @param {ParentNode} fragment 1798 + * @param {HtmxSettleInfo} settleInfo 1799 + */ 1800 + function swapWithStyle(swapStyle, elt, target, fragment, settleInfo) { 1801 + switch (swapStyle) { 1802 + case 'none': 1803 + return 1804 + case 'outerHTML': 1805 + swapOuterHTML(target, fragment, settleInfo) 1806 + return 1807 + case 'afterbegin': 1808 + swapAfterBegin(target, fragment, settleInfo) 1809 + return 1810 + case 'beforebegin': 1811 + swapBeforeBegin(target, fragment, settleInfo) 1812 + return 1813 + case 'beforeend': 1814 + swapBeforeEnd(target, fragment, settleInfo) 1815 + return 1816 + case 'afterend': 1817 + swapAfterEnd(target, fragment, settleInfo) 1818 + return 1819 + case 'delete': 1820 + swapDelete(target) 1821 + return 1822 + default: 1823 + var extensions = getExtensions(elt) 1824 + for (let i = 0; i < extensions.length; i++) { 1825 + const ext = extensions[i] 1826 + try { 1827 + const newElements = ext.handleSwap(swapStyle, target, fragment, settleInfo) 1828 + if (newElements) { 1829 + if (Array.isArray(newElements)) { 1830 + // if handleSwap returns an array (like) of elements, we handle them 1831 + for (let j = 0; j < newElements.length; j++) { 1832 + const child = newElements[j] 1833 + if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) { 1834 + settleInfo.tasks.push(makeAjaxLoadTask(child)) 1835 + } 1836 + } 1837 + } 1838 + return 1839 + } 1840 + } catch (e) { 1841 + logError(e) 1842 + } 1843 + } 1844 + if (swapStyle === 'innerHTML') { 1845 + swapInnerHTML(target, fragment, settleInfo) 1846 + } else { 1847 + swapWithStyle(htmx.config.defaultSwapStyle, elt, target, fragment, settleInfo) 1848 + } 1849 + } 1850 + } 1851 + 1852 + /** 1853 + * @param {DocumentFragment} fragment 1854 + * @param {HtmxSettleInfo} settleInfo 1855 + * @param {Node|Document} [rootNode] 1856 + */ 1857 + function findAndSwapOobElements(fragment, settleInfo, rootNode) { 1858 + var oobElts = findAll(fragment, '[hx-swap-oob], [data-hx-swap-oob]') 1859 + forEach(oobElts, function(oobElement) { 1860 + if (htmx.config.allowNestedOobSwaps || oobElement.parentElement === null) { 1861 + const oobValue = getAttributeValue(oobElement, 'hx-swap-oob') 1862 + if (oobValue != null) { 1863 + oobSwap(oobValue, oobElement, settleInfo, rootNode) 1864 + } 1865 + } else { 1866 + oobElement.removeAttribute('hx-swap-oob') 1867 + oobElement.removeAttribute('data-hx-swap-oob') 1868 + } 1869 + }) 1870 + return oobElts.length > 0 1871 + } 1872 + 1873 + /** 1874 + * Implements complete swapping pipeline, including: focus and selection preservation, 1875 + * title updates, scroll, OOB swapping, normal swapping and settling 1876 + * @param {string|Element} target 1877 + * @param {string} content 1878 + * @param {HtmxSwapSpecification} swapSpec 1879 + * @param {SwapOptions} [swapOptions] 1880 + */ 1881 + function swap(target, content, swapSpec, swapOptions) { 1882 + if (!swapOptions) { 1883 + swapOptions = {} 1884 + } 1885 + 1886 + target = resolveTarget(target) 1887 + const rootNode = swapOptions.contextElement ? getRootNode(swapOptions.contextElement, false) : getDocument() 1888 + 1889 + // preserve focus and selection 1890 + const activeElt = document.activeElement 1891 + let selectionInfo = {} 1892 + try { 1893 + selectionInfo = { 1894 + elt: activeElt, 1895 + // @ts-ignore 1896 + start: activeElt ? activeElt.selectionStart : null, 1897 + // @ts-ignore 1898 + end: activeElt ? activeElt.selectionEnd : null 1899 + } 1900 + } catch (e) { 1901 + // safari issue - see https://github.com/microsoft/playwright/issues/5894 1902 + } 1903 + const settleInfo = makeSettleInfo(target) 1904 + 1905 + // For text content swaps, don't parse the response as HTML, just insert it 1906 + if (swapSpec.swapStyle === 'textContent') { 1907 + target.textContent = content 1908 + // Otherwise, make the fragment and process it 1909 + } else { 1910 + let fragment = makeFragment(content) 1911 + 1912 + settleInfo.title = fragment.title 1913 + 1914 + // select-oob swaps 1915 + if (swapOptions.selectOOB) { 1916 + const oobSelectValues = swapOptions.selectOOB.split(',') 1917 + for (let i = 0; i < oobSelectValues.length; i++) { 1918 + const oobSelectValue = oobSelectValues[i].split(':', 2) 1919 + let id = oobSelectValue[0].trim() 1920 + if (id.indexOf('#') === 0) { 1921 + id = id.substring(1) 1922 + } 1923 + const oobValue = oobSelectValue[1] || 'true' 1924 + const oobElement = fragment.querySelector('#' + id) 1925 + if (oobElement) { 1926 + oobSwap(oobValue, oobElement, settleInfo, rootNode) 1927 + } 1928 + } 1929 + } 1930 + // oob swaps 1931 + findAndSwapOobElements(fragment, settleInfo, rootNode) 1932 + forEach(findAll(fragment, 'template'), /** @param {HTMLTemplateElement} template */function(template) { 1933 + if (template.content && findAndSwapOobElements(template.content, settleInfo, rootNode)) { 1934 + // Avoid polluting the DOM with empty templates that were only used to encapsulate oob swap 1935 + template.remove() 1936 + } 1937 + }) 1938 + 1939 + // normal swap 1940 + if (swapOptions.select) { 1941 + const newFragment = getDocument().createDocumentFragment() 1942 + forEach(fragment.querySelectorAll(swapOptions.select), function(node) { 1943 + newFragment.appendChild(node) 1944 + }) 1945 + fragment = newFragment 1946 + } 1947 + handlePreservedElements(fragment) 1948 + swapWithStyle(swapSpec.swapStyle, swapOptions.contextElement, target, fragment, settleInfo) 1949 + restorePreservedElements() 1950 + } 1951 + 1952 + // apply saved focus and selection information to swapped content 1953 + if (selectionInfo.elt && 1954 + !bodyContains(selectionInfo.elt) && 1955 + getRawAttribute(selectionInfo.elt, 'id')) { 1956 + const newActiveElt = document.getElementById(getRawAttribute(selectionInfo.elt, 'id')) 1957 + const focusOptions = { preventScroll: swapSpec.focusScroll !== undefined ? !swapSpec.focusScroll : !htmx.config.defaultFocusScroll } 1958 + if (newActiveElt) { 1959 + // @ts-ignore 1960 + if (selectionInfo.start && newActiveElt.setSelectionRange) { 1961 + try { 1962 + // @ts-ignore 1963 + newActiveElt.setSelectionRange(selectionInfo.start, selectionInfo.end) 1964 + } catch (e) { 1965 + // the setSelectionRange method is present on fields that don't support it, so just let this fail 1966 + } 1967 + } 1968 + newActiveElt.focus(focusOptions) 1969 + } 1970 + } 1971 + 1972 + target.classList.remove(htmx.config.swappingClass) 1973 + forEach(settleInfo.elts, function(elt) { 1974 + if (elt.classList) { 1975 + elt.classList.add(htmx.config.settlingClass) 1976 + } 1977 + triggerEvent(elt, 'htmx:afterSwap', swapOptions.eventInfo) 1978 + }) 1979 + if (swapOptions.afterSwapCallback) { 1980 + swapOptions.afterSwapCallback() 1981 + } 1982 + 1983 + // merge in new title after swap but before settle 1984 + if (!swapSpec.ignoreTitle) { 1985 + handleTitle(settleInfo.title) 1986 + } 1987 + 1988 + // settle 1989 + const doSettle = function() { 1990 + forEach(settleInfo.tasks, function(task) { 1991 + task.call() 1992 + }) 1993 + forEach(settleInfo.elts, function(elt) { 1994 + if (elt.classList) { 1995 + elt.classList.remove(htmx.config.settlingClass) 1996 + } 1997 + triggerEvent(elt, 'htmx:afterSettle', swapOptions.eventInfo) 1998 + }) 1999 + 2000 + if (swapOptions.anchor) { 2001 + const anchorTarget = asElement(resolveTarget('#' + swapOptions.anchor)) 2002 + if (anchorTarget) { 2003 + anchorTarget.scrollIntoView({ block: 'start', behavior: 'auto' }) 2004 + } 2005 + } 2006 + 2007 + updateScrollState(settleInfo.elts, swapSpec) 2008 + if (swapOptions.afterSettleCallback) { 2009 + swapOptions.afterSettleCallback() 2010 + } 2011 + } 2012 + 2013 + if (swapSpec.settleDelay > 0) { 2014 + getWindow().setTimeout(doSettle, swapSpec.settleDelay) 2015 + } else { 2016 + doSettle() 2017 + } 2018 + } 2019 + 2020 + /** 2021 + * @param {XMLHttpRequest} xhr 2022 + * @param {string} header 2023 + * @param {EventTarget} elt 2024 + */ 2025 + function handleTriggerHeader(xhr, header, elt) { 2026 + const triggerBody = xhr.getResponseHeader(header) 2027 + if (triggerBody.indexOf('{') === 0) { 2028 + const triggers = parseJSON(triggerBody) 2029 + for (const eventName in triggers) { 2030 + if (triggers.hasOwnProperty(eventName)) { 2031 + let detail = triggers[eventName] 2032 + if (isRawObject(detail)) { 2033 + // @ts-ignore 2034 + elt = detail.target !== undefined ? detail.target : elt 2035 + } else { 2036 + detail = { value: detail } 2037 + } 2038 + triggerEvent(elt, eventName, detail) 2039 + } 2040 + } 2041 + } else { 2042 + const eventNames = triggerBody.split(',') 2043 + for (let i = 0; i < eventNames.length; i++) { 2044 + triggerEvent(elt, eventNames[i].trim(), []) 2045 + } 2046 + } 2047 + } 2048 + 2049 + const WHITESPACE = /\s/ 2050 + const WHITESPACE_OR_COMMA = /[\s,]/ 2051 + const SYMBOL_START = /[_$a-zA-Z]/ 2052 + const SYMBOL_CONT = /[_$a-zA-Z0-9]/ 2053 + const STRINGISH_START = ['"', "'", '/'] 2054 + const NOT_WHITESPACE = /[^\s]/ 2055 + const COMBINED_SELECTOR_START = /[{(]/ 2056 + const COMBINED_SELECTOR_END = /[})]/ 2057 + 2058 + /** 2059 + * @param {string} str 2060 + * @returns {string[]} 2061 + */ 2062 + function tokenizeString(str) { 2063 + /** @type string[] */ 2064 + const tokens = [] 2065 + let position = 0 2066 + while (position < str.length) { 2067 + if (SYMBOL_START.exec(str.charAt(position))) { 2068 + var startPosition = position 2069 + while (SYMBOL_CONT.exec(str.charAt(position + 1))) { 2070 + position++ 2071 + } 2072 + tokens.push(str.substring(startPosition, position + 1)) 2073 + } else if (STRINGISH_START.indexOf(str.charAt(position)) !== -1) { 2074 + const startChar = str.charAt(position) 2075 + var startPosition = position 2076 + position++ 2077 + while (position < str.length && str.charAt(position) !== startChar) { 2078 + if (str.charAt(position) === '\\') { 2079 + position++ 2080 + } 2081 + position++ 2082 + } 2083 + tokens.push(str.substring(startPosition, position + 1)) 2084 + } else { 2085 + const symbol = str.charAt(position) 2086 + tokens.push(symbol) 2087 + } 2088 + position++ 2089 + } 2090 + return tokens 2091 + } 2092 + 2093 + /** 2094 + * @param {string} token 2095 + * @param {string|null} last 2096 + * @param {string} paramName 2097 + * @returns {boolean} 2098 + */ 2099 + function isPossibleRelativeReference(token, last, paramName) { 2100 + return SYMBOL_START.exec(token.charAt(0)) && 2101 + token !== 'true' && 2102 + token !== 'false' && 2103 + token !== 'this' && 2104 + token !== paramName && 2105 + last !== '.' 2106 + } 2107 + 2108 + /** 2109 + * @param {EventTarget|string} elt 2110 + * @param {string[]} tokens 2111 + * @param {string} paramName 2112 + * @returns {ConditionalFunction|null} 2113 + */ 2114 + function maybeGenerateConditional(elt, tokens, paramName) { 2115 + if (tokens[0] === '[') { 2116 + tokens.shift() 2117 + let bracketCount = 1 2118 + let conditionalSource = ' return (function(' + paramName + '){ return (' 2119 + let last = null 2120 + while (tokens.length > 0) { 2121 + const token = tokens[0] 2122 + // @ts-ignore For some reason tsc doesn't understand the shift call, and thinks we're comparing the same value here, i.e. '[' vs ']' 2123 + if (token === ']') { 2124 + bracketCount-- 2125 + if (bracketCount === 0) { 2126 + if (last === null) { 2127 + conditionalSource = conditionalSource + 'true' 2128 + } 2129 + tokens.shift() 2130 + conditionalSource += ')})' 2131 + try { 2132 + const conditionFunction = maybeEval(elt, function() { 2133 + return Function(conditionalSource)() 2134 + }, 2135 + function() { return true }) 2136 + conditionFunction.source = conditionalSource 2137 + return conditionFunction 2138 + } catch (e) { 2139 + triggerErrorEvent(getDocument().body, 'htmx:syntax:error', { error: e, source: conditionalSource }) 2140 + return null 2141 + } 2142 + } 2143 + } else if (token === '[') { 2144 + bracketCount++ 2145 + } 2146 + if (isPossibleRelativeReference(token, last, paramName)) { 2147 + conditionalSource += '((' + paramName + '.' + token + ') ? (' + paramName + '.' + token + ') : (window.' + token + '))' 2148 + } else { 2149 + conditionalSource = conditionalSource + token 2150 + } 2151 + last = tokens.shift() 2152 + } 2153 + } 2154 + } 2155 + 2156 + /** 2157 + * @param {string[]} tokens 2158 + * @param {RegExp} match 2159 + * @returns {string} 2160 + */ 2161 + function consumeUntil(tokens, match) { 2162 + let result = '' 2163 + while (tokens.length > 0 && !match.test(tokens[0])) { 2164 + result += tokens.shift() 2165 + } 2166 + return result 2167 + } 2168 + 2169 + /** 2170 + * @param {string[]} tokens 2171 + * @returns {string} 2172 + */ 2173 + function consumeCSSSelector(tokens) { 2174 + let result 2175 + if (tokens.length > 0 && COMBINED_SELECTOR_START.test(tokens[0])) { 2176 + tokens.shift() 2177 + result = consumeUntil(tokens, COMBINED_SELECTOR_END).trim() 2178 + tokens.shift() 2179 + } else { 2180 + result = consumeUntil(tokens, WHITESPACE_OR_COMMA) 2181 + } 2182 + return result 2183 + } 2184 + 2185 + const INPUT_SELECTOR = 'input, textarea, select' 2186 + 2187 + /** 2188 + * @param {Element} elt 2189 + * @param {string} explicitTrigger 2190 + * @param {Object} cache for trigger specs 2191 + * @returns {HtmxTriggerSpecification[]} 2192 + */ 2193 + function parseAndCacheTrigger(elt, explicitTrigger, cache) { 2194 + /** @type HtmxTriggerSpecification[] */ 2195 + const triggerSpecs = [] 2196 + const tokens = tokenizeString(explicitTrigger) 2197 + do { 2198 + consumeUntil(tokens, NOT_WHITESPACE) 2199 + const initialLength = tokens.length 2200 + const trigger = consumeUntil(tokens, /[,\[\s]/) 2201 + if (trigger !== '') { 2202 + if (trigger === 'every') { 2203 + /** @type HtmxTriggerSpecification */ 2204 + const every = { trigger: 'every' } 2205 + consumeUntil(tokens, NOT_WHITESPACE) 2206 + every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/)) 2207 + consumeUntil(tokens, NOT_WHITESPACE) 2208 + var eventFilter = maybeGenerateConditional(elt, tokens, 'event') 2209 + if (eventFilter) { 2210 + every.eventFilter = eventFilter 2211 + } 2212 + triggerSpecs.push(every) 2213 + } else { 2214 + /** @type HtmxTriggerSpecification */ 2215 + const triggerSpec = { trigger } 2216 + var eventFilter = maybeGenerateConditional(elt, tokens, 'event') 2217 + if (eventFilter) { 2218 + triggerSpec.eventFilter = eventFilter 2219 + } 2220 + consumeUntil(tokens, NOT_WHITESPACE) 2221 + while (tokens.length > 0 && tokens[0] !== ',') { 2222 + const token = tokens.shift() 2223 + if (token === 'changed') { 2224 + triggerSpec.changed = true 2225 + } else if (token === 'once') { 2226 + triggerSpec.once = true 2227 + } else if (token === 'consume') { 2228 + triggerSpec.consume = true 2229 + } else if (token === 'delay' && tokens[0] === ':') { 2230 + tokens.shift() 2231 + triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)) 2232 + } else if (token === 'from' && tokens[0] === ':') { 2233 + tokens.shift() 2234 + if (COMBINED_SELECTOR_START.test(tokens[0])) { 2235 + var from_arg = consumeCSSSelector(tokens) 2236 + } else { 2237 + var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA) 2238 + if (from_arg === 'closest' || from_arg === 'find' || from_arg === 'next' || from_arg === 'previous') { 2239 + tokens.shift() 2240 + const selector = consumeCSSSelector(tokens) 2241 + // `next` and `previous` allow a selector-less syntax 2242 + if (selector.length > 0) { 2243 + from_arg += ' ' + selector 2244 + } 2245 + } 2246 + } 2247 + triggerSpec.from = from_arg 2248 + } else if (token === 'target' && tokens[0] === ':') { 2249 + tokens.shift() 2250 + triggerSpec.target = consumeCSSSelector(tokens) 2251 + } else if (token === 'throttle' && tokens[0] === ':') { 2252 + tokens.shift() 2253 + triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)) 2254 + } else if (token === 'queue' && tokens[0] === ':') { 2255 + tokens.shift() 2256 + triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA) 2257 + } else if (token === 'root' && tokens[0] === ':') { 2258 + tokens.shift() 2259 + triggerSpec[token] = consumeCSSSelector(tokens) 2260 + } else if (token === 'threshold' && tokens[0] === ':') { 2261 + tokens.shift() 2262 + triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA) 2263 + } else { 2264 + triggerErrorEvent(elt, 'htmx:syntax:error', { token: tokens.shift() }) 2265 + } 2266 + consumeUntil(tokens, NOT_WHITESPACE) 2267 + } 2268 + triggerSpecs.push(triggerSpec) 2269 + } 2270 + } 2271 + if (tokens.length === initialLength) { 2272 + triggerErrorEvent(elt, 'htmx:syntax:error', { token: tokens.shift() }) 2273 + } 2274 + consumeUntil(tokens, NOT_WHITESPACE) 2275 + } while (tokens[0] === ',' && tokens.shift()) 2276 + if (cache) { 2277 + cache[explicitTrigger] = triggerSpecs 2278 + } 2279 + return triggerSpecs 2280 + } 2281 + 2282 + /** 2283 + * @param {Element} elt 2284 + * @returns {HtmxTriggerSpecification[]} 2285 + */ 2286 + function getTriggerSpecs(elt) { 2287 + const explicitTrigger = getAttributeValue(elt, 'hx-trigger') 2288 + let triggerSpecs = [] 2289 + if (explicitTrigger) { 2290 + const cache = htmx.config.triggerSpecsCache 2291 + triggerSpecs = (cache && cache[explicitTrigger]) || parseAndCacheTrigger(elt, explicitTrigger, cache) 2292 + } 2293 + 2294 + if (triggerSpecs.length > 0) { 2295 + return triggerSpecs 2296 + } else if (matches(elt, 'form')) { 2297 + return [{ trigger: 'submit' }] 2298 + } else if (matches(elt, 'input[type="button"], input[type="submit"]')) { 2299 + return [{ trigger: 'click' }] 2300 + } else if (matches(elt, INPUT_SELECTOR)) { 2301 + return [{ trigger: 'change' }] 2302 + } else { 2303 + return [{ trigger: 'click' }] 2304 + } 2305 + } 2306 + 2307 + /** 2308 + * @param {Element} elt 2309 + */ 2310 + function cancelPolling(elt) { 2311 + getInternalData(elt).cancelled = true 2312 + } 2313 + 2314 + /** 2315 + * @param {Element} elt 2316 + * @param {TriggerHandler} handler 2317 + * @param {HtmxTriggerSpecification} spec 2318 + */ 2319 + function processPolling(elt, handler, spec) { 2320 + const nodeData = getInternalData(elt) 2321 + nodeData.timeout = getWindow().setTimeout(function() { 2322 + if (bodyContains(elt) && nodeData.cancelled !== true) { 2323 + if (!maybeFilterEvent(spec, elt, makeEvent('hx:poll:trigger', { 2324 + triggerSpec: spec, 2325 + target: elt 2326 + }))) { 2327 + handler(elt) 2328 + } 2329 + processPolling(elt, handler, spec) 2330 + } 2331 + }, spec.pollInterval) 2332 + } 2333 + 2334 + /** 2335 + * @param {HTMLAnchorElement} elt 2336 + * @returns {boolean} 2337 + */ 2338 + function isLocalLink(elt) { 2339 + return location.hostname === elt.hostname && 2340 + getRawAttribute(elt, 'href') && 2341 + getRawAttribute(elt, 'href').indexOf('#') !== 0 2342 + } 2343 + 2344 + /** 2345 + * @param {Element} elt 2346 + */ 2347 + function eltIsDisabled(elt) { 2348 + return closest(elt, htmx.config.disableSelector) 2349 + } 2350 + 2351 + /** 2352 + * @param {Element} elt 2353 + * @param {HtmxNodeInternalData} nodeData 2354 + * @param {HtmxTriggerSpecification[]} triggerSpecs 2355 + */ 2356 + function boostElement(elt, nodeData, triggerSpecs) { 2357 + if ((elt instanceof HTMLAnchorElement && isLocalLink(elt) && (elt.target === '' || elt.target === '_self')) || (elt.tagName === 'FORM' && String(getRawAttribute(elt, 'method')).toLowerCase() !== 'dialog')) { 2358 + nodeData.boosted = true 2359 + let verb, path 2360 + if (elt.tagName === 'A') { 2361 + verb = (/** @type HttpVerb */('get')) 2362 + path = getRawAttribute(elt, 'href') 2363 + } else { 2364 + const rawAttribute = getRawAttribute(elt, 'method') 2365 + verb = (/** @type HttpVerb */(rawAttribute ? rawAttribute.toLowerCase() : 'get')) 2366 + path = getRawAttribute(elt, 'action') 2367 + if (path == null || path === '') { 2368 + // if there is no action attribute on the form set path to current href before the 2369 + // following logic to properly clear parameters on a GET (not on a POST!) 2370 + path = getDocument().location.href 2371 + } 2372 + if (verb === 'get' && path.includes('?')) { 2373 + path = path.replace(/\?[^#]+/, '') 2374 + } 2375 + } 2376 + triggerSpecs.forEach(function(triggerSpec) { 2377 + addEventListener(elt, function(node, evt) { 2378 + const elt = asElement(node) 2379 + if (eltIsDisabled(elt)) { 2380 + cleanUpElement(elt) 2381 + return 2382 + } 2383 + issueAjaxRequest(verb, path, elt, evt) 2384 + }, nodeData, triggerSpec, true) 2385 + }) 2386 + } 2387 + } 2388 + 2389 + /** 2390 + * @param {Event} evt 2391 + * @param {Node} node 2392 + * @returns {boolean} 2393 + */ 2394 + function shouldCancel(evt, node) { 2395 + const elt = asElement(node) 2396 + if (!elt) { 2397 + return false 2398 + } 2399 + if (evt.type === 'submit' || evt.type === 'click') { 2400 + if (elt.tagName === 'FORM') { 2401 + return true 2402 + } 2403 + if (matches(elt, 'input[type="submit"], button') && 2404 + (matches(elt, '[form]') || closest(elt, 'form') !== null)) { 2405 + return true 2406 + } 2407 + if (elt instanceof HTMLAnchorElement && elt.href && 2408 + (elt.getAttribute('href') === '#' || elt.getAttribute('href').indexOf('#') !== 0)) { 2409 + return true 2410 + } 2411 + } 2412 + return false 2413 + } 2414 + 2415 + /** 2416 + * @param {Node} elt 2417 + * @param {Event|MouseEvent|KeyboardEvent|TouchEvent} evt 2418 + * @returns {boolean} 2419 + */ 2420 + function ignoreBoostedAnchorCtrlClick(elt, evt) { 2421 + return getInternalData(elt).boosted && elt instanceof HTMLAnchorElement && evt.type === 'click' && 2422 + // @ts-ignore this will resolve to undefined for events that don't define those properties, which is fine 2423 + (evt.ctrlKey || evt.metaKey) 2424 + } 2425 + 2426 + /** 2427 + * @param {HtmxTriggerSpecification} triggerSpec 2428 + * @param {Node} elt 2429 + * @param {Event} evt 2430 + * @returns {boolean} 2431 + */ 2432 + function maybeFilterEvent(triggerSpec, elt, evt) { 2433 + const eventFilter = triggerSpec.eventFilter 2434 + if (eventFilter) { 2435 + try { 2436 + return eventFilter.call(elt, evt) !== true 2437 + } catch (e) { 2438 + const source = eventFilter.source 2439 + triggerErrorEvent(getDocument().body, 'htmx:eventFilter:error', { error: e, source }) 2440 + return true 2441 + } 2442 + } 2443 + return false 2444 + } 2445 + 2446 + /** 2447 + * @param {Node} elt 2448 + * @param {TriggerHandler} handler 2449 + * @param {HtmxNodeInternalData} nodeData 2450 + * @param {HtmxTriggerSpecification} triggerSpec 2451 + * @param {boolean} [explicitCancel] 2452 + */ 2453 + function addEventListener(elt, handler, nodeData, triggerSpec, explicitCancel) { 2454 + const elementData = getInternalData(elt) 2455 + /** @type {(Node|Window)[]} */ 2456 + let eltsToListenOn 2457 + if (triggerSpec.from) { 2458 + eltsToListenOn = querySelectorAllExt(elt, triggerSpec.from) 2459 + } else { 2460 + eltsToListenOn = [elt] 2461 + } 2462 + // store the initial values of the elements, so we can tell if they change 2463 + if (triggerSpec.changed) { 2464 + if (!('lastValue' in elementData)) { 2465 + elementData.lastValue = new WeakMap() 2466 + } 2467 + eltsToListenOn.forEach(function(eltToListenOn) { 2468 + if (!elementData.lastValue.has(triggerSpec)) { 2469 + elementData.lastValue.set(triggerSpec, new WeakMap()) 2470 + } 2471 + // @ts-ignore value will be undefined for non-input elements, which is fine 2472 + elementData.lastValue.get(triggerSpec).set(eltToListenOn, eltToListenOn.value) 2473 + }) 2474 + } 2475 + forEach(eltsToListenOn, function(eltToListenOn) { 2476 + /** @type EventListener */ 2477 + const eventListener = function(evt) { 2478 + if (!bodyContains(elt)) { 2479 + eltToListenOn.removeEventListener(triggerSpec.trigger, eventListener) 2480 + return 2481 + } 2482 + if (ignoreBoostedAnchorCtrlClick(elt, evt)) { 2483 + return 2484 + } 2485 + if (explicitCancel || shouldCancel(evt, elt)) { 2486 + evt.preventDefault() 2487 + } 2488 + if (maybeFilterEvent(triggerSpec, elt, evt)) { 2489 + return 2490 + } 2491 + const eventData = getInternalData(evt) 2492 + eventData.triggerSpec = triggerSpec 2493 + if (eventData.handledFor == null) { 2494 + eventData.handledFor = [] 2495 + } 2496 + if (eventData.handledFor.indexOf(elt) < 0) { 2497 + eventData.handledFor.push(elt) 2498 + if (triggerSpec.consume) { 2499 + evt.stopPropagation() 2500 + } 2501 + if (triggerSpec.target && evt.target) { 2502 + if (!matches(asElement(evt.target), triggerSpec.target)) { 2503 + return 2504 + } 2505 + } 2506 + if (triggerSpec.once) { 2507 + if (elementData.triggeredOnce) { 2508 + return 2509 + } else { 2510 + elementData.triggeredOnce = true 2511 + } 2512 + } 2513 + if (triggerSpec.changed) { 2514 + const node = event.target 2515 + // @ts-ignore value will be undefined for non-input elements, which is fine 2516 + const value = node.value 2517 + const lastValue = elementData.lastValue.get(triggerSpec) 2518 + if (lastValue.has(node) && lastValue.get(node) === value) { 2519 + return 2520 + } 2521 + lastValue.set(node, value) 2522 + } 2523 + if (elementData.delayed) { 2524 + clearTimeout(elementData.delayed) 2525 + } 2526 + if (elementData.throttle) { 2527 + return 2528 + } 2529 + 2530 + if (triggerSpec.throttle > 0) { 2531 + if (!elementData.throttle) { 2532 + triggerEvent(elt, 'htmx:trigger') 2533 + handler(elt, evt) 2534 + elementData.throttle = getWindow().setTimeout(function() { 2535 + elementData.throttle = null 2536 + }, triggerSpec.throttle) 2537 + } 2538 + } else if (triggerSpec.delay > 0) { 2539 + elementData.delayed = getWindow().setTimeout(function() { 2540 + triggerEvent(elt, 'htmx:trigger') 2541 + handler(elt, evt) 2542 + }, triggerSpec.delay) 2543 + } else { 2544 + triggerEvent(elt, 'htmx:trigger') 2545 + handler(elt, evt) 2546 + } 2547 + } 2548 + } 2549 + if (nodeData.listenerInfos == null) { 2550 + nodeData.listenerInfos = [] 2551 + } 2552 + nodeData.listenerInfos.push({ 2553 + trigger: triggerSpec.trigger, 2554 + listener: eventListener, 2555 + on: eltToListenOn 2556 + }) 2557 + eltToListenOn.addEventListener(triggerSpec.trigger, eventListener) 2558 + }) 2559 + } 2560 + 2561 + let windowIsScrolling = false // used by initScrollHandler 2562 + let scrollHandler = null 2563 + function initScrollHandler() { 2564 + if (!scrollHandler) { 2565 + scrollHandler = function() { 2566 + windowIsScrolling = true 2567 + } 2568 + window.addEventListener('scroll', scrollHandler) 2569 + window.addEventListener('resize', scrollHandler) 2570 + setInterval(function() { 2571 + if (windowIsScrolling) { 2572 + windowIsScrolling = false 2573 + forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"), function(elt) { 2574 + maybeReveal(elt) 2575 + }) 2576 + } 2577 + }, 200) 2578 + } 2579 + } 2580 + 2581 + /** 2582 + * @param {Element} elt 2583 + */ 2584 + function maybeReveal(elt) { 2585 + if (!hasAttribute(elt, 'data-hx-revealed') && isScrolledIntoView(elt)) { 2586 + elt.setAttribute('data-hx-revealed', 'true') 2587 + const nodeData = getInternalData(elt) 2588 + if (nodeData.initHash) { 2589 + triggerEvent(elt, 'revealed') 2590 + } else { 2591 + // if the node isn't initialized, wait for it before triggering the request 2592 + elt.addEventListener('htmx:afterProcessNode', function() { triggerEvent(elt, 'revealed') }, { once: true }) 2593 + } 2594 + } 2595 + } 2596 + 2597 + //= =================================================================== 2598 + 2599 + /** 2600 + * @param {Element} elt 2601 + * @param {TriggerHandler} handler 2602 + * @param {HtmxNodeInternalData} nodeData 2603 + * @param {number} delay 2604 + */ 2605 + function loadImmediately(elt, handler, nodeData, delay) { 2606 + const load = function() { 2607 + if (!nodeData.loaded) { 2608 + nodeData.loaded = true 2609 + triggerEvent(elt, 'htmx:trigger') 2610 + handler(elt) 2611 + } 2612 + } 2613 + if (delay > 0) { 2614 + getWindow().setTimeout(load, delay) 2615 + } else { 2616 + load() 2617 + } 2618 + } 2619 + 2620 + /** 2621 + * @param {Element} elt 2622 + * @param {HtmxNodeInternalData} nodeData 2623 + * @param {HtmxTriggerSpecification[]} triggerSpecs 2624 + * @returns {boolean} 2625 + */ 2626 + function processVerbs(elt, nodeData, triggerSpecs) { 2627 + let explicitAction = false 2628 + forEach(VERBS, function(verb) { 2629 + if (hasAttribute(elt, 'hx-' + verb)) { 2630 + const path = getAttributeValue(elt, 'hx-' + verb) 2631 + explicitAction = true 2632 + nodeData.path = path 2633 + nodeData.verb = verb 2634 + triggerSpecs.forEach(function(triggerSpec) { 2635 + addTriggerHandler(elt, triggerSpec, nodeData, function(node, evt) { 2636 + const elt = asElement(node) 2637 + if (closest(elt, htmx.config.disableSelector)) { 2638 + cleanUpElement(elt) 2639 + return 2640 + } 2641 + issueAjaxRequest(verb, path, elt, evt) 2642 + }) 2643 + }) 2644 + } 2645 + }) 2646 + return explicitAction 2647 + } 2648 + 2649 + /** 2650 + * @callback TriggerHandler 2651 + * @param {Node} elt 2652 + * @param {Event} [evt] 2653 + */ 2654 + 2655 + /** 2656 + * @param {Node} elt 2657 + * @param {HtmxTriggerSpecification} triggerSpec 2658 + * @param {HtmxNodeInternalData} nodeData 2659 + * @param {TriggerHandler} handler 2660 + */ 2661 + function addTriggerHandler(elt, triggerSpec, nodeData, handler) { 2662 + if (triggerSpec.trigger === 'revealed') { 2663 + initScrollHandler() 2664 + addEventListener(elt, handler, nodeData, triggerSpec) 2665 + maybeReveal(asElement(elt)) 2666 + } else if (triggerSpec.trigger === 'intersect') { 2667 + const observerOptions = {} 2668 + if (triggerSpec.root) { 2669 + observerOptions.root = querySelectorExt(elt, triggerSpec.root) 2670 + } 2671 + if (triggerSpec.threshold) { 2672 + observerOptions.threshold = parseFloat(triggerSpec.threshold) 2673 + } 2674 + const observer = new IntersectionObserver(function(entries) { 2675 + for (let i = 0; i < entries.length; i++) { 2676 + const entry = entries[i] 2677 + if (entry.isIntersecting) { 2678 + triggerEvent(elt, 'intersect') 2679 + break 2680 + } 2681 + } 2682 + }, observerOptions) 2683 + observer.observe(asElement(elt)) 2684 + addEventListener(asElement(elt), handler, nodeData, triggerSpec) 2685 + } else if (!nodeData.firstInitCompleted && triggerSpec.trigger === 'load') { 2686 + if (!maybeFilterEvent(triggerSpec, elt, makeEvent('load', { elt }))) { 2687 + loadImmediately(asElement(elt), handler, nodeData, triggerSpec.delay) 2688 + } 2689 + } else if (triggerSpec.pollInterval > 0) { 2690 + nodeData.polling = true 2691 + processPolling(asElement(elt), handler, triggerSpec) 2692 + } else { 2693 + addEventListener(elt, handler, nodeData, triggerSpec) 2694 + } 2695 + } 2696 + 2697 + /** 2698 + * @param {Node} node 2699 + * @returns {boolean} 2700 + */ 2701 + function shouldProcessHxOn(node) { 2702 + const elt = asElement(node) 2703 + if (!elt) { 2704 + return false 2705 + } 2706 + const attributes = elt.attributes 2707 + for (let j = 0; j < attributes.length; j++) { 2708 + const attrName = attributes[j].name 2709 + if (startsWith(attrName, 'hx-on:') || startsWith(attrName, 'data-hx-on:') || 2710 + startsWith(attrName, 'hx-on-') || startsWith(attrName, 'data-hx-on-')) { 2711 + return true 2712 + } 2713 + } 2714 + return false 2715 + } 2716 + 2717 + /** 2718 + * @param {Node} elt 2719 + * @returns {Element[]} 2720 + */ 2721 + const HX_ON_QUERY = new XPathEvaluator() 2722 + .createExpression('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or' + 2723 + ' starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]') 2724 + 2725 + function processHXOnRoot(elt, elements) { 2726 + if (shouldProcessHxOn(elt)) { 2727 + elements.push(asElement(elt)) 2728 + } 2729 + const iter = HX_ON_QUERY.evaluate(elt) 2730 + let node = null 2731 + while (node = iter.iterateNext()) elements.push(asElement(node)) 2732 + } 2733 + 2734 + function findHxOnWildcardElements(elt) { 2735 + /** @type {Element[]} */ 2736 + const elements = [] 2737 + if (elt instanceof DocumentFragment) { 2738 + for (const child of elt.childNodes) { 2739 + processHXOnRoot(child, elements) 2740 + } 2741 + } else { 2742 + processHXOnRoot(elt, elements) 2743 + } 2744 + return elements 2745 + } 2746 + 2747 + /** 2748 + * @param {Element} elt 2749 + * @returns {NodeListOf<Element>|[]} 2750 + */ 2751 + function findElementsToProcess(elt) { 2752 + if (elt.querySelectorAll) { 2753 + const boostedSelector = ', [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]' 2754 + 2755 + const extensionSelectors = [] 2756 + for (const e in extensions) { 2757 + const extension = extensions[e] 2758 + if (extension.getSelectors) { 2759 + var selectors = extension.getSelectors() 2760 + if (selectors) { 2761 + extensionSelectors.push(selectors) 2762 + } 2763 + } 2764 + } 2765 + 2766 + const results = elt.querySelectorAll(VERB_SELECTOR + boostedSelector + ", form, [type='submit']," + 2767 + ' [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger]' + extensionSelectors.flat().map(s => ', ' + s).join('')) 2768 + 2769 + return results 2770 + } else { 2771 + return [] 2772 + } 2773 + } 2774 + 2775 + /** 2776 + * Handle submit buttons/inputs that have the form attribute set 2777 + * see https://developer.mozilla.org/docs/Web/HTML/Element/button 2778 + * @param {Event} evt 2779 + */ 2780 + function maybeSetLastButtonClicked(evt) { 2781 + const elt = /** @type {HTMLButtonElement|HTMLInputElement} */ (closest(asElement(evt.target), "button, input[type='submit']")) 2782 + const internalData = getRelatedFormData(evt) 2783 + if (internalData) { 2784 + internalData.lastButtonClicked = elt 2785 + } 2786 + } 2787 + 2788 + /** 2789 + * @param {Event} evt 2790 + */ 2791 + function maybeUnsetLastButtonClicked(evt) { 2792 + const internalData = getRelatedFormData(evt) 2793 + if (internalData) { 2794 + internalData.lastButtonClicked = null 2795 + } 2796 + } 2797 + 2798 + /** 2799 + * @param {Event} evt 2800 + * @returns {HtmxNodeInternalData|undefined} 2801 + */ 2802 + function getRelatedFormData(evt) { 2803 + const elt = closest(asElement(evt.target), "button, input[type='submit']") 2804 + if (!elt) { 2805 + return 2806 + } 2807 + const form = resolveTarget('#' + getRawAttribute(elt, 'form'), elt.getRootNode()) || closest(elt, 'form') 2808 + if (!form) { 2809 + return 2810 + } 2811 + return getInternalData(form) 2812 + } 2813 + 2814 + /** 2815 + * @param {EventTarget} elt 2816 + */ 2817 + function initButtonTracking(elt) { 2818 + // need to handle both click and focus in: 2819 + // focusin - in case someone tabs in to a button and hits the space bar 2820 + // click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724 2821 + elt.addEventListener('click', maybeSetLastButtonClicked) 2822 + elt.addEventListener('focusin', maybeSetLastButtonClicked) 2823 + elt.addEventListener('focusout', maybeUnsetLastButtonClicked) 2824 + } 2825 + 2826 + /** 2827 + * @param {Element} elt 2828 + * @param {string} eventName 2829 + * @param {string} code 2830 + */ 2831 + function addHxOnEventHandler(elt, eventName, code) { 2832 + const nodeData = getInternalData(elt) 2833 + if (!Array.isArray(nodeData.onHandlers)) { 2834 + nodeData.onHandlers = [] 2835 + } 2836 + let func 2837 + /** @type EventListener */ 2838 + const listener = function(e) { 2839 + maybeEval(elt, function() { 2840 + if (eltIsDisabled(elt)) { 2841 + return 2842 + } 2843 + if (!func) { 2844 + func = new Function('event', code) 2845 + } 2846 + func.call(elt, e) 2847 + }) 2848 + } 2849 + elt.addEventListener(eventName, listener) 2850 + nodeData.onHandlers.push({ event: eventName, listener }) 2851 + } 2852 + 2853 + /** 2854 + * @param {Element} elt 2855 + */ 2856 + function processHxOnWildcard(elt) { 2857 + // wipe any previous on handlers so that this function takes precedence 2858 + deInitOnHandlers(elt) 2859 + 2860 + for (let i = 0; i < elt.attributes.length; i++) { 2861 + const name = elt.attributes[i].name 2862 + const value = elt.attributes[i].value 2863 + if (startsWith(name, 'hx-on') || startsWith(name, 'data-hx-on')) { 2864 + const afterOnPosition = name.indexOf('-on') + 3 2865 + const nextChar = name.slice(afterOnPosition, afterOnPosition + 1) 2866 + if (nextChar === '-' || nextChar === ':') { 2867 + let eventName = name.slice(afterOnPosition + 1) 2868 + // if the eventName starts with a colon or dash, prepend "htmx" for shorthand support 2869 + if (startsWith(eventName, ':')) { 2870 + eventName = 'htmx' + eventName 2871 + } else if (startsWith(eventName, '-')) { 2872 + eventName = 'htmx:' + eventName.slice(1) 2873 + } else if (startsWith(eventName, 'htmx-')) { 2874 + eventName = 'htmx:' + eventName.slice(5) 2875 + } 2876 + 2877 + addHxOnEventHandler(elt, eventName, value) 2878 + } 2879 + } 2880 + } 2881 + } 2882 + 2883 + /** 2884 + * @param {Element|HTMLInputElement} elt 2885 + */ 2886 + function initNode(elt) { 2887 + if (closest(elt, htmx.config.disableSelector)) { 2888 + cleanUpElement(elt) 2889 + return 2890 + } 2891 + const nodeData = getInternalData(elt) 2892 + const attrHash = attributeHash(elt) 2893 + if (nodeData.initHash !== attrHash) { 2894 + // clean up any previously processed info 2895 + deInitNode(elt) 2896 + 2897 + nodeData.initHash = attrHash 2898 + 2899 + triggerEvent(elt, 'htmx:beforeProcessNode') 2900 + 2901 + const triggerSpecs = getTriggerSpecs(elt) 2902 + const hasExplicitHttpAction = processVerbs(elt, nodeData, triggerSpecs) 2903 + 2904 + if (!hasExplicitHttpAction) { 2905 + if (getClosestAttributeValue(elt, 'hx-boost') === 'true') { 2906 + boostElement(elt, nodeData, triggerSpecs) 2907 + } else if (hasAttribute(elt, 'hx-trigger')) { 2908 + triggerSpecs.forEach(function(triggerSpec) { 2909 + // For "naked" triggers, don't do anything at all 2910 + addTriggerHandler(elt, triggerSpec, nodeData, function() { 2911 + }) 2912 + }) 2913 + } 2914 + } 2915 + 2916 + // Handle submit buttons/inputs that have the form attribute set 2917 + // see https://developer.mozilla.org/docs/Web/HTML/Element/button 2918 + if (elt.tagName === 'FORM' || (getRawAttribute(elt, 'type') === 'submit' && hasAttribute(elt, 'form'))) { 2919 + initButtonTracking(elt) 2920 + } 2921 + 2922 + nodeData.firstInitCompleted = true 2923 + triggerEvent(elt, 'htmx:afterProcessNode') 2924 + } 2925 + } 2926 + 2927 + /** 2928 + * Processes new content, enabling htmx behavior. This can be useful if you have content that is added to the DOM outside of the normal htmx request cycle but still want htmx attributes to work. 2929 + * 2930 + * @see https://htmx.org/api/#process 2931 + * 2932 + * @param {Element|string} elt element to process 2933 + */ 2934 + function processNode(elt) { 2935 + elt = resolveTarget(elt) 2936 + if (closest(elt, htmx.config.disableSelector)) { 2937 + cleanUpElement(elt) 2938 + return 2939 + } 2940 + initNode(elt) 2941 + forEach(findElementsToProcess(elt), function(child) { initNode(child) }) 2942 + forEach(findHxOnWildcardElements(elt), processHxOnWildcard) 2943 + } 2944 + 2945 + //= =================================================================== 2946 + // Event/Log Support 2947 + //= =================================================================== 2948 + 2949 + /** 2950 + * @param {string} str 2951 + * @returns {string} 2952 + */ 2953 + function kebabEventName(str) { 2954 + return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase() 2955 + } 2956 + 2957 + /** 2958 + * @param {string} eventName 2959 + * @param {any} detail 2960 + * @returns {CustomEvent} 2961 + */ 2962 + function makeEvent(eventName, detail) { 2963 + let evt 2964 + if (window.CustomEvent && typeof window.CustomEvent === 'function') { 2965 + // TODO: `composed: true` here is a hack to make global event handlers work with events in shadow DOM 2966 + // This breaks expected encapsulation but needs to be here until decided otherwise by core devs 2967 + evt = new CustomEvent(eventName, { bubbles: true, cancelable: true, composed: true, detail }) 2968 + } else { 2969 + evt = getDocument().createEvent('CustomEvent') 2970 + evt.initCustomEvent(eventName, true, true, detail) 2971 + } 2972 + return evt 2973 + } 2974 + 2975 + /** 2976 + * @param {EventTarget|string} elt 2977 + * @param {string} eventName 2978 + * @param {any=} detail 2979 + */ 2980 + function triggerErrorEvent(elt, eventName, detail) { 2981 + triggerEvent(elt, eventName, mergeObjects({ error: eventName }, detail)) 2982 + } 2983 + 2984 + /** 2985 + * @param {string} eventName 2986 + * @returns {boolean} 2987 + */ 2988 + function ignoreEventForLogging(eventName) { 2989 + return eventName === 'htmx:afterProcessNode' 2990 + } 2991 + 2992 + /** 2993 + * `withExtensions` locates all active extensions for a provided element, then 2994 + * executes the provided function using each of the active extensions. It should 2995 + * be called internally at every extendable execution point in htmx. 2996 + * 2997 + * @param {Element} elt 2998 + * @param {(extension:HtmxExtension) => void} toDo 2999 + * @returns void 3000 + */ 3001 + function withExtensions(elt, toDo) { 3002 + forEach(getExtensions(elt), function(extension) { 3003 + try { 3004 + toDo(extension) 3005 + } catch (e) { 3006 + logError(e) 3007 + } 3008 + }) 3009 + } 3010 + 3011 + function logError(msg) { 3012 + if (console.error) { 3013 + console.error(msg) 3014 + } else if (console.log) { 3015 + console.log('ERROR: ', msg) 3016 + } 3017 + } 3018 + 3019 + /** 3020 + * Triggers a given event on an element 3021 + * 3022 + * @see https://htmx.org/api/#trigger 3023 + * 3024 + * @param {EventTarget|string} elt the element to trigger the event on 3025 + * @param {string} eventName the name of the event to trigger 3026 + * @param {any=} detail details for the event 3027 + * @returns {boolean} 3028 + */ 3029 + function triggerEvent(elt, eventName, detail) { 3030 + elt = resolveTarget(elt) 3031 + if (detail == null) { 3032 + detail = {} 3033 + } 3034 + detail.elt = elt 3035 + const event = makeEvent(eventName, detail) 3036 + if (htmx.logger && !ignoreEventForLogging(eventName)) { 3037 + htmx.logger(elt, eventName, detail) 3038 + } 3039 + if (detail.error) { 3040 + logError(detail.error) 3041 + triggerEvent(elt, 'htmx:error', { errorInfo: detail }) 3042 + } 3043 + let eventResult = elt.dispatchEvent(event) 3044 + const kebabName = kebabEventName(eventName) 3045 + if (eventResult && kebabName !== eventName) { 3046 + const kebabedEvent = makeEvent(kebabName, event.detail) 3047 + eventResult = eventResult && elt.dispatchEvent(kebabedEvent) 3048 + } 3049 + withExtensions(asElement(elt), function(extension) { 3050 + eventResult = eventResult && (extension.onEvent(eventName, event) !== false && !event.defaultPrevented) 3051 + }) 3052 + return eventResult 3053 + } 3054 + 3055 + //= =================================================================== 3056 + // History Support 3057 + //= =================================================================== 3058 + let currentPathForHistory = location.pathname + location.search 3059 + 3060 + /** 3061 + * @returns {Element} 3062 + */ 3063 + function getHistoryElement() { 3064 + const historyElt = getDocument().querySelector('[hx-history-elt],[data-hx-history-elt]') 3065 + return historyElt || getDocument().body 3066 + } 3067 + 3068 + /** 3069 + * @param {string} url 3070 + * @param {Element} rootElt 3071 + */ 3072 + function saveToHistoryCache(url, rootElt) { 3073 + if (!canAccessLocalStorage()) { 3074 + return 3075 + } 3076 + 3077 + // get state to save 3078 + const innerHTML = cleanInnerHtmlForHistory(rootElt) 3079 + const title = getDocument().title 3080 + const scroll = window.scrollY 3081 + 3082 + if (htmx.config.historyCacheSize <= 0) { 3083 + // make sure that an eventually already existing cache is purged 3084 + localStorage.removeItem('htmx-history-cache') 3085 + return 3086 + } 3087 + 3088 + url = normalizePath(url) 3089 + 3090 + const historyCache = parseJSON(localStorage.getItem('htmx-history-cache')) || [] 3091 + for (let i = 0; i < historyCache.length; i++) { 3092 + if (historyCache[i].url === url) { 3093 + historyCache.splice(i, 1) 3094 + break 3095 + } 3096 + } 3097 + 3098 + /** @type HtmxHistoryItem */ 3099 + const newHistoryItem = { url, content: innerHTML, title, scroll } 3100 + 3101 + triggerEvent(getDocument().body, 'htmx:historyItemCreated', { item: newHistoryItem, cache: historyCache }) 3102 + 3103 + historyCache.push(newHistoryItem) 3104 + while (historyCache.length > htmx.config.historyCacheSize) { 3105 + historyCache.shift() 3106 + } 3107 + 3108 + // keep trying to save the cache until it succeeds or is empty 3109 + while (historyCache.length > 0) { 3110 + try { 3111 + localStorage.setItem('htmx-history-cache', JSON.stringify(historyCache)) 3112 + break 3113 + } catch (e) { 3114 + triggerErrorEvent(getDocument().body, 'htmx:historyCacheError', { cause: e, cache: historyCache }) 3115 + historyCache.shift() // shrink the cache and retry 3116 + } 3117 + } 3118 + } 3119 + 3120 + /** 3121 + * @typedef {Object} HtmxHistoryItem 3122 + * @property {string} url 3123 + * @property {string} content 3124 + * @property {string} title 3125 + * @property {number} scroll 3126 + */ 3127 + 3128 + /** 3129 + * @param {string} url 3130 + * @returns {HtmxHistoryItem|null} 3131 + */ 3132 + function getCachedHistory(url) { 3133 + if (!canAccessLocalStorage()) { 3134 + return null 3135 + } 3136 + 3137 + url = normalizePath(url) 3138 + 3139 + const historyCache = parseJSON(localStorage.getItem('htmx-history-cache')) || [] 3140 + for (let i = 0; i < historyCache.length; i++) { 3141 + if (historyCache[i].url === url) { 3142 + return historyCache[i] 3143 + } 3144 + } 3145 + return null 3146 + } 3147 + 3148 + /** 3149 + * @param {Element} elt 3150 + * @returns {string} 3151 + */ 3152 + function cleanInnerHtmlForHistory(elt) { 3153 + const className = htmx.config.requestClass 3154 + const clone = /** @type Element */ (elt.cloneNode(true)) 3155 + forEach(findAll(clone, '.' + className), function(child) { 3156 + removeClassFromElement(child, className) 3157 + }) 3158 + // remove the disabled attribute for any element disabled due to an htmx request 3159 + forEach(findAll(clone, '[data-disabled-by-htmx]'), function(child) { 3160 + child.removeAttribute('disabled') 3161 + }) 3162 + return clone.innerHTML 3163 + } 3164 + 3165 + function saveCurrentPageToHistory() { 3166 + const elt = getHistoryElement() 3167 + const path = currentPathForHistory || location.pathname + location.search 3168 + 3169 + // Allow history snapshot feature to be disabled where hx-history="false" 3170 + // is present *anywhere* in the current document we're about to save, 3171 + // so we can prevent privileged data entering the cache. 3172 + // The page will still be reachable as a history entry, but htmx will fetch it 3173 + // live from the server onpopstate rather than look in the localStorage cache 3174 + let disableHistoryCache 3175 + try { 3176 + disableHistoryCache = getDocument().querySelector('[hx-history="false" i],[data-hx-history="false" i]') 3177 + } catch (e) { 3178 + // IE11: insensitive modifier not supported so fallback to case sensitive selector 3179 + disableHistoryCache = getDocument().querySelector('[hx-history="false"],[data-hx-history="false"]') 3180 + } 3181 + if (!disableHistoryCache) { 3182 + triggerEvent(getDocument().body, 'htmx:beforeHistorySave', { path, historyElt: elt }) 3183 + saveToHistoryCache(path, elt) 3184 + } 3185 + 3186 + if (htmx.config.historyEnabled) history.replaceState({ htmx: true }, getDocument().title, window.location.href) 3187 + } 3188 + 3189 + /** 3190 + * @param {string} path 3191 + */ 3192 + function pushUrlIntoHistory(path) { 3193 + // remove the cache buster parameter, if any 3194 + if (htmx.config.getCacheBusterParam) { 3195 + path = path.replace(/org\.htmx\.cache-buster=[^&]*&?/, '') 3196 + if (endsWith(path, '&') || endsWith(path, '?')) { 3197 + path = path.slice(0, -1) 3198 + } 3199 + } 3200 + if (htmx.config.historyEnabled) { 3201 + history.pushState({ htmx: true }, '', path) 3202 + } 3203 + currentPathForHistory = path 3204 + } 3205 + 3206 + /** 3207 + * @param {string} path 3208 + */ 3209 + function replaceUrlInHistory(path) { 3210 + if (htmx.config.historyEnabled) history.replaceState({ htmx: true }, '', path) 3211 + currentPathForHistory = path 3212 + } 3213 + 3214 + /** 3215 + * @param {HtmxSettleTask[]} tasks 3216 + */ 3217 + function settleImmediately(tasks) { 3218 + forEach(tasks, function(task) { 3219 + task.call(undefined) 3220 + }) 3221 + } 3222 + 3223 + /** 3224 + * @param {string} path 3225 + */ 3226 + function loadHistoryFromServer(path) { 3227 + const request = new XMLHttpRequest() 3228 + const details = { path, xhr: request } 3229 + triggerEvent(getDocument().body, 'htmx:historyCacheMiss', details) 3230 + request.open('GET', path, true) 3231 + request.setRequestHeader('HX-Request', 'true') 3232 + request.setRequestHeader('HX-History-Restore-Request', 'true') 3233 + request.setRequestHeader('HX-Current-URL', getDocument().location.href) 3234 + request.onload = function() { 3235 + if (this.status >= 200 && this.status < 400) { 3236 + triggerEvent(getDocument().body, 'htmx:historyCacheMissLoad', details) 3237 + const fragment = makeFragment(this.response) 3238 + /** @type ParentNode */ 3239 + const content = fragment.querySelector('[hx-history-elt],[data-hx-history-elt]') || fragment 3240 + const historyElement = getHistoryElement() 3241 + const settleInfo = makeSettleInfo(historyElement) 3242 + handleTitle(fragment.title) 3243 + 3244 + handlePreservedElements(fragment) 3245 + swapInnerHTML(historyElement, content, settleInfo) 3246 + restorePreservedElements() 3247 + settleImmediately(settleInfo.tasks) 3248 + currentPathForHistory = path 3249 + triggerEvent(getDocument().body, 'htmx:historyRestore', { path, cacheMiss: true, serverResponse: this.response }) 3250 + } else { 3251 + triggerErrorEvent(getDocument().body, 'htmx:historyCacheMissLoadError', details) 3252 + } 3253 + } 3254 + request.send() 3255 + } 3256 + 3257 + /** 3258 + * @param {string} [path] 3259 + */ 3260 + function restoreHistory(path) { 3261 + saveCurrentPageToHistory() 3262 + path = path || location.pathname + location.search 3263 + const cached = getCachedHistory(path) 3264 + if (cached) { 3265 + const fragment = makeFragment(cached.content) 3266 + const historyElement = getHistoryElement() 3267 + const settleInfo = makeSettleInfo(historyElement) 3268 + handleTitle(cached.title) 3269 + handlePreservedElements(fragment) 3270 + swapInnerHTML(historyElement, fragment, settleInfo) 3271 + restorePreservedElements() 3272 + settleImmediately(settleInfo.tasks) 3273 + getWindow().setTimeout(function() { 3274 + window.scrollTo(0, cached.scroll) 3275 + }, 0) // next 'tick', so browser has time to render layout 3276 + currentPathForHistory = path 3277 + triggerEvent(getDocument().body, 'htmx:historyRestore', { path, item: cached }) 3278 + } else { 3279 + if (htmx.config.refreshOnHistoryMiss) { 3280 + // @ts-ignore: optional parameter in reload() function throws error 3281 + // noinspection JSUnresolvedReference 3282 + window.location.reload(true) 3283 + } else { 3284 + loadHistoryFromServer(path) 3285 + } 3286 + } 3287 + } 3288 + 3289 + /** 3290 + * @param {Element} elt 3291 + * @returns {Element[]} 3292 + */ 3293 + function addRequestIndicatorClasses(elt) { 3294 + let indicators = /** @type Element[] */ (findAttributeTargets(elt, 'hx-indicator')) 3295 + if (indicators == null) { 3296 + indicators = [elt] 3297 + } 3298 + forEach(indicators, function(ic) { 3299 + const internalData = getInternalData(ic) 3300 + internalData.requestCount = (internalData.requestCount || 0) + 1 3301 + ic.classList.add.call(ic.classList, htmx.config.requestClass) 3302 + }) 3303 + return indicators 3304 + } 3305 + 3306 + /** 3307 + * @param {Element} elt 3308 + * @returns {Element[]} 3309 + */ 3310 + function disableElements(elt) { 3311 + let disabledElts = /** @type Element[] */ (findAttributeTargets(elt, 'hx-disabled-elt')) 3312 + if (disabledElts == null) { 3313 + disabledElts = [] 3314 + } 3315 + forEach(disabledElts, function(disabledElement) { 3316 + const internalData = getInternalData(disabledElement) 3317 + internalData.requestCount = (internalData.requestCount || 0) + 1 3318 + disabledElement.setAttribute('disabled', '') 3319 + disabledElement.setAttribute('data-disabled-by-htmx', '') 3320 + }) 3321 + return disabledElts 3322 + } 3323 + 3324 + /** 3325 + * @param {Element[]} indicators 3326 + * @param {Element[]} disabled 3327 + */ 3328 + function removeRequestIndicators(indicators, disabled) { 3329 + forEach(indicators.concat(disabled), function(ele) { 3330 + const internalData = getInternalData(ele) 3331 + internalData.requestCount = (internalData.requestCount || 1) - 1 3332 + }) 3333 + forEach(indicators, function(ic) { 3334 + const internalData = getInternalData(ic) 3335 + if (internalData.requestCount === 0) { 3336 + ic.classList.remove.call(ic.classList, htmx.config.requestClass) 3337 + } 3338 + }) 3339 + forEach(disabled, function(disabledElement) { 3340 + const internalData = getInternalData(disabledElement) 3341 + if (internalData.requestCount === 0) { 3342 + disabledElement.removeAttribute('disabled') 3343 + disabledElement.removeAttribute('data-disabled-by-htmx') 3344 + } 3345 + }) 3346 + } 3347 + 3348 + //= =================================================================== 3349 + // Input Value Processing 3350 + //= =================================================================== 3351 + 3352 + /** 3353 + * @param {Element[]} processed 3354 + * @param {Element} elt 3355 + * @returns {boolean} 3356 + */ 3357 + function haveSeenNode(processed, elt) { 3358 + for (let i = 0; i < processed.length; i++) { 3359 + const node = processed[i] 3360 + if (node.isSameNode(elt)) { 3361 + return true 3362 + } 3363 + } 3364 + return false 3365 + } 3366 + 3367 + /** 3368 + * @param {Element} element 3369 + * @return {boolean} 3370 + */ 3371 + function shouldInclude(element) { 3372 + // Cast to trick tsc, undefined values will work fine here 3373 + const elt = /** @type {HTMLInputElement} */ (element) 3374 + if (elt.name === '' || elt.name == null || elt.disabled || closest(elt, 'fieldset[disabled]')) { 3375 + return false 3376 + } 3377 + // ignore "submitter" types (see jQuery src/serialize.js) 3378 + if (elt.type === 'button' || elt.type === 'submit' || elt.tagName === 'image' || elt.tagName === 'reset' || elt.tagName === 'file') { 3379 + return false 3380 + } 3381 + if (elt.type === 'checkbox' || elt.type === 'radio') { 3382 + return elt.checked 3383 + } 3384 + return true 3385 + } 3386 + 3387 + /** @param {string} name 3388 + * @param {string|Array|FormDataEntryValue} value 3389 + * @param {FormData} formData */ 3390 + function addValueToFormData(name, value, formData) { 3391 + if (name != null && value != null) { 3392 + if (Array.isArray(value)) { 3393 + value.forEach(function(v) { formData.append(name, v) }) 3394 + } else { 3395 + formData.append(name, value) 3396 + } 3397 + } 3398 + } 3399 + 3400 + /** @param {string} name 3401 + * @param {string|Array} value 3402 + * @param {FormData} formData */ 3403 + function removeValueFromFormData(name, value, formData) { 3404 + if (name != null && value != null) { 3405 + let values = formData.getAll(name) 3406 + if (Array.isArray(value)) { 3407 + values = values.filter(v => value.indexOf(v) < 0) 3408 + } else { 3409 + values = values.filter(v => v !== value) 3410 + } 3411 + formData.delete(name) 3412 + forEach(values, v => formData.append(name, v)) 3413 + } 3414 + } 3415 + 3416 + /** 3417 + * @param {Element[]} processed 3418 + * @param {FormData} formData 3419 + * @param {HtmxElementValidationError[]} errors 3420 + * @param {Element|HTMLInputElement|HTMLSelectElement|HTMLFormElement} elt 3421 + * @param {boolean} validate 3422 + */ 3423 + function processInputValue(processed, formData, errors, elt, validate) { 3424 + if (elt == null || haveSeenNode(processed, elt)) { 3425 + return 3426 + } else { 3427 + processed.push(elt) 3428 + } 3429 + if (shouldInclude(elt)) { 3430 + const name = getRawAttribute(elt, 'name') 3431 + // @ts-ignore value will be undefined for non-input elements, which is fine 3432 + let value = elt.value 3433 + if (elt instanceof HTMLSelectElement && elt.multiple) { 3434 + value = toArray(elt.querySelectorAll('option:checked')).map(function(e) { return (/** @type HTMLOptionElement */(e)).value }) 3435 + } 3436 + // include file inputs 3437 + if (elt instanceof HTMLInputElement && elt.files) { 3438 + value = toArray(elt.files) 3439 + } 3440 + addValueToFormData(name, value, formData) 3441 + if (validate) { 3442 + validateElement(elt, errors) 3443 + } 3444 + } 3445 + if (elt instanceof HTMLFormElement) { 3446 + forEach(elt.elements, function(input) { 3447 + if (processed.indexOf(input) >= 0) { 3448 + // The input has already been processed and added to the values, but the FormData that will be 3449 + // constructed right after on the form, will include it once again. So remove that input's value 3450 + // now to avoid duplicates 3451 + removeValueFromFormData(input.name, input.value, formData) 3452 + } else { 3453 + processed.push(input) 3454 + } 3455 + if (validate) { 3456 + validateElement(input, errors) 3457 + } 3458 + }) 3459 + new FormData(elt).forEach(function(value, name) { 3460 + if (value instanceof File && value.name === '') { 3461 + return // ignore no-name files 3462 + } 3463 + addValueToFormData(name, value, formData) 3464 + }) 3465 + } 3466 + } 3467 + 3468 + /** 3469 + * 3470 + * @param {Element} elt 3471 + * @param {HtmxElementValidationError[]} errors 3472 + */ 3473 + function validateElement(elt, errors) { 3474 + const element = /** @type {HTMLElement & ElementInternals} */ (elt) 3475 + if (element.willValidate) { 3476 + triggerEvent(element, 'htmx:validation:validate') 3477 + if (!element.checkValidity()) { 3478 + errors.push({ elt: element, message: element.validationMessage, validity: element.validity }) 3479 + triggerEvent(element, 'htmx:validation:failed', { message: element.validationMessage, validity: element.validity }) 3480 + } 3481 + } 3482 + } 3483 + 3484 + /** 3485 + * Override values in the one FormData with those from another. 3486 + * @param {FormData} receiver the formdata that will be mutated 3487 + * @param {FormData} donor the formdata that will provide the overriding values 3488 + * @returns {FormData} the {@linkcode receiver} 3489 + */ 3490 + function overrideFormData(receiver, donor) { 3491 + for (const key of donor.keys()) { 3492 + receiver.delete(key) 3493 + } 3494 + donor.forEach(function(value, key) { 3495 + receiver.append(key, value) 3496 + }) 3497 + return receiver 3498 + } 3499 + 3500 + /** 3501 + * @param {Element|HTMLFormElement} elt 3502 + * @param {HttpVerb} verb 3503 + * @returns {{errors: HtmxElementValidationError[], formData: FormData, values: Object}} 3504 + */ 3505 + function getInputValues(elt, verb) { 3506 + /** @type Element[] */ 3507 + const processed = [] 3508 + const formData = new FormData() 3509 + const priorityFormData = new FormData() 3510 + /** @type HtmxElementValidationError[] */ 3511 + const errors = [] 3512 + const internalData = getInternalData(elt) 3513 + if (internalData.lastButtonClicked && !bodyContains(internalData.lastButtonClicked)) { 3514 + internalData.lastButtonClicked = null 3515 + } 3516 + 3517 + // only validate when form is directly submitted and novalidate or formnovalidate are not set 3518 + // or if the element has an explicit hx-validate="true" on it 3519 + let validate = (elt instanceof HTMLFormElement && elt.noValidate !== true) || getAttributeValue(elt, 'hx-validate') === 'true' 3520 + if (internalData.lastButtonClicked) { 3521 + validate = validate && internalData.lastButtonClicked.formNoValidate !== true 3522 + } 3523 + 3524 + // for a non-GET include the closest form 3525 + if (verb !== 'get') { 3526 + processInputValue(processed, priorityFormData, errors, closest(elt, 'form'), validate) 3527 + } 3528 + 3529 + // include the element itself 3530 + processInputValue(processed, formData, errors, elt, validate) 3531 + 3532 + // if a button or submit was clicked last, include its value 3533 + if (internalData.lastButtonClicked || elt.tagName === 'BUTTON' || 3534 + (elt.tagName === 'INPUT' && getRawAttribute(elt, 'type') === 'submit')) { 3535 + const button = internalData.lastButtonClicked || (/** @type HTMLInputElement|HTMLButtonElement */(elt)) 3536 + const name = getRawAttribute(button, 'name') 3537 + addValueToFormData(name, button.value, priorityFormData) 3538 + } 3539 + 3540 + // include any explicit includes 3541 + const includes = findAttributeTargets(elt, 'hx-include') 3542 + forEach(includes, function(node) { 3543 + processInputValue(processed, formData, errors, asElement(node), validate) 3544 + // if a non-form is included, include any input values within it 3545 + if (!matches(node, 'form')) { 3546 + forEach(asParentNode(node).querySelectorAll(INPUT_SELECTOR), function(descendant) { 3547 + processInputValue(processed, formData, errors, descendant, validate) 3548 + }) 3549 + } 3550 + }) 3551 + 3552 + // values from a <form> take precedence, overriding the regular values 3553 + overrideFormData(formData, priorityFormData) 3554 + 3555 + return { errors, formData, values: formDataProxy(formData) } 3556 + } 3557 + 3558 + /** 3559 + * @param {string} returnStr 3560 + * @param {string} name 3561 + * @param {any} realValue 3562 + * @returns {string} 3563 + */ 3564 + function appendParam(returnStr, name, realValue) { 3565 + if (returnStr !== '') { 3566 + returnStr += '&' 3567 + } 3568 + if (String(realValue) === '[object Object]') { 3569 + realValue = JSON.stringify(realValue) 3570 + } 3571 + const s = encodeURIComponent(realValue) 3572 + returnStr += encodeURIComponent(name) + '=' + s 3573 + return returnStr 3574 + } 3575 + 3576 + /** 3577 + * @param {FormData|Object} values 3578 + * @returns string 3579 + */ 3580 + function urlEncode(values) { 3581 + values = formDataFromObject(values) 3582 + let returnStr = '' 3583 + values.forEach(function(value, key) { 3584 + returnStr = appendParam(returnStr, key, value) 3585 + }) 3586 + return returnStr 3587 + } 3588 + 3589 + //= =================================================================== 3590 + // Ajax 3591 + //= =================================================================== 3592 + 3593 + /** 3594 + * @param {Element} elt 3595 + * @param {Element} target 3596 + * @param {string} prompt 3597 + * @returns {HtmxHeaderSpecification} 3598 + */ 3599 + function getHeaders(elt, target, prompt) { 3600 + /** @type HtmxHeaderSpecification */ 3601 + const headers = { 3602 + 'HX-Request': 'true', 3603 + 'HX-Trigger': getRawAttribute(elt, 'id'), 3604 + 'HX-Trigger-Name': getRawAttribute(elt, 'name'), 3605 + 'HX-Target': getAttributeValue(target, 'id'), 3606 + 'HX-Current-URL': getDocument().location.href 3607 + } 3608 + getValuesForElement(elt, 'hx-headers', false, headers) 3609 + if (prompt !== undefined) { 3610 + headers['HX-Prompt'] = prompt 3611 + } 3612 + if (getInternalData(elt).boosted) { 3613 + headers['HX-Boosted'] = 'true' 3614 + } 3615 + return headers 3616 + } 3617 + 3618 + /** 3619 + * filterValues takes an object containing form input values 3620 + * and returns a new object that only contains keys that are 3621 + * specified by the closest "hx-params" attribute 3622 + * @param {FormData} inputValues 3623 + * @param {Element} elt 3624 + * @returns {FormData} 3625 + */ 3626 + function filterValues(inputValues, elt) { 3627 + const paramsValue = getClosestAttributeValue(elt, 'hx-params') 3628 + if (paramsValue) { 3629 + if (paramsValue === 'none') { 3630 + return new FormData() 3631 + } else if (paramsValue === '*') { 3632 + return inputValues 3633 + } else if (paramsValue.indexOf('not ') === 0) { 3634 + forEach(paramsValue.slice(4).split(','), function(name) { 3635 + name = name.trim() 3636 + inputValues.delete(name) 3637 + }) 3638 + return inputValues 3639 + } else { 3640 + const newValues = new FormData() 3641 + forEach(paramsValue.split(','), function(name) { 3642 + name = name.trim() 3643 + if (inputValues.has(name)) { 3644 + inputValues.getAll(name).forEach(function(value) { newValues.append(name, value) }) 3645 + } 3646 + }) 3647 + return newValues 3648 + } 3649 + } else { 3650 + return inputValues 3651 + } 3652 + } 3653 + 3654 + /** 3655 + * @param {Element} elt 3656 + * @return {boolean} 3657 + */ 3658 + function isAnchorLink(elt) { 3659 + return !!getRawAttribute(elt, 'href') && getRawAttribute(elt, 'href').indexOf('#') >= 0 3660 + } 3661 + 3662 + /** 3663 + * @param {Element} elt 3664 + * @param {HtmxSwapStyle} [swapInfoOverride] 3665 + * @returns {HtmxSwapSpecification} 3666 + */ 3667 + function getSwapSpecification(elt, swapInfoOverride) { 3668 + const swapInfo = swapInfoOverride || getClosestAttributeValue(elt, 'hx-swap') 3669 + /** @type HtmxSwapSpecification */ 3670 + const swapSpec = { 3671 + swapStyle: getInternalData(elt).boosted ? 'innerHTML' : htmx.config.defaultSwapStyle, 3672 + swapDelay: htmx.config.defaultSwapDelay, 3673 + settleDelay: htmx.config.defaultSettleDelay 3674 + } 3675 + if (htmx.config.scrollIntoViewOnBoost && getInternalData(elt).boosted && !isAnchorLink(elt)) { 3676 + swapSpec.show = 'top' 3677 + } 3678 + if (swapInfo) { 3679 + const split = splitOnWhitespace(swapInfo) 3680 + if (split.length > 0) { 3681 + for (let i = 0; i < split.length; i++) { 3682 + const value = split[i] 3683 + if (value.indexOf('swap:') === 0) { 3684 + swapSpec.swapDelay = parseInterval(value.slice(5)) 3685 + } else if (value.indexOf('settle:') === 0) { 3686 + swapSpec.settleDelay = parseInterval(value.slice(7)) 3687 + } else if (value.indexOf('transition:') === 0) { 3688 + swapSpec.transition = value.slice(11) === 'true' 3689 + } else if (value.indexOf('ignoreTitle:') === 0) { 3690 + swapSpec.ignoreTitle = value.slice(12) === 'true' 3691 + } else if (value.indexOf('scroll:') === 0) { 3692 + const scrollSpec = value.slice(7) 3693 + var splitSpec = scrollSpec.split(':') 3694 + const scrollVal = splitSpec.pop() 3695 + var selectorVal = splitSpec.length > 0 ? splitSpec.join(':') : null 3696 + // @ts-ignore 3697 + swapSpec.scroll = scrollVal 3698 + swapSpec.scrollTarget = selectorVal 3699 + } else if (value.indexOf('show:') === 0) { 3700 + const showSpec = value.slice(5) 3701 + var splitSpec = showSpec.split(':') 3702 + const showVal = splitSpec.pop() 3703 + var selectorVal = splitSpec.length > 0 ? splitSpec.join(':') : null 3704 + swapSpec.show = showVal 3705 + swapSpec.showTarget = selectorVal 3706 + } else if (value.indexOf('focus-scroll:') === 0) { 3707 + const focusScrollVal = value.slice('focus-scroll:'.length) 3708 + swapSpec.focusScroll = focusScrollVal == 'true' 3709 + } else if (i == 0) { 3710 + swapSpec.swapStyle = value 3711 + } else { 3712 + logError('Unknown modifier in hx-swap: ' + value) 3713 + } 3714 + } 3715 + } 3716 + } 3717 + return swapSpec 3718 + } 3719 + 3720 + /** 3721 + * @param {Element} elt 3722 + * @return {boolean} 3723 + */ 3724 + function usesFormData(elt) { 3725 + return getClosestAttributeValue(elt, 'hx-encoding') === 'multipart/form-data' || 3726 + (matches(elt, 'form') && getRawAttribute(elt, 'enctype') === 'multipart/form-data') 3727 + } 3728 + 3729 + /** 3730 + * @param {XMLHttpRequest} xhr 3731 + * @param {Element} elt 3732 + * @param {FormData} filteredParameters 3733 + * @returns {*|string|null} 3734 + */ 3735 + function encodeParamsForBody(xhr, elt, filteredParameters) { 3736 + let encodedParameters = null 3737 + withExtensions(elt, function(extension) { 3738 + if (encodedParameters == null) { 3739 + encodedParameters = extension.encodeParameters(xhr, filteredParameters, elt) 3740 + } 3741 + }) 3742 + if (encodedParameters != null) { 3743 + return encodedParameters 3744 + } else { 3745 + if (usesFormData(elt)) { 3746 + // Force conversion to an actual FormData object in case filteredParameters is a formDataProxy 3747 + // See https://github.com/bigskysoftware/htmx/issues/2317 3748 + return overrideFormData(new FormData(), formDataFromObject(filteredParameters)) 3749 + } else { 3750 + return urlEncode(filteredParameters) 3751 + } 3752 + } 3753 + } 3754 + 3755 + /** 3756 + * 3757 + * @param {Element} target 3758 + * @returns {HtmxSettleInfo} 3759 + */ 3760 + function makeSettleInfo(target) { 3761 + return { tasks: [], elts: [target] } 3762 + } 3763 + 3764 + /** 3765 + * @param {Element[]} content 3766 + * @param {HtmxSwapSpecification} swapSpec 3767 + */ 3768 + function updateScrollState(content, swapSpec) { 3769 + const first = content[0] 3770 + const last = content[content.length - 1] 3771 + if (swapSpec.scroll) { 3772 + var target = null 3773 + if (swapSpec.scrollTarget) { 3774 + target = asElement(querySelectorExt(first, swapSpec.scrollTarget)) 3775 + } 3776 + if (swapSpec.scroll === 'top' && (first || target)) { 3777 + target = target || first 3778 + target.scrollTop = 0 3779 + } 3780 + if (swapSpec.scroll === 'bottom' && (last || target)) { 3781 + target = target || last 3782 + target.scrollTop = target.scrollHeight 3783 + } 3784 + } 3785 + if (swapSpec.show) { 3786 + var target = null 3787 + if (swapSpec.showTarget) { 3788 + let targetStr = swapSpec.showTarget 3789 + if (swapSpec.showTarget === 'window') { 3790 + targetStr = 'body' 3791 + } 3792 + target = asElement(querySelectorExt(first, targetStr)) 3793 + } 3794 + if (swapSpec.show === 'top' && (first || target)) { 3795 + target = target || first 3796 + // @ts-ignore For some reason tsc doesn't recognize "instant" as a valid option for now 3797 + target.scrollIntoView({ block: 'start', behavior: htmx.config.scrollBehavior }) 3798 + } 3799 + if (swapSpec.show === 'bottom' && (last || target)) { 3800 + target = target || last 3801 + // @ts-ignore For some reason tsc doesn't recognize "instant" as a valid option for now 3802 + target.scrollIntoView({ block: 'end', behavior: htmx.config.scrollBehavior }) 3803 + } 3804 + } 3805 + } 3806 + 3807 + /** 3808 + * @param {Element} elt 3809 + * @param {string} attr 3810 + * @param {boolean=} evalAsDefault 3811 + * @param {Object=} values 3812 + * @returns {Object} 3813 + */ 3814 + function getValuesForElement(elt, attr, evalAsDefault, values) { 3815 + if (values == null) { 3816 + values = {} 3817 + } 3818 + if (elt == null) { 3819 + return values 3820 + } 3821 + const attributeValue = getAttributeValue(elt, attr) 3822 + if (attributeValue) { 3823 + let str = attributeValue.trim() 3824 + let evaluateValue = evalAsDefault 3825 + if (str === 'unset') { 3826 + return null 3827 + } 3828 + if (str.indexOf('javascript:') === 0) { 3829 + str = str.slice(11) 3830 + evaluateValue = true 3831 + } else if (str.indexOf('js:') === 0) { 3832 + str = str.slice(3) 3833 + evaluateValue = true 3834 + } 3835 + if (str.indexOf('{') !== 0) { 3836 + str = '{' + str + '}' 3837 + } 3838 + let varsValues 3839 + if (evaluateValue) { 3840 + varsValues = maybeEval(elt, function() { return Function('return (' + str + ')')() }, {}) 3841 + } else { 3842 + varsValues = parseJSON(str) 3843 + } 3844 + for (const key in varsValues) { 3845 + if (varsValues.hasOwnProperty(key)) { 3846 + if (values[key] == null) { 3847 + values[key] = varsValues[key] 3848 + } 3849 + } 3850 + } 3851 + } 3852 + return getValuesForElement(asElement(parentElt(elt)), attr, evalAsDefault, values) 3853 + } 3854 + 3855 + /** 3856 + * @param {EventTarget|string} elt 3857 + * @param {() => any} toEval 3858 + * @param {any=} defaultVal 3859 + * @returns {any} 3860 + */ 3861 + function maybeEval(elt, toEval, defaultVal) { 3862 + if (htmx.config.allowEval) { 3863 + return toEval() 3864 + } else { 3865 + triggerErrorEvent(elt, 'htmx:evalDisallowedError') 3866 + return defaultVal 3867 + } 3868 + } 3869 + 3870 + /** 3871 + * @param {Element} elt 3872 + * @param {*?} expressionVars 3873 + * @returns 3874 + */ 3875 + function getHXVarsForElement(elt, expressionVars) { 3876 + return getValuesForElement(elt, 'hx-vars', true, expressionVars) 3877 + } 3878 + 3879 + /** 3880 + * @param {Element} elt 3881 + * @param {*?} expressionVars 3882 + * @returns 3883 + */ 3884 + function getHXValsForElement(elt, expressionVars) { 3885 + return getValuesForElement(elt, 'hx-vals', false, expressionVars) 3886 + } 3887 + 3888 + /** 3889 + * @param {Element} elt 3890 + * @returns {FormData} 3891 + */ 3892 + function getExpressionVars(elt) { 3893 + return mergeObjects(getHXVarsForElement(elt), getHXValsForElement(elt)) 3894 + } 3895 + 3896 + /** 3897 + * @param {XMLHttpRequest} xhr 3898 + * @param {string} header 3899 + * @param {string|null} headerValue 3900 + */ 3901 + function safelySetHeaderValue(xhr, header, headerValue) { 3902 + if (headerValue !== null) { 3903 + try { 3904 + xhr.setRequestHeader(header, headerValue) 3905 + } catch (e) { 3906 + // On an exception, try to set the header URI encoded instead 3907 + xhr.setRequestHeader(header, encodeURIComponent(headerValue)) 3908 + xhr.setRequestHeader(header + '-URI-AutoEncoded', 'true') 3909 + } 3910 + } 3911 + } 3912 + 3913 + /** 3914 + * @param {XMLHttpRequest} xhr 3915 + * @return {string} 3916 + */ 3917 + function getPathFromResponse(xhr) { 3918 + // NB: IE11 does not support this stuff 3919 + if (xhr.responseURL && typeof (URL) !== 'undefined') { 3920 + try { 3921 + const url = new URL(xhr.responseURL) 3922 + return url.pathname + url.search 3923 + } catch (e) { 3924 + triggerErrorEvent(getDocument().body, 'htmx:badResponseUrl', { url: xhr.responseURL }) 3925 + } 3926 + } 3927 + } 3928 + 3929 + /** 3930 + * @param {XMLHttpRequest} xhr 3931 + * @param {RegExp} regexp 3932 + * @return {boolean} 3933 + */ 3934 + function hasHeader(xhr, regexp) { 3935 + return regexp.test(xhr.getAllResponseHeaders()) 3936 + } 3937 + 3938 + /** 3939 + * Issues an htmx-style AJAX request 3940 + * 3941 + * @see https://htmx.org/api/#ajax 3942 + * 3943 + * @param {HttpVerb} verb 3944 + * @param {string} path the URL path to make the AJAX 3945 + * @param {Element|string|HtmxAjaxHelperContext} context the element to target (defaults to the **body**) | a selector for the target | a context object that contains any of the following 3946 + * @return {Promise<void>} Promise that resolves immediately if no request is sent, or when the request is complete 3947 + */ 3948 + function ajaxHelper(verb, path, context) { 3949 + verb = (/** @type HttpVerb */(verb.toLowerCase())) 3950 + if (context) { 3951 + if (context instanceof Element || typeof context === 'string') { 3952 + return issueAjaxRequest(verb, path, null, null, { 3953 + targetOverride: resolveTarget(context) || DUMMY_ELT, 3954 + returnPromise: true 3955 + }) 3956 + } else { 3957 + let resolvedTarget = resolveTarget(context.target) 3958 + // If target is supplied but can't resolve OR source is supplied but both target and source can't be resolved 3959 + // then use DUMMY_ELT to abort the request with htmx:targetError to avoid it replacing body by mistake 3960 + if ((context.target && !resolvedTarget) || (context.source && !resolvedTarget && !resolveTarget(context.source))) { 3961 + resolvedTarget = DUMMY_ELT 3962 + } 3963 + return issueAjaxRequest(verb, path, resolveTarget(context.source), context.event, 3964 + { 3965 + handler: context.handler, 3966 + headers: context.headers, 3967 + values: context.values, 3968 + targetOverride: resolvedTarget, 3969 + swapOverride: context.swap, 3970 + select: context.select, 3971 + returnPromise: true 3972 + }) 3973 + } 3974 + } else { 3975 + return issueAjaxRequest(verb, path, null, null, { 3976 + returnPromise: true 3977 + }) 3978 + } 3979 + } 3980 + 3981 + /** 3982 + * @param {Element} elt 3983 + * @return {Element[]} 3984 + */ 3985 + function hierarchyForElt(elt) { 3986 + const arr = [] 3987 + while (elt) { 3988 + arr.push(elt) 3989 + elt = elt.parentElement 3990 + } 3991 + return arr 3992 + } 3993 + 3994 + /** 3995 + * @param {Element} elt 3996 + * @param {string} path 3997 + * @param {HtmxRequestConfig} requestConfig 3998 + * @return {boolean} 3999 + */ 4000 + function verifyPath(elt, path, requestConfig) { 4001 + let sameHost 4002 + let url 4003 + if (typeof URL === 'function') { 4004 + url = new URL(path, document.location.href) 4005 + const origin = document.location.origin 4006 + sameHost = origin === url.origin 4007 + } else { 4008 + // IE11 doesn't support URL 4009 + url = path 4010 + sameHost = startsWith(path, document.location.origin) 4011 + } 4012 + 4013 + if (htmx.config.selfRequestsOnly) { 4014 + if (!sameHost) { 4015 + return false 4016 + } 4017 + } 4018 + return triggerEvent(elt, 'htmx:validateUrl', mergeObjects({ url, sameHost }, requestConfig)) 4019 + } 4020 + 4021 + /** 4022 + * @param {Object|FormData} obj 4023 + * @return {FormData} 4024 + */ 4025 + function formDataFromObject(obj) { 4026 + if (obj instanceof FormData) return obj 4027 + const formData = new FormData() 4028 + for (const key in obj) { 4029 + if (obj.hasOwnProperty(key)) { 4030 + if (obj[key] && typeof obj[key].forEach === 'function') { 4031 + obj[key].forEach(function(v) { formData.append(key, v) }) 4032 + } else if (typeof obj[key] === 'object' && !(obj[key] instanceof Blob)) { 4033 + formData.append(key, JSON.stringify(obj[key])) 4034 + } else { 4035 + formData.append(key, obj[key]) 4036 + } 4037 + } 4038 + } 4039 + return formData 4040 + } 4041 + 4042 + /** 4043 + * @param {FormData} formData 4044 + * @param {string} name 4045 + * @param {Array} array 4046 + * @returns {Array} 4047 + */ 4048 + function formDataArrayProxy(formData, name, array) { 4049 + // mutating the array should mutate the underlying form data 4050 + return new Proxy(array, { 4051 + get: function(target, key) { 4052 + if (typeof key === 'number') return target[key] 4053 + if (key === 'length') return target.length 4054 + if (key === 'push') { 4055 + return function(value) { 4056 + target.push(value) 4057 + formData.append(name, value) 4058 + } 4059 + } 4060 + if (typeof target[key] === 'function') { 4061 + return function() { 4062 + target[key].apply(target, arguments) 4063 + formData.delete(name) 4064 + target.forEach(function(v) { formData.append(name, v) }) 4065 + } 4066 + } 4067 + 4068 + if (target[key] && target[key].length === 1) { 4069 + return target[key][0] 4070 + } else { 4071 + return target[key] 4072 + } 4073 + }, 4074 + set: function(target, index, value) { 4075 + target[index] = value 4076 + formData.delete(name) 4077 + target.forEach(function(v) { formData.append(name, v) }) 4078 + return true 4079 + } 4080 + }) 4081 + } 4082 + 4083 + /** 4084 + * @param {FormData} formData 4085 + * @returns {Object} 4086 + */ 4087 + function formDataProxy(formData) { 4088 + return new Proxy(formData, { 4089 + get: function(target, name) { 4090 + if (typeof name === 'symbol') { 4091 + // Forward symbol calls to the FormData itself directly 4092 + const result = Reflect.get(target, name) 4093 + // Wrap in function with apply to correctly bind the FormData context, as a direct call would result in an illegal invocation error 4094 + if (typeof result === 'function') { 4095 + return function() { 4096 + return result.apply(formData, arguments) 4097 + } 4098 + } else { 4099 + return result 4100 + } 4101 + } 4102 + if (name === 'toJSON') { 4103 + // Support JSON.stringify call on proxy 4104 + return () => Object.fromEntries(formData) 4105 + } 4106 + if (name in target) { 4107 + // Wrap in function with apply to correctly bind the FormData context, as a direct call would result in an illegal invocation error 4108 + if (typeof target[name] === 'function') { 4109 + return function() { 4110 + return formData[name].apply(formData, arguments) 4111 + } 4112 + } else { 4113 + return target[name] 4114 + } 4115 + } 4116 + const array = formData.getAll(name) 4117 + // Those 2 undefined & single value returns are for retro-compatibility as we weren't using FormData before 4118 + if (array.length === 0) { 4119 + return undefined 4120 + } else if (array.length === 1) { 4121 + return array[0] 4122 + } else { 4123 + return formDataArrayProxy(target, name, array) 4124 + } 4125 + }, 4126 + set: function(target, name, value) { 4127 + if (typeof name !== 'string') { 4128 + return false 4129 + } 4130 + target.delete(name) 4131 + if (value && typeof value.forEach === 'function') { 4132 + value.forEach(function(v) { target.append(name, v) }) 4133 + } else if (typeof value === 'object' && !(value instanceof Blob)) { 4134 + target.append(name, JSON.stringify(value)) 4135 + } else { 4136 + target.append(name, value) 4137 + } 4138 + return true 4139 + }, 4140 + deleteProperty: function(target, name) { 4141 + if (typeof name === 'string') { 4142 + target.delete(name) 4143 + } 4144 + return true 4145 + }, 4146 + // Support Object.assign call from proxy 4147 + ownKeys: function(target) { 4148 + return Reflect.ownKeys(Object.fromEntries(target)) 4149 + }, 4150 + getOwnPropertyDescriptor: function(target, prop) { 4151 + return Reflect.getOwnPropertyDescriptor(Object.fromEntries(target), prop) 4152 + } 4153 + }) 4154 + } 4155 + 4156 + /** 4157 + * @param {HttpVerb} verb 4158 + * @param {string} path 4159 + * @param {Element} elt 4160 + * @param {Event} event 4161 + * @param {HtmxAjaxEtc} [etc] 4162 + * @param {boolean} [confirmed] 4163 + * @return {Promise<void>} 4164 + */ 4165 + function issueAjaxRequest(verb, path, elt, event, etc, confirmed) { 4166 + let resolve = null 4167 + let reject = null 4168 + etc = etc != null ? etc : {} 4169 + if (etc.returnPromise && typeof Promise !== 'undefined') { 4170 + var promise = new Promise(function(_resolve, _reject) { 4171 + resolve = _resolve 4172 + reject = _reject 4173 + }) 4174 + } 4175 + if (elt == null) { 4176 + elt = getDocument().body 4177 + } 4178 + const responseHandler = etc.handler || handleAjaxResponse 4179 + const select = etc.select || null 4180 + 4181 + if (!bodyContains(elt)) { 4182 + // do not issue requests for elements removed from the DOM 4183 + maybeCall(resolve) 4184 + return promise 4185 + } 4186 + const target = etc.targetOverride || asElement(getTarget(elt)) 4187 + if (target == null || target == DUMMY_ELT) { 4188 + triggerErrorEvent(elt, 'htmx:targetError', { target: getAttributeValue(elt, 'hx-target') }) 4189 + maybeCall(reject) 4190 + return promise 4191 + } 4192 + 4193 + let eltData = getInternalData(elt) 4194 + const submitter = eltData.lastButtonClicked 4195 + 4196 + if (submitter) { 4197 + const buttonPath = getRawAttribute(submitter, 'formaction') 4198 + if (buttonPath != null) { 4199 + path = buttonPath 4200 + } 4201 + 4202 + const buttonVerb = getRawAttribute(submitter, 'formmethod') 4203 + if (buttonVerb != null) { 4204 + // ignore buttons with formmethod="dialog" 4205 + if (buttonVerb.toLowerCase() !== 'dialog') { 4206 + verb = (/** @type HttpVerb */(buttonVerb)) 4207 + } 4208 + } 4209 + } 4210 + 4211 + const confirmQuestion = getClosestAttributeValue(elt, 'hx-confirm') 4212 + // allow event-based confirmation w/ a callback 4213 + if (confirmed === undefined) { 4214 + const issueRequest = function(skipConfirmation) { 4215 + return issueAjaxRequest(verb, path, elt, event, etc, !!skipConfirmation) 4216 + } 4217 + const confirmDetails = { target, elt, path, verb, triggeringEvent: event, etc, issueRequest, question: confirmQuestion } 4218 + if (triggerEvent(elt, 'htmx:confirm', confirmDetails) === false) { 4219 + maybeCall(resolve) 4220 + return promise 4221 + } 4222 + } 4223 + 4224 + let syncElt = elt 4225 + let syncStrategy = getClosestAttributeValue(elt, 'hx-sync') 4226 + let queueStrategy = null 4227 + let abortable = false 4228 + if (syncStrategy) { 4229 + const syncStrings = syncStrategy.split(':') 4230 + const selector = syncStrings[0].trim() 4231 + if (selector === 'this') { 4232 + syncElt = findThisElement(elt, 'hx-sync') 4233 + } else { 4234 + syncElt = asElement(querySelectorExt(elt, selector)) 4235 + } 4236 + // default to the drop strategy 4237 + syncStrategy = (syncStrings[1] || 'drop').trim() 4238 + eltData = getInternalData(syncElt) 4239 + if (syncStrategy === 'drop' && eltData.xhr && eltData.abortable !== true) { 4240 + maybeCall(resolve) 4241 + return promise 4242 + } else if (syncStrategy === 'abort') { 4243 + if (eltData.xhr) { 4244 + maybeCall(resolve) 4245 + return promise 4246 + } else { 4247 + abortable = true 4248 + } 4249 + } else if (syncStrategy === 'replace') { 4250 + triggerEvent(syncElt, 'htmx:abort') // abort the current request and continue 4251 + } else if (syncStrategy.indexOf('queue') === 0) { 4252 + const queueStrArray = syncStrategy.split(' ') 4253 + queueStrategy = (queueStrArray[1] || 'last').trim() 4254 + } 4255 + } 4256 + 4257 + if (eltData.xhr) { 4258 + if (eltData.abortable) { 4259 + triggerEvent(syncElt, 'htmx:abort') // abort the current request and continue 4260 + } else { 4261 + if (queueStrategy == null) { 4262 + if (event) { 4263 + const eventData = getInternalData(event) 4264 + if (eventData && eventData.triggerSpec && eventData.triggerSpec.queue) { 4265 + queueStrategy = eventData.triggerSpec.queue 4266 + } 4267 + } 4268 + if (queueStrategy == null) { 4269 + queueStrategy = 'last' 4270 + } 4271 + } 4272 + if (eltData.queuedRequests == null) { 4273 + eltData.queuedRequests = [] 4274 + } 4275 + if (queueStrategy === 'first' && eltData.queuedRequests.length === 0) { 4276 + eltData.queuedRequests.push(function() { 4277 + issueAjaxRequest(verb, path, elt, event, etc) 4278 + }) 4279 + } else if (queueStrategy === 'all') { 4280 + eltData.queuedRequests.push(function() { 4281 + issueAjaxRequest(verb, path, elt, event, etc) 4282 + }) 4283 + } else if (queueStrategy === 'last') { 4284 + eltData.queuedRequests = [] // dump existing queue 4285 + eltData.queuedRequests.push(function() { 4286 + issueAjaxRequest(verb, path, elt, event, etc) 4287 + }) 4288 + } 4289 + maybeCall(resolve) 4290 + return promise 4291 + } 4292 + } 4293 + 4294 + const xhr = new XMLHttpRequest() 4295 + eltData.xhr = xhr 4296 + eltData.abortable = abortable 4297 + const endRequestLock = function() { 4298 + eltData.xhr = null 4299 + eltData.abortable = false 4300 + if (eltData.queuedRequests != null && 4301 + eltData.queuedRequests.length > 0) { 4302 + const queuedRequest = eltData.queuedRequests.shift() 4303 + queuedRequest() 4304 + } 4305 + } 4306 + const promptQuestion = getClosestAttributeValue(elt, 'hx-prompt') 4307 + if (promptQuestion) { 4308 + var promptResponse = prompt(promptQuestion) 4309 + // prompt returns null if cancelled and empty string if accepted with no entry 4310 + if (promptResponse === null || 4311 + !triggerEvent(elt, 'htmx:prompt', { prompt: promptResponse, target })) { 4312 + maybeCall(resolve) 4313 + endRequestLock() 4314 + return promise 4315 + } 4316 + } 4317 + 4318 + if (confirmQuestion && !confirmed) { 4319 + if (!confirm(confirmQuestion)) { 4320 + maybeCall(resolve) 4321 + endRequestLock() 4322 + return promise 4323 + } 4324 + } 4325 + 4326 + let headers = getHeaders(elt, target, promptResponse) 4327 + 4328 + if (verb !== 'get' && !usesFormData(elt)) { 4329 + headers['Content-Type'] = 'application/x-www-form-urlencoded' 4330 + } 4331 + 4332 + if (etc.headers) { 4333 + headers = mergeObjects(headers, etc.headers) 4334 + } 4335 + const results = getInputValues(elt, verb) 4336 + let errors = results.errors 4337 + const rawFormData = results.formData 4338 + if (etc.values) { 4339 + overrideFormData(rawFormData, formDataFromObject(etc.values)) 4340 + } 4341 + const expressionVars = formDataFromObject(getExpressionVars(elt)) 4342 + const allFormData = overrideFormData(rawFormData, expressionVars) 4343 + let filteredFormData = filterValues(allFormData, elt) 4344 + 4345 + if (htmx.config.getCacheBusterParam && verb === 'get') { 4346 + filteredFormData.set('org.htmx.cache-buster', getRawAttribute(target, 'id') || 'true') 4347 + } 4348 + 4349 + // behavior of anchors w/ empty href is to use the current URL 4350 + if (path == null || path === '') { 4351 + path = getDocument().location.href 4352 + } 4353 + 4354 + /** 4355 + * @type {Object} 4356 + * @property {boolean} [credentials] 4357 + * @property {number} [timeout] 4358 + * @property {boolean} [noHeaders] 4359 + */ 4360 + const requestAttrValues = getValuesForElement(elt, 'hx-request') 4361 + 4362 + const eltIsBoosted = getInternalData(elt).boosted 4363 + 4364 + let useUrlParams = htmx.config.methodsThatUseUrlParams.indexOf(verb) >= 0 4365 + 4366 + /** @type HtmxRequestConfig */ 4367 + const requestConfig = { 4368 + boosted: eltIsBoosted, 4369 + useUrlParams, 4370 + formData: filteredFormData, 4371 + parameters: formDataProxy(filteredFormData), 4372 + unfilteredFormData: allFormData, 4373 + unfilteredParameters: formDataProxy(allFormData), 4374 + headers, 4375 + target, 4376 + verb, 4377 + errors, 4378 + withCredentials: etc.credentials || requestAttrValues.credentials || htmx.config.withCredentials, 4379 + timeout: etc.timeout || requestAttrValues.timeout || htmx.config.timeout, 4380 + path, 4381 + triggeringEvent: event 4382 + } 4383 + 4384 + if (!triggerEvent(elt, 'htmx:configRequest', requestConfig)) { 4385 + maybeCall(resolve) 4386 + endRequestLock() 4387 + return promise 4388 + } 4389 + 4390 + // copy out in case the object was overwritten 4391 + path = requestConfig.path 4392 + verb = requestConfig.verb 4393 + headers = requestConfig.headers 4394 + filteredFormData = formDataFromObject(requestConfig.parameters) 4395 + errors = requestConfig.errors 4396 + useUrlParams = requestConfig.useUrlParams 4397 + 4398 + if (errors && errors.length > 0) { 4399 + triggerEvent(elt, 'htmx:validation:halted', requestConfig) 4400 + maybeCall(resolve) 4401 + endRequestLock() 4402 + return promise 4403 + } 4404 + 4405 + const splitPath = path.split('#') 4406 + const pathNoAnchor = splitPath[0] 4407 + const anchor = splitPath[1] 4408 + 4409 + let finalPath = path 4410 + if (useUrlParams) { 4411 + finalPath = pathNoAnchor 4412 + const hasValues = !filteredFormData.keys().next().done 4413 + if (hasValues) { 4414 + if (finalPath.indexOf('?') < 0) { 4415 + finalPath += '?' 4416 + } else { 4417 + finalPath += '&' 4418 + } 4419 + finalPath += urlEncode(filteredFormData) 4420 + if (anchor) { 4421 + finalPath += '#' + anchor 4422 + } 4423 + } 4424 + } 4425 + 4426 + if (!verifyPath(elt, finalPath, requestConfig)) { 4427 + triggerErrorEvent(elt, 'htmx:invalidPath', requestConfig) 4428 + maybeCall(reject) 4429 + return promise 4430 + } 4431 + 4432 + xhr.open(verb.toUpperCase(), finalPath, true) 4433 + xhr.overrideMimeType('text/html') 4434 + xhr.withCredentials = requestConfig.withCredentials 4435 + xhr.timeout = requestConfig.timeout 4436 + 4437 + // request headers 4438 + if (requestAttrValues.noHeaders) { 4439 + // ignore all headers 4440 + } else { 4441 + for (const header in headers) { 4442 + if (headers.hasOwnProperty(header)) { 4443 + const headerValue = headers[header] 4444 + safelySetHeaderValue(xhr, header, headerValue) 4445 + } 4446 + } 4447 + } 4448 + 4449 + /** @type {HtmxResponseInfo} */ 4450 + const responseInfo = { 4451 + xhr, 4452 + target, 4453 + requestConfig, 4454 + etc, 4455 + boosted: eltIsBoosted, 4456 + select, 4457 + pathInfo: { 4458 + requestPath: path, 4459 + finalRequestPath: finalPath, 4460 + responsePath: null, 4461 + anchor 4462 + } 4463 + } 4464 + 4465 + xhr.onload = function() { 4466 + try { 4467 + const hierarchy = hierarchyForElt(elt) 4468 + responseInfo.pathInfo.responsePath = getPathFromResponse(xhr) 4469 + responseHandler(elt, responseInfo) 4470 + if (responseInfo.keepIndicators !== true) { 4471 + removeRequestIndicators(indicators, disableElts) 4472 + } 4473 + triggerEvent(elt, 'htmx:afterRequest', responseInfo) 4474 + triggerEvent(elt, 'htmx:afterOnLoad', responseInfo) 4475 + // if the body no longer contains the element, trigger the event on the closest parent 4476 + // remaining in the DOM 4477 + if (!bodyContains(elt)) { 4478 + let secondaryTriggerElt = null 4479 + while (hierarchy.length > 0 && secondaryTriggerElt == null) { 4480 + const parentEltInHierarchy = hierarchy.shift() 4481 + if (bodyContains(parentEltInHierarchy)) { 4482 + secondaryTriggerElt = parentEltInHierarchy 4483 + } 4484 + } 4485 + if (secondaryTriggerElt) { 4486 + triggerEvent(secondaryTriggerElt, 'htmx:afterRequest', responseInfo) 4487 + triggerEvent(secondaryTriggerElt, 'htmx:afterOnLoad', responseInfo) 4488 + } 4489 + } 4490 + maybeCall(resolve) 4491 + endRequestLock() 4492 + } catch (e) { 4493 + triggerErrorEvent(elt, 'htmx:onLoadError', mergeObjects({ error: e }, responseInfo)) 4494 + throw e 4495 + } 4496 + } 4497 + xhr.onerror = function() { 4498 + removeRequestIndicators(indicators, disableElts) 4499 + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo) 4500 + triggerErrorEvent(elt, 'htmx:sendError', responseInfo) 4501 + maybeCall(reject) 4502 + endRequestLock() 4503 + } 4504 + xhr.onabort = function() { 4505 + removeRequestIndicators(indicators, disableElts) 4506 + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo) 4507 + triggerErrorEvent(elt, 'htmx:sendAbort', responseInfo) 4508 + maybeCall(reject) 4509 + endRequestLock() 4510 + } 4511 + xhr.ontimeout = function() { 4512 + removeRequestIndicators(indicators, disableElts) 4513 + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo) 4514 + triggerErrorEvent(elt, 'htmx:timeout', responseInfo) 4515 + maybeCall(reject) 4516 + endRequestLock() 4517 + } 4518 + if (!triggerEvent(elt, 'htmx:beforeRequest', responseInfo)) { 4519 + maybeCall(resolve) 4520 + endRequestLock() 4521 + return promise 4522 + } 4523 + var indicators = addRequestIndicatorClasses(elt) 4524 + var disableElts = disableElements(elt) 4525 + 4526 + forEach(['loadstart', 'loadend', 'progress', 'abort'], function(eventName) { 4527 + forEach([xhr, xhr.upload], function(target) { 4528 + target.addEventListener(eventName, function(event) { 4529 + triggerEvent(elt, 'htmx:xhr:' + eventName, { 4530 + lengthComputable: event.lengthComputable, 4531 + loaded: event.loaded, 4532 + total: event.total 4533 + }) 4534 + }) 4535 + }) 4536 + }) 4537 + triggerEvent(elt, 'htmx:beforeSend', responseInfo) 4538 + const params = useUrlParams ? null : encodeParamsForBody(xhr, elt, filteredFormData) 4539 + xhr.send(params) 4540 + return promise 4541 + } 4542 + 4543 + /** 4544 + * @typedef {Object} HtmxHistoryUpdate 4545 + * @property {string|null} [type] 4546 + * @property {string|null} [path] 4547 + */ 4548 + 4549 + /** 4550 + * @param {Element} elt 4551 + * @param {HtmxResponseInfo} responseInfo 4552 + * @return {HtmxHistoryUpdate} 4553 + */ 4554 + function determineHistoryUpdates(elt, responseInfo) { 4555 + const xhr = responseInfo.xhr 4556 + 4557 + //= ========================================== 4558 + // First consult response headers 4559 + //= ========================================== 4560 + let pathFromHeaders = null 4561 + let typeFromHeaders = null 4562 + if (hasHeader(xhr, /HX-Push:/i)) { 4563 + pathFromHeaders = xhr.getResponseHeader('HX-Push') 4564 + typeFromHeaders = 'push' 4565 + } else if (hasHeader(xhr, /HX-Push-Url:/i)) { 4566 + pathFromHeaders = xhr.getResponseHeader('HX-Push-Url') 4567 + typeFromHeaders = 'push' 4568 + } else if (hasHeader(xhr, /HX-Replace-Url:/i)) { 4569 + pathFromHeaders = xhr.getResponseHeader('HX-Replace-Url') 4570 + typeFromHeaders = 'replace' 4571 + } 4572 + 4573 + // if there was a response header, that has priority 4574 + if (pathFromHeaders) { 4575 + if (pathFromHeaders === 'false') { 4576 + return {} 4577 + } else { 4578 + return { 4579 + type: typeFromHeaders, 4580 + path: pathFromHeaders 4581 + } 4582 + } 4583 + } 4584 + 4585 + //= ========================================== 4586 + // Next resolve via DOM values 4587 + //= ========================================== 4588 + const requestPath = responseInfo.pathInfo.finalRequestPath 4589 + const responsePath = responseInfo.pathInfo.responsePath 4590 + 4591 + const pushUrl = getClosestAttributeValue(elt, 'hx-push-url') 4592 + const replaceUrl = getClosestAttributeValue(elt, 'hx-replace-url') 4593 + const elementIsBoosted = getInternalData(elt).boosted 4594 + 4595 + let saveType = null 4596 + let path = null 4597 + 4598 + if (pushUrl) { 4599 + saveType = 'push' 4600 + path = pushUrl 4601 + } else if (replaceUrl) { 4602 + saveType = 'replace' 4603 + path = replaceUrl 4604 + } else if (elementIsBoosted) { 4605 + saveType = 'push' 4606 + path = responsePath || requestPath // if there is no response path, go with the original request path 4607 + } 4608 + 4609 + if (path) { 4610 + // false indicates no push, return empty object 4611 + if (path === 'false') { 4612 + return {} 4613 + } 4614 + 4615 + // true indicates we want to follow wherever the server ended up sending us 4616 + if (path === 'true') { 4617 + path = responsePath || requestPath // if there is no response path, go with the original request path 4618 + } 4619 + 4620 + // restore any anchor associated with the request 4621 + if (responseInfo.pathInfo.anchor && path.indexOf('#') === -1) { 4622 + path = path + '#' + responseInfo.pathInfo.anchor 4623 + } 4624 + 4625 + return { 4626 + type: saveType, 4627 + path 4628 + } 4629 + } else { 4630 + return {} 4631 + } 4632 + } 4633 + 4634 + /** 4635 + * @param {HtmxResponseHandlingConfig} responseHandlingConfig 4636 + * @param {number} status 4637 + * @return {boolean} 4638 + */ 4639 + function codeMatches(responseHandlingConfig, status) { 4640 + var regExp = new RegExp(responseHandlingConfig.code) 4641 + return regExp.test(status.toString(10)) 4642 + } 4643 + 4644 + /** 4645 + * @param {XMLHttpRequest} xhr 4646 + * @return {HtmxResponseHandlingConfig} 4647 + */ 4648 + function resolveResponseHandling(xhr) { 4649 + for (var i = 0; i < htmx.config.responseHandling.length; i++) { 4650 + /** @type HtmxResponseHandlingConfig */ 4651 + var responseHandlingElement = htmx.config.responseHandling[i] 4652 + if (codeMatches(responseHandlingElement, xhr.status)) { 4653 + return responseHandlingElement 4654 + } 4655 + } 4656 + // no matches, return no swap 4657 + return { 4658 + swap: false 4659 + } 4660 + } 4661 + 4662 + /** 4663 + * @param {string} title 4664 + */ 4665 + function handleTitle(title) { 4666 + if (title) { 4667 + const titleElt = find('title') 4668 + if (titleElt) { 4669 + titleElt.innerHTML = title 4670 + } else { 4671 + window.document.title = title 4672 + } 4673 + } 4674 + } 4675 + 4676 + /** 4677 + * @param {Element} elt 4678 + * @param {HtmxResponseInfo} responseInfo 4679 + */ 4680 + function handleAjaxResponse(elt, responseInfo) { 4681 + const xhr = responseInfo.xhr 4682 + let target = responseInfo.target 4683 + const etc = responseInfo.etc 4684 + const responseInfoSelect = responseInfo.select 4685 + 4686 + if (!triggerEvent(elt, 'htmx:beforeOnLoad', responseInfo)) return 4687 + 4688 + if (hasHeader(xhr, /HX-Trigger:/i)) { 4689 + handleTriggerHeader(xhr, 'HX-Trigger', elt) 4690 + } 4691 + 4692 + if (hasHeader(xhr, /HX-Location:/i)) { 4693 + saveCurrentPageToHistory() 4694 + let redirectPath = xhr.getResponseHeader('HX-Location') 4695 + /** @type {HtmxAjaxHelperContext&{path:string}} */ 4696 + var redirectSwapSpec 4697 + if (redirectPath.indexOf('{') === 0) { 4698 + redirectSwapSpec = parseJSON(redirectPath) 4699 + // what's the best way to throw an error if the user didn't include this 4700 + redirectPath = redirectSwapSpec.path 4701 + delete redirectSwapSpec.path 4702 + } 4703 + ajaxHelper('get', redirectPath, redirectSwapSpec).then(function() { 4704 + pushUrlIntoHistory(redirectPath) 4705 + }) 4706 + return 4707 + } 4708 + 4709 + const shouldRefresh = hasHeader(xhr, /HX-Refresh:/i) && xhr.getResponseHeader('HX-Refresh') === 'true' 4710 + 4711 + if (hasHeader(xhr, /HX-Redirect:/i)) { 4712 + responseInfo.keepIndicators = true 4713 + location.href = xhr.getResponseHeader('HX-Redirect') 4714 + shouldRefresh && location.reload() 4715 + return 4716 + } 4717 + 4718 + if (shouldRefresh) { 4719 + responseInfo.keepIndicators = true 4720 + location.reload() 4721 + return 4722 + } 4723 + 4724 + if (hasHeader(xhr, /HX-Retarget:/i)) { 4725 + if (xhr.getResponseHeader('HX-Retarget') === 'this') { 4726 + responseInfo.target = elt 4727 + } else { 4728 + responseInfo.target = asElement(querySelectorExt(elt, xhr.getResponseHeader('HX-Retarget'))) 4729 + } 4730 + } 4731 + 4732 + const historyUpdate = determineHistoryUpdates(elt, responseInfo) 4733 + 4734 + const responseHandling = resolveResponseHandling(xhr) 4735 + const shouldSwap = responseHandling.swap 4736 + let isError = !!responseHandling.error 4737 + let ignoreTitle = htmx.config.ignoreTitle || responseHandling.ignoreTitle 4738 + let selectOverride = responseHandling.select 4739 + if (responseHandling.target) { 4740 + responseInfo.target = asElement(querySelectorExt(elt, responseHandling.target)) 4741 + } 4742 + var swapOverride = etc.swapOverride 4743 + if (swapOverride == null && responseHandling.swapOverride) { 4744 + swapOverride = responseHandling.swapOverride 4745 + } 4746 + 4747 + // response headers override response handling config 4748 + if (hasHeader(xhr, /HX-Retarget:/i)) { 4749 + if (xhr.getResponseHeader('HX-Retarget') === 'this') { 4750 + responseInfo.target = elt 4751 + } else { 4752 + responseInfo.target = asElement(querySelectorExt(elt, xhr.getResponseHeader('HX-Retarget'))) 4753 + } 4754 + } 4755 + if (hasHeader(xhr, /HX-Reswap:/i)) { 4756 + swapOverride = xhr.getResponseHeader('HX-Reswap') 4757 + } 4758 + 4759 + var serverResponse = xhr.response 4760 + /** @type HtmxBeforeSwapDetails */ 4761 + var beforeSwapDetails = mergeObjects({ 4762 + shouldSwap, 4763 + serverResponse, 4764 + isError, 4765 + ignoreTitle, 4766 + selectOverride, 4767 + swapOverride 4768 + }, responseInfo) 4769 + 4770 + if (responseHandling.event && !triggerEvent(target, responseHandling.event, beforeSwapDetails)) return 4771 + 4772 + if (!triggerEvent(target, 'htmx:beforeSwap', beforeSwapDetails)) return 4773 + 4774 + target = beforeSwapDetails.target // allow re-targeting 4775 + serverResponse = beforeSwapDetails.serverResponse // allow updating content 4776 + isError = beforeSwapDetails.isError // allow updating error 4777 + ignoreTitle = beforeSwapDetails.ignoreTitle // allow updating ignoring title 4778 + selectOverride = beforeSwapDetails.selectOverride // allow updating select override 4779 + swapOverride = beforeSwapDetails.swapOverride // allow updating swap override 4780 + 4781 + responseInfo.target = target // Make updated target available to response events 4782 + responseInfo.failed = isError // Make failed property available to response events 4783 + responseInfo.successful = !isError // Make successful property available to response events 4784 + 4785 + if (beforeSwapDetails.shouldSwap) { 4786 + if (xhr.status === 286) { 4787 + cancelPolling(elt) 4788 + } 4789 + 4790 + withExtensions(elt, function(extension) { 4791 + serverResponse = extension.transformResponse(serverResponse, xhr, elt) 4792 + }) 4793 + 4794 + // Save current page if there will be a history update 4795 + if (historyUpdate.type) { 4796 + saveCurrentPageToHistory() 4797 + } 4798 + 4799 + var swapSpec = getSwapSpecification(elt, swapOverride) 4800 + 4801 + if (!swapSpec.hasOwnProperty('ignoreTitle')) { 4802 + swapSpec.ignoreTitle = ignoreTitle 4803 + } 4804 + 4805 + target.classList.add(htmx.config.swappingClass) 4806 + 4807 + // optional transition API promise callbacks 4808 + let settleResolve = null 4809 + let settleReject = null 4810 + 4811 + if (responseInfoSelect) { 4812 + selectOverride = responseInfoSelect 4813 + } 4814 + 4815 + if (hasHeader(xhr, /HX-Reselect:/i)) { 4816 + selectOverride = xhr.getResponseHeader('HX-Reselect') 4817 + } 4818 + 4819 + const selectOOB = getClosestAttributeValue(elt, 'hx-select-oob') 4820 + const select = getClosestAttributeValue(elt, 'hx-select') 4821 + 4822 + let doSwap = function() { 4823 + try { 4824 + // if we need to save history, do so, before swapping so that relative resources have the correct base URL 4825 + if (historyUpdate.type) { 4826 + triggerEvent(getDocument().body, 'htmx:beforeHistoryUpdate', mergeObjects({ history: historyUpdate }, responseInfo)) 4827 + if (historyUpdate.type === 'push') { 4828 + pushUrlIntoHistory(historyUpdate.path) 4829 + triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', { path: historyUpdate.path }) 4830 + } else { 4831 + replaceUrlInHistory(historyUpdate.path) 4832 + triggerEvent(getDocument().body, 'htmx:replacedInHistory', { path: historyUpdate.path }) 4833 + } 4834 + } 4835 + 4836 + swap(target, serverResponse, swapSpec, { 4837 + select: selectOverride || select, 4838 + selectOOB, 4839 + eventInfo: responseInfo, 4840 + anchor: responseInfo.pathInfo.anchor, 4841 + contextElement: elt, 4842 + afterSwapCallback: function() { 4843 + if (hasHeader(xhr, /HX-Trigger-After-Swap:/i)) { 4844 + let finalElt = elt 4845 + if (!bodyContains(elt)) { 4846 + finalElt = getDocument().body 4847 + } 4848 + handleTriggerHeader(xhr, 'HX-Trigger-After-Swap', finalElt) 4849 + } 4850 + }, 4851 + afterSettleCallback: function() { 4852 + if (hasHeader(xhr, /HX-Trigger-After-Settle:/i)) { 4853 + let finalElt = elt 4854 + if (!bodyContains(elt)) { 4855 + finalElt = getDocument().body 4856 + } 4857 + handleTriggerHeader(xhr, 'HX-Trigger-After-Settle', finalElt) 4858 + } 4859 + maybeCall(settleResolve) 4860 + } 4861 + }) 4862 + } catch (e) { 4863 + triggerErrorEvent(elt, 'htmx:swapError', responseInfo) 4864 + maybeCall(settleReject) 4865 + throw e 4866 + } 4867 + } 4868 + 4869 + let shouldTransition = htmx.config.globalViewTransitions 4870 + if (swapSpec.hasOwnProperty('transition')) { 4871 + shouldTransition = swapSpec.transition 4872 + } 4873 + 4874 + if (shouldTransition && 4875 + triggerEvent(elt, 'htmx:beforeTransition', responseInfo) && 4876 + typeof Promise !== 'undefined' && 4877 + // @ts-ignore experimental feature atm 4878 + document.startViewTransition) { 4879 + const settlePromise = new Promise(function(_resolve, _reject) { 4880 + settleResolve = _resolve 4881 + settleReject = _reject 4882 + }) 4883 + // wrap the original doSwap() in a call to startViewTransition() 4884 + const innerDoSwap = doSwap 4885 + doSwap = function() { 4886 + // @ts-ignore experimental feature atm 4887 + document.startViewTransition(function() { 4888 + innerDoSwap() 4889 + return settlePromise 4890 + }) 4891 + } 4892 + } 4893 + 4894 + if (swapSpec.swapDelay > 0) { 4895 + getWindow().setTimeout(doSwap, swapSpec.swapDelay) 4896 + } else { 4897 + doSwap() 4898 + } 4899 + } 4900 + if (isError) { 4901 + triggerErrorEvent(elt, 'htmx:responseError', mergeObjects({ error: 'Response Status Error Code ' + xhr.status + ' from ' + responseInfo.pathInfo.requestPath }, responseInfo)) 4902 + } 4903 + } 4904 + 4905 + //= =================================================================== 4906 + // Extensions API 4907 + //= =================================================================== 4908 + 4909 + /** @type {Object<string, HtmxExtension>} */ 4910 + const extensions = {} 4911 + 4912 + /** 4913 + * extensionBase defines the default functions for all extensions. 4914 + * @returns {HtmxExtension} 4915 + */ 4916 + function extensionBase() { 4917 + return { 4918 + init: function(api) { return null }, 4919 + getSelectors: function() { return null }, 4920 + onEvent: function(name, evt) { return true }, 4921 + transformResponse: function(text, xhr, elt) { return text }, 4922 + isInlineSwap: function(swapStyle) { return false }, 4923 + handleSwap: function(swapStyle, target, fragment, settleInfo) { return false }, 4924 + encodeParameters: function(xhr, parameters, elt) { return null } 4925 + } 4926 + } 4927 + 4928 + /** 4929 + * defineExtension initializes the extension and adds it to the htmx registry 4930 + * 4931 + * @see https://htmx.org/api/#defineExtension 4932 + * 4933 + * @param {string} name the extension name 4934 + * @param {Partial<HtmxExtension>} extension the extension definition 4935 + */ 4936 + function defineExtension(name, extension) { 4937 + if (extension.init) { 4938 + extension.init(internalAPI) 4939 + } 4940 + extensions[name] = mergeObjects(extensionBase(), extension) 4941 + } 4942 + 4943 + /** 4944 + * removeExtension removes an extension from the htmx registry 4945 + * 4946 + * @see https://htmx.org/api/#removeExtension 4947 + * 4948 + * @param {string} name 4949 + */ 4950 + function removeExtension(name) { 4951 + delete extensions[name] 4952 + } 4953 + 4954 + /** 4955 + * getExtensions searches up the DOM tree to return all extensions that can be applied to a given element 4956 + * 4957 + * @param {Element} elt 4958 + * @param {HtmxExtension[]=} extensionsToReturn 4959 + * @param {string[]=} extensionsToIgnore 4960 + * @returns {HtmxExtension[]} 4961 + */ 4962 + function getExtensions(elt, extensionsToReturn, extensionsToIgnore) { 4963 + if (extensionsToReturn == undefined) { 4964 + extensionsToReturn = [] 4965 + } 4966 + if (elt == undefined) { 4967 + return extensionsToReturn 4968 + } 4969 + if (extensionsToIgnore == undefined) { 4970 + extensionsToIgnore = [] 4971 + } 4972 + const extensionsForElement = getAttributeValue(elt, 'hx-ext') 4973 + if (extensionsForElement) { 4974 + forEach(extensionsForElement.split(','), function(extensionName) { 4975 + extensionName = extensionName.replace(/ /g, '') 4976 + if (extensionName.slice(0, 7) == 'ignore:') { 4977 + extensionsToIgnore.push(extensionName.slice(7)) 4978 + return 4979 + } 4980 + if (extensionsToIgnore.indexOf(extensionName) < 0) { 4981 + const extension = extensions[extensionName] 4982 + if (extension && extensionsToReturn.indexOf(extension) < 0) { 4983 + extensionsToReturn.push(extension) 4984 + } 4985 + } 4986 + }) 4987 + } 4988 + return getExtensions(asElement(parentElt(elt)), extensionsToReturn, extensionsToIgnore) 4989 + } 4990 + 4991 + //= =================================================================== 4992 + // Initialization 4993 + //= =================================================================== 4994 + var isReady = false 4995 + getDocument().addEventListener('DOMContentLoaded', function() { 4996 + isReady = true 4997 + }) 4998 + 4999 + /** 5000 + * Execute a function now if DOMContentLoaded has fired, otherwise listen for it. 5001 + * 5002 + * This function uses isReady because there is no reliable way to ask the browser whether 5003 + * the DOMContentLoaded event has already been fired; there's a gap between DOMContentLoaded 5004 + * firing and readystate=complete. 5005 + */ 5006 + function ready(fn) { 5007 + // Checking readyState here is a failsafe in case the htmx script tag entered the DOM by 5008 + // some means other than the initial page load. 5009 + if (isReady || getDocument().readyState === 'complete') { 5010 + fn() 5011 + } else { 5012 + getDocument().addEventListener('DOMContentLoaded', fn) 5013 + } 5014 + } 5015 + 5016 + function insertIndicatorStyles() { 5017 + if (htmx.config.includeIndicatorStyles !== false) { 5018 + const nonceAttribute = htmx.config.inlineStyleNonce ? ` nonce="${htmx.config.inlineStyleNonce}"` : '' 5019 + getDocument().head.insertAdjacentHTML('beforeend', 5020 + '<style' + nonceAttribute + '>\ 5021 + .' + htmx.config.indicatorClass + '{opacity:0}\ 5022 + .' + htmx.config.requestClass + ' .' + htmx.config.indicatorClass + '{opacity:1; transition: opacity 200ms ease-in;}\ 5023 + .' + htmx.config.requestClass + '.' + htmx.config.indicatorClass + '{opacity:1; transition: opacity 200ms ease-in;}\ 5024 + </style>') 5025 + } 5026 + } 5027 + 5028 + function getMetaConfig() { 5029 + /** @type HTMLMetaElement */ 5030 + const element = getDocument().querySelector('meta[name="htmx-config"]') 5031 + if (element) { 5032 + return parseJSON(element.content) 5033 + } else { 5034 + return null 5035 + } 5036 + } 5037 + 5038 + function mergeMetaConfig() { 5039 + const metaConfig = getMetaConfig() 5040 + if (metaConfig) { 5041 + htmx.config = mergeObjects(htmx.config, metaConfig) 5042 + } 5043 + } 5044 + 5045 + // initialize the document 5046 + ready(function() { 5047 + mergeMetaConfig() 5048 + insertIndicatorStyles() 5049 + let body = getDocument().body 5050 + processNode(body) 5051 + const restoredElts = getDocument().querySelectorAll( 5052 + "[hx-trigger='restored'],[data-hx-trigger='restored']" 5053 + ) 5054 + body.addEventListener('htmx:abort', function(evt) { 5055 + const target = evt.target 5056 + const internalData = getInternalData(target) 5057 + if (internalData && internalData.xhr) { 5058 + internalData.xhr.abort() 5059 + } 5060 + }) 5061 + /** @type {(ev: PopStateEvent) => any} */ 5062 + const originalPopstate = window.onpopstate ? window.onpopstate.bind(window) : null 5063 + /** @type {(ev: PopStateEvent) => any} */ 5064 + window.onpopstate = function(event) { 5065 + if (event.state && event.state.htmx) { 5066 + restoreHistory() 5067 + forEach(restoredElts, function(elt) { 5068 + triggerEvent(elt, 'htmx:restored', { 5069 + document: getDocument(), 5070 + triggerEvent 5071 + }) 5072 + }) 5073 + } else { 5074 + if (originalPopstate) { 5075 + originalPopstate(event) 5076 + } 5077 + } 5078 + } 5079 + getWindow().setTimeout(function() { 5080 + triggerEvent(body, 'htmx:load', {}) // give ready handlers a chance to load up before firing this event 5081 + body = null // kill reference for gc 5082 + }, 0) 5083 + }) 5084 + 5085 + return htmx 5086 + })() 5087 + 5088 + /** @typedef {'get'|'head'|'post'|'put'|'delete'|'connect'|'options'|'trace'|'patch'} HttpVerb */ 5089 + 5090 + /** 5091 + * @typedef {Object} SwapOptions 5092 + * @property {string} [select] 5093 + * @property {string} [selectOOB] 5094 + * @property {*} [eventInfo] 5095 + * @property {string} [anchor] 5096 + * @property {Element} [contextElement] 5097 + * @property {swapCallback} [afterSwapCallback] 5098 + * @property {swapCallback} [afterSettleCallback] 5099 + */ 5100 + 5101 + /** 5102 + * @callback swapCallback 5103 + */ 5104 + 5105 + /** 5106 + * @typedef {'innerHTML' | 'outerHTML' | 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend' | 'delete' | 'none' | string} HtmxSwapStyle 5107 + */ 5108 + 5109 + /** 5110 + * @typedef HtmxSwapSpecification 5111 + * @property {HtmxSwapStyle} swapStyle 5112 + * @property {number} swapDelay 5113 + * @property {number} settleDelay 5114 + * @property {boolean} [transition] 5115 + * @property {boolean} [ignoreTitle] 5116 + * @property {string} [head] 5117 + * @property {'top' | 'bottom'} [scroll] 5118 + * @property {string} [scrollTarget] 5119 + * @property {string} [show] 5120 + * @property {string} [showTarget] 5121 + * @property {boolean} [focusScroll] 5122 + */ 5123 + 5124 + /** 5125 + * @typedef {((this:Node, evt:Event) => boolean) & {source: string}} ConditionalFunction 5126 + */ 5127 + 5128 + /** 5129 + * @typedef {Object} HtmxTriggerSpecification 5130 + * @property {string} trigger 5131 + * @property {number} [pollInterval] 5132 + * @property {ConditionalFunction} [eventFilter] 5133 + * @property {boolean} [changed] 5134 + * @property {boolean} [once] 5135 + * @property {boolean} [consume] 5136 + * @property {number} [delay] 5137 + * @property {string} [from] 5138 + * @property {string} [target] 5139 + * @property {number} [throttle] 5140 + * @property {string} [queue] 5141 + * @property {string} [root] 5142 + * @property {string} [threshold] 5143 + */ 5144 + 5145 + /** 5146 + * @typedef {{elt: Element, message: string, validity: ValidityState}} HtmxElementValidationError 5147 + */ 5148 + 5149 + /** 5150 + * @typedef {Record<string, string>} HtmxHeaderSpecification 5151 + * @property {'true'} HX-Request 5152 + * @property {string|null} HX-Trigger 5153 + * @property {string|null} HX-Trigger-Name 5154 + * @property {string|null} HX-Target 5155 + * @property {string} HX-Current-URL 5156 + * @property {string} [HX-Prompt] 5157 + * @property {'true'} [HX-Boosted] 5158 + * @property {string} [Content-Type] 5159 + * @property {'true'} [HX-History-Restore-Request] 5160 + */ 5161 + 5162 + /** @typedef HtmxAjaxHelperContext 5163 + * @property {Element|string} [source] 5164 + * @property {Event} [event] 5165 + * @property {HtmxAjaxHandler} [handler] 5166 + * @property {Element|string} [target] 5167 + * @property {HtmxSwapStyle} [swap] 5168 + * @property {Object|FormData} [values] 5169 + * @property {Record<string,string>} [headers] 5170 + * @property {string} [select] 5171 + */ 5172 + 5173 + /** 5174 + * @typedef {Object} HtmxRequestConfig 5175 + * @property {boolean} boosted 5176 + * @property {boolean} useUrlParams 5177 + * @property {FormData} formData 5178 + * @property {Object} parameters formData proxy 5179 + * @property {FormData} unfilteredFormData 5180 + * @property {Object} unfilteredParameters unfilteredFormData proxy 5181 + * @property {HtmxHeaderSpecification} headers 5182 + * @property {Element} target 5183 + * @property {HttpVerb} verb 5184 + * @property {HtmxElementValidationError[]} errors 5185 + * @property {boolean} withCredentials 5186 + * @property {number} timeout 5187 + * @property {string} path 5188 + * @property {Event} triggeringEvent 5189 + */ 5190 + 5191 + /** 5192 + * @typedef {Object} HtmxResponseInfo 5193 + * @property {XMLHttpRequest} xhr 5194 + * @property {Element} target 5195 + * @property {HtmxRequestConfig} requestConfig 5196 + * @property {HtmxAjaxEtc} etc 5197 + * @property {boolean} boosted 5198 + * @property {string} select 5199 + * @property {{requestPath: string, finalRequestPath: string, responsePath: string|null, anchor: string}} pathInfo 5200 + * @property {boolean} [failed] 5201 + * @property {boolean} [successful] 5202 + * @property {boolean} [keepIndicators] 5203 + */ 5204 + 5205 + /** 5206 + * @typedef {Object} HtmxAjaxEtc 5207 + * @property {boolean} [returnPromise] 5208 + * @property {HtmxAjaxHandler} [handler] 5209 + * @property {string} [select] 5210 + * @property {Element} [targetOverride] 5211 + * @property {HtmxSwapStyle} [swapOverride] 5212 + * @property {Record<string,string>} [headers] 5213 + * @property {Object|FormData} [values] 5214 + * @property {boolean} [credentials] 5215 + * @property {number} [timeout] 5216 + */ 5217 + 5218 + /** 5219 + * @typedef {Object} HtmxResponseHandlingConfig 5220 + * @property {string} [code] 5221 + * @property {boolean} swap 5222 + * @property {boolean} [error] 5223 + * @property {boolean} [ignoreTitle] 5224 + * @property {string} [select] 5225 + * @property {string} [target] 5226 + * @property {string} [swapOverride] 5227 + * @property {string} [event] 5228 + */ 5229 + 5230 + /** 5231 + * @typedef {HtmxResponseInfo & {shouldSwap: boolean, serverResponse: any, isError: boolean, ignoreTitle: boolean, selectOverride:string, swapOverride:string}} HtmxBeforeSwapDetails 5232 + */ 5233 + 5234 + /** 5235 + * @callback HtmxAjaxHandler 5236 + * @param {Element} elt 5237 + * @param {HtmxResponseInfo} responseInfo 5238 + */ 5239 + 5240 + /** 5241 + * @typedef {(() => void)} HtmxSettleTask 5242 + */ 5243 + 5244 + /** 5245 + * @typedef {Object} HtmxSettleInfo 5246 + * @property {HtmxSettleTask[]} tasks 5247 + * @property {Element[]} elts 5248 + * @property {string} [title] 5249 + */ 5250 + 5251 + /** 5252 + * @see https://github.com/bigskysoftware/htmx-extensions/blob/main/README.md 5253 + * @typedef {Object} HtmxExtension 5254 + * @property {(api: any) => void} init 5255 + * @property {(name: string, event: Event|CustomEvent) => boolean} onEvent 5256 + * @property {(text: string, xhr: XMLHttpRequest, elt: Element) => string} transformResponse 5257 + * @property {(swapStyle: HtmxSwapStyle) => boolean} isInlineSwap 5258 + * @property {(swapStyle: HtmxSwapStyle, target: Node, fragment: Node, settleInfo: HtmxSettleInfo) => boolean|Node[]} handleSwap 5259 + * @property {(xhr: XMLHttpRequest, parameters: FormData, elt: Node) => *|string|null} encodeParameters 5260 + * @property {() => string[]|null} getSelectors 5261 + */
+2657
public/prism.js
··· 1 + /* PrismJS 1.30.0 2 + https://prismjs.com/download#themes=prism&plugins=custom-class+show-language+autoloader+toolbar+copy-to-clipboard+treeview */ 3 + /// <reference lib="WebWorker"/> 4 + 5 + var _self = (typeof window !== 'undefined') 6 + ? window // if in browser 7 + : ( 8 + (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) 9 + ? self // if in worker 10 + : {} // if in node js 11 + ); 12 + 13 + /** 14 + * Prism: Lightweight, robust, elegant syntax highlighting 15 + * 16 + * @license MIT <https://opensource.org/licenses/MIT> 17 + * @author Lea Verou <https://lea.verou.me> 18 + * @namespace 19 + * @public 20 + */ 21 + var Prism = (function (_self) { 22 + 23 + // Private helper vars 24 + var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i; 25 + var uniqueId = 0; 26 + 27 + // The grammar object for plaintext 28 + var plainTextGrammar = {}; 29 + 30 + 31 + var _ = { 32 + /** 33 + * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the 34 + * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load 35 + * additional languages or plugins yourself. 36 + * 37 + * By setting this value to `true`, Prism will not automatically highlight all code elements on the page. 38 + * 39 + * You obviously have to change this value before the automatic highlighting started. To do this, you can add an 40 + * empty Prism object into the global scope before loading the Prism script like this: 41 + * 42 + * ```js 43 + * window.Prism = window.Prism || {}; 44 + * Prism.manual = true; 45 + * // add a new <script> to load Prism's script 46 + * ``` 47 + * 48 + * @default false 49 + * @type {boolean} 50 + * @memberof Prism 51 + * @public 52 + */ 53 + manual: _self.Prism && _self.Prism.manual, 54 + /** 55 + * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses 56 + * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your 57 + * own worker, you don't want it to do this. 58 + * 59 + * By setting this value to `true`, Prism will not add its own listeners to the worker. 60 + * 61 + * You obviously have to change this value before Prism executes. To do this, you can add an 62 + * empty Prism object into the global scope before loading the Prism script like this: 63 + * 64 + * ```js 65 + * window.Prism = window.Prism || {}; 66 + * Prism.disableWorkerMessageHandler = true; 67 + * // Load Prism's script 68 + * ``` 69 + * 70 + * @default false 71 + * @type {boolean} 72 + * @memberof Prism 73 + * @public 74 + */ 75 + disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, 76 + 77 + /** 78 + * A namespace for utility methods. 79 + * 80 + * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may 81 + * change or disappear at any time. 82 + * 83 + * @namespace 84 + * @memberof Prism 85 + */ 86 + util: { 87 + encode: function encode(tokens) { 88 + if (tokens instanceof Token) { 89 + return new Token(tokens.type, encode(tokens.content), tokens.alias); 90 + } else if (Array.isArray(tokens)) { 91 + return tokens.map(encode); 92 + } else { 93 + return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' '); 94 + } 95 + }, 96 + 97 + /** 98 + * Returns the name of the type of the given value. 99 + * 100 + * @param {any} o 101 + * @returns {string} 102 + * @example 103 + * type(null) === 'Null' 104 + * type(undefined) === 'Undefined' 105 + * type(123) === 'Number' 106 + * type('foo') === 'String' 107 + * type(true) === 'Boolean' 108 + * type([1, 2]) === 'Array' 109 + * type({}) === 'Object' 110 + * type(String) === 'Function' 111 + * type(/abc+/) === 'RegExp' 112 + */ 113 + type: function (o) { 114 + return Object.prototype.toString.call(o).slice(8, -1); 115 + }, 116 + 117 + /** 118 + * Returns a unique number for the given object. Later calls will still return the same number. 119 + * 120 + * @param {Object} obj 121 + * @returns {number} 122 + */ 123 + objId: function (obj) { 124 + if (!obj['__id']) { 125 + Object.defineProperty(obj, '__id', { value: ++uniqueId }); 126 + } 127 + return obj['__id']; 128 + }, 129 + 130 + /** 131 + * Creates a deep clone of the given object. 132 + * 133 + * The main intended use of this function is to clone language definitions. 134 + * 135 + * @param {T} o 136 + * @param {Record<number, any>} [visited] 137 + * @returns {T} 138 + * @template T 139 + */ 140 + clone: function deepClone(o, visited) { 141 + visited = visited || {}; 142 + 143 + var clone; var id; 144 + switch (_.util.type(o)) { 145 + case 'Object': 146 + id = _.util.objId(o); 147 + if (visited[id]) { 148 + return visited[id]; 149 + } 150 + clone = /** @type {Record<string, any>} */ ({}); 151 + visited[id] = clone; 152 + 153 + for (var key in o) { 154 + if (o.hasOwnProperty(key)) { 155 + clone[key] = deepClone(o[key], visited); 156 + } 157 + } 158 + 159 + return /** @type {any} */ (clone); 160 + 161 + case 'Array': 162 + id = _.util.objId(o); 163 + if (visited[id]) { 164 + return visited[id]; 165 + } 166 + clone = []; 167 + visited[id] = clone; 168 + 169 + (/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) { 170 + clone[i] = deepClone(v, visited); 171 + }); 172 + 173 + return /** @type {any} */ (clone); 174 + 175 + default: 176 + return o; 177 + } 178 + }, 179 + 180 + /** 181 + * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class. 182 + * 183 + * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned. 184 + * 185 + * @param {Element} element 186 + * @returns {string} 187 + */ 188 + getLanguage: function (element) { 189 + while (element) { 190 + var m = lang.exec(element.className); 191 + if (m) { 192 + return m[1].toLowerCase(); 193 + } 194 + element = element.parentElement; 195 + } 196 + return 'none'; 197 + }, 198 + 199 + /** 200 + * Sets the Prism `language-xxxx` class of the given element. 201 + * 202 + * @param {Element} element 203 + * @param {string} language 204 + * @returns {void} 205 + */ 206 + setLanguage: function (element, language) { 207 + // remove all `language-xxxx` classes 208 + // (this might leave behind a leading space) 209 + element.className = element.className.replace(RegExp(lang, 'gi'), ''); 210 + 211 + // add the new `language-xxxx` class 212 + // (using `classList` will automatically clean up spaces for us) 213 + element.classList.add('language-' + language); 214 + }, 215 + 216 + /** 217 + * Returns the script element that is currently executing. 218 + * 219 + * This does __not__ work for line script element. 220 + * 221 + * @returns {HTMLScriptElement | null} 222 + */ 223 + currentScript: function () { 224 + if (typeof document === 'undefined') { 225 + return null; 226 + } 227 + if (document.currentScript && document.currentScript.tagName === 'SCRIPT' && 1 < 2 /* hack to trip TS' flow analysis */) { 228 + return /** @type {any} */ (document.currentScript); 229 + } 230 + 231 + // IE11 workaround 232 + // we'll get the src of the current script by parsing IE11's error stack trace 233 + // this will not work for inline scripts 234 + 235 + try { 236 + throw new Error(); 237 + } catch (err) { 238 + // Get file src url from stack. Specifically works with the format of stack traces in IE. 239 + // A stack will look like this: 240 + // 241 + // Error 242 + // at _.util.currentScript (http://localhost/components/prism-core.js:119:5) 243 + // at Global code (http://localhost/components/prism-core.js:606:1) 244 + 245 + var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1]; 246 + if (src) { 247 + var scripts = document.getElementsByTagName('script'); 248 + for (var i in scripts) { 249 + if (scripts[i].src == src) { 250 + return scripts[i]; 251 + } 252 + } 253 + } 254 + return null; 255 + } 256 + }, 257 + 258 + /** 259 + * Returns whether a given class is active for `element`. 260 + * 261 + * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated 262 + * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the 263 + * given class is just the given class with a `no-` prefix. 264 + * 265 + * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is 266 + * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its 267 + * ancestors have the given class or the negated version of it, then the default activation will be returned. 268 + * 269 + * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated 270 + * version of it, the class is considered active. 271 + * 272 + * @param {Element} element 273 + * @param {string} className 274 + * @param {boolean} [defaultActivation=false] 275 + * @returns {boolean} 276 + */ 277 + isActive: function (element, className, defaultActivation) { 278 + var no = 'no-' + className; 279 + 280 + while (element) { 281 + var classList = element.classList; 282 + if (classList.contains(className)) { 283 + return true; 284 + } 285 + if (classList.contains(no)) { 286 + return false; 287 + } 288 + element = element.parentElement; 289 + } 290 + return !!defaultActivation; 291 + } 292 + }, 293 + 294 + /** 295 + * This namespace contains all currently loaded languages and the some helper functions to create and modify languages. 296 + * 297 + * @namespace 298 + * @memberof Prism 299 + * @public 300 + */ 301 + languages: { 302 + /** 303 + * The grammar for plain, unformatted text. 304 + */ 305 + plain: plainTextGrammar, 306 + plaintext: plainTextGrammar, 307 + text: plainTextGrammar, 308 + txt: plainTextGrammar, 309 + 310 + /** 311 + * Creates a deep copy of the language with the given id and appends the given tokens. 312 + * 313 + * If a token in `redef` also appears in the copied language, then the existing token in the copied language 314 + * will be overwritten at its original position. 315 + * 316 + * ## Best practices 317 + * 318 + * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language) 319 + * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to 320 + * understand the language definition because, normally, the order of tokens matters in Prism grammars. 321 + * 322 + * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens. 323 + * Furthermore, all non-overwriting tokens should be placed after the overwriting ones. 324 + * 325 + * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`. 326 + * @param {Grammar} redef The new tokens to append. 327 + * @returns {Grammar} The new language created. 328 + * @public 329 + * @example 330 + * Prism.languages['css-with-colors'] = Prism.languages.extend('css', { 331 + * // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token 332 + * // at its original position 333 + * 'comment': { ... }, 334 + * // CSS doesn't have a 'color' token, so this token will be appended 335 + * 'color': /\b(?:red|green|blue)\b/ 336 + * }); 337 + */ 338 + extend: function (id, redef) { 339 + var lang = _.util.clone(_.languages[id]); 340 + 341 + for (var key in redef) { 342 + lang[key] = redef[key]; 343 + } 344 + 345 + return lang; 346 + }, 347 + 348 + /** 349 + * Inserts tokens _before_ another token in a language definition or any other grammar. 350 + * 351 + * ## Usage 352 + * 353 + * This helper method makes it easy to modify existing languages. For example, the CSS language definition 354 + * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded 355 + * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the 356 + * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do 357 + * this: 358 + * 359 + * ```js 360 + * Prism.languages.markup.style = { 361 + * // token 362 + * }; 363 + * ``` 364 + * 365 + * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens 366 + * before existing tokens. For the CSS example above, you would use it like this: 367 + * 368 + * ```js 369 + * Prism.languages.insertBefore('markup', 'cdata', { 370 + * 'style': { 371 + * // token 372 + * } 373 + * }); 374 + * ``` 375 + * 376 + * ## Special cases 377 + * 378 + * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar 379 + * will be ignored. 380 + * 381 + * This behavior can be used to insert tokens after `before`: 382 + * 383 + * ```js 384 + * Prism.languages.insertBefore('markup', 'comment', { 385 + * 'comment': Prism.languages.markup.comment, 386 + * // tokens after 'comment' 387 + * }); 388 + * ``` 389 + * 390 + * ## Limitations 391 + * 392 + * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object 393 + * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave 394 + * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily 395 + * deleting properties which is necessary to insert at arbitrary positions. 396 + * 397 + * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object. 398 + * Instead, it will create a new object and replace all references to the target object with the new one. This 399 + * can be done without temporarily deleting properties, so the iteration order is well-defined. 400 + * 401 + * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if 402 + * you hold the target object in a variable, then the value of the variable will not change. 403 + * 404 + * ```js 405 + * var oldMarkup = Prism.languages.markup; 406 + * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... }); 407 + * 408 + * assert(oldMarkup !== Prism.languages.markup); 409 + * assert(newMarkup === Prism.languages.markup); 410 + * ``` 411 + * 412 + * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the 413 + * object to be modified. 414 + * @param {string} before The key to insert before. 415 + * @param {Grammar} insert An object containing the key-value pairs to be inserted. 416 + * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the 417 + * object to be modified. 418 + * 419 + * Defaults to `Prism.languages`. 420 + * @returns {Grammar} The new grammar object. 421 + * @public 422 + */ 423 + insertBefore: function (inside, before, insert, root) { 424 + root = root || /** @type {any} */ (_.languages); 425 + var grammar = root[inside]; 426 + /** @type {Grammar} */ 427 + var ret = {}; 428 + 429 + for (var token in grammar) { 430 + if (grammar.hasOwnProperty(token)) { 431 + 432 + if (token == before) { 433 + for (var newToken in insert) { 434 + if (insert.hasOwnProperty(newToken)) { 435 + ret[newToken] = insert[newToken]; 436 + } 437 + } 438 + } 439 + 440 + // Do not insert token which also occur in insert. See #1525 441 + if (!insert.hasOwnProperty(token)) { 442 + ret[token] = grammar[token]; 443 + } 444 + } 445 + } 446 + 447 + var old = root[inside]; 448 + root[inside] = ret; 449 + 450 + // Update references in other language definitions 451 + _.languages.DFS(_.languages, function (key, value) { 452 + if (value === old && key != inside) { 453 + this[key] = ret; 454 + } 455 + }); 456 + 457 + return ret; 458 + }, 459 + 460 + // Traverse a language definition with Depth First Search 461 + DFS: function DFS(o, callback, type, visited) { 462 + visited = visited || {}; 463 + 464 + var objId = _.util.objId; 465 + 466 + for (var i in o) { 467 + if (o.hasOwnProperty(i)) { 468 + callback.call(o, i, o[i], type || i); 469 + 470 + var property = o[i]; 471 + var propertyType = _.util.type(property); 472 + 473 + if (propertyType === 'Object' && !visited[objId(property)]) { 474 + visited[objId(property)] = true; 475 + DFS(property, callback, null, visited); 476 + } else if (propertyType === 'Array' && !visited[objId(property)]) { 477 + visited[objId(property)] = true; 478 + DFS(property, callback, i, visited); 479 + } 480 + } 481 + } 482 + } 483 + }, 484 + 485 + plugins: {}, 486 + 487 + /** 488 + * This is the most high-level function in Prism’s API. 489 + * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on 490 + * each one of them. 491 + * 492 + * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`. 493 + * 494 + * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}. 495 + * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}. 496 + * @memberof Prism 497 + * @public 498 + */ 499 + highlightAll: function (async, callback) { 500 + _.highlightAllUnder(document, async, callback); 501 + }, 502 + 503 + /** 504 + * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls 505 + * {@link Prism.highlightElement} on each one of them. 506 + * 507 + * The following hooks will be run: 508 + * 1. `before-highlightall` 509 + * 2. `before-all-elements-highlight` 510 + * 3. All hooks of {@link Prism.highlightElement} for each element. 511 + * 512 + * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted. 513 + * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers. 514 + * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done. 515 + * @memberof Prism 516 + * @public 517 + */ 518 + highlightAllUnder: function (container, async, callback) { 519 + var env = { 520 + callback: callback, 521 + container: container, 522 + selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code' 523 + }; 524 + 525 + _.hooks.run('before-highlightall', env); 526 + 527 + env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector)); 528 + 529 + _.hooks.run('before-all-elements-highlight', env); 530 + 531 + for (var i = 0, element; (element = env.elements[i++]);) { 532 + _.highlightElement(element, async === true, env.callback); 533 + } 534 + }, 535 + 536 + /** 537 + * Highlights the code inside a single element. 538 + * 539 + * The following hooks will be run: 540 + * 1. `before-sanity-check` 541 + * 2. `before-highlight` 542 + * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`. 543 + * 4. `before-insert` 544 + * 5. `after-highlight` 545 + * 6. `complete` 546 + * 547 + * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for 548 + * the element's language. 549 + * 550 + * @param {Element} element The element containing the code. 551 + * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier. 552 + * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers 553 + * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is 554 + * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default). 555 + * 556 + * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for 557 + * asynchronous highlighting to work. You can build your own bundle on the 558 + * [Download page](https://prismjs.com/download.html). 559 + * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done. 560 + * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously. 561 + * @memberof Prism 562 + * @public 563 + */ 564 + highlightElement: function (element, async, callback) { 565 + // Find language 566 + var language = _.util.getLanguage(element); 567 + var grammar = _.languages[language]; 568 + 569 + // Set language on the element, if not present 570 + _.util.setLanguage(element, language); 571 + 572 + // Set language on the parent, for styling 573 + var parent = element.parentElement; 574 + if (parent && parent.nodeName.toLowerCase() === 'pre') { 575 + _.util.setLanguage(parent, language); 576 + } 577 + 578 + var code = element.textContent; 579 + 580 + var env = { 581 + element: element, 582 + language: language, 583 + grammar: grammar, 584 + code: code 585 + }; 586 + 587 + function insertHighlightedCode(highlightedCode) { 588 + env.highlightedCode = highlightedCode; 589 + 590 + _.hooks.run('before-insert', env); 591 + 592 + env.element.innerHTML = env.highlightedCode; 593 + 594 + _.hooks.run('after-highlight', env); 595 + _.hooks.run('complete', env); 596 + callback && callback.call(env.element); 597 + } 598 + 599 + _.hooks.run('before-sanity-check', env); 600 + 601 + // plugins may change/add the parent/element 602 + parent = env.element.parentElement; 603 + if (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) { 604 + parent.setAttribute('tabindex', '0'); 605 + } 606 + 607 + if (!env.code) { 608 + _.hooks.run('complete', env); 609 + callback && callback.call(env.element); 610 + return; 611 + } 612 + 613 + _.hooks.run('before-highlight', env); 614 + 615 + if (!env.grammar) { 616 + insertHighlightedCode(_.util.encode(env.code)); 617 + return; 618 + } 619 + 620 + if (async && _self.Worker) { 621 + var worker = new Worker(_.filename); 622 + 623 + worker.onmessage = function (evt) { 624 + insertHighlightedCode(evt.data); 625 + }; 626 + 627 + worker.postMessage(JSON.stringify({ 628 + language: env.language, 629 + code: env.code, 630 + immediateClose: true 631 + })); 632 + } else { 633 + insertHighlightedCode(_.highlight(env.code, env.grammar, env.language)); 634 + } 635 + }, 636 + 637 + /** 638 + * Low-level function, only use if you know what you’re doing. It accepts a string of text as input 639 + * and the language definitions to use, and returns a string with the HTML produced. 640 + * 641 + * The following hooks will be run: 642 + * 1. `before-tokenize` 643 + * 2. `after-tokenize` 644 + * 3. `wrap`: On each {@link Token}. 645 + * 646 + * @param {string} text A string with the code to be highlighted. 647 + * @param {Grammar} grammar An object containing the tokens to use. 648 + * 649 + * Usually a language definition like `Prism.languages.markup`. 650 + * @param {string} language The name of the language definition passed to `grammar`. 651 + * @returns {string} The highlighted HTML. 652 + * @memberof Prism 653 + * @public 654 + * @example 655 + * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript'); 656 + */ 657 + highlight: function (text, grammar, language) { 658 + var env = { 659 + code: text, 660 + grammar: grammar, 661 + language: language 662 + }; 663 + _.hooks.run('before-tokenize', env); 664 + if (!env.grammar) { 665 + throw new Error('The language "' + env.language + '" has no grammar.'); 666 + } 667 + env.tokens = _.tokenize(env.code, env.grammar); 668 + _.hooks.run('after-tokenize', env); 669 + return Token.stringify(_.util.encode(env.tokens), env.language); 670 + }, 671 + 672 + /** 673 + * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input 674 + * and the language definitions to use, and returns an array with the tokenized code. 675 + * 676 + * When the language definition includes nested tokens, the function is called recursively on each of these tokens. 677 + * 678 + * This method could be useful in other contexts as well, as a very crude parser. 679 + * 680 + * @param {string} text A string with the code to be highlighted. 681 + * @param {Grammar} grammar An object containing the tokens to use. 682 + * 683 + * Usually a language definition like `Prism.languages.markup`. 684 + * @returns {TokenStream} An array of strings and tokens, a token stream. 685 + * @memberof Prism 686 + * @public 687 + * @example 688 + * let code = `var foo = 0;`; 689 + * let tokens = Prism.tokenize(code, Prism.languages.javascript); 690 + * tokens.forEach(token => { 691 + * if (token instanceof Prism.Token && token.type === 'number') { 692 + * console.log(`Found numeric literal: ${token.content}`); 693 + * } 694 + * }); 695 + */ 696 + tokenize: function (text, grammar) { 697 + var rest = grammar.rest; 698 + if (rest) { 699 + for (var token in rest) { 700 + grammar[token] = rest[token]; 701 + } 702 + 703 + delete grammar.rest; 704 + } 705 + 706 + var tokenList = new LinkedList(); 707 + addAfter(tokenList, tokenList.head, text); 708 + 709 + matchGrammar(text, tokenList, grammar, tokenList.head, 0); 710 + 711 + return toArray(tokenList); 712 + }, 713 + 714 + /** 715 + * @namespace 716 + * @memberof Prism 717 + * @public 718 + */ 719 + hooks: { 720 + all: {}, 721 + 722 + /** 723 + * Adds the given callback to the list of callbacks for the given hook. 724 + * 725 + * The callback will be invoked when the hook it is registered for is run. 726 + * Hooks are usually directly run by a highlight function but you can also run hooks yourself. 727 + * 728 + * One callback function can be registered to multiple hooks and the same hook multiple times. 729 + * 730 + * @param {string} name The name of the hook. 731 + * @param {HookCallback} callback The callback function which is given environment variables. 732 + * @public 733 + */ 734 + add: function (name, callback) { 735 + var hooks = _.hooks.all; 736 + 737 + hooks[name] = hooks[name] || []; 738 + 739 + hooks[name].push(callback); 740 + }, 741 + 742 + /** 743 + * Runs a hook invoking all registered callbacks with the given environment variables. 744 + * 745 + * Callbacks will be invoked synchronously and in the order in which they were registered. 746 + * 747 + * @param {string} name The name of the hook. 748 + * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered. 749 + * @public 750 + */ 751 + run: function (name, env) { 752 + var callbacks = _.hooks.all[name]; 753 + 754 + if (!callbacks || !callbacks.length) { 755 + return; 756 + } 757 + 758 + for (var i = 0, callback; (callback = callbacks[i++]);) { 759 + callback(env); 760 + } 761 + } 762 + }, 763 + 764 + Token: Token 765 + }; 766 + _self.Prism = _; 767 + 768 + 769 + // Typescript note: 770 + // The following can be used to import the Token type in JSDoc: 771 + // 772 + // @typedef {InstanceType<import("./prism-core")["Token"]>} Token 773 + 774 + /** 775 + * Creates a new token. 776 + * 777 + * @param {string} type See {@link Token#type type} 778 + * @param {string | TokenStream} content See {@link Token#content content} 779 + * @param {string|string[]} [alias] The alias(es) of the token. 780 + * @param {string} [matchedStr=""] A copy of the full string this token was created from. 781 + * @class 782 + * @global 783 + * @public 784 + */ 785 + function Token(type, content, alias, matchedStr) { 786 + /** 787 + * The type of the token. 788 + * 789 + * This is usually the key of a pattern in a {@link Grammar}. 790 + * 791 + * @type {string} 792 + * @see GrammarToken 793 + * @public 794 + */ 795 + this.type = type; 796 + /** 797 + * The strings or tokens contained by this token. 798 + * 799 + * This will be a token stream if the pattern matched also defined an `inside` grammar. 800 + * 801 + * @type {string | TokenStream} 802 + * @public 803 + */ 804 + this.content = content; 805 + /** 806 + * The alias(es) of the token. 807 + * 808 + * @type {string|string[]} 809 + * @see GrammarToken 810 + * @public 811 + */ 812 + this.alias = alias; 813 + // Copy of the full string this token was created from 814 + this.length = (matchedStr || '').length | 0; 815 + } 816 + 817 + /** 818 + * A token stream is an array of strings and {@link Token Token} objects. 819 + * 820 + * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process 821 + * them. 822 + * 823 + * 1. No adjacent strings. 824 + * 2. No empty strings. 825 + * 826 + * The only exception here is the token stream that only contains the empty string and nothing else. 827 + * 828 + * @typedef {Array<string | Token>} TokenStream 829 + * @global 830 + * @public 831 + */ 832 + 833 + /** 834 + * Converts the given token or token stream to an HTML representation. 835 + * 836 + * The following hooks will be run: 837 + * 1. `wrap`: On each {@link Token}. 838 + * 839 + * @param {string | Token | TokenStream} o The token or token stream to be converted. 840 + * @param {string} language The name of current language. 841 + * @returns {string} The HTML representation of the token or token stream. 842 + * @memberof Token 843 + * @static 844 + */ 845 + Token.stringify = function stringify(o, language) { 846 + if (typeof o == 'string') { 847 + return o; 848 + } 849 + if (Array.isArray(o)) { 850 + var s = ''; 851 + o.forEach(function (e) { 852 + s += stringify(e, language); 853 + }); 854 + return s; 855 + } 856 + 857 + var env = { 858 + type: o.type, 859 + content: stringify(o.content, language), 860 + tag: 'span', 861 + classes: ['token', o.type], 862 + attributes: {}, 863 + language: language 864 + }; 865 + 866 + var aliases = o.alias; 867 + if (aliases) { 868 + if (Array.isArray(aliases)) { 869 + Array.prototype.push.apply(env.classes, aliases); 870 + } else { 871 + env.classes.push(aliases); 872 + } 873 + } 874 + 875 + _.hooks.run('wrap', env); 876 + 877 + var attributes = ''; 878 + for (var name in env.attributes) { 879 + attributes += ' ' + name + '="' + (env.attributes[name] || '').replace(/"/g, '&quot;') + '"'; 880 + } 881 + 882 + return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + attributes + '>' + env.content + '</' + env.tag + '>'; 883 + }; 884 + 885 + /** 886 + * @param {RegExp} pattern 887 + * @param {number} pos 888 + * @param {string} text 889 + * @param {boolean} lookbehind 890 + * @returns {RegExpExecArray | null} 891 + */ 892 + function matchPattern(pattern, pos, text, lookbehind) { 893 + pattern.lastIndex = pos; 894 + var match = pattern.exec(text); 895 + if (match && lookbehind && match[1]) { 896 + // change the match to remove the text matched by the Prism lookbehind group 897 + var lookbehindLength = match[1].length; 898 + match.index += lookbehindLength; 899 + match[0] = match[0].slice(lookbehindLength); 900 + } 901 + return match; 902 + } 903 + 904 + /** 905 + * @param {string} text 906 + * @param {LinkedList<string | Token>} tokenList 907 + * @param {any} grammar 908 + * @param {LinkedListNode<string | Token>} startNode 909 + * @param {number} startPos 910 + * @param {RematchOptions} [rematch] 911 + * @returns {void} 912 + * @private 913 + * 914 + * @typedef RematchOptions 915 + * @property {string} cause 916 + * @property {number} reach 917 + */ 918 + function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) { 919 + for (var token in grammar) { 920 + if (!grammar.hasOwnProperty(token) || !grammar[token]) { 921 + continue; 922 + } 923 + 924 + var patterns = grammar[token]; 925 + patterns = Array.isArray(patterns) ? patterns : [patterns]; 926 + 927 + for (var j = 0; j < patterns.length; ++j) { 928 + if (rematch && rematch.cause == token + ',' + j) { 929 + return; 930 + } 931 + 932 + var patternObj = patterns[j]; 933 + var inside = patternObj.inside; 934 + var lookbehind = !!patternObj.lookbehind; 935 + var greedy = !!patternObj.greedy; 936 + var alias = patternObj.alias; 937 + 938 + if (greedy && !patternObj.pattern.global) { 939 + // Without the global flag, lastIndex won't work 940 + var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0]; 941 + patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g'); 942 + } 943 + 944 + /** @type {RegExp} */ 945 + var pattern = patternObj.pattern || patternObj; 946 + 947 + for ( // iterate the token list and keep track of the current token/string position 948 + var currentNode = startNode.next, pos = startPos; 949 + currentNode !== tokenList.tail; 950 + pos += currentNode.value.length, currentNode = currentNode.next 951 + ) { 952 + 953 + if (rematch && pos >= rematch.reach) { 954 + break; 955 + } 956 + 957 + var str = currentNode.value; 958 + 959 + if (tokenList.length > text.length) { 960 + // Something went terribly wrong, ABORT, ABORT! 961 + return; 962 + } 963 + 964 + if (str instanceof Token) { 965 + continue; 966 + } 967 + 968 + var removeCount = 1; // this is the to parameter of removeBetween 969 + var match; 970 + 971 + if (greedy) { 972 + match = matchPattern(pattern, pos, text, lookbehind); 973 + if (!match || match.index >= text.length) { 974 + break; 975 + } 976 + 977 + var from = match.index; 978 + var to = match.index + match[0].length; 979 + var p = pos; 980 + 981 + // find the node that contains the match 982 + p += currentNode.value.length; 983 + while (from >= p) { 984 + currentNode = currentNode.next; 985 + p += currentNode.value.length; 986 + } 987 + // adjust pos (and p) 988 + p -= currentNode.value.length; 989 + pos = p; 990 + 991 + // the current node is a Token, then the match starts inside another Token, which is invalid 992 + if (currentNode.value instanceof Token) { 993 + continue; 994 + } 995 + 996 + // find the last node which is affected by this match 997 + for ( 998 + var k = currentNode; 999 + k !== tokenList.tail && (p < to || typeof k.value === 'string'); 1000 + k = k.next 1001 + ) { 1002 + removeCount++; 1003 + p += k.value.length; 1004 + } 1005 + removeCount--; 1006 + 1007 + // replace with the new match 1008 + str = text.slice(pos, p); 1009 + match.index -= pos; 1010 + } else { 1011 + match = matchPattern(pattern, 0, str, lookbehind); 1012 + if (!match) { 1013 + continue; 1014 + } 1015 + } 1016 + 1017 + // eslint-disable-next-line no-redeclare 1018 + var from = match.index; 1019 + var matchStr = match[0]; 1020 + var before = str.slice(0, from); 1021 + var after = str.slice(from + matchStr.length); 1022 + 1023 + var reach = pos + str.length; 1024 + if (rematch && reach > rematch.reach) { 1025 + rematch.reach = reach; 1026 + } 1027 + 1028 + var removeFrom = currentNode.prev; 1029 + 1030 + if (before) { 1031 + removeFrom = addAfter(tokenList, removeFrom, before); 1032 + pos += before.length; 1033 + } 1034 + 1035 + removeRange(tokenList, removeFrom, removeCount); 1036 + 1037 + var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr); 1038 + currentNode = addAfter(tokenList, removeFrom, wrapped); 1039 + 1040 + if (after) { 1041 + addAfter(tokenList, currentNode, after); 1042 + } 1043 + 1044 + if (removeCount > 1) { 1045 + // at least one Token object was removed, so we have to do some rematching 1046 + // this can only happen if the current pattern is greedy 1047 + 1048 + /** @type {RematchOptions} */ 1049 + var nestedRematch = { 1050 + cause: token + ',' + j, 1051 + reach: reach 1052 + }; 1053 + matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch); 1054 + 1055 + // the reach might have been extended because of the rematching 1056 + if (rematch && nestedRematch.reach > rematch.reach) { 1057 + rematch.reach = nestedRematch.reach; 1058 + } 1059 + } 1060 + } 1061 + } 1062 + } 1063 + } 1064 + 1065 + /** 1066 + * @typedef LinkedListNode 1067 + * @property {T} value 1068 + * @property {LinkedListNode<T> | null} prev The previous node. 1069 + * @property {LinkedListNode<T> | null} next The next node. 1070 + * @template T 1071 + * @private 1072 + */ 1073 + 1074 + /** 1075 + * @template T 1076 + * @private 1077 + */ 1078 + function LinkedList() { 1079 + /** @type {LinkedListNode<T>} */ 1080 + var head = { value: null, prev: null, next: null }; 1081 + /** @type {LinkedListNode<T>} */ 1082 + var tail = { value: null, prev: head, next: null }; 1083 + head.next = tail; 1084 + 1085 + /** @type {LinkedListNode<T>} */ 1086 + this.head = head; 1087 + /** @type {LinkedListNode<T>} */ 1088 + this.tail = tail; 1089 + this.length = 0; 1090 + } 1091 + 1092 + /** 1093 + * Adds a new node with the given value to the list. 1094 + * 1095 + * @param {LinkedList<T>} list 1096 + * @param {LinkedListNode<T>} node 1097 + * @param {T} value 1098 + * @returns {LinkedListNode<T>} The added node. 1099 + * @template T 1100 + */ 1101 + function addAfter(list, node, value) { 1102 + // assumes that node != list.tail && values.length >= 0 1103 + var next = node.next; 1104 + 1105 + var newNode = { value: value, prev: node, next: next }; 1106 + node.next = newNode; 1107 + next.prev = newNode; 1108 + list.length++; 1109 + 1110 + return newNode; 1111 + } 1112 + /** 1113 + * Removes `count` nodes after the given node. The given node will not be removed. 1114 + * 1115 + * @param {LinkedList<T>} list 1116 + * @param {LinkedListNode<T>} node 1117 + * @param {number} count 1118 + * @template T 1119 + */ 1120 + function removeRange(list, node, count) { 1121 + var next = node.next; 1122 + for (var i = 0; i < count && next !== list.tail; i++) { 1123 + next = next.next; 1124 + } 1125 + node.next = next; 1126 + next.prev = node; 1127 + list.length -= i; 1128 + } 1129 + /** 1130 + * @param {LinkedList<T>} list 1131 + * @returns {T[]} 1132 + * @template T 1133 + */ 1134 + function toArray(list) { 1135 + var array = []; 1136 + var node = list.head.next; 1137 + while (node !== list.tail) { 1138 + array.push(node.value); 1139 + node = node.next; 1140 + } 1141 + return array; 1142 + } 1143 + 1144 + 1145 + if (!_self.document) { 1146 + if (!_self.addEventListener) { 1147 + // in Node.js 1148 + return _; 1149 + } 1150 + 1151 + if (!_.disableWorkerMessageHandler) { 1152 + // In worker 1153 + _self.addEventListener('message', function (evt) { 1154 + var message = JSON.parse(evt.data); 1155 + var lang = message.language; 1156 + var code = message.code; 1157 + var immediateClose = message.immediateClose; 1158 + 1159 + _self.postMessage(_.highlight(code, _.languages[lang], lang)); 1160 + if (immediateClose) { 1161 + _self.close(); 1162 + } 1163 + }, false); 1164 + } 1165 + 1166 + return _; 1167 + } 1168 + 1169 + // Get current script and highlight 1170 + var script = _.util.currentScript(); 1171 + 1172 + if (script) { 1173 + _.filename = script.src; 1174 + 1175 + if (script.hasAttribute('data-manual')) { 1176 + _.manual = true; 1177 + } 1178 + } 1179 + 1180 + function highlightAutomaticallyCallback() { 1181 + if (!_.manual) { 1182 + _.highlightAll(); 1183 + } 1184 + } 1185 + 1186 + if (!_.manual) { 1187 + // If the document state is "loading", then we'll use DOMContentLoaded. 1188 + // If the document state is "interactive" and the prism.js script is deferred, then we'll also use the 1189 + // DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they 1190 + // might take longer one animation frame to execute which can create a race condition where only some plugins have 1191 + // been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded. 1192 + // See https://github.com/PrismJS/prism/issues/2102 1193 + var readyState = document.readyState; 1194 + if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { 1195 + document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); 1196 + } else { 1197 + if (window.requestAnimationFrame) { 1198 + window.requestAnimationFrame(highlightAutomaticallyCallback); 1199 + } else { 1200 + window.setTimeout(highlightAutomaticallyCallback, 16); 1201 + } 1202 + } 1203 + } 1204 + 1205 + return _; 1206 + 1207 + }(_self)); 1208 + 1209 + if (typeof module !== 'undefined' && module.exports) { 1210 + module.exports = Prism; 1211 + } 1212 + 1213 + // hack for components to work correctly in node.js 1214 + if (typeof global !== 'undefined') { 1215 + global.Prism = Prism; 1216 + } 1217 + 1218 + // some additional documentation/types 1219 + 1220 + /** 1221 + * The expansion of a simple `RegExp` literal to support additional properties. 1222 + * 1223 + * @typedef GrammarToken 1224 + * @property {RegExp} pattern The regular expression of the token. 1225 + * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively) 1226 + * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token. 1227 + * @property {boolean} [greedy=false] Whether the token is greedy. 1228 + * @property {string|string[]} [alias] An optional alias or list of aliases. 1229 + * @property {Grammar} [inside] The nested grammar of this token. 1230 + * 1231 + * The `inside` grammar will be used to tokenize the text value of each token of this kind. 1232 + * 1233 + * This can be used to make nested and even recursive language definitions. 1234 + * 1235 + * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into 1236 + * each another. 1237 + * @global 1238 + * @public 1239 + */ 1240 + 1241 + /** 1242 + * @typedef Grammar 1243 + * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>} 1244 + * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar. 1245 + * @global 1246 + * @public 1247 + */ 1248 + 1249 + /** 1250 + * A function which will invoked after an element was successfully highlighted. 1251 + * 1252 + * @callback HighlightCallback 1253 + * @param {Element} element The element successfully highlighted. 1254 + * @returns {void} 1255 + * @global 1256 + * @public 1257 + */ 1258 + 1259 + /** 1260 + * @callback HookCallback 1261 + * @param {Object<string, any>} env The environment variables of the hook. 1262 + * @returns {void} 1263 + * @global 1264 + * @public 1265 + */ 1266 + ; 1267 + (function () { 1268 + 1269 + if (typeof Prism === 'undefined') { 1270 + return; 1271 + } 1272 + 1273 + /** 1274 + * @callback ClassMapper 1275 + * @param {string} className 1276 + * @param {string} language 1277 + * @returns {string} 1278 + * 1279 + * @callback ClassAdder 1280 + * @param {ClassAdderEnvironment} env 1281 + * @returns {undefined | string | string[]} 1282 + * 1283 + * @typedef ClassAdderEnvironment 1284 + * @property {string} language 1285 + * @property {string} type 1286 + * @property {string} content 1287 + */ 1288 + 1289 + // options 1290 + 1291 + /** @type {ClassAdder | undefined} */ 1292 + var adder; 1293 + /** @type {ClassMapper | undefined} */ 1294 + var mapper; 1295 + /** @type {string} */ 1296 + var prefixString = ''; 1297 + 1298 + 1299 + /** 1300 + * @param {string} className 1301 + * @param {string} language 1302 + */ 1303 + function apply(className, language) { 1304 + return prefixString + (mapper ? mapper(className, language) : className); 1305 + } 1306 + 1307 + 1308 + Prism.plugins.customClass = { 1309 + /** 1310 + * Sets the function which can be used to add custom aliases to any token. 1311 + * 1312 + * @param {ClassAdder} classAdder 1313 + */ 1314 + add: function (classAdder) { 1315 + adder = classAdder; 1316 + }, 1317 + /** 1318 + * Maps all class names using the given object or map function. 1319 + * 1320 + * This does not affect the prefix. 1321 + * 1322 + * @param {Object<string, string> | ClassMapper} classMapper 1323 + */ 1324 + map: function map(classMapper) { 1325 + if (typeof classMapper === 'function') { 1326 + mapper = classMapper; 1327 + } else { 1328 + mapper = function (className) { 1329 + return classMapper[className] || className; 1330 + }; 1331 + } 1332 + }, 1333 + /** 1334 + * Adds the given prefix to all class names. 1335 + * 1336 + * @param {string} string 1337 + */ 1338 + prefix: function prefix(string) { 1339 + prefixString = string || ''; 1340 + }, 1341 + /** 1342 + * Applies the current mapping and prefix to the given class name. 1343 + * 1344 + * @param {string} className A single class name. 1345 + * @param {string} language The language of the code that contains this class name. 1346 + * 1347 + * If the language is unknown, pass `"none"`. 1348 + */ 1349 + apply: apply 1350 + }; 1351 + 1352 + Prism.hooks.add('wrap', function (env) { 1353 + if (adder) { 1354 + var result = adder({ 1355 + content: env.content, 1356 + type: env.type, 1357 + language: env.language 1358 + }); 1359 + 1360 + if (Array.isArray(result)) { 1361 + env.classes.push.apply(env.classes, result); 1362 + } else if (result) { 1363 + env.classes.push(result); 1364 + } 1365 + } 1366 + 1367 + if (!mapper && !prefixString) { 1368 + return; 1369 + } 1370 + 1371 + env.classes = env.classes.map(function (c) { 1372 + return apply(c, env.language); 1373 + }); 1374 + }); 1375 + 1376 + }()); 1377 + 1378 + (function () { 1379 + 1380 + if (typeof Prism === 'undefined' || typeof document === 'undefined') { 1381 + return; 1382 + } 1383 + 1384 + var callbacks = []; 1385 + var map = {}; 1386 + var noop = function () {}; 1387 + 1388 + Prism.plugins.toolbar = {}; 1389 + 1390 + /** 1391 + * @typedef ButtonOptions 1392 + * @property {string} text The text displayed. 1393 + * @property {string} [url] The URL of the link which will be created. 1394 + * @property {Function} [onClick] The event listener for the `click` event of the created button. 1395 + * @property {string} [className] The class attribute to include with element. 1396 + */ 1397 + 1398 + /** 1399 + * Register a button callback with the toolbar. 1400 + * 1401 + * @param {string} key 1402 + * @param {ButtonOptions|Function} opts 1403 + */ 1404 + var registerButton = Prism.plugins.toolbar.registerButton = function (key, opts) { 1405 + var callback; 1406 + 1407 + if (typeof opts === 'function') { 1408 + callback = opts; 1409 + } else { 1410 + callback = function (env) { 1411 + var element; 1412 + 1413 + if (typeof opts.onClick === 'function') { 1414 + element = document.createElement('button'); 1415 + element.type = 'button'; 1416 + element.addEventListener('click', function () { 1417 + opts.onClick.call(this, env); 1418 + }); 1419 + } else if (typeof opts.url === 'string') { 1420 + element = document.createElement('a'); 1421 + element.href = opts.url; 1422 + } else { 1423 + element = document.createElement('span'); 1424 + } 1425 + 1426 + if (opts.className) { 1427 + element.classList.add(opts.className); 1428 + } 1429 + 1430 + element.textContent = opts.text; 1431 + 1432 + return element; 1433 + }; 1434 + } 1435 + 1436 + if (key in map) { 1437 + console.warn('There is a button with the key "' + key + '" registered already.'); 1438 + return; 1439 + } 1440 + 1441 + callbacks.push(map[key] = callback); 1442 + }; 1443 + 1444 + /** 1445 + * Returns the callback order of the given element. 1446 + * 1447 + * @param {HTMLElement} element 1448 + * @returns {string[] | undefined} 1449 + */ 1450 + function getOrder(element) { 1451 + while (element) { 1452 + var order = element.getAttribute('data-toolbar-order'); 1453 + if (order != null) { 1454 + order = order.trim(); 1455 + if (order.length) { 1456 + return order.split(/\s*,\s*/g); 1457 + } else { 1458 + return []; 1459 + } 1460 + } 1461 + element = element.parentElement; 1462 + } 1463 + } 1464 + 1465 + /** 1466 + * Post-highlight Prism hook callback. 1467 + * 1468 + * @param env 1469 + */ 1470 + var hook = Prism.plugins.toolbar.hook = function (env) { 1471 + // Check if inline or actual code block (credit to line-numbers plugin) 1472 + var pre = env.element.parentNode; 1473 + if (!pre || !/pre/i.test(pre.nodeName)) { 1474 + return; 1475 + } 1476 + 1477 + // Autoloader rehighlights, so only do this once. 1478 + if (pre.parentNode.classList.contains('code-toolbar')) { 1479 + return; 1480 + } 1481 + 1482 + // Create wrapper for <pre> to prevent scrolling toolbar with content 1483 + var wrapper = document.createElement('div'); 1484 + wrapper.classList.add('code-toolbar'); 1485 + pre.parentNode.insertBefore(wrapper, pre); 1486 + wrapper.appendChild(pre); 1487 + 1488 + // Setup the toolbar 1489 + var toolbar = document.createElement('div'); 1490 + toolbar.classList.add('toolbar'); 1491 + 1492 + // order callbacks 1493 + var elementCallbacks = callbacks; 1494 + var order = getOrder(env.element); 1495 + if (order) { 1496 + elementCallbacks = order.map(function (key) { 1497 + return map[key] || noop; 1498 + }); 1499 + } 1500 + 1501 + elementCallbacks.forEach(function (callback) { 1502 + var element = callback(env); 1503 + 1504 + if (!element) { 1505 + return; 1506 + } 1507 + 1508 + var item = document.createElement('div'); 1509 + item.classList.add('toolbar-item'); 1510 + 1511 + item.appendChild(element); 1512 + toolbar.appendChild(item); 1513 + }); 1514 + 1515 + // Add our toolbar to the currently created wrapper of <pre> tag 1516 + wrapper.appendChild(toolbar); 1517 + }; 1518 + 1519 + registerButton('label', function (env) { 1520 + var pre = env.element.parentNode; 1521 + if (!pre || !/pre/i.test(pre.nodeName)) { 1522 + return; 1523 + } 1524 + 1525 + if (!pre.hasAttribute('data-label')) { 1526 + return; 1527 + } 1528 + 1529 + var element; var template; 1530 + var text = pre.getAttribute('data-label'); 1531 + try { 1532 + // Any normal text will blow up this selector. 1533 + template = document.querySelector('template#' + text); 1534 + } catch (e) { /* noop */ } 1535 + 1536 + if (template) { 1537 + element = template.content; 1538 + } else { 1539 + if (pre.hasAttribute('data-url')) { 1540 + element = document.createElement('a'); 1541 + element.href = pre.getAttribute('data-url'); 1542 + } else { 1543 + element = document.createElement('span'); 1544 + } 1545 + 1546 + element.textContent = text; 1547 + } 1548 + 1549 + return element; 1550 + }); 1551 + 1552 + /** 1553 + * Register the toolbar with Prism. 1554 + */ 1555 + Prism.hooks.add('complete', hook); 1556 + }()); 1557 + 1558 + (function () { 1559 + 1560 + if (typeof Prism === 'undefined' || typeof document === 'undefined') { 1561 + return; 1562 + } 1563 + 1564 + if (!Prism.plugins.toolbar) { 1565 + console.warn('Show Languages plugin loaded before Toolbar plugin.'); 1566 + 1567 + return; 1568 + } 1569 + 1570 + /* eslint-disable */ 1571 + 1572 + // The languages map is built automatically with gulp 1573 + var Languages = /*languages_placeholder[*/{ 1574 + "none": "Plain text", 1575 + "plain": "Plain text", 1576 + "plaintext": "Plain text", 1577 + "text": "Plain text", 1578 + "txt": "Plain text", 1579 + "html": "HTML", 1580 + "xml": "XML", 1581 + "svg": "SVG", 1582 + "mathml": "MathML", 1583 + "ssml": "SSML", 1584 + "rss": "RSS", 1585 + "css": "CSS", 1586 + "clike": "C-like", 1587 + "js": "JavaScript", 1588 + "abap": "ABAP", 1589 + "abnf": "ABNF", 1590 + "al": "AL", 1591 + "antlr4": "ANTLR4", 1592 + "g4": "ANTLR4", 1593 + "apacheconf": "Apache Configuration", 1594 + "apl": "APL", 1595 + "aql": "AQL", 1596 + "ino": "Arduino", 1597 + "arff": "ARFF", 1598 + "armasm": "ARM Assembly", 1599 + "arm-asm": "ARM Assembly", 1600 + "art": "Arturo", 1601 + "asciidoc": "AsciiDoc", 1602 + "adoc": "AsciiDoc", 1603 + "aspnet": "ASP.NET (C#)", 1604 + "asm6502": "6502 Assembly", 1605 + "asmatmel": "Atmel AVR Assembly", 1606 + "autohotkey": "AutoHotkey", 1607 + "autoit": "AutoIt", 1608 + "avisynth": "AviSynth", 1609 + "avs": "AviSynth", 1610 + "avro-idl": "Avro IDL", 1611 + "avdl": "Avro IDL", 1612 + "awk": "AWK", 1613 + "gawk": "GAWK", 1614 + "sh": "Shell", 1615 + "basic": "BASIC", 1616 + "bbcode": "BBcode", 1617 + "bbj": "BBj", 1618 + "bnf": "BNF", 1619 + "rbnf": "RBNF", 1620 + "bqn": "BQN", 1621 + "bsl": "BSL (1C:Enterprise)", 1622 + "oscript": "OneScript", 1623 + "csharp": "C#", 1624 + "cs": "C#", 1625 + "dotnet": "C#", 1626 + "cpp": "C++", 1627 + "cfscript": "CFScript", 1628 + "cfc": "CFScript", 1629 + "cil": "CIL", 1630 + "cilkc": "Cilk/C", 1631 + "cilk-c": "Cilk/C", 1632 + "cilkcpp": "Cilk/C++", 1633 + "cilk-cpp": "Cilk/C++", 1634 + "cilk": "Cilk/C++", 1635 + "cmake": "CMake", 1636 + "cobol": "COBOL", 1637 + "coffee": "CoffeeScript", 1638 + "conc": "Concurnas", 1639 + "csp": "Content-Security-Policy", 1640 + "css-extras": "CSS Extras", 1641 + "csv": "CSV", 1642 + "cue": "CUE", 1643 + "dataweave": "DataWeave", 1644 + "dax": "DAX", 1645 + "django": "Django/Jinja2", 1646 + "jinja2": "Django/Jinja2", 1647 + "dns-zone-file": "DNS zone file", 1648 + "dns-zone": "DNS zone file", 1649 + "dockerfile": "Docker", 1650 + "dot": "DOT (Graphviz)", 1651 + "gv": "DOT (Graphviz)", 1652 + "ebnf": "EBNF", 1653 + "editorconfig": "EditorConfig", 1654 + "ejs": "EJS", 1655 + "etlua": "Embedded Lua templating", 1656 + "erb": "ERB", 1657 + "excel-formula": "Excel Formula", 1658 + "xlsx": "Excel Formula", 1659 + "xls": "Excel Formula", 1660 + "fsharp": "F#", 1661 + "firestore-security-rules": "Firestore security rules", 1662 + "ftl": "FreeMarker Template Language", 1663 + "gml": "GameMaker Language", 1664 + "gamemakerlanguage": "GameMaker Language", 1665 + "gap": "GAP (CAS)", 1666 + "gcode": "G-code", 1667 + "gdscript": "GDScript", 1668 + "gedcom": "GEDCOM", 1669 + "gettext": "gettext", 1670 + "po": "gettext", 1671 + "glsl": "GLSL", 1672 + "gn": "GN", 1673 + "gni": "GN", 1674 + "linker-script": "GNU Linker Script", 1675 + "ld": "GNU Linker Script", 1676 + "go-module": "Go module", 1677 + "go-mod": "Go module", 1678 + "graphql": "GraphQL", 1679 + "hbs": "Handlebars", 1680 + "hs": "Haskell", 1681 + "hcl": "HCL", 1682 + "hlsl": "HLSL", 1683 + "http": "HTTP", 1684 + "hpkp": "HTTP Public-Key-Pins", 1685 + "hsts": "HTTP Strict-Transport-Security", 1686 + "ichigojam": "IchigoJam", 1687 + "icu-message-format": "ICU Message Format", 1688 + "idr": "Idris", 1689 + "ignore": ".ignore", 1690 + "gitignore": ".gitignore", 1691 + "hgignore": ".hgignore", 1692 + "npmignore": ".npmignore", 1693 + "inform7": "Inform 7", 1694 + "javadoc": "JavaDoc", 1695 + "javadoclike": "JavaDoc-like", 1696 + "javastacktrace": "Java stack trace", 1697 + "jq": "JQ", 1698 + "jsdoc": "JSDoc", 1699 + "js-extras": "JS Extras", 1700 + "json": "JSON", 1701 + "webmanifest": "Web App Manifest", 1702 + "json5": "JSON5", 1703 + "jsonp": "JSONP", 1704 + "jsstacktrace": "JS stack trace", 1705 + "js-templates": "JS Templates", 1706 + "keepalived": "Keepalived Configure", 1707 + "kts": "Kotlin Script", 1708 + "kt": "Kotlin", 1709 + "kumir": "KuMir (КуМир)", 1710 + "kum": "KuMir (КуМир)", 1711 + "latex": "LaTeX", 1712 + "tex": "TeX", 1713 + "context": "ConTeXt", 1714 + "lilypond": "LilyPond", 1715 + "ly": "LilyPond", 1716 + "emacs": "Lisp", 1717 + "elisp": "Lisp", 1718 + "emacs-lisp": "Lisp", 1719 + "llvm": "LLVM IR", 1720 + "log": "Log file", 1721 + "lolcode": "LOLCODE", 1722 + "magma": "Magma (CAS)", 1723 + "md": "Markdown", 1724 + "markup-templating": "Markup templating", 1725 + "matlab": "MATLAB", 1726 + "maxscript": "MAXScript", 1727 + "mel": "MEL", 1728 + "metafont": "METAFONT", 1729 + "mongodb": "MongoDB", 1730 + "moon": "MoonScript", 1731 + "n1ql": "N1QL", 1732 + "n4js": "N4JS", 1733 + "n4jsd": "N4JS", 1734 + "nand2tetris-hdl": "Nand To Tetris HDL", 1735 + "naniscript": "Naninovel Script", 1736 + "nani": "Naninovel Script", 1737 + "nasm": "NASM", 1738 + "neon": "NEON", 1739 + "nginx": "nginx", 1740 + "nsis": "NSIS", 1741 + "objectivec": "Objective-C", 1742 + "objc": "Objective-C", 1743 + "ocaml": "OCaml", 1744 + "opencl": "OpenCL", 1745 + "openqasm": "OpenQasm", 1746 + "qasm": "OpenQasm", 1747 + "parigp": "PARI/GP", 1748 + "objectpascal": "Object Pascal", 1749 + "psl": "PATROL Scripting Language", 1750 + "pcaxis": "PC-Axis", 1751 + "px": "PC-Axis", 1752 + "peoplecode": "PeopleCode", 1753 + "pcode": "PeopleCode", 1754 + "php": "PHP", 1755 + "phpdoc": "PHPDoc", 1756 + "php-extras": "PHP Extras", 1757 + "plant-uml": "PlantUML", 1758 + "plantuml": "PlantUML", 1759 + "plsql": "PL/SQL", 1760 + "powerquery": "PowerQuery", 1761 + "pq": "PowerQuery", 1762 + "mscript": "PowerQuery", 1763 + "powershell": "PowerShell", 1764 + "promql": "PromQL", 1765 + "properties": ".properties", 1766 + "protobuf": "Protocol Buffers", 1767 + "purebasic": "PureBasic", 1768 + "pbfasm": "PureBasic", 1769 + "purs": "PureScript", 1770 + "py": "Python", 1771 + "qsharp": "Q#", 1772 + "qs": "Q#", 1773 + "q": "Q (kdb+ database)", 1774 + "qml": "QML", 1775 + "rkt": "Racket", 1776 + "cshtml": "Razor C#", 1777 + "razor": "Razor C#", 1778 + "jsx": "React JSX", 1779 + "tsx": "React TSX", 1780 + "renpy": "Ren'py", 1781 + "rpy": "Ren'py", 1782 + "res": "ReScript", 1783 + "rest": "reST (reStructuredText)", 1784 + "robotframework": "Robot Framework", 1785 + "robot": "Robot Framework", 1786 + "rb": "Ruby", 1787 + "sas": "SAS", 1788 + "sass": "Sass (Sass)", 1789 + "scss": "Sass (SCSS)", 1790 + "shell-session": "Shell session", 1791 + "sh-session": "Shell session", 1792 + "shellsession": "Shell session", 1793 + "sml": "SML", 1794 + "smlnj": "SML/NJ", 1795 + "solidity": "Solidity (Ethereum)", 1796 + "sol": "Solidity (Ethereum)", 1797 + "solution-file": "Solution file", 1798 + "sln": "Solution file", 1799 + "soy": "Soy (Closure Template)", 1800 + "sparql": "SPARQL", 1801 + "rq": "SPARQL", 1802 + "splunk-spl": "Splunk SPL", 1803 + "sqf": "SQF: Status Quo Function (Arma 3)", 1804 + "sql": "SQL", 1805 + "stata": "Stata Ado", 1806 + "iecst": "Structured Text (IEC 61131-3)", 1807 + "supercollider": "SuperCollider", 1808 + "sclang": "SuperCollider", 1809 + "systemd": "Systemd configuration file", 1810 + "t4-templating": "T4 templating", 1811 + "t4-cs": "T4 Text Templates (C#)", 1812 + "t4": "T4 Text Templates (C#)", 1813 + "t4-vb": "T4 Text Templates (VB)", 1814 + "tap": "TAP", 1815 + "tt2": "Template Toolkit 2", 1816 + "toml": "TOML", 1817 + "trickle": "trickle", 1818 + "troy": "troy", 1819 + "trig": "TriG", 1820 + "ts": "TypeScript", 1821 + "tsconfig": "TSConfig", 1822 + "uscript": "UnrealScript", 1823 + "uc": "UnrealScript", 1824 + "uorazor": "UO Razor Script", 1825 + "uri": "URI", 1826 + "url": "URL", 1827 + "vbnet": "VB.Net", 1828 + "vhdl": "VHDL", 1829 + "vim": "vim", 1830 + "visual-basic": "Visual Basic", 1831 + "vba": "VBA", 1832 + "vb": "Visual Basic", 1833 + "wasm": "WebAssembly", 1834 + "web-idl": "Web IDL", 1835 + "webidl": "Web IDL", 1836 + "wgsl": "WGSL", 1837 + "wiki": "Wiki markup", 1838 + "wolfram": "Wolfram language", 1839 + "nb": "Mathematica Notebook", 1840 + "wl": "Wolfram language", 1841 + "xeoracube": "XeoraCube", 1842 + "xml-doc": "XML doc (.net)", 1843 + "xojo": "Xojo (REALbasic)", 1844 + "xquery": "XQuery", 1845 + "yaml": "YAML", 1846 + "yml": "YAML", 1847 + "yang": "YANG" 1848 + }/*]*/; 1849 + 1850 + /* eslint-enable */ 1851 + 1852 + Prism.plugins.toolbar.registerButton('show-language', function (env) { 1853 + var pre = env.element.parentNode; 1854 + if (!pre || !/pre/i.test(pre.nodeName)) { 1855 + return; 1856 + } 1857 + 1858 + /** 1859 + * Tries to guess the name of a language given its id. 1860 + * 1861 + * @param {string} id The language id. 1862 + * @returns {string} 1863 + */ 1864 + function guessTitle(id) { 1865 + if (!id) { 1866 + return id; 1867 + } 1868 + return (id.substring(0, 1).toUpperCase() + id.substring(1)).replace(/s(?=cript)/, 'S'); 1869 + } 1870 + 1871 + var language = pre.getAttribute('data-language') || Languages[env.language] || guessTitle(env.language); 1872 + 1873 + if (!language) { 1874 + return; 1875 + } 1876 + var element = document.createElement('span'); 1877 + element.textContent = language; 1878 + 1879 + return element; 1880 + }); 1881 + 1882 + }()); 1883 + 1884 + (function () { 1885 + 1886 + if (typeof Prism === 'undefined' || typeof document === 'undefined') { 1887 + return; 1888 + } 1889 + 1890 + /* eslint-disable */ 1891 + 1892 + /** 1893 + * The dependencies map is built automatically with gulp. 1894 + * 1895 + * @type {Object<string, string | string[]>} 1896 + */ 1897 + var lang_dependencies = /*dependencies_placeholder[*/{ 1898 + "javascript": "clike", 1899 + "actionscript": "javascript", 1900 + "apex": [ 1901 + "clike", 1902 + "sql" 1903 + ], 1904 + "arduino": "cpp", 1905 + "aspnet": [ 1906 + "markup", 1907 + "csharp" 1908 + ], 1909 + "birb": "clike", 1910 + "bison": "c", 1911 + "c": "clike", 1912 + "csharp": "clike", 1913 + "cpp": "c", 1914 + "cfscript": "clike", 1915 + "chaiscript": [ 1916 + "clike", 1917 + "cpp" 1918 + ], 1919 + "cilkc": "c", 1920 + "cilkcpp": "cpp", 1921 + "coffeescript": "javascript", 1922 + "crystal": "ruby", 1923 + "css-extras": "css", 1924 + "d": "clike", 1925 + "dart": "clike", 1926 + "django": "markup-templating", 1927 + "ejs": [ 1928 + "javascript", 1929 + "markup-templating" 1930 + ], 1931 + "etlua": [ 1932 + "lua", 1933 + "markup-templating" 1934 + ], 1935 + "erb": [ 1936 + "ruby", 1937 + "markup-templating" 1938 + ], 1939 + "fsharp": "clike", 1940 + "firestore-security-rules": "clike", 1941 + "flow": "javascript", 1942 + "ftl": "markup-templating", 1943 + "gml": "clike", 1944 + "glsl": "c", 1945 + "go": "clike", 1946 + "gradle": "clike", 1947 + "groovy": "clike", 1948 + "haml": "ruby", 1949 + "handlebars": "markup-templating", 1950 + "haxe": "clike", 1951 + "hlsl": "c", 1952 + "idris": "haskell", 1953 + "java": "clike", 1954 + "javadoc": [ 1955 + "markup", 1956 + "java", 1957 + "javadoclike" 1958 + ], 1959 + "jolie": "clike", 1960 + "jsdoc": [ 1961 + "javascript", 1962 + "javadoclike", 1963 + "typescript" 1964 + ], 1965 + "js-extras": "javascript", 1966 + "json5": "json", 1967 + "jsonp": "json", 1968 + "js-templates": "javascript", 1969 + "kotlin": "clike", 1970 + "latte": [ 1971 + "clike", 1972 + "markup-templating", 1973 + "php" 1974 + ], 1975 + "less": "css", 1976 + "lilypond": "scheme", 1977 + "liquid": "markup-templating", 1978 + "markdown": "markup", 1979 + "markup-templating": "markup", 1980 + "mongodb": "javascript", 1981 + "n4js": "javascript", 1982 + "objectivec": "c", 1983 + "opencl": "c", 1984 + "parser": "markup", 1985 + "php": "markup-templating", 1986 + "phpdoc": [ 1987 + "php", 1988 + "javadoclike" 1989 + ], 1990 + "php-extras": "php", 1991 + "plsql": "sql", 1992 + "processing": "clike", 1993 + "protobuf": "clike", 1994 + "pug": [ 1995 + "markup", 1996 + "javascript" 1997 + ], 1998 + "purebasic": "clike", 1999 + "purescript": "haskell", 2000 + "qsharp": "clike", 2001 + "qml": "javascript", 2002 + "qore": "clike", 2003 + "racket": "scheme", 2004 + "cshtml": [ 2005 + "markup", 2006 + "csharp" 2007 + ], 2008 + "jsx": [ 2009 + "markup", 2010 + "javascript" 2011 + ], 2012 + "tsx": [ 2013 + "jsx", 2014 + "typescript" 2015 + ], 2016 + "reason": "clike", 2017 + "ruby": "clike", 2018 + "sass": "css", 2019 + "scss": "css", 2020 + "scala": "java", 2021 + "shell-session": "bash", 2022 + "smarty": "markup-templating", 2023 + "solidity": "clike", 2024 + "soy": "markup-templating", 2025 + "sparql": "turtle", 2026 + "sqf": "clike", 2027 + "squirrel": "clike", 2028 + "stata": [ 2029 + "mata", 2030 + "java", 2031 + "python" 2032 + ], 2033 + "t4-cs": [ 2034 + "t4-templating", 2035 + "csharp" 2036 + ], 2037 + "t4-vb": [ 2038 + "t4-templating", 2039 + "vbnet" 2040 + ], 2041 + "tap": "yaml", 2042 + "tt2": [ 2043 + "clike", 2044 + "markup-templating" 2045 + ], 2046 + "textile": "markup", 2047 + "twig": "markup-templating", 2048 + "typescript": "javascript", 2049 + "v": "clike", 2050 + "vala": "clike", 2051 + "vbnet": "basic", 2052 + "velocity": "markup", 2053 + "wiki": "markup", 2054 + "xeora": "markup", 2055 + "xml-doc": "markup", 2056 + "xquery": "markup" 2057 + }/*]*/; 2058 + 2059 + var lang_aliases = /*aliases_placeholder[*/{ 2060 + "html": "markup", 2061 + "xml": "markup", 2062 + "svg": "markup", 2063 + "mathml": "markup", 2064 + "ssml": "markup", 2065 + "atom": "markup", 2066 + "rss": "markup", 2067 + "js": "javascript", 2068 + "g4": "antlr4", 2069 + "ino": "arduino", 2070 + "arm-asm": "armasm", 2071 + "art": "arturo", 2072 + "adoc": "asciidoc", 2073 + "avs": "avisynth", 2074 + "avdl": "avro-idl", 2075 + "gawk": "awk", 2076 + "sh": "bash", 2077 + "shell": "bash", 2078 + "shortcode": "bbcode", 2079 + "rbnf": "bnf", 2080 + "oscript": "bsl", 2081 + "cs": "csharp", 2082 + "dotnet": "csharp", 2083 + "cfc": "cfscript", 2084 + "cilk-c": "cilkc", 2085 + "cilk-cpp": "cilkcpp", 2086 + "cilk": "cilkcpp", 2087 + "coffee": "coffeescript", 2088 + "conc": "concurnas", 2089 + "jinja2": "django", 2090 + "dns-zone": "dns-zone-file", 2091 + "dockerfile": "docker", 2092 + "gv": "dot", 2093 + "eta": "ejs", 2094 + "xlsx": "excel-formula", 2095 + "xls": "excel-formula", 2096 + "gamemakerlanguage": "gml", 2097 + "po": "gettext", 2098 + "gni": "gn", 2099 + "ld": "linker-script", 2100 + "go-mod": "go-module", 2101 + "hbs": "handlebars", 2102 + "mustache": "handlebars", 2103 + "hs": "haskell", 2104 + "idr": "idris", 2105 + "gitignore": "ignore", 2106 + "hgignore": "ignore", 2107 + "npmignore": "ignore", 2108 + "webmanifest": "json", 2109 + "kt": "kotlin", 2110 + "kts": "kotlin", 2111 + "kum": "kumir", 2112 + "tex": "latex", 2113 + "context": "latex", 2114 + "ly": "lilypond", 2115 + "emacs": "lisp", 2116 + "elisp": "lisp", 2117 + "emacs-lisp": "lisp", 2118 + "md": "markdown", 2119 + "moon": "moonscript", 2120 + "n4jsd": "n4js", 2121 + "nani": "naniscript", 2122 + "objc": "objectivec", 2123 + "qasm": "openqasm", 2124 + "objectpascal": "pascal", 2125 + "px": "pcaxis", 2126 + "pcode": "peoplecode", 2127 + "plantuml": "plant-uml", 2128 + "pq": "powerquery", 2129 + "mscript": "powerquery", 2130 + "pbfasm": "purebasic", 2131 + "purs": "purescript", 2132 + "py": "python", 2133 + "qs": "qsharp", 2134 + "rkt": "racket", 2135 + "razor": "cshtml", 2136 + "rpy": "renpy", 2137 + "res": "rescript", 2138 + "robot": "robotframework", 2139 + "rb": "ruby", 2140 + "sh-session": "shell-session", 2141 + "shellsession": "shell-session", 2142 + "smlnj": "sml", 2143 + "sol": "solidity", 2144 + "sln": "solution-file", 2145 + "rq": "sparql", 2146 + "sclang": "supercollider", 2147 + "t4": "t4-cs", 2148 + "trickle": "tremor", 2149 + "troy": "tremor", 2150 + "trig": "turtle", 2151 + "ts": "typescript", 2152 + "tsconfig": "typoscript", 2153 + "uscript": "unrealscript", 2154 + "uc": "unrealscript", 2155 + "url": "uri", 2156 + "vb": "visual-basic", 2157 + "vba": "visual-basic", 2158 + "webidl": "web-idl", 2159 + "mathematica": "wolfram", 2160 + "nb": "wolfram", 2161 + "wl": "wolfram", 2162 + "xeoracube": "xeora", 2163 + "yml": "yaml" 2164 + }/*]*/; 2165 + 2166 + /* eslint-enable */ 2167 + 2168 + /** 2169 + * @typedef LangDataItem 2170 + * @property {{ success?: () => void, error?: () => void }[]} callbacks 2171 + * @property {boolean} [error] 2172 + * @property {boolean} [loading] 2173 + */ 2174 + /** @type {Object<string, LangDataItem>} */ 2175 + var lang_data = {}; 2176 + 2177 + var ignored_language = 'none'; 2178 + var languages_path = 'components/'; 2179 + 2180 + var script = Prism.util.currentScript(); 2181 + if (script) { 2182 + var autoloaderFile = /\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i; 2183 + var prismFile = /(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i; 2184 + 2185 + var autoloaderPath = script.getAttribute('data-autoloader-path'); 2186 + if (autoloaderPath != null) { 2187 + // data-autoloader-path is set, so just use it 2188 + languages_path = autoloaderPath.trim().replace(/\/?$/, '/'); 2189 + } else { 2190 + var src = script.src; 2191 + if (autoloaderFile.test(src)) { 2192 + // the script is the original autoloader script in the usual Prism project structure 2193 + languages_path = src.replace(autoloaderFile, 'components/'); 2194 + } else if (prismFile.test(src)) { 2195 + // the script is part of a bundle like a custom prism.js from the download page 2196 + languages_path = src.replace(prismFile, '$1components/'); 2197 + } 2198 + } 2199 + } 2200 + 2201 + var config = Prism.plugins.autoloader = { 2202 + languages_path: languages_path, 2203 + use_minified: true, 2204 + loadLanguages: loadLanguages 2205 + }; 2206 + 2207 + 2208 + /** 2209 + * Lazily loads an external script. 2210 + * 2211 + * @param {string} src 2212 + * @param {() => void} [success] 2213 + * @param {() => void} [error] 2214 + */ 2215 + function addScript(src, success, error) { 2216 + var s = document.createElement('script'); 2217 + s.src = src; 2218 + s.async = true; 2219 + s.onload = function () { 2220 + document.body.removeChild(s); 2221 + success && success(); 2222 + }; 2223 + s.onerror = function () { 2224 + document.body.removeChild(s); 2225 + error && error(); 2226 + }; 2227 + document.body.appendChild(s); 2228 + } 2229 + 2230 + /** 2231 + * Returns all additional dependencies of the given element defined by the `data-dependencies` attribute. 2232 + * 2233 + * @param {Element} element 2234 + * @returns {string[]} 2235 + */ 2236 + function getDependencies(element) { 2237 + var deps = (element.getAttribute('data-dependencies') || '').trim(); 2238 + if (!deps) { 2239 + var parent = element.parentElement; 2240 + if (parent && parent.tagName.toLowerCase() === 'pre') { 2241 + deps = (parent.getAttribute('data-dependencies') || '').trim(); 2242 + } 2243 + } 2244 + return deps ? deps.split(/\s*,\s*/g) : []; 2245 + } 2246 + 2247 + /** 2248 + * Returns whether the given language is currently loaded. 2249 + * 2250 + * @param {string} lang 2251 + * @returns {boolean} 2252 + */ 2253 + function isLoaded(lang) { 2254 + if (lang.indexOf('!') >= 0) { 2255 + // forced reload 2256 + return false; 2257 + } 2258 + 2259 + lang = lang_aliases[lang] || lang; // resolve alias 2260 + 2261 + if (lang in Prism.languages) { 2262 + // the given language is already loaded 2263 + return true; 2264 + } 2265 + 2266 + // this will catch extensions like CSS extras that don't add a grammar to Prism.languages 2267 + var data = lang_data[lang]; 2268 + return data && !data.error && data.loading === false; 2269 + } 2270 + 2271 + /** 2272 + * Returns the path to a grammar, using the language_path and use_minified config keys. 2273 + * 2274 + * @param {string} lang 2275 + * @returns {string} 2276 + */ 2277 + function getLanguagePath(lang) { 2278 + return config.languages_path + 'prism-' + lang + (config.use_minified ? '.min' : '') + '.js'; 2279 + } 2280 + 2281 + /** 2282 + * Loads all given grammars concurrently. 2283 + * 2284 + * @param {string[]|string} languages 2285 + * @param {(languages: string[]) => void} [success] 2286 + * @param {(language: string) => void} [error] This callback will be invoked on the first language to fail. 2287 + */ 2288 + function loadLanguages(languages, success, error) { 2289 + if (typeof languages === 'string') { 2290 + languages = [languages]; 2291 + } 2292 + 2293 + var total = languages.length; 2294 + var completed = 0; 2295 + var failed = false; 2296 + 2297 + if (total === 0) { 2298 + if (success) { 2299 + setTimeout(success, 0); 2300 + } 2301 + return; 2302 + } 2303 + 2304 + function successCallback() { 2305 + if (failed) { 2306 + return; 2307 + } 2308 + completed++; 2309 + if (completed === total) { 2310 + success && success(languages); 2311 + } 2312 + } 2313 + 2314 + languages.forEach(function (lang) { 2315 + loadLanguage(lang, successCallback, function () { 2316 + if (failed) { 2317 + return; 2318 + } 2319 + failed = true; 2320 + error && error(lang); 2321 + }); 2322 + }); 2323 + } 2324 + 2325 + /** 2326 + * Loads a grammar with its dependencies. 2327 + * 2328 + * @param {string} lang 2329 + * @param {() => void} [success] 2330 + * @param {() => void} [error] 2331 + */ 2332 + function loadLanguage(lang, success, error) { 2333 + var force = lang.indexOf('!') >= 0; 2334 + 2335 + lang = lang.replace('!', ''); 2336 + lang = lang_aliases[lang] || lang; 2337 + 2338 + function load() { 2339 + var data = lang_data[lang]; 2340 + if (!data) { 2341 + data = lang_data[lang] = { 2342 + callbacks: [] 2343 + }; 2344 + } 2345 + data.callbacks.push({ 2346 + success: success, 2347 + error: error 2348 + }); 2349 + 2350 + if (!force && isLoaded(lang)) { 2351 + // the language is already loaded and we aren't forced to reload 2352 + languageCallback(lang, 'success'); 2353 + } else if (!force && data.error) { 2354 + // the language failed to load before and we don't reload 2355 + languageCallback(lang, 'error'); 2356 + } else if (force || !data.loading) { 2357 + // the language isn't currently loading and/or we are forced to reload 2358 + data.loading = true; 2359 + data.error = false; 2360 + 2361 + addScript(getLanguagePath(lang), function () { 2362 + data.loading = false; 2363 + languageCallback(lang, 'success'); 2364 + 2365 + }, function () { 2366 + data.loading = false; 2367 + data.error = true; 2368 + languageCallback(lang, 'error'); 2369 + }); 2370 + } 2371 + } 2372 + 2373 + var dependencies = lang_dependencies[lang]; 2374 + if (dependencies && dependencies.length) { 2375 + loadLanguages(dependencies, load, error); 2376 + } else { 2377 + load(); 2378 + } 2379 + } 2380 + 2381 + /** 2382 + * Runs all callbacks of the given type for the given language. 2383 + * 2384 + * @param {string} lang 2385 + * @param {"success" | "error"} type 2386 + */ 2387 + function languageCallback(lang, type) { 2388 + if (lang_data[lang]) { 2389 + var callbacks = lang_data[lang].callbacks; 2390 + for (var i = 0, l = callbacks.length; i < l; i++) { 2391 + var callback = callbacks[i][type]; 2392 + if (callback) { 2393 + setTimeout(callback, 0); 2394 + } 2395 + } 2396 + callbacks.length = 0; 2397 + } 2398 + } 2399 + 2400 + Prism.hooks.add('complete', function (env) { 2401 + var element = env.element; 2402 + var language = env.language; 2403 + if (!element || !language || language === ignored_language) { 2404 + return; 2405 + } 2406 + 2407 + var deps = getDependencies(element); 2408 + if (/^diff-./i.test(language)) { 2409 + // the "diff-xxxx" format is used by the Diff Highlight plugin 2410 + deps.push('diff'); 2411 + deps.push(language.substr('diff-'.length)); 2412 + } else { 2413 + deps.push(language); 2414 + } 2415 + 2416 + if (!deps.every(isLoaded)) { 2417 + // the language or some dependencies aren't loaded 2418 + loadLanguages(deps, function () { 2419 + Prism.highlightElement(element); 2420 + }); 2421 + } 2422 + }); 2423 + 2424 + }()); 2425 + 2426 + (function () { 2427 + 2428 + if (typeof Prism === 'undefined' || typeof document === 'undefined') { 2429 + return; 2430 + } 2431 + 2432 + if (!Prism.plugins.toolbar) { 2433 + console.warn('Copy to Clipboard plugin loaded before Toolbar plugin.'); 2434 + 2435 + return; 2436 + } 2437 + 2438 + /** 2439 + * When the given elements is clicked by the user, the given text will be copied to clipboard. 2440 + * 2441 + * @param {HTMLElement} element 2442 + * @param {CopyInfo} copyInfo 2443 + * 2444 + * @typedef CopyInfo 2445 + * @property {() => string} getText 2446 + * @property {() => void} success 2447 + * @property {(reason: unknown) => void} error 2448 + */ 2449 + function registerClipboard(element, copyInfo) { 2450 + element.addEventListener('click', function () { 2451 + copyTextToClipboard(copyInfo); 2452 + }); 2453 + } 2454 + 2455 + // https://stackoverflow.com/a/30810322/7595472 2456 + 2457 + /** @param {CopyInfo} copyInfo */ 2458 + function fallbackCopyTextToClipboard(copyInfo) { 2459 + var textArea = document.createElement('textarea'); 2460 + textArea.value = copyInfo.getText(); 2461 + 2462 + // Avoid scrolling to bottom 2463 + textArea.style.top = '0'; 2464 + textArea.style.left = '0'; 2465 + textArea.style.position = 'fixed'; 2466 + 2467 + document.body.appendChild(textArea); 2468 + textArea.focus(); 2469 + textArea.select(); 2470 + 2471 + try { 2472 + var successful = document.execCommand('copy'); 2473 + setTimeout(function () { 2474 + if (successful) { 2475 + copyInfo.success(); 2476 + } else { 2477 + copyInfo.error(); 2478 + } 2479 + }, 1); 2480 + } catch (err) { 2481 + setTimeout(function () { 2482 + copyInfo.error(err); 2483 + }, 1); 2484 + } 2485 + 2486 + document.body.removeChild(textArea); 2487 + } 2488 + /** @param {CopyInfo} copyInfo */ 2489 + function copyTextToClipboard(copyInfo) { 2490 + if (navigator.clipboard) { 2491 + navigator.clipboard.writeText(copyInfo.getText()).then(copyInfo.success, function () { 2492 + // try the fallback in case `writeText` didn't work 2493 + fallbackCopyTextToClipboard(copyInfo); 2494 + }); 2495 + } else { 2496 + fallbackCopyTextToClipboard(copyInfo); 2497 + } 2498 + } 2499 + 2500 + /** 2501 + * Selects the text content of the given element. 2502 + * 2503 + * @param {Element} element 2504 + */ 2505 + function selectElementText(element) { 2506 + // https://stackoverflow.com/a/20079910/7595472 2507 + window.getSelection().selectAllChildren(element); 2508 + } 2509 + 2510 + /** 2511 + * Traverses up the DOM tree to find data attributes that override the default plugin settings. 2512 + * 2513 + * @param {Element} startElement An element to start from. 2514 + * @returns {Settings} The plugin settings. 2515 + * @typedef {Record<"copy" | "copy-error" | "copy-success" | "copy-timeout", string | number>} Settings 2516 + */ 2517 + function getSettings(startElement) { 2518 + /** @type {Settings} */ 2519 + var settings = { 2520 + 'copy': 'Copy', 2521 + 'copy-error': 'Press Ctrl+C to copy', 2522 + 'copy-success': 'Copied!', 2523 + 'copy-timeout': 5000 2524 + }; 2525 + 2526 + var prefix = 'data-prismjs-'; 2527 + for (var key in settings) { 2528 + var attr = prefix + key; 2529 + var element = startElement; 2530 + while (element && !element.hasAttribute(attr)) { 2531 + element = element.parentElement; 2532 + } 2533 + if (element) { 2534 + settings[key] = element.getAttribute(attr); 2535 + } 2536 + } 2537 + return settings; 2538 + } 2539 + 2540 + Prism.plugins.toolbar.registerButton('copy-to-clipboard', function (env) { 2541 + var element = env.element; 2542 + 2543 + var settings = getSettings(element); 2544 + 2545 + var linkCopy = document.createElement('button'); 2546 + linkCopy.className = 'copy-to-clipboard-button'; 2547 + linkCopy.setAttribute('type', 'button'); 2548 + var linkSpan = document.createElement('span'); 2549 + linkCopy.appendChild(linkSpan); 2550 + 2551 + setState('copy'); 2552 + 2553 + registerClipboard(linkCopy, { 2554 + getText: function () { 2555 + return element.textContent; 2556 + }, 2557 + success: function () { 2558 + setState('copy-success'); 2559 + 2560 + resetText(); 2561 + }, 2562 + error: function () { 2563 + setState('copy-error'); 2564 + 2565 + setTimeout(function () { 2566 + selectElementText(element); 2567 + }, 1); 2568 + 2569 + resetText(); 2570 + } 2571 + }); 2572 + 2573 + return linkCopy; 2574 + 2575 + function resetText() { 2576 + setTimeout(function () { setState('copy'); }, settings['copy-timeout']); 2577 + } 2578 + 2579 + /** @param {"copy" | "copy-error" | "copy-success"} state */ 2580 + function setState(state) { 2581 + linkSpan.textContent = settings[state]; 2582 + linkCopy.setAttribute('data-copy-state', state); 2583 + } 2584 + }); 2585 + }()); 2586 + 2587 + (function () { 2588 + 2589 + if (typeof Prism === 'undefined') { 2590 + return; 2591 + } 2592 + 2593 + Prism.languages.treeview = { 2594 + 'treeview-part': { 2595 + pattern: /^.+/m, 2596 + inside: { 2597 + 'entry-line': [ 2598 + { 2599 + pattern: /\|-- |├── /, 2600 + alias: 'line-h' 2601 + }, 2602 + { 2603 + pattern: /\| {3}|│ {3}/, 2604 + alias: 'line-v' 2605 + }, 2606 + { 2607 + pattern: /`-- |└── /, 2608 + alias: 'line-v-last' 2609 + }, 2610 + { 2611 + pattern: / {4}/, 2612 + alias: 'line-v-gap' 2613 + } 2614 + ], 2615 + 'entry-name': { 2616 + pattern: /.*\S.*/, 2617 + inside: { 2618 + // symlink 2619 + 'operator': / -> /, 2620 + } 2621 + } 2622 + } 2623 + } 2624 + }; 2625 + 2626 + Prism.hooks.add('wrap', function (env) { 2627 + if (env.language === 'treeview' && env.type === 'entry-name') { 2628 + var classes = env.classes; 2629 + 2630 + var folderPattern = /(^|[^\\])\/\s*$/; 2631 + if (folderPattern.test(env.content)) { 2632 + // folder 2633 + 2634 + // remove trailing / 2635 + env.content = env.content.replace(folderPattern, '$1'); 2636 + classes.push('dir'); 2637 + } else { 2638 + // file 2639 + 2640 + // remove trailing file marker 2641 + env.content = env.content.replace(/(^|[^\\])[=*|]\s*$/, '$1'); 2642 + 2643 + var parts = env.content.toLowerCase().replace(/\s+/g, '').split('.'); 2644 + while (parts.length > 1) { 2645 + parts.shift(); 2646 + // Ex. 'foo.min.js' would become '<span class="token keyword ext-min-js ext-js">foo.min.js</span>' 2647 + classes.push('ext-' + parts.join('-')); 2648 + } 2649 + } 2650 + 2651 + if (env.content[0] === '.') { 2652 + classes.push('dotfile'); 2653 + } 2654 + } 2655 + }); 2656 + }()); 2657 +
+235
public/prism/prism-bash.js
··· 1 + (function (Prism) { 2 + // $ set | grep '^[A-Z][^[:space:]]*=' | cut -d= -f1 | tr '\n' '|' 3 + // + LC_ALL, RANDOM, REPLY, SECONDS. 4 + // + make sure PS1..4 are here as they are not always set, 5 + // - some useless things. 6 + var envVars = '\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b'; 7 + 8 + var commandAfterHeredoc = { 9 + pattern: /(^(["']?)\w+\2)[ \t]+\S.*/, 10 + lookbehind: true, 11 + alias: 'punctuation', // this looks reasonably well in all themes 12 + inside: null // see below 13 + }; 14 + 15 + var insideString = { 16 + 'bash': commandAfterHeredoc, 17 + 'environment': { 18 + pattern: RegExp('\\$' + envVars), 19 + alias: 'constant' 20 + }, 21 + 'variable': [ 22 + // [0]: Arithmetic Environment 23 + { 24 + pattern: /\$?\(\([\s\S]+?\)\)/, 25 + greedy: true, 26 + inside: { 27 + // If there is a $ sign at the beginning highlight $(( and )) as variable 28 + 'variable': [ 29 + { 30 + pattern: /(^\$\(\([\s\S]+)\)\)/, 31 + lookbehind: true 32 + }, 33 + /^\$\(\(/ 34 + ], 35 + 'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/, 36 + // Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic 37 + 'operator': /--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/, 38 + // If there is no $ sign at the beginning highlight (( and )) as punctuation 39 + 'punctuation': /\(\(?|\)\)?|,|;/ 40 + } 41 + }, 42 + // [1]: Command Substitution 43 + { 44 + pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/, 45 + greedy: true, 46 + inside: { 47 + 'variable': /^\$\(|^`|\)$|`$/ 48 + } 49 + }, 50 + // [2]: Brace expansion 51 + { 52 + pattern: /\$\{[^}]+\}/, 53 + greedy: true, 54 + inside: { 55 + 'operator': /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/, 56 + 'punctuation': /[\[\]]/, 57 + 'environment': { 58 + pattern: RegExp('(\\{)' + envVars), 59 + lookbehind: true, 60 + alias: 'constant' 61 + } 62 + } 63 + }, 64 + /\$(?:\w+|[#?*!@$])/ 65 + ], 66 + // Escape sequences from echo and printf's manuals, and escaped quotes. 67 + 'entity': /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/ 68 + }; 69 + 70 + Prism.languages.bash = { 71 + 'shebang': { 72 + pattern: /^#!\s*\/.*/, 73 + alias: 'important' 74 + }, 75 + 'comment': { 76 + pattern: /(^|[^"{\\$])#.*/, 77 + lookbehind: true 78 + }, 79 + 'function-name': [ 80 + // a) function foo { 81 + // b) foo() { 82 + // c) function foo() { 83 + // but not “foo {” 84 + { 85 + // a) and c) 86 + pattern: /(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/, 87 + lookbehind: true, 88 + alias: 'function' 89 + }, 90 + { 91 + // b) 92 + pattern: /\b[\w-]+(?=\s*\(\s*\)\s*\{)/, 93 + alias: 'function' 94 + } 95 + ], 96 + // Highlight variable names as variables in for and select beginnings. 97 + 'for-or-select': { 98 + pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/, 99 + alias: 'variable', 100 + lookbehind: true 101 + }, 102 + // Highlight variable names as variables in the left-hand part 103 + // of assignments (“=” and “+=”). 104 + 'assign-left': { 105 + pattern: /(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/, 106 + inside: { 107 + 'environment': { 108 + pattern: RegExp('(^|[\\s;|&]|[<>]\\()' + envVars), 109 + lookbehind: true, 110 + alias: 'constant' 111 + } 112 + }, 113 + alias: 'variable', 114 + lookbehind: true 115 + }, 116 + // Highlight parameter names as variables 117 + 'parameter': { 118 + pattern: /(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/, 119 + alias: 'variable', 120 + lookbehind: true 121 + }, 122 + 'string': [ 123 + // Support for Here-documents https://en.wikipedia.org/wiki/Here_document 124 + { 125 + pattern: /((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/, 126 + lookbehind: true, 127 + greedy: true, 128 + inside: insideString 129 + }, 130 + // Here-document with quotes around the tag 131 + // → No expansion (so no “inside”). 132 + { 133 + pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/, 134 + lookbehind: true, 135 + greedy: true, 136 + inside: { 137 + 'bash': commandAfterHeredoc 138 + } 139 + }, 140 + // “Normal” string 141 + { 142 + // https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html 143 + pattern: /(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/, 144 + lookbehind: true, 145 + greedy: true, 146 + inside: insideString 147 + }, 148 + { 149 + // https://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html 150 + pattern: /(^|[^$\\])'[^']*'/, 151 + lookbehind: true, 152 + greedy: true 153 + }, 154 + { 155 + // https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html 156 + pattern: /\$'(?:[^'\\]|\\[\s\S])*'/, 157 + greedy: true, 158 + inside: { 159 + 'entity': insideString.entity 160 + } 161 + } 162 + ], 163 + 'environment': { 164 + pattern: RegExp('\\$?' + envVars), 165 + alias: 'constant' 166 + }, 167 + 'variable': insideString.variable, 168 + 'function': { 169 + pattern: /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/, 170 + lookbehind: true 171 + }, 172 + 'keyword': { 173 + pattern: /(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/, 174 + lookbehind: true 175 + }, 176 + // https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html 177 + 'builtin': { 178 + pattern: /(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/, 179 + lookbehind: true, 180 + // Alias added to make those easier to distinguish from strings. 181 + alias: 'class-name' 182 + }, 183 + 'boolean': { 184 + pattern: /(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/, 185 + lookbehind: true 186 + }, 187 + 'file-descriptor': { 188 + pattern: /\B&\d\b/, 189 + alias: 'important' 190 + }, 191 + 'operator': { 192 + // Lots of redirections here, but not just that. 193 + pattern: /\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/, 194 + inside: { 195 + 'file-descriptor': { 196 + pattern: /^\d/, 197 + alias: 'important' 198 + } 199 + } 200 + }, 201 + 'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/, 202 + 'number': { 203 + pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/, 204 + lookbehind: true 205 + } 206 + }; 207 + 208 + commandAfterHeredoc.inside = Prism.languages.bash; 209 + 210 + /* Patterns in command substitution. */ 211 + var toBeCopied = [ 212 + 'comment', 213 + 'function-name', 214 + 'for-or-select', 215 + 'assign-left', 216 + 'parameter', 217 + 'string', 218 + 'environment', 219 + 'function', 220 + 'keyword', 221 + 'builtin', 222 + 'boolean', 223 + 'file-descriptor', 224 + 'operator', 225 + 'punctuation', 226 + 'number' 227 + ]; 228 + var inside = insideString.variable[1].inside; 229 + for (var i = 0; i < toBeCopied.length; i++) { 230 + inside[toBeCopied[i]] = Prism.languages.bash[toBeCopied[i]]; 231 + } 232 + 233 + Prism.languages.sh = Prism.languages.bash; 234 + Prism.languages.shell = Prism.languages.bash; 235 + }(Prism));
+99
public/prism/prism-batch.js
··· 1 + (function (Prism) { 2 + var variable = /%%?[~:\w]+%?|!\S+!/; 3 + var parameter = { 4 + pattern: /\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im, 5 + alias: 'attr-name', 6 + inside: { 7 + 'punctuation': /:/ 8 + } 9 + }; 10 + var string = /"(?:[\\"]"|[^"])*"(?!")/; 11 + var number = /(?:\b|-)\d+\b/; 12 + 13 + Prism.languages.batch = { 14 + 'comment': [ 15 + /^::.*/m, 16 + { 17 + pattern: /((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im, 18 + lookbehind: true 19 + } 20 + ], 21 + 'label': { 22 + pattern: /^:.*/m, 23 + alias: 'property' 24 + }, 25 + 'command': [ 26 + { 27 + // FOR command 28 + pattern: /((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im, 29 + lookbehind: true, 30 + inside: { 31 + 'keyword': /\b(?:do|in)\b|^for\b/i, 32 + 'string': string, 33 + 'parameter': parameter, 34 + 'variable': variable, 35 + 'number': number, 36 + 'punctuation': /[()',]/ 37 + } 38 + }, 39 + { 40 + // IF command 41 + pattern: /((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im, 42 + lookbehind: true, 43 + inside: { 44 + 'keyword': /\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i, 45 + 'string': string, 46 + 'parameter': parameter, 47 + 'variable': variable, 48 + 'number': number, 49 + 'operator': /\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i 50 + } 51 + }, 52 + { 53 + // ELSE command 54 + pattern: /((?:^|[&()])[ \t]*)else\b/im, 55 + lookbehind: true, 56 + inside: { 57 + 'keyword': /^else\b/i 58 + } 59 + }, 60 + { 61 + // SET command 62 + pattern: /((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im, 63 + lookbehind: true, 64 + inside: { 65 + 'keyword': /^set\b/i, 66 + 'string': string, 67 + 'parameter': parameter, 68 + 'variable': [ 69 + variable, 70 + /\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/ 71 + ], 72 + 'number': number, 73 + 'operator': /[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/, 74 + 'punctuation': /[()',]/ 75 + } 76 + }, 77 + { 78 + // Other commands 79 + pattern: /((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m, 80 + lookbehind: true, 81 + inside: { 82 + 'keyword': /^\w+\b/, 83 + 'string': string, 84 + 'parameter': parameter, 85 + 'label': { 86 + pattern: /(^\s*):\S+/m, 87 + lookbehind: true, 88 + alias: 'property' 89 + }, 90 + 'variable': variable, 91 + 'number': number, 92 + 'operator': /\^/ 93 + } 94 + } 95 + ], 96 + 'operator': /[&@]/, 97 + 'punctuation': /[()']/ 98 + }; 99 + }(Prism));
+80
public/prism/prism-c.js
··· 1 + Prism.languages.c = Prism.languages.extend('clike', { 2 + 'comment': { 3 + pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/, 4 + greedy: true 5 + }, 6 + 'string': { 7 + // https://en.cppreference.com/w/c/language/string_literal 8 + pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/, 9 + greedy: true 10 + }, 11 + 'class-name': { 12 + pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/, 13 + lookbehind: true 14 + }, 15 + 'keyword': /\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/, 16 + 'function': /\b[a-z_]\w*(?=\s*\()/i, 17 + 'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i, 18 + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/ 19 + }); 20 + 21 + Prism.languages.insertBefore('c', 'string', { 22 + 'char': { 23 + // https://en.cppreference.com/w/c/language/character_constant 24 + pattern: /'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/, 25 + greedy: true 26 + } 27 + }); 28 + 29 + Prism.languages.insertBefore('c', 'string', { 30 + 'macro': { 31 + // allow for multiline macro definitions 32 + // spaces after the # character compile fine with gcc 33 + pattern: /(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im, 34 + lookbehind: true, 35 + greedy: true, 36 + alias: 'property', 37 + inside: { 38 + 'string': [ 39 + { 40 + // highlight the path of the include statement as a string 41 + pattern: /^(#\s*include\s*)<[^>]+>/, 42 + lookbehind: true 43 + }, 44 + Prism.languages.c['string'] 45 + ], 46 + 'char': Prism.languages.c['char'], 47 + 'comment': Prism.languages.c['comment'], 48 + 'macro-name': [ 49 + { 50 + pattern: /(^#\s*define\s+)\w+\b(?!\()/i, 51 + lookbehind: true 52 + }, 53 + { 54 + pattern: /(^#\s*define\s+)\w+\b(?=\()/i, 55 + lookbehind: true, 56 + alias: 'function' 57 + } 58 + ], 59 + // highlight macro directives as keywords 60 + 'directive': { 61 + pattern: /^(#\s*)[a-z]+/, 62 + lookbehind: true, 63 + alias: 'keyword' 64 + }, 65 + 'directive-hash': /^#/, 66 + 'punctuation': /##|\\(?=[\r\n])/, 67 + 'expression': { 68 + pattern: /\S[\s\S]*/, 69 + inside: Prism.languages.c 70 + } 71 + } 72 + } 73 + }); 74 + 75 + Prism.languages.insertBefore('c', 'function', { 76 + // highlight predefined macros as constants 77 + 'constant': /\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/ 78 + }); 79 + 80 + delete Prism.languages.c['boolean'];
+31
public/prism/prism-clike.js
··· 1 + Prism.languages.clike = { 2 + 'comment': [ 3 + { 4 + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, 5 + lookbehind: true, 6 + greedy: true 7 + }, 8 + { 9 + pattern: /(^|[^\\:])\/\/.*/, 10 + lookbehind: true, 11 + greedy: true 12 + } 13 + ], 14 + 'string': { 15 + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, 16 + greedy: true 17 + }, 18 + 'class-name': { 19 + pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i, 20 + lookbehind: true, 21 + inside: { 22 + 'punctuation': /[.\\]/ 23 + } 24 + }, 25 + 'keyword': /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/, 26 + 'boolean': /\b(?:false|true)\b/, 27 + 'function': /\b\w+(?=\()/, 28 + 'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, 29 + 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, 30 + 'punctuation': /[{}[\];(),.:]/ 31 + };
+99
public/prism/prism-cpp.js
··· 1 + (function (Prism) { 2 + 3 + var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/; 4 + var modName = /\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g, function () { return keyword.source; }); 5 + 6 + Prism.languages.cpp = Prism.languages.extend('c', { 7 + 'class-name': [ 8 + { 9 + pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source 10 + .replace(/<keyword>/g, function () { return keyword.source; })), 11 + lookbehind: true 12 + }, 13 + // This is intended to capture the class name of method implementations like: 14 + // void foo::bar() const {} 15 + // However! The `foo` in the above example could also be a namespace, so we only capture the class name if 16 + // it starts with an uppercase letter. This approximation should give decent results. 17 + /\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/, 18 + // This will capture the class name before destructors like: 19 + // Foo::~Foo() {} 20 + /\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i, 21 + // This also intends to capture the class name of method implementations but here the class has template 22 + // parameters, so it can't be a namespace (until C++ adds generic namespaces). 23 + /\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/ 24 + ], 25 + 'keyword': keyword, 26 + 'number': { 27 + pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i, 28 + greedy: true 29 + }, 30 + 'operator': />>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, 31 + 'boolean': /\b(?:false|true)\b/ 32 + }); 33 + 34 + Prism.languages.insertBefore('cpp', 'string', { 35 + 'module': { 36 + // https://en.cppreference.com/w/cpp/language/modules 37 + pattern: RegExp( 38 + /(\b(?:import|module)\s+)/.source + 39 + '(?:' + 40 + // header-name 41 + /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source + 42 + '|' + 43 + // module name or partition or both 44 + /<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g, function () { return modName; }) + 45 + ')' 46 + ), 47 + lookbehind: true, 48 + greedy: true, 49 + inside: { 50 + 'string': /^[<"][\s\S]+/, 51 + 'operator': /:/, 52 + 'punctuation': /\./ 53 + } 54 + }, 55 + 'raw-string': { 56 + pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, 57 + alias: 'string', 58 + greedy: true 59 + } 60 + }); 61 + 62 + Prism.languages.insertBefore('cpp', 'keyword', { 63 + 'generic-function': { 64 + pattern: /\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i, 65 + inside: { 66 + 'function': /^\w+/, 67 + 'generic': { 68 + pattern: /<[\s\S]+/, 69 + alias: 'class-name', 70 + inside: Prism.languages.cpp 71 + } 72 + } 73 + } 74 + }); 75 + 76 + Prism.languages.insertBefore('cpp', 'operator', { 77 + 'double-colon': { 78 + pattern: /::/, 79 + alias: 'punctuation' 80 + } 81 + }); 82 + 83 + Prism.languages.insertBefore('cpp', 'class-name', { 84 + // the base clause is an optional list of parent classes 85 + // https://en.cppreference.com/w/cpp/language/class 86 + 'base-clause': { 87 + pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/, 88 + lookbehind: true, 89 + greedy: true, 90 + inside: Prism.languages.extend('cpp', {}) 91 + } 92 + }); 93 + 94 + Prism.languages.insertBefore('inside', 'double-colon', { 95 + // All untokenized words that are not namespaces should be class names 96 + 'class-name': /\b[a-z_]\w*\b(?!\s*::)/i 97 + }, Prism.languages.cpp['base-clause']); 98 + 99 + }(Prism));
+366
public/prism/prism-csharp.js
··· 1 + (function (Prism) { 2 + 3 + /** 4 + * Replaces all placeholders "<<n>>" of given pattern with the n-th replacement (zero based). 5 + * 6 + * Note: This is a simple text based replacement. Be careful when using backreferences! 7 + * 8 + * @param {string} pattern the given pattern. 9 + * @param {string[]} replacements a list of replacement which can be inserted into the given pattern. 10 + * @returns {string} the pattern with all placeholders replaced with their corresponding replacements. 11 + * @example replace(/a<<0>>a/.source, [/b+/.source]) === /a(?:b+)a/.source 12 + */ 13 + function replace(pattern, replacements) { 14 + return pattern.replace(/<<(\d+)>>/g, function (m, index) { 15 + return '(?:' + replacements[+index] + ')'; 16 + }); 17 + } 18 + /** 19 + * @param {string} pattern 20 + * @param {string[]} replacements 21 + * @param {string} [flags] 22 + * @returns {RegExp} 23 + */ 24 + function re(pattern, replacements, flags) { 25 + return RegExp(replace(pattern, replacements), flags || ''); 26 + } 27 + 28 + /** 29 + * Creates a nested pattern where all occurrences of the string `<<self>>` are replaced with the pattern itself. 30 + * 31 + * @param {string} pattern 32 + * @param {number} depthLog2 33 + * @returns {string} 34 + */ 35 + function nested(pattern, depthLog2) { 36 + for (var i = 0; i < depthLog2; i++) { 37 + pattern = pattern.replace(/<<self>>/g, function () { return '(?:' + pattern + ')'; }); 38 + } 39 + return pattern.replace(/<<self>>/g, '[^\\s\\S]'); 40 + } 41 + 42 + // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ 43 + var keywordKinds = { 44 + // keywords which represent a return or variable type 45 + type: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void', 46 + // keywords which are used to declare a type 47 + typeDeclaration: 'class enum interface record struct', 48 + // contextual keywords 49 + // ("var" and "dynamic" are missing because they are used like types) 50 + contextual: 'add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)', 51 + // all other keywords 52 + other: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield' 53 + }; 54 + 55 + // keywords 56 + function keywordsToPattern(words) { 57 + return '\\b(?:' + words.trim().replace(/ /g, '|') + ')\\b'; 58 + } 59 + var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration); 60 + var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other)); 61 + var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other); 62 + var nonContextualKeywords = keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other); 63 + 64 + // types 65 + var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source, 2); // the idea behind the other forbidden characters is to prevent false positives. Same for tupleElement. 66 + var nestedRound = nested(/\((?:[^()]|<<self>>)*\)/.source, 2); 67 + var name = /@?\b[A-Za-z_]\w*\b/.source; 68 + var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [name, generic]); 69 + var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [nonTypeKeywords, genericName]); 70 + var array = /\[\s*(?:,\s*)*\]/.source; 71 + var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [identifier, array]); 72 + var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [generic, nestedRound, array]); 73 + var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]); 74 + var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [tuple, identifier, array]); 75 + 76 + var typeInside = { 77 + 'keyword': keywords, 78 + 'punctuation': /[<>()?,.:[\]]/ 79 + }; 80 + 81 + // strings & characters 82 + // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#character-literals 83 + // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#string-literals 84 + var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source; // simplified pattern 85 + var regularString = /"(?:\\.|[^\\"\r\n])*"/.source; 86 + var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source; 87 + 88 + 89 + Prism.languages.csharp = Prism.languages.extend('clike', { 90 + 'string': [ 91 + { 92 + pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]), 93 + lookbehind: true, 94 + greedy: true 95 + }, 96 + { 97 + pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]), 98 + lookbehind: true, 99 + greedy: true 100 + } 101 + ], 102 + 'class-name': [ 103 + { 104 + // Using static 105 + // using static System.Math; 106 + pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]), 107 + lookbehind: true, 108 + inside: typeInside 109 + }, 110 + { 111 + // Using alias (type) 112 + // using Project = PC.MyCompany.Project; 113 + pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [name, typeExpression]), 114 + lookbehind: true, 115 + inside: typeInside 116 + }, 117 + { 118 + // Using alias (alias) 119 + // using Project = PC.MyCompany.Project; 120 + pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]), 121 + lookbehind: true 122 + }, 123 + { 124 + // Type declarations 125 + // class Foo<A, B> 126 + // interface Foo<out A, B> 127 + pattern: re(/(\b<<0>>\s+)<<1>>/.source, [typeDeclarationKeywords, genericName]), 128 + lookbehind: true, 129 + inside: typeInside 130 + }, 131 + { 132 + // Single catch exception declaration 133 + // catch(Foo) 134 + // (things like catch(Foo e) is covered by variable declaration) 135 + pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]), 136 + lookbehind: true, 137 + inside: typeInside 138 + }, 139 + { 140 + // Name of the type parameter of generic constraints 141 + // where Foo : class 142 + pattern: re(/(\bwhere\s+)<<0>>/.source, [name]), 143 + lookbehind: true 144 + }, 145 + { 146 + // Casts and checks via as and is. 147 + // as Foo<A>, is Bar<B> 148 + // (things like if(a is Foo b) is covered by variable declaration) 149 + pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]), 150 + lookbehind: true, 151 + inside: typeInside 152 + }, 153 + { 154 + // Variable, field and parameter declaration 155 + // (Foo bar, Bar baz, Foo[,,] bay, Foo<Bar, FooBar<Bar>> bax) 156 + pattern: re(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [typeExpression, nonContextualKeywords, name]), 157 + inside: typeInside 158 + } 159 + ], 160 + 'keyword': keywords, 161 + // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#literals 162 + 'number': /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i, 163 + 'operator': />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/, 164 + 'punctuation': /\?\.?|::|[{}[\];(),.:]/ 165 + }); 166 + 167 + Prism.languages.insertBefore('csharp', 'number', { 168 + 'range': { 169 + pattern: /\.\./, 170 + alias: 'operator' 171 + } 172 + }); 173 + 174 + Prism.languages.insertBefore('csharp', 'punctuation', { 175 + 'named-parameter': { 176 + pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]), 177 + lookbehind: true, 178 + alias: 'punctuation' 179 + } 180 + }); 181 + 182 + Prism.languages.insertBefore('csharp', 'class-name', { 183 + 'namespace': { 184 + // namespace Foo.Bar {} 185 + // using Foo.Bar; 186 + pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]), 187 + lookbehind: true, 188 + inside: { 189 + 'punctuation': /\./ 190 + } 191 + }, 192 + 'type-expression': { 193 + // default(Foo), typeof(Foo<Bar>), sizeof(int) 194 + pattern: re(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source, [nestedRound]), 195 + lookbehind: true, 196 + alias: 'class-name', 197 + inside: typeInside 198 + }, 199 + 'return-type': { 200 + // Foo<Bar> ForBar(); Foo IFoo.Bar() => 0 201 + // int this[int index] => 0; T IReadOnlyList<T>.this[int index] => this[index]; 202 + // int Foo => 0; int Foo { get; set } = 0; 203 + pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [typeExpression, identifier]), 204 + inside: typeInside, 205 + alias: 'class-name' 206 + }, 207 + 'constructor-invocation': { 208 + // new List<Foo<Bar[]>> { } 209 + pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]), 210 + lookbehind: true, 211 + inside: typeInside, 212 + alias: 'class-name' 213 + }, 214 + /*'explicit-implementation': { 215 + // int IFoo<Foo>.Bar => 0; void IFoo<Foo<Foo>>.Foo<T>(); 216 + pattern: replace(/\b<<0>>(?=\.<<1>>)/, className, methodOrPropertyDeclaration), 217 + inside: classNameInside, 218 + alias: 'class-name' 219 + },*/ 220 + 'generic-method': { 221 + // foo<Bar>() 222 + pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [name, generic]), 223 + inside: { 224 + 'function': re(/^<<0>>/.source, [name]), 225 + 'generic': { 226 + pattern: RegExp(generic), 227 + alias: 'class-name', 228 + inside: typeInside 229 + } 230 + } 231 + }, 232 + 'type-list': { 233 + // The list of types inherited or of generic constraints 234 + // class Foo<F> : Bar, IList<FooBar> 235 + // where F : Bar, IList<int> 236 + pattern: re( 237 + /\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source, 238 + [typeDeclarationKeywords, genericName, name, typeExpression, keywords.source, nestedRound, /\bnew\s*\(\s*\)/.source] 239 + ), 240 + lookbehind: true, 241 + inside: { 242 + 'record-arguments': { 243 + pattern: re(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source, [genericName, nestedRound]), 244 + lookbehind: true, 245 + greedy: true, 246 + inside: Prism.languages.csharp 247 + }, 248 + 'keyword': keywords, 249 + 'class-name': { 250 + pattern: RegExp(typeExpression), 251 + greedy: true, 252 + inside: typeInside 253 + }, 254 + 'punctuation': /[,()]/ 255 + } 256 + }, 257 + 'preprocessor': { 258 + pattern: /(^[\t ]*)#.*/m, 259 + lookbehind: true, 260 + alias: 'property', 261 + inside: { 262 + // highlight preprocessor directives as keywords 263 + 'directive': { 264 + pattern: /(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/, 265 + lookbehind: true, 266 + alias: 'keyword' 267 + } 268 + } 269 + } 270 + }); 271 + 272 + // attributes 273 + var regularStringOrCharacter = regularString + '|' + character; 274 + var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]); 275 + var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2); 276 + 277 + // https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/#attribute-targets 278 + var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source; 279 + var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [identifier, roundExpression]); 280 + 281 + Prism.languages.insertBefore('csharp', 'class-name', { 282 + 'attribute': { 283 + // Attributes 284 + // [Foo], [Foo(1), Bar(2, Prop = "foo")], [return: Foo(1), Bar(2)], [assembly: Foo(Bar)] 285 + pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [attrTarget, attr]), 286 + lookbehind: true, 287 + greedy: true, 288 + inside: { 289 + 'target': { 290 + pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]), 291 + alias: 'keyword' 292 + }, 293 + 'attribute-arguments': { 294 + pattern: re(/\(<<0>>*\)/.source, [roundExpression]), 295 + inside: Prism.languages.csharp 296 + }, 297 + 'class-name': { 298 + pattern: RegExp(identifier), 299 + inside: { 300 + 'punctuation': /\./ 301 + } 302 + }, 303 + 'punctuation': /[:,]/ 304 + } 305 + } 306 + }); 307 + 308 + 309 + // string interpolation 310 + var formatString = /:[^}\r\n]+/.source; 311 + // multi line 312 + var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2); 313 + var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [mInterpolationRound, formatString]); 314 + // single line 315 + var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source, [regularStringOrCharacter]), 2); 316 + var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [sInterpolationRound, formatString]); 317 + 318 + function createInterpolationInside(interpolation, interpolationRound) { 319 + return { 320 + 'interpolation': { 321 + pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]), 322 + lookbehind: true, 323 + inside: { 324 + 'format-string': { 325 + pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [interpolationRound, formatString]), 326 + lookbehind: true, 327 + inside: { 328 + 'punctuation': /^:/ 329 + } 330 + }, 331 + 'punctuation': /^\{|\}$/, 332 + 'expression': { 333 + pattern: /[\s\S]+/, 334 + alias: 'language-csharp', 335 + inside: Prism.languages.csharp 336 + } 337 + } 338 + }, 339 + 'string': /[\s\S]+/ 340 + }; 341 + } 342 + 343 + Prism.languages.insertBefore('csharp', 'string', { 344 + 'interpolation-string': [ 345 + { 346 + pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]), 347 + lookbehind: true, 348 + greedy: true, 349 + inside: createInterpolationInside(mInterpolation, mInterpolationRound), 350 + }, 351 + { 352 + pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]), 353 + lookbehind: true, 354 + greedy: true, 355 + inside: createInterpolationInside(sInterpolation, sInterpolationRound), 356 + } 357 + ], 358 + 'char': { 359 + pattern: RegExp(character), 360 + greedy: true 361 + } 362 + }); 363 + 364 + Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; 365 + 366 + }(Prism));
+120
public/prism/prism-css-extras.js
··· 1 + (function (Prism) { 2 + 3 + var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/; 4 + var selectorInside; 5 + 6 + Prism.languages.css.selector = { 7 + pattern: Prism.languages.css.selector.pattern, 8 + lookbehind: true, 9 + inside: selectorInside = { 10 + 'pseudo-element': /:(?:after|before|first-letter|first-line|selection)|::[-\w]+/, 11 + 'pseudo-class': /:[-\w]+/, 12 + 'class': /\.[-\w]+/, 13 + 'id': /#[-\w]+/, 14 + 'attribute': { 15 + pattern: RegExp('\\[(?:[^[\\]"\']|' + string.source + ')*\\]'), 16 + greedy: true, 17 + inside: { 18 + 'punctuation': /^\[|\]$/, 19 + 'case-sensitivity': { 20 + pattern: /(\s)[si]$/i, 21 + lookbehind: true, 22 + alias: 'keyword' 23 + }, 24 + 'namespace': { 25 + pattern: /^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/, 26 + lookbehind: true, 27 + inside: { 28 + 'punctuation': /\|$/ 29 + } 30 + }, 31 + 'attr-name': { 32 + pattern: /^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/, 33 + lookbehind: true 34 + }, 35 + 'attr-value': [ 36 + string, 37 + { 38 + pattern: /(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/, 39 + lookbehind: true 40 + } 41 + ], 42 + 'operator': /[|~*^$]?=/ 43 + } 44 + }, 45 + 'n-th': [ 46 + { 47 + pattern: /(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/, 48 + lookbehind: true, 49 + inside: { 50 + 'number': /[\dn]+/, 51 + 'operator': /[+-]/ 52 + } 53 + }, 54 + { 55 + pattern: /(\(\s*)(?:even|odd)(?=\s*\))/i, 56 + lookbehind: true 57 + } 58 + ], 59 + 'combinator': />|\+|~|\|\|/, 60 + 61 + // the `tag` token has been existed and removed. 62 + // because we can't find a perfect tokenize to match it. 63 + // if you want to add it, please read https://github.com/PrismJS/prism/pull/2373 first. 64 + 65 + 'punctuation': /[(),]/, 66 + } 67 + }; 68 + 69 + Prism.languages.css['atrule'].inside['selector-function-argument'].inside = selectorInside; 70 + 71 + Prism.languages.insertBefore('css', 'property', { 72 + 'variable': { 73 + pattern: /(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i, 74 + lookbehind: true 75 + } 76 + }); 77 + 78 + var unit = { 79 + pattern: /(\b\d+)(?:%|[a-z]+(?![\w-]))/, 80 + lookbehind: true 81 + }; 82 + // 123 -123 .123 -.123 12.3 -12.3 83 + var number = { 84 + pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/, 85 + lookbehind: true 86 + }; 87 + 88 + Prism.languages.insertBefore('css', 'function', { 89 + 'operator': { 90 + pattern: /(\s)[+\-*\/](?=\s)/, 91 + lookbehind: true 92 + }, 93 + // CAREFUL! 94 + // Previewers and Inline color use hexcode and color. 95 + 'hexcode': { 96 + pattern: /\B#[\da-f]{3,8}\b/i, 97 + alias: 'color' 98 + }, 99 + 'color': [ 100 + { 101 + pattern: /(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i, 102 + lookbehind: true 103 + }, 104 + { 105 + pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i, 106 + inside: { 107 + 'unit': unit, 108 + 'number': number, 109 + 'function': /[\w-]+(?=\()/, 110 + 'punctuation': /[(),]/ 111 + } 112 + } 113 + ], 114 + // it's important that there is no boundary assertion after the hex digits 115 + 'entity': /\\[\da-f]{1,8}/i, 116 + 'unit': unit, 117 + 'number': number 118 + }); 119 + 120 + }(Prism));
+64
public/prism/prism-css.js
··· 1 + (function (Prism) { 2 + 3 + var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/; 4 + 5 + Prism.languages.css = { 6 + 'comment': /\/\*[\s\S]*?\*\//, 7 + 'atrule': { 8 + pattern: RegExp('@[\\w-](?:' + /[^;{\s"']|\s+(?!\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\s*\{))/.source), 9 + inside: { 10 + 'rule': /^@[\w-]+/, 11 + 'selector-function-argument': { 12 + pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/, 13 + lookbehind: true, 14 + alias: 'selector' 15 + }, 16 + 'keyword': { 17 + pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, 18 + lookbehind: true 19 + } 20 + // See rest below 21 + } 22 + }, 23 + 'url': { 24 + // https://drafts.csswg.org/css-values-3/#urls 25 + pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'), 26 + greedy: true, 27 + inside: { 28 + 'function': /^url/i, 29 + 'punctuation': /^\(|\)$/, 30 + 'string': { 31 + pattern: RegExp('^' + string.source + '$'), 32 + alias: 'url' 33 + } 34 + } 35 + }, 36 + 'selector': { 37 + pattern: RegExp('(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + string.source + ')*(?=\\s*\\{)'), 38 + lookbehind: true 39 + }, 40 + 'string': { 41 + pattern: string, 42 + greedy: true 43 + }, 44 + 'property': { 45 + pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i, 46 + lookbehind: true 47 + }, 48 + 'important': /!important\b/i, 49 + 'function': { 50 + pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i, 51 + lookbehind: true 52 + }, 53 + 'punctuation': /[(){};:,]/ 54 + }; 55 + 56 + Prism.languages.css['atrule'].inside.rest = Prism.languages.css; 57 + 58 + var markup = Prism.languages.markup; 59 + if (markup) { 60 + markup.tag.addInlined('style', 'css'); 61 + markup.tag.addAttribute('style', 'css'); 62 + } 63 + 64 + }(Prism));
+64
public/prism/prism-diff.js
··· 1 + (function (Prism) { 2 + 3 + Prism.languages.diff = { 4 + 'coord': [ 5 + // Match all kinds of coord lines (prefixed by "+++", "---" or "***"). 6 + /^(?:\*{3}|-{3}|\+{3}).*$/m, 7 + // Match "@@ ... @@" coord lines in unified diff. 8 + /^@@.*@@$/m, 9 + // Match coord lines in normal diff (starts with a number). 10 + /^\d.*$/m 11 + ] 12 + 13 + // deleted, inserted, unchanged, diff 14 + }; 15 + 16 + /** 17 + * A map from the name of a block to its line prefix. 18 + * 19 + * @type {Object<string, string>} 20 + */ 21 + var PREFIXES = { 22 + 'deleted-sign': '-', 23 + 'deleted-arrow': '<', 24 + 'inserted-sign': '+', 25 + 'inserted-arrow': '>', 26 + 'unchanged': ' ', 27 + 'diff': '!', 28 + }; 29 + 30 + // add a token for each prefix 31 + Object.keys(PREFIXES).forEach(function (name) { 32 + var prefix = PREFIXES[name]; 33 + 34 + var alias = []; 35 + if (!/^\w+$/.test(name)) { // "deleted-sign" -> "deleted" 36 + alias.push(/\w+/.exec(name)[0]); 37 + } 38 + if (name === 'diff') { 39 + alias.push('bold'); 40 + } 41 + 42 + Prism.languages.diff[name] = { 43 + pattern: RegExp('^(?:[' + prefix + '].*(?:\r\n?|\n|(?![\\s\\S])))+', 'm'), 44 + alias: alias, 45 + inside: { 46 + 'line': { 47 + pattern: /(.)(?=[\s\S]).*(?:\r\n?|\n)?/, 48 + lookbehind: true 49 + }, 50 + 'prefix': { 51 + pattern: /[\s\S]/, 52 + alias: /\w+/.exec(name)[0] 53 + } 54 + } 55 + }; 56 + 57 + }); 58 + 59 + // make prefixes available to Diff plugin 60 + Object.defineProperty(Prism.languages.diff, 'PREFIXES', { 61 + value: PREFIXES 62 + }); 63 + 64 + }(Prism));
+98
public/prism/prism-docker.js
··· 1 + (function (Prism) { 2 + 3 + // Many of the following regexes will contain negated lookaheads like `[ \t]+(?![ \t])`. This is a trick to ensure 4 + // that quantifiers behave *atomically*. Atomic quantifiers are necessary to prevent exponential backtracking. 5 + 6 + var spaceAfterBackSlash = /\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source; 7 + // At least one space, comment, or line break 8 + var space = /(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)/.source 9 + .replace(/<SP_BS>/g, function () { return spaceAfterBackSlash; }); 10 + 11 + var string = /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source; 12 + var option = /--[\w-]+=(?:<STR>|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(/<STR>/g, function () { return string; }); 13 + 14 + var stringRule = { 15 + pattern: RegExp(string), 16 + greedy: true 17 + }; 18 + var commentRule = { 19 + pattern: /(^[ \t]*)#.*/m, 20 + lookbehind: true, 21 + greedy: true 22 + }; 23 + 24 + /** 25 + * @param {string} source 26 + * @param {string} flags 27 + * @returns {RegExp} 28 + */ 29 + function re(source, flags) { 30 + source = source 31 + .replace(/<OPT>/g, function () { return option; }) 32 + .replace(/<SP>/g, function () { return space; }); 33 + 34 + return RegExp(source, flags); 35 + } 36 + 37 + Prism.languages.docker = { 38 + 'instruction': { 39 + pattern: /(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im, 40 + lookbehind: true, 41 + greedy: true, 42 + inside: { 43 + 'options': { 44 + pattern: re(/(^(?:ONBUILD<SP>)?\w+<SP>)<OPT>(?:<SP><OPT>)*/.source, 'i'), 45 + lookbehind: true, 46 + greedy: true, 47 + inside: { 48 + 'property': { 49 + pattern: /(^|\s)--[\w-]+/, 50 + lookbehind: true 51 + }, 52 + 'string': [ 53 + stringRule, 54 + { 55 + pattern: /(=)(?!["'])(?:[^\s\\]|\\.)+/, 56 + lookbehind: true 57 + } 58 + ], 59 + 'operator': /\\$/m, 60 + 'punctuation': /=/ 61 + } 62 + }, 63 + 'keyword': [ 64 + { 65 + // https://docs.docker.com/engine/reference/builder/#healthcheck 66 + pattern: re(/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\b/.source, 'i'), 67 + lookbehind: true, 68 + greedy: true 69 + }, 70 + { 71 + // https://docs.docker.com/engine/reference/builder/#from 72 + pattern: re(/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\]+<SP>)AS/.source, 'i'), 73 + lookbehind: true, 74 + greedy: true 75 + }, 76 + { 77 + // https://docs.docker.com/engine/reference/builder/#onbuild 78 + pattern: re(/(^ONBUILD<SP>)\w+/.source, 'i'), 79 + lookbehind: true, 80 + greedy: true 81 + }, 82 + { 83 + pattern: /^\w+/, 84 + greedy: true 85 + } 86 + ], 87 + 'comment': commentRule, 88 + 'string': stringRule, 89 + 'variable': /\$(?:\w+|\{[^{}"'\\]*\})/, 90 + 'operator': /\\$/m 91 + } 92 + }, 93 + 'comment': commentRule 94 + }; 95 + 96 + Prism.languages.dockerfile = Prism.languages.docker; 97 + 98 + }(Prism));
+151
public/prism/prism-http.js
··· 1 + (function (Prism) { 2 + 3 + /** 4 + * @param {string} name 5 + * @returns {RegExp} 6 + */ 7 + function headerValueOf(name) { 8 + return RegExp('(^(?:' + name + '):[ \t]*(?![ \t]))[^]+', 'i'); 9 + } 10 + 11 + Prism.languages.http = { 12 + 'request-line': { 13 + pattern: /^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m, 14 + inside: { 15 + // HTTP Method 16 + 'method': { 17 + pattern: /^[A-Z]+\b/, 18 + alias: 'property' 19 + }, 20 + // Request Target e.g. http://example.com, /path/to/file 21 + 'request-target': { 22 + pattern: /^(\s)(?:https?:\/\/|\/)\S*(?=\s)/, 23 + lookbehind: true, 24 + alias: 'url', 25 + inside: Prism.languages.uri 26 + }, 27 + // HTTP Version 28 + 'http-version': { 29 + pattern: /^(\s)HTTP\/[\d.]+/, 30 + lookbehind: true, 31 + alias: 'property' 32 + }, 33 + } 34 + }, 35 + 'response-status': { 36 + pattern: /^HTTP\/[\d.]+ \d+ .+/m, 37 + inside: { 38 + // HTTP Version 39 + 'http-version': { 40 + pattern: /^HTTP\/[\d.]+/, 41 + alias: 'property' 42 + }, 43 + // Status Code 44 + 'status-code': { 45 + pattern: /^(\s)\d+(?=\s)/, 46 + lookbehind: true, 47 + alias: 'number' 48 + }, 49 + // Reason Phrase 50 + 'reason-phrase': { 51 + pattern: /^(\s).+/, 52 + lookbehind: true, 53 + alias: 'string' 54 + } 55 + } 56 + }, 57 + 'header': { 58 + pattern: /^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m, 59 + inside: { 60 + 'header-value': [ 61 + { 62 + pattern: headerValueOf(/Content-Security-Policy/.source), 63 + lookbehind: true, 64 + alias: ['csp', 'languages-csp'], 65 + inside: Prism.languages.csp 66 + }, 67 + { 68 + pattern: headerValueOf(/Public-Key-Pins(?:-Report-Only)?/.source), 69 + lookbehind: true, 70 + alias: ['hpkp', 'languages-hpkp'], 71 + inside: Prism.languages.hpkp 72 + }, 73 + { 74 + pattern: headerValueOf(/Strict-Transport-Security/.source), 75 + lookbehind: true, 76 + alias: ['hsts', 'languages-hsts'], 77 + inside: Prism.languages.hsts 78 + }, 79 + { 80 + pattern: headerValueOf(/[^:]+/.source), 81 + lookbehind: true 82 + } 83 + ], 84 + 'header-name': { 85 + pattern: /^[^:]+/, 86 + alias: 'keyword' 87 + }, 88 + 'punctuation': /^:/ 89 + } 90 + } 91 + }; 92 + 93 + // Create a mapping of Content-Type headers to language definitions 94 + var langs = Prism.languages; 95 + var httpLanguages = { 96 + 'application/javascript': langs.javascript, 97 + 'application/json': langs.json || langs.javascript, 98 + 'application/xml': langs.xml, 99 + 'text/xml': langs.xml, 100 + 'text/html': langs.html, 101 + 'text/css': langs.css, 102 + 'text/plain': langs.plain 103 + }; 104 + 105 + // Declare which types can also be suffixes 106 + var suffixTypes = { 107 + 'application/json': true, 108 + 'application/xml': true 109 + }; 110 + 111 + /** 112 + * Returns a pattern for the given content type which matches it and any type which has it as a suffix. 113 + * 114 + * @param {string} contentType 115 + * @returns {string} 116 + */ 117 + function getSuffixPattern(contentType) { 118 + var suffix = contentType.replace(/^[a-z]+\//, ''); 119 + var suffixPattern = '\\w+/(?:[\\w.-]+\\+)+' + suffix + '(?![+\\w.-])'; 120 + return '(?:' + contentType + '|' + suffixPattern + ')'; 121 + } 122 + 123 + // Insert each content type parser that has its associated language 124 + // currently loaded. 125 + var options; 126 + for (var contentType in httpLanguages) { 127 + if (httpLanguages[contentType]) { 128 + options = options || {}; 129 + 130 + var pattern = suffixTypes[contentType] ? getSuffixPattern(contentType) : contentType; 131 + options[contentType.replace(/\//g, '-')] = { 132 + pattern: RegExp( 133 + '(' + /content-type:\s*/.source + pattern + /(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source + ')' + 134 + // This is a little interesting: 135 + // The HTTP format spec required 1 empty line before the body to make everything unambiguous. 136 + // However, when writing code by hand (e.g. to display on a website) people can forget about this, 137 + // so we want to be liberal here. We will allow the empty line to be omitted if the first line of 138 + // the body does not start with a [\w-] character (as headers do). 139 + /[^ \t\w-][\s\S]*/.source, 140 + 'i' 141 + ), 142 + lookbehind: true, 143 + inside: httpLanguages[contentType] 144 + }; 145 + } 146 + } 147 + if (options) { 148 + Prism.languages.insertBefore('http', 'header', options); 149 + } 150 + 151 + }(Prism));
+42
public/prism/prism-ini.js
··· 1 + Prism.languages.ini = { 2 + 3 + /** 4 + * The component mimics the behavior of the Win32 API parser. 5 + * 6 + * @see {@link https://github.com/PrismJS/prism/issues/2775#issuecomment-787477723} 7 + */ 8 + 9 + 'comment': { 10 + pattern: /(^[ \f\t\v]*)[#;][^\n\r]*/m, 11 + lookbehind: true 12 + }, 13 + 'section': { 14 + pattern: /(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m, 15 + lookbehind: true, 16 + inside: { 17 + 'section-name': { 18 + pattern: /(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/, 19 + lookbehind: true, 20 + alias: 'selector' 21 + }, 22 + 'punctuation': /\[|\]/ 23 + } 24 + }, 25 + 'key': { 26 + pattern: /(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m, 27 + lookbehind: true, 28 + alias: 'attr-name' 29 + }, 30 + 'value': { 31 + pattern: /(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/, 32 + lookbehind: true, 33 + alias: 'attr-value', 34 + inside: { 35 + 'inner-value': { 36 + pattern: /^("|').+(?=\1$)/, 37 + lookbehind: true 38 + } 39 + } 40 + }, 41 + 'punctuation': /=/ 42 + };
+124
public/prism/prism-java.js
··· 1 + (function (Prism) { 2 + 3 + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; 4 + 5 + // full package (optional) + parent classes (optional) 6 + var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source; 7 + 8 + // based on the java naming conventions 9 + var className = { 10 + pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source), 11 + lookbehind: true, 12 + inside: { 13 + 'namespace': { 14 + pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/, 15 + inside: { 16 + 'punctuation': /\./ 17 + } 18 + }, 19 + 'punctuation': /\./ 20 + } 21 + }; 22 + 23 + Prism.languages.java = Prism.languages.extend('clike', { 24 + 'string': { 25 + pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"/, 26 + lookbehind: true, 27 + greedy: true 28 + }, 29 + 'class-name': [ 30 + className, 31 + { 32 + // variables, parameters, and constructor references 33 + // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods) 34 + pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source), 35 + lookbehind: true, 36 + inside: className.inside 37 + }, 38 + { 39 + // class names based on keyword 40 + // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods) 41 + pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source), 42 + lookbehind: true, 43 + inside: className.inside 44 + } 45 + ], 46 + 'keyword': keywords, 47 + 'function': [ 48 + Prism.languages.clike.function, 49 + { 50 + pattern: /(::\s*)[a-z_]\w*/, 51 + lookbehind: true 52 + } 53 + ], 54 + 'number': /\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, 55 + 'operator': { 56 + pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, 57 + lookbehind: true 58 + }, 59 + 'constant': /\b[A-Z][A-Z_\d]+\b/ 60 + }); 61 + 62 + Prism.languages.insertBefore('java', 'string', { 63 + 'triple-quoted-string': { 64 + // http://openjdk.java.net/jeps/355#Description 65 + pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, 66 + greedy: true, 67 + alias: 'string' 68 + }, 69 + 'char': { 70 + pattern: /'(?:\\.|[^'\\\r\n]){1,6}'/, 71 + greedy: true 72 + } 73 + }); 74 + 75 + Prism.languages.insertBefore('java', 'class-name', { 76 + 'annotation': { 77 + pattern: /(^|[^.])@\w+(?:\s*\.\s*\w+)*/, 78 + lookbehind: true, 79 + alias: 'punctuation' 80 + }, 81 + 'generics': { 82 + pattern: /<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/, 83 + inside: { 84 + 'class-name': className, 85 + 'keyword': keywords, 86 + 'punctuation': /[<>(),.:]/, 87 + 'operator': /[?&|]/ 88 + } 89 + }, 90 + 'import': [ 91 + { 92 + pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source), 93 + lookbehind: true, 94 + inside: { 95 + 'namespace': className.inside.namespace, 96 + 'punctuation': /\./, 97 + 'operator': /\*/, 98 + 'class-name': /\w+/ 99 + } 100 + }, 101 + { 102 + pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source), 103 + lookbehind: true, 104 + alias: 'static', 105 + inside: { 106 + 'namespace': className.inside.namespace, 107 + 'static': /\b\w+$/, 108 + 'punctuation': /\./, 109 + 'operator': /\*/, 110 + 'class-name': /\w+/ 111 + } 112 + } 113 + ], 114 + 'namespace': { 115 + pattern: RegExp( 116 + /(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/ 117 + .source.replace(/<keyword>/g, function () { return keywords.source; })), 118 + lookbehind: true, 119 + inside: { 120 + 'punctuation': /\./, 121 + } 122 + } 123 + }); 124 + }(Prism));
+82
public/prism/prism-javadoc.js
··· 1 + (function (Prism) { 2 + 3 + var codeLinePattern = /(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m; 4 + 5 + var memberReference = /#\s*\w+(?:\s*\([^()]*\))?/.source; 6 + var reference = /(?:\b[a-zA-Z]\w+\s*\.\s*)*\b[A-Z]\w*(?:\s*<mem>)?|<mem>/.source.replace(/<mem>/g, function () { return memberReference; }); 7 + 8 + Prism.languages.javadoc = Prism.languages.extend('javadoclike', {}); 9 + Prism.languages.insertBefore('javadoc', 'keyword', { 10 + 'reference': { 11 + pattern: RegExp(/(@(?:exception|link|linkplain|see|throws|value)\s+(?:\*\s*)?)/.source + '(?:' + reference + ')'), 12 + lookbehind: true, 13 + inside: { 14 + 'function': { 15 + pattern: /(#\s*)\w+(?=\s*\()/, 16 + lookbehind: true 17 + }, 18 + 'field': { 19 + pattern: /(#\s*)\w+/, 20 + lookbehind: true 21 + }, 22 + 'namespace': { 23 + pattern: /\b(?:[a-z]\w*\s*\.\s*)+/, 24 + inside: { 25 + 'punctuation': /\./ 26 + } 27 + }, 28 + 'class-name': /\b[A-Z]\w*/, 29 + 'keyword': Prism.languages.java.keyword, 30 + 'punctuation': /[#()[\],.]/ 31 + } 32 + }, 33 + 'class-name': { 34 + // @param <T> the first generic type parameter 35 + pattern: /(@param\s+)<[A-Z]\w*>/, 36 + lookbehind: true, 37 + inside: { 38 + 'punctuation': /[.<>]/ 39 + } 40 + }, 41 + 'code-section': [ 42 + { 43 + pattern: /(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/, 44 + lookbehind: true, 45 + inside: { 46 + 'code': { 47 + // there can't be any HTML inside of {@code} tags 48 + pattern: codeLinePattern, 49 + lookbehind: true, 50 + inside: Prism.languages.java, 51 + alias: 'language-java' 52 + } 53 + } 54 + }, 55 + { 56 + pattern: /(<(code|pre|tt)>(?!<code>)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/, 57 + lookbehind: true, 58 + inside: { 59 + 'line': { 60 + pattern: codeLinePattern, 61 + lookbehind: true, 62 + inside: { 63 + // highlight HTML tags and entities 64 + 'tag': Prism.languages.markup.tag, 65 + 'entity': Prism.languages.markup.entity, 66 + 'code': { 67 + // everything else is Java code 68 + pattern: /.+/, 69 + inside: Prism.languages.java, 70 + alias: 'language-java' 71 + } 72 + } 73 + } 74 + } 75 + } 76 + ], 77 + 'tag': Prism.languages.markup.tag, 78 + 'entity': Prism.languages.markup.entity, 79 + }); 80 + 81 + Prism.languages.javadoclike.addSupport('java', Prism.languages.javadoc); 82 + }(Prism));
+87
public/prism/prism-javadoclike.js
··· 1 + (function (Prism) { 2 + 3 + var javaDocLike = Prism.languages.javadoclike = { 4 + 'parameter': { 5 + pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m, 6 + lookbehind: true 7 + }, 8 + 'keyword': { 9 + // keywords are the first word in a line preceded be an `@` or surrounded by curly braces. 10 + // @word, {@word} 11 + pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m, 12 + lookbehind: true 13 + }, 14 + 'punctuation': /[{}]/ 15 + }; 16 + 17 + 18 + /** 19 + * Adds doc comment support to the given language and calls a given callback on each doc comment pattern. 20 + * 21 + * @param {string} lang the language add doc comment support to. 22 + * @param {(pattern: {inside: {rest: undefined}}) => void} callback the function called with each doc comment pattern as argument. 23 + */ 24 + function docCommentSupport(lang, callback) { 25 + var tokenName = 'doc-comment'; 26 + 27 + var grammar = Prism.languages[lang]; 28 + if (!grammar) { 29 + return; 30 + } 31 + var token = grammar[tokenName]; 32 + 33 + if (!token) { 34 + // add doc comment: /** */ 35 + var definition = {}; 36 + definition[tokenName] = { 37 + pattern: /(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/, 38 + lookbehind: true, 39 + alias: 'comment' 40 + }; 41 + 42 + grammar = Prism.languages.insertBefore(lang, 'comment', definition); 43 + token = grammar[tokenName]; 44 + } 45 + 46 + if (token instanceof RegExp) { // convert regex to object 47 + token = grammar[tokenName] = { pattern: token }; 48 + } 49 + 50 + if (Array.isArray(token)) { 51 + for (var i = 0, l = token.length; i < l; i++) { 52 + if (token[i] instanceof RegExp) { 53 + token[i] = { pattern: token[i] }; 54 + } 55 + callback(token[i]); 56 + } 57 + } else { 58 + callback(token); 59 + } 60 + } 61 + 62 + /** 63 + * Adds doc-comment support to the given languages for the given documentation language. 64 + * 65 + * @param {string[]|string} languages 66 + * @param {Object} docLanguage 67 + */ 68 + function addSupport(languages, docLanguage) { 69 + if (typeof languages === 'string') { 70 + languages = [languages]; 71 + } 72 + 73 + languages.forEach(function (lang) { 74 + docCommentSupport(lang, function (pattern) { 75 + if (!pattern.inside) { 76 + pattern.inside = {}; 77 + } 78 + pattern.inside.rest = docLanguage; 79 + }); 80 + }); 81 + } 82 + 83 + Object.defineProperty(javaDocLike, 'addSupport', { value: addSupport }); 84 + 85 + javaDocLike.addSupport(['java', 'javascript', 'php'], javaDocLike); 86 + 87 + }(Prism));
+172
public/prism/prism-javascript.js
··· 1 + Prism.languages.javascript = Prism.languages.extend('clike', { 2 + 'class-name': [ 3 + Prism.languages.clike['class-name'], 4 + { 5 + pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/, 6 + lookbehind: true 7 + } 8 + ], 9 + 'keyword': [ 10 + { 11 + pattern: /((?:^|\})\s*)catch\b/, 12 + lookbehind: true 13 + }, 14 + { 15 + pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, 16 + lookbehind: true 17 + }, 18 + ], 19 + // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444) 20 + 'function': /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, 21 + 'number': { 22 + pattern: RegExp( 23 + /(^|[^\w$])/.source + 24 + '(?:' + 25 + ( 26 + // constant 27 + /NaN|Infinity/.source + 28 + '|' + 29 + // binary integer 30 + /0[bB][01]+(?:_[01]+)*n?/.source + 31 + '|' + 32 + // octal integer 33 + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + 34 + '|' + 35 + // hexadecimal integer 36 + /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + 37 + '|' + 38 + // decimal bigint 39 + /\d+(?:_\d+)*n/.source + 40 + '|' + 41 + // decimal number (integer or float) but no bigint 42 + /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source 43 + ) + 44 + ')' + 45 + /(?![\w$])/.source 46 + ), 47 + lookbehind: true 48 + }, 49 + 'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/ 50 + }); 51 + 52 + Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/; 53 + 54 + Prism.languages.insertBefore('javascript', 'keyword', { 55 + 'regex': { 56 + pattern: RegExp( 57 + // lookbehind 58 + // eslint-disable-next-line regexp/no-dupe-characters-character-class 59 + /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + 60 + // Regex pattern: 61 + // There are 2 regex patterns here. The RegExp set notation proposal added support for nested character 62 + // classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible 63 + // with the only syntax, so we have to define 2 different regex patterns. 64 + /\//.source + 65 + '(?:' + 66 + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + 67 + '|' + 68 + // `v` flag syntax. This supports 3 levels of nested character classes. 69 + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + 70 + ')' + 71 + // lookahead 72 + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source 73 + ), 74 + lookbehind: true, 75 + greedy: true, 76 + inside: { 77 + 'regex-source': { 78 + pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, 79 + lookbehind: true, 80 + alias: 'language-regex', 81 + inside: Prism.languages.regex 82 + }, 83 + 'regex-delimiter': /^\/|\/$/, 84 + 'regex-flags': /^[a-z]+$/, 85 + } 86 + }, 87 + // This must be declared before keyword because we use "function" inside the look-forward 88 + 'function-variable': { 89 + pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/, 90 + alias: 'function' 91 + }, 92 + 'parameter': [ 93 + { 94 + pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/, 95 + lookbehind: true, 96 + inside: Prism.languages.javascript 97 + }, 98 + { 99 + pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i, 100 + lookbehind: true, 101 + inside: Prism.languages.javascript 102 + }, 103 + { 104 + pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/, 105 + lookbehind: true, 106 + inside: Prism.languages.javascript 107 + }, 108 + { 109 + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/, 110 + lookbehind: true, 111 + inside: Prism.languages.javascript 112 + } 113 + ], 114 + 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ 115 + }); 116 + 117 + Prism.languages.insertBefore('javascript', 'string', { 118 + 'hashbang': { 119 + pattern: /^#!.*/, 120 + greedy: true, 121 + alias: 'comment' 122 + }, 123 + 'template-string': { 124 + pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, 125 + greedy: true, 126 + inside: { 127 + 'template-punctuation': { 128 + pattern: /^`|`$/, 129 + alias: 'string' 130 + }, 131 + 'interpolation': { 132 + pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, 133 + lookbehind: true, 134 + inside: { 135 + 'interpolation-punctuation': { 136 + pattern: /^\$\{|\}$/, 137 + alias: 'punctuation' 138 + }, 139 + rest: Prism.languages.javascript 140 + } 141 + }, 142 + 'string': /[\s\S]+/ 143 + } 144 + }, 145 + 'string-property': { 146 + pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m, 147 + lookbehind: true, 148 + greedy: true, 149 + alias: 'property' 150 + } 151 + }); 152 + 153 + Prism.languages.insertBefore('javascript', 'operator', { 154 + 'literal-property': { 155 + pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m, 156 + lookbehind: true, 157 + alias: 'property' 158 + }, 159 + }); 160 + 161 + if (Prism.languages.markup) { 162 + Prism.languages.markup.tag.addInlined('script', 'javascript'); 163 + 164 + // add attribute support for all DOM events. 165 + // https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events 166 + Prism.languages.markup.tag.addAttribute( 167 + /on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, 168 + 'javascript' 169 + ); 170 + } 171 + 172 + Prism.languages.js = Prism.languages.javascript;
+142
public/prism/prism-javastacktrace.js
··· 1 + // Specification: 2 + // https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/Throwable.html#printStackTrace() 3 + 4 + Prism.languages.javastacktrace = { 5 + 6 + // java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...] 7 + // Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...] 8 + // Caused by: com.example.myproject.MyProjectServletException 9 + // Caused by: MidLevelException: LowLevelException 10 + // Suppressed: Resource$CloseFailException: Resource ID = 0 11 + 'summary': { 12 + pattern: /^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m, 13 + lookbehind: true, 14 + inside: { 15 + 'keyword': { 16 + pattern: /^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m, 17 + lookbehind: true 18 + }, 19 + 20 + // the current thread if the summary starts with 'Exception in thread' 21 + 'string': { 22 + pattern: /^(\s*)"[^"]*"/, 23 + lookbehind: true 24 + }, 25 + 'exceptions': { 26 + pattern: /^(:?\s*)[\w$.]+(?=:|$)/, 27 + lookbehind: true, 28 + inside: { 29 + 'class-name': /[\w$]+$/, 30 + 'namespace': /\b[a-z]\w*\b/, 31 + 'punctuation': /\./ 32 + } 33 + }, 34 + 'message': { 35 + pattern: /(:\s*)\S.*/, 36 + lookbehind: true, 37 + alias: 'string' 38 + }, 39 + 'punctuation': /:/ 40 + } 41 + }, 42 + 43 + // at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 44 + // at org.hsqldb.jdbc.Util.throwError(Unknown Source) here could be some notes 45 + // at java.base/java.lang.Class.forName0(Native Method) 46 + // at Util.<init>(Unknown Source) 47 + // at com.foo.loader/foo@9.0/com.foo.Main.run(Main.java:101) 48 + // at com.foo.loader//com.foo.bar.App.run(App.java:12) 49 + // at acme@2.1/org.acme.Lib.test(Lib.java:80) 50 + // at MyClass.mash(MyClass.java:9) 51 + // 52 + // More information: 53 + // https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/StackTraceElement.html#toString() 54 + // 55 + // A valid Java module name is defined as: 56 + // "A module name consists of one or more Java identifiers (§3.8) separated by "." tokens." 57 + // https://docs.oracle.com/javase/specs/jls/se9/html/jls-6.html#jls-ModuleName 58 + // 59 + // A Java module version is defined by this class: 60 + // https://docs.oracle.com/javase/9/docs/api/java/lang/module/ModuleDescriptor.Version.html 61 + // This is the implementation of the `parse` method in JDK13: 62 + // https://github.com/matcdac/jdk/blob/2305df71d1b7710266ae0956d73927a225132c0f/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java#L1108 63 + // However, to keep this simple, a version will be matched by the pattern /@[\w$.+-]*/. 64 + 'stack-frame': { 65 + pattern: /^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:<init>)?\([^()]*\)/m, 66 + lookbehind: true, 67 + inside: { 68 + 'keyword': { 69 + pattern: /^(\s*)at(?= )/, 70 + lookbehind: true 71 + }, 72 + 'source': [ 73 + // (Main.java:15) 74 + // (Main.scala:15) 75 + { 76 + pattern: /(\()\w+\.\w+:\d+(?=\))/, 77 + lookbehind: true, 78 + inside: { 79 + 'file': /^\w+\.\w+/, 80 + 'punctuation': /:/, 81 + 'line-number': { 82 + pattern: /\b\d+\b/, 83 + alias: 'number' 84 + } 85 + } 86 + }, 87 + // (Unknown Source) 88 + // (Native Method) 89 + // (...something...) 90 + { 91 + pattern: /(\()[^()]*(?=\))/, 92 + lookbehind: true, 93 + inside: { 94 + 'keyword': /^(?:Native Method|Unknown Source)$/ 95 + } 96 + } 97 + ], 98 + 'class-name': /[\w$]+(?=\.(?:<init>|[\w$]+)\()/, 99 + 'function': /(?:<init>|[\w$]+)(?=\()/, 100 + 'class-loader': { 101 + pattern: /(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/, 102 + lookbehind: true, 103 + alias: 'namespace', 104 + inside: { 105 + 'punctuation': /\./ 106 + } 107 + }, 108 + 'module': { 109 + pattern: /([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/, 110 + lookbehind: true, 111 + inside: { 112 + 'version': { 113 + pattern: /(@)[\s\S]+/, 114 + lookbehind: true, 115 + alias: 'number' 116 + }, 117 + 'punctuation': /[@.]/ 118 + } 119 + }, 120 + 'namespace': { 121 + pattern: /(?:\b[a-z]\w*\.)+/, 122 + inside: { 123 + 'punctuation': /\./ 124 + } 125 + }, 126 + 'punctuation': /[()/.]/ 127 + } 128 + }, 129 + 130 + // ... 32 more 131 + // ... 32 common frames omitted 132 + 'more': { 133 + pattern: /^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m, 134 + lookbehind: true, 135 + inside: { 136 + 'punctuation': /\.{3}/, 137 + 'number': /\d+/, 138 + 'keyword': /\b[a-z]+(?: [a-z]+)*\b/ 139 + } 140 + } 141 + 142 + };
+135
public/prism/prism-js-extras.js
··· 1 + (function (Prism) { 2 + 3 + Prism.languages.insertBefore('javascript', 'function-variable', { 4 + 'method-variable': { 5 + pattern: RegExp('(\\.\\s*)' + Prism.languages.javascript['function-variable'].pattern.source), 6 + lookbehind: true, 7 + alias: ['function-variable', 'method', 'function', 'property-access'] 8 + } 9 + }); 10 + 11 + Prism.languages.insertBefore('javascript', 'function', { 12 + 'method': { 13 + pattern: RegExp('(\\.\\s*)' + Prism.languages.javascript['function'].source), 14 + lookbehind: true, 15 + alias: ['function', 'property-access'] 16 + } 17 + }); 18 + 19 + Prism.languages.insertBefore('javascript', 'constant', { 20 + 'known-class-name': [ 21 + { 22 + // standard built-ins 23 + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects 24 + pattern: /\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/, 25 + alias: 'class-name' 26 + }, 27 + { 28 + // errors 29 + pattern: /\b(?:[A-Z]\w*)Error\b/, 30 + alias: 'class-name' 31 + } 32 + ] 33 + }); 34 + 35 + /** 36 + * Replaces the `<ID>` placeholder in the given pattern with a pattern for general JS identifiers. 37 + * 38 + * @param {string} source 39 + * @param {string} [flags] 40 + * @returns {RegExp} 41 + */ 42 + function withId(source, flags) { 43 + return RegExp( 44 + source.replace(/<ID>/g, function () { return /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source; }), 45 + flags); 46 + } 47 + Prism.languages.insertBefore('javascript', 'keyword', { 48 + 'imports': { 49 + // https://tc39.es/ecma262/#sec-imports 50 + pattern: withId(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source), 51 + lookbehind: true, 52 + inside: Prism.languages.javascript 53 + }, 54 + 'exports': { 55 + // https://tc39.es/ecma262/#sec-exports 56 + pattern: withId(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source), 57 + lookbehind: true, 58 + inside: Prism.languages.javascript 59 + } 60 + }); 61 + 62 + Prism.languages.javascript['keyword'].unshift( 63 + { 64 + pattern: /\b(?:as|default|export|from|import)\b/, 65 + alias: 'module' 66 + }, 67 + { 68 + pattern: /\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/, 69 + alias: 'control-flow' 70 + }, 71 + { 72 + pattern: /\bnull\b/, 73 + alias: ['null', 'nil'] 74 + }, 75 + { 76 + pattern: /\bundefined\b/, 77 + alias: 'nil' 78 + } 79 + ); 80 + 81 + Prism.languages.insertBefore('javascript', 'operator', { 82 + 'spread': { 83 + pattern: /\.{3}/, 84 + alias: 'operator' 85 + }, 86 + 'arrow': { 87 + pattern: /=>/, 88 + alias: 'operator' 89 + } 90 + }); 91 + 92 + Prism.languages.insertBefore('javascript', 'punctuation', { 93 + 'property-access': { 94 + pattern: withId(/(\.\s*)#?<ID>/.source), 95 + lookbehind: true 96 + }, 97 + 'maybe-class-name': { 98 + pattern: /(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/, 99 + lookbehind: true 100 + }, 101 + 'dom': { 102 + // this contains only a few commonly used DOM variables 103 + pattern: /\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/, 104 + alias: 'variable' 105 + }, 106 + 'console': { 107 + pattern: /\bconsole(?=\s*\.)/, 108 + alias: 'class-name' 109 + } 110 + }); 111 + 112 + 113 + // add 'maybe-class-name' to tokens which might be a class name 114 + var maybeClassNameTokens = ['function', 'function-variable', 'method', 'method-variable', 'property-access']; 115 + 116 + for (var i = 0; i < maybeClassNameTokens.length; i++) { 117 + var token = maybeClassNameTokens[i]; 118 + var value = Prism.languages.javascript[token]; 119 + 120 + // convert regex to object 121 + if (Prism.util.type(value) === 'RegExp') { 122 + value = Prism.languages.javascript[token] = { 123 + pattern: value 124 + }; 125 + } 126 + 127 + // keep in mind that we don't support arrays 128 + 129 + var inside = value.inside || {}; 130 + value.inside = inside; 131 + 132 + inside['maybe-class-name'] = /^[A-Z][\s\S]*/; 133 + } 134 + 135 + }(Prism));
+349
public/prism/prism-js-templates.js
··· 1 + (function (Prism) { 2 + 3 + var templateString = Prism.languages.javascript['template-string']; 4 + 5 + // see the pattern in prism-javascript.js 6 + var templateLiteralPattern = templateString.pattern.source; 7 + var interpolationObject = templateString.inside['interpolation']; 8 + var interpolationPunctuationObject = interpolationObject.inside['interpolation-punctuation']; 9 + var interpolationPattern = interpolationObject.pattern.source; 10 + 11 + 12 + /** 13 + * Creates a new pattern to match a template string with a special tag. 14 + * 15 + * This will return `undefined` if there is no grammar with the given language id. 16 + * 17 + * @param {string} language The language id of the embedded language. E.g. `markdown`. 18 + * @param {string} tag The regex pattern to match the tag. 19 + * @returns {object | undefined} 20 + * @example 21 + * createTemplate('css', /\bcss/.source); 22 + */ 23 + function createTemplate(language, tag) { 24 + if (!Prism.languages[language]) { 25 + return undefined; 26 + } 27 + 28 + return { 29 + pattern: RegExp('((?:' + tag + ')\\s*)' + templateLiteralPattern), 30 + lookbehind: true, 31 + greedy: true, 32 + inside: { 33 + 'template-punctuation': { 34 + pattern: /^`|`$/, 35 + alias: 'string' 36 + }, 37 + 'embedded-code': { 38 + pattern: /[\s\S]+/, 39 + alias: language 40 + } 41 + } 42 + }; 43 + } 44 + 45 + 46 + Prism.languages.javascript['template-string'] = [ 47 + // styled-jsx: 48 + // css`a { color: #25F; }` 49 + // styled-components: 50 + // styled.h1`color: red;` 51 + createTemplate('css', /\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source), 52 + 53 + // html`<p></p>` 54 + // div.innerHTML = `<p></p>` 55 + createTemplate('html', /\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source), 56 + 57 + // svg`<path fill="#fff" d="M55.37 ..."/>` 58 + createTemplate('svg', /\bsvg/.source), 59 + 60 + // md`# h1`, markdown`## h2` 61 + createTemplate('markdown', /\b(?:markdown|md)/.source), 62 + 63 + // gql`...`, graphql`...`, graphql.experimental`...` 64 + createTemplate('graphql', /\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source), 65 + 66 + // sql`...` 67 + createTemplate('sql', /\bsql/.source), 68 + 69 + // vanilla template string 70 + templateString 71 + ].filter(Boolean); 72 + 73 + 74 + /** 75 + * Returns a specific placeholder literal for the given language. 76 + * 77 + * @param {number} counter 78 + * @param {string} language 79 + * @returns {string} 80 + */ 81 + function getPlaceholder(counter, language) { 82 + return '___' + language.toUpperCase() + '_' + counter + '___'; 83 + } 84 + 85 + /** 86 + * Returns the tokens of `Prism.tokenize` but also runs the `before-tokenize` and `after-tokenize` hooks. 87 + * 88 + * @param {string} code 89 + * @param {any} grammar 90 + * @param {string} language 91 + * @returns {(string|Token)[]} 92 + */ 93 + function tokenizeWithHooks(code, grammar, language) { 94 + var env = { 95 + code: code, 96 + grammar: grammar, 97 + language: language 98 + }; 99 + Prism.hooks.run('before-tokenize', env); 100 + env.tokens = Prism.tokenize(env.code, env.grammar); 101 + Prism.hooks.run('after-tokenize', env); 102 + return env.tokens; 103 + } 104 + 105 + /** 106 + * Returns the token of the given JavaScript interpolation expression. 107 + * 108 + * @param {string} expression The code of the expression. E.g. `"${42}"` 109 + * @returns {Token} 110 + */ 111 + function tokenizeInterpolationExpression(expression) { 112 + var tempGrammar = {}; 113 + tempGrammar['interpolation-punctuation'] = interpolationPunctuationObject; 114 + 115 + /** @type {Array} */ 116 + var tokens = Prism.tokenize(expression, tempGrammar); 117 + if (tokens.length === 3) { 118 + /** 119 + * The token array will look like this 120 + * [ 121 + * ["interpolation-punctuation", "${"] 122 + * "..." // JavaScript expression of the interpolation 123 + * ["interpolation-punctuation", "}"] 124 + * ] 125 + */ 126 + 127 + var args = [1, 1]; 128 + args.push.apply(args, tokenizeWithHooks(tokens[1], Prism.languages.javascript, 'javascript')); 129 + 130 + tokens.splice.apply(tokens, args); 131 + } 132 + 133 + return new Prism.Token('interpolation', tokens, interpolationObject.alias, expression); 134 + } 135 + 136 + /** 137 + * Tokenizes the given code with support for JavaScript interpolation expressions mixed in. 138 + * 139 + * This function has 3 phases: 140 + * 141 + * 1. Replace all JavaScript interpolation expression with a placeholder. 142 + * The placeholder will have the syntax of a identify of the target language. 143 + * 2. Tokenize the code with placeholders. 144 + * 3. Tokenize the interpolation expressions and re-insert them into the tokenize code. 145 + * The insertion only works if a placeholder hasn't been "ripped apart" meaning that the placeholder has been 146 + * tokenized as two tokens by the grammar of the embedded language. 147 + * 148 + * @param {string} code 149 + * @param {object} grammar 150 + * @param {string} language 151 + * @returns {Token} 152 + */ 153 + function tokenizeEmbedded(code, grammar, language) { 154 + // 1. First filter out all interpolations 155 + 156 + // because they might be escaped, we need a lookbehind, so we use Prism 157 + /** @type {(Token|string)[]} */ 158 + var _tokens = Prism.tokenize(code, { 159 + 'interpolation': { 160 + pattern: RegExp(interpolationPattern), 161 + lookbehind: true 162 + } 163 + }); 164 + 165 + // replace all interpolations with a placeholder which is not in the code already 166 + var placeholderCounter = 0; 167 + /** @type {Object<string, string>} */ 168 + var placeholderMap = {}; 169 + var embeddedCode = _tokens.map(function (token) { 170 + if (typeof token === 'string') { 171 + return token; 172 + } else { 173 + var interpolationExpression = token.content; 174 + 175 + var placeholder; 176 + while (code.indexOf(placeholder = getPlaceholder(placeholderCounter++, language)) !== -1) { /* noop */ } 177 + placeholderMap[placeholder] = interpolationExpression; 178 + return placeholder; 179 + } 180 + }).join(''); 181 + 182 + 183 + // 2. Tokenize the embedded code 184 + 185 + var embeddedTokens = tokenizeWithHooks(embeddedCode, grammar, language); 186 + 187 + 188 + // 3. Re-insert the interpolation 189 + 190 + var placeholders = Object.keys(placeholderMap); 191 + placeholderCounter = 0; 192 + 193 + /** 194 + * 195 + * @param {(Token|string)[]} tokens 196 + * @returns {void} 197 + */ 198 + function walkTokens(tokens) { 199 + for (var i = 0; i < tokens.length; i++) { 200 + if (placeholderCounter >= placeholders.length) { 201 + return; 202 + } 203 + 204 + var token = tokens[i]; 205 + 206 + if (typeof token === 'string' || typeof token.content === 'string') { 207 + var placeholder = placeholders[placeholderCounter]; 208 + var s = typeof token === 'string' ? token : /** @type {string} */ (token.content); 209 + 210 + var index = s.indexOf(placeholder); 211 + if (index !== -1) { 212 + ++placeholderCounter; 213 + 214 + var before = s.substring(0, index); 215 + var middle = tokenizeInterpolationExpression(placeholderMap[placeholder]); 216 + var after = s.substring(index + placeholder.length); 217 + 218 + var replacement = []; 219 + if (before) { 220 + replacement.push(before); 221 + } 222 + replacement.push(middle); 223 + if (after) { 224 + var afterTokens = [after]; 225 + walkTokens(afterTokens); 226 + replacement.push.apply(replacement, afterTokens); 227 + } 228 + 229 + if (typeof token === 'string') { 230 + tokens.splice.apply(tokens, [i, 1].concat(replacement)); 231 + i += replacement.length - 1; 232 + } else { 233 + token.content = replacement; 234 + } 235 + } 236 + } else { 237 + var content = token.content; 238 + if (Array.isArray(content)) { 239 + walkTokens(content); 240 + } else { 241 + walkTokens([content]); 242 + } 243 + } 244 + } 245 + } 246 + walkTokens(embeddedTokens); 247 + 248 + return new Prism.Token(language, embeddedTokens, 'language-' + language, code); 249 + } 250 + 251 + /** 252 + * The languages for which JS templating will handle tagged template literals. 253 + * 254 + * JS templating isn't active for only JavaScript but also related languages like TypeScript, JSX, and TSX. 255 + */ 256 + var supportedLanguages = { 257 + 'javascript': true, 258 + 'js': true, 259 + 'typescript': true, 260 + 'ts': true, 261 + 'jsx': true, 262 + 'tsx': true, 263 + }; 264 + Prism.hooks.add('after-tokenize', function (env) { 265 + if (!(env.language in supportedLanguages)) { 266 + return; 267 + } 268 + 269 + /** 270 + * Finds and tokenizes all template strings with an embedded languages. 271 + * 272 + * @param {(Token | string)[]} tokens 273 + * @returns {void} 274 + */ 275 + function findTemplateStrings(tokens) { 276 + for (var i = 0, l = tokens.length; i < l; i++) { 277 + var token = tokens[i]; 278 + 279 + if (typeof token === 'string') { 280 + continue; 281 + } 282 + 283 + var content = token.content; 284 + if (!Array.isArray(content)) { 285 + if (typeof content !== 'string') { 286 + findTemplateStrings([content]); 287 + } 288 + continue; 289 + } 290 + 291 + if (token.type === 'template-string') { 292 + /** 293 + * A JavaScript template-string token will look like this: 294 + * 295 + * ["template-string", [ 296 + * ["template-punctuation", "`"], 297 + * ( 298 + * An array of "string" and "interpolation" tokens. This is the simple string case. 299 + * or 300 + * ["embedded-code", "..."] This is the token containing the embedded code. 301 + * It also has an alias which is the language of the embedded code. 302 + * ), 303 + * ["template-punctuation", "`"] 304 + * ]] 305 + */ 306 + 307 + var embedded = content[1]; 308 + if (content.length === 3 && typeof embedded !== 'string' && embedded.type === 'embedded-code') { 309 + // get string content 310 + var code = stringContent(embedded); 311 + 312 + var alias = embedded.alias; 313 + var language = Array.isArray(alias) ? alias[0] : alias; 314 + 315 + var grammar = Prism.languages[language]; 316 + if (!grammar) { 317 + // the embedded language isn't registered. 318 + continue; 319 + } 320 + 321 + content[1] = tokenizeEmbedded(code, grammar, language); 322 + } 323 + } else { 324 + findTemplateStrings(content); 325 + } 326 + } 327 + } 328 + 329 + findTemplateStrings(env.tokens); 330 + }); 331 + 332 + 333 + /** 334 + * Returns the string content of a token or token stream. 335 + * 336 + * @param {string | Token | (string | Token)[]} value 337 + * @returns {string} 338 + */ 339 + function stringContent(value) { 340 + if (typeof value === 'string') { 341 + return value; 342 + } else if (Array.isArray(value)) { 343 + return value.map(stringContent).join(''); 344 + } else { 345 + return stringContent(value.content); 346 + } 347 + } 348 + 349 + }(Prism));
+78
public/prism/prism-jsdoc.js
··· 1 + (function (Prism) { 2 + 3 + var javascript = Prism.languages.javascript; 4 + 5 + var type = /\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source; 6 + var parameterPrefix = '(@(?:arg|argument|param|property)\\s+(?:' + type + '\\s+)?)'; 7 + 8 + Prism.languages.jsdoc = Prism.languages.extend('javadoclike', { 9 + 'parameter': { 10 + // @param {string} foo - foo bar 11 + pattern: RegExp(parameterPrefix + /(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source), 12 + lookbehind: true, 13 + inside: { 14 + 'punctuation': /\./ 15 + } 16 + } 17 + }); 18 + 19 + Prism.languages.insertBefore('jsdoc', 'keyword', { 20 + 'optional-parameter': { 21 + // @param {string} [baz.foo="bar"] foo bar 22 + pattern: RegExp(parameterPrefix + /\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source), 23 + lookbehind: true, 24 + inside: { 25 + 'parameter': { 26 + pattern: /(^\[)[$\w\xA0-\uFFFF\.]+/, 27 + lookbehind: true, 28 + inside: { 29 + 'punctuation': /\./ 30 + } 31 + }, 32 + 'code': { 33 + pattern: /(=)[\s\S]*(?=\]$)/, 34 + lookbehind: true, 35 + inside: javascript, 36 + alias: 'language-javascript' 37 + }, 38 + 'punctuation': /[=[\]]/ 39 + } 40 + }, 41 + 'class-name': [ 42 + { 43 + pattern: RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g, function () { return type; })), 44 + lookbehind: true, 45 + inside: { 46 + 'punctuation': /\./ 47 + } 48 + }, 49 + { 50 + pattern: RegExp('(@[a-z]+\\s+)' + type), 51 + lookbehind: true, 52 + inside: { 53 + 'string': javascript.string, 54 + 'number': javascript.number, 55 + 'boolean': javascript.boolean, 56 + 'keyword': Prism.languages.typescript.keyword, 57 + 'operator': /=>|\.\.\.|[&|?:*]/, 58 + 'punctuation': /[.,;=<>{}()[\]]/ 59 + } 60 + } 61 + ], 62 + 'example': { 63 + pattern: /(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/, 64 + lookbehind: true, 65 + inside: { 66 + 'code': { 67 + pattern: /^([\t ]*(?:\*\s*)?)\S.*$/m, 68 + lookbehind: true, 69 + inside: javascript, 70 + alias: 'language-javascript' 71 + } 72 + } 73 + } 74 + }); 75 + 76 + Prism.languages.javadoclike.addSupport('javascript', Prism.languages.jsdoc); 77 + 78 + }(Prism));
+27
public/prism/prism-json.js
··· 1 + // https://www.json.org/json-en.html 2 + Prism.languages.json = { 3 + 'property': { 4 + pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/, 5 + lookbehind: true, 6 + greedy: true 7 + }, 8 + 'string': { 9 + pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/, 10 + lookbehind: true, 11 + greedy: true 12 + }, 13 + 'comment': { 14 + pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/, 15 + greedy: true 16 + }, 17 + 'number': /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i, 18 + 'punctuation': /[{}[\],]/, 19 + 'operator': /:/, 20 + 'boolean': /\b(?:false|true)\b/, 21 + 'null': { 22 + pattern: /\bnull\b/, 23 + alias: 'keyword' 24 + } 25 + }; 26 + 27 + Prism.languages.webmanifest = Prism.languages.json;
+23
public/prism/prism-json5.js
··· 1 + (function (Prism) { 2 + 3 + var string = /("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/; 4 + 5 + Prism.languages.json5 = Prism.languages.extend('json', { 6 + 'property': [ 7 + { 8 + pattern: RegExp(string.source + '(?=\\s*:)'), 9 + greedy: true 10 + }, 11 + { 12 + pattern: /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/, 13 + alias: 'unquoted' 14 + } 15 + ], 16 + 'string': { 17 + pattern: string, 18 + greedy: true 19 + }, 20 + 'number': /[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/ 21 + }); 22 + 23 + }(Prism));
+49
public/prism/prism-jsstacktrace.js
··· 1 + Prism.languages.jsstacktrace = { 2 + 'error-message': { 3 + pattern: /^\S.*/m, 4 + alias: 'string' 5 + }, 6 + 7 + 'stack-frame': { 8 + pattern: /(^[ \t]+)at[ \t].*/m, 9 + lookbehind: true, 10 + inside: { 11 + 'not-my-code': { 12 + pattern: /^at[ \t]+(?!\s)(?:node\.js|<unknown>|.*(?:node_modules|\(<anonymous>\)|\(<unknown>|<anonymous>$|\(internal\/|\(node\.js)).*/m, 13 + alias: 'comment' 14 + }, 15 + 16 + 'filename': { 17 + pattern: /(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/, 18 + lookbehind: true, 19 + alias: 'url' 20 + }, 21 + 22 + 'function': { 23 + pattern: /(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/, 24 + lookbehind: true, 25 + inside: { 26 + 'punctuation': /\./ 27 + } 28 + }, 29 + 30 + 'punctuation': /[()]/, 31 + 32 + 'keyword': /\b(?:at|new)\b/, 33 + 34 + 'alias': { 35 + pattern: /\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/, 36 + alias: 'variable' 37 + }, 38 + 39 + 'line-number': { 40 + pattern: /:\d+(?::\d+)?\b/, 41 + alias: 'number', 42 + inside: { 43 + 'punctuation': /:/ 44 + } 45 + }, 46 + 47 + } 48 + } 49 + };
+34
public/prism/prism-makefile.js
··· 1 + Prism.languages.makefile = { 2 + 'comment': { 3 + pattern: /(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/, 4 + lookbehind: true 5 + }, 6 + 'string': { 7 + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, 8 + greedy: true 9 + }, 10 + 11 + 'builtin-target': { 12 + pattern: /\.[A-Z][^:#=\s]+(?=\s*:(?!=))/, 13 + alias: 'builtin' 14 + }, 15 + 16 + 'target': { 17 + pattern: /^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m, 18 + alias: 'symbol', 19 + inside: { 20 + 'variable': /\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/ 21 + } 22 + }, 23 + 'variable': /\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/, 24 + 25 + // Directives 26 + 'keyword': /-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/, 27 + 28 + 'function': { 29 + pattern: /(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/, 30 + lookbehind: true 31 + }, 32 + 'operator': /(?:::|[?:+!])?=|[|@]/, 33 + 'punctuation': /[:;(){}]/ 34 + };
+415
public/prism/prism-markdown.js
··· 1 + (function (Prism) { 2 + 3 + // Allow only one line break 4 + var inner = /(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source; 5 + 6 + /** 7 + * This function is intended for the creation of the bold or italic pattern. 8 + * 9 + * This also adds a lookbehind group to the given pattern to ensure that the pattern is not backslash-escaped. 10 + * 11 + * _Note:_ Keep in mind that this adds a capturing group. 12 + * 13 + * @param {string} pattern 14 + * @returns {RegExp} 15 + */ 16 + function createInline(pattern) { 17 + pattern = pattern.replace(/<inner>/g, function () { return inner; }); 18 + return RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + '(?:' + pattern + ')'); 19 + } 20 + 21 + 22 + var tableCell = /(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source; 23 + var tableRow = /\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g, function () { return tableCell; }); 24 + var tableLine = /\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source; 25 + 26 + 27 + Prism.languages.markdown = Prism.languages.extend('markup', {}); 28 + Prism.languages.insertBefore('markdown', 'prolog', { 29 + 'front-matter-block': { 30 + pattern: /(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/, 31 + lookbehind: true, 32 + greedy: true, 33 + inside: { 34 + 'punctuation': /^---|---$/, 35 + 'front-matter': { 36 + pattern: /\S+(?:\s+\S+)*/, 37 + alias: ['yaml', 'language-yaml'], 38 + inside: Prism.languages.yaml 39 + } 40 + } 41 + }, 42 + 'blockquote': { 43 + // > ... 44 + pattern: /^>(?:[\t ]*>)*/m, 45 + alias: 'punctuation' 46 + }, 47 + 'table': { 48 + pattern: RegExp('^' + tableRow + tableLine + '(?:' + tableRow + ')*', 'm'), 49 + inside: { 50 + 'table-data-rows': { 51 + pattern: RegExp('^(' + tableRow + tableLine + ')(?:' + tableRow + ')*$'), 52 + lookbehind: true, 53 + inside: { 54 + 'table-data': { 55 + pattern: RegExp(tableCell), 56 + inside: Prism.languages.markdown 57 + }, 58 + 'punctuation': /\|/ 59 + } 60 + }, 61 + 'table-line': { 62 + pattern: RegExp('^(' + tableRow + ')' + tableLine + '$'), 63 + lookbehind: true, 64 + inside: { 65 + 'punctuation': /\||:?-{3,}:?/ 66 + } 67 + }, 68 + 'table-header-row': { 69 + pattern: RegExp('^' + tableRow + '$'), 70 + inside: { 71 + 'table-header': { 72 + pattern: RegExp(tableCell), 73 + alias: 'important', 74 + inside: Prism.languages.markdown 75 + }, 76 + 'punctuation': /\|/ 77 + } 78 + } 79 + } 80 + }, 81 + 'code': [ 82 + { 83 + // Prefixed by 4 spaces or 1 tab and preceded by an empty line 84 + pattern: /((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/, 85 + lookbehind: true, 86 + alias: 'keyword' 87 + }, 88 + { 89 + // ```optional language 90 + // code block 91 + // ``` 92 + pattern: /^```[\s\S]*?^```$/m, 93 + greedy: true, 94 + inside: { 95 + 'code-block': { 96 + pattern: /^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m, 97 + lookbehind: true 98 + }, 99 + 'code-language': { 100 + pattern: /^(```).+/, 101 + lookbehind: true 102 + }, 103 + 'punctuation': /```/ 104 + } 105 + } 106 + ], 107 + 'title': [ 108 + { 109 + // title 1 110 + // ======= 111 + 112 + // title 2 113 + // ------- 114 + pattern: /\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m, 115 + alias: 'important', 116 + inside: { 117 + punctuation: /==+$|--+$/ 118 + } 119 + }, 120 + { 121 + // # title 1 122 + // ###### title 6 123 + pattern: /(^\s*)#.+/m, 124 + lookbehind: true, 125 + alias: 'important', 126 + inside: { 127 + punctuation: /^#+|#+$/ 128 + } 129 + } 130 + ], 131 + 'hr': { 132 + // *** 133 + // --- 134 + // * * * 135 + // ----------- 136 + pattern: /(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m, 137 + lookbehind: true, 138 + alias: 'punctuation' 139 + }, 140 + 'list': { 141 + // * item 142 + // + item 143 + // - item 144 + // 1. item 145 + pattern: /(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m, 146 + lookbehind: true, 147 + alias: 'punctuation' 148 + }, 149 + 'url-reference': { 150 + // [id]: http://example.com "Optional title" 151 + // [id]: http://example.com 'Optional title' 152 + // [id]: http://example.com (Optional title) 153 + // [id]: <http://example.com> "Optional title" 154 + pattern: /!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/, 155 + inside: { 156 + 'variable': { 157 + pattern: /^(!?\[)[^\]]+/, 158 + lookbehind: true 159 + }, 160 + 'string': /(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/, 161 + 'punctuation': /^[\[\]!:]|[<>]/ 162 + }, 163 + alias: 'url' 164 + }, 165 + 'bold': { 166 + // **strong** 167 + // __strong__ 168 + 169 + // allow one nested instance of italic text using the same delimiter 170 + pattern: createInline(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source), 171 + lookbehind: true, 172 + greedy: true, 173 + inside: { 174 + 'content': { 175 + pattern: /(^..)[\s\S]+(?=..$)/, 176 + lookbehind: true, 177 + inside: {} // see below 178 + }, 179 + 'punctuation': /\*\*|__/ 180 + } 181 + }, 182 + 'italic': { 183 + // *em* 184 + // _em_ 185 + 186 + // allow one nested instance of bold text using the same delimiter 187 + pattern: createInline(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source), 188 + lookbehind: true, 189 + greedy: true, 190 + inside: { 191 + 'content': { 192 + pattern: /(^.)[\s\S]+(?=.$)/, 193 + lookbehind: true, 194 + inside: {} // see below 195 + }, 196 + 'punctuation': /[*_]/ 197 + } 198 + }, 199 + 'strike': { 200 + // ~~strike through~~ 201 + // ~strike~ 202 + // eslint-disable-next-line regexp/strict 203 + pattern: createInline(/(~~?)(?:(?!~)<inner>)+\2/.source), 204 + lookbehind: true, 205 + greedy: true, 206 + inside: { 207 + 'content': { 208 + pattern: /(^~~?)[\s\S]+(?=\1$)/, 209 + lookbehind: true, 210 + inside: {} // see below 211 + }, 212 + 'punctuation': /~~?/ 213 + } 214 + }, 215 + 'code-snippet': { 216 + // `code` 217 + // ``code`` 218 + pattern: /(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/, 219 + lookbehind: true, 220 + greedy: true, 221 + alias: ['code', 'keyword'] 222 + }, 223 + 'url': { 224 + // [example](http://example.com "Optional title") 225 + // [example][id] 226 + // [example] [id] 227 + pattern: createInline(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source), 228 + lookbehind: true, 229 + greedy: true, 230 + inside: { 231 + 'operator': /^!/, 232 + 'content': { 233 + pattern: /(^\[)[^\]]+(?=\])/, 234 + lookbehind: true, 235 + inside: {} // see below 236 + }, 237 + 'variable': { 238 + pattern: /(^\][ \t]?\[)[^\]]+(?=\]$)/, 239 + lookbehind: true 240 + }, 241 + 'url': { 242 + pattern: /(^\]\()[^\s)]+/, 243 + lookbehind: true 244 + }, 245 + 'string': { 246 + pattern: /(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/, 247 + lookbehind: true 248 + } 249 + } 250 + } 251 + }); 252 + 253 + ['url', 'bold', 'italic', 'strike'].forEach(function (token) { 254 + ['url', 'bold', 'italic', 'strike', 'code-snippet'].forEach(function (inside) { 255 + if (token !== inside) { 256 + Prism.languages.markdown[token].inside.content.inside[inside] = Prism.languages.markdown[inside]; 257 + } 258 + }); 259 + }); 260 + 261 + Prism.hooks.add('after-tokenize', function (env) { 262 + if (env.language !== 'markdown' && env.language !== 'md') { 263 + return; 264 + } 265 + 266 + function walkTokens(tokens) { 267 + if (!tokens || typeof tokens === 'string') { 268 + return; 269 + } 270 + 271 + for (var i = 0, l = tokens.length; i < l; i++) { 272 + var token = tokens[i]; 273 + 274 + if (token.type !== 'code') { 275 + walkTokens(token.content); 276 + continue; 277 + } 278 + 279 + /* 280 + * Add the correct `language-xxxx` class to this code block. Keep in mind that the `code-language` token 281 + * is optional. But the grammar is defined so that there is only one case we have to handle: 282 + * 283 + * token.content = [ 284 + * <span class="punctuation">```</span>, 285 + * <span class="code-language">xxxx</span>, 286 + * '\n', // exactly one new lines (\r or \n or \r\n) 287 + * <span class="code-block">...</span>, 288 + * '\n', // exactly one new lines again 289 + * <span class="punctuation">```</span> 290 + * ]; 291 + */ 292 + 293 + var codeLang = token.content[1]; 294 + var codeBlock = token.content[3]; 295 + 296 + if (codeLang && codeBlock && 297 + codeLang.type === 'code-language' && codeBlock.type === 'code-block' && 298 + typeof codeLang.content === 'string') { 299 + 300 + // this might be a language that Prism does not support 301 + 302 + // do some replacements to support C++, C#, and F# 303 + var lang = codeLang.content.replace(/\b#/g, 'sharp').replace(/\b\+\+/g, 'pp'); 304 + // only use the first word 305 + lang = (/[a-z][\w-]*/i.exec(lang) || [''])[0].toLowerCase(); 306 + var alias = 'language-' + lang; 307 + 308 + // add alias 309 + if (!codeBlock.alias) { 310 + codeBlock.alias = [alias]; 311 + } else if (typeof codeBlock.alias === 'string') { 312 + codeBlock.alias = [codeBlock.alias, alias]; 313 + } else { 314 + codeBlock.alias.push(alias); 315 + } 316 + } 317 + } 318 + } 319 + 320 + walkTokens(env.tokens); 321 + }); 322 + 323 + Prism.hooks.add('wrap', function (env) { 324 + if (env.type !== 'code-block') { 325 + return; 326 + } 327 + 328 + var codeLang = ''; 329 + for (var i = 0, l = env.classes.length; i < l; i++) { 330 + var cls = env.classes[i]; 331 + var match = /language-(.+)/.exec(cls); 332 + if (match) { 333 + codeLang = match[1]; 334 + break; 335 + } 336 + } 337 + 338 + var grammar = Prism.languages[codeLang]; 339 + 340 + if (!grammar) { 341 + if (codeLang && codeLang !== 'none' && Prism.plugins.autoloader) { 342 + var id = 'md-' + new Date().valueOf() + '-' + Math.floor(Math.random() * 1e16); 343 + env.attributes['id'] = id; 344 + 345 + Prism.plugins.autoloader.loadLanguages(codeLang, function () { 346 + var ele = document.getElementById(id); 347 + if (ele) { 348 + ele.innerHTML = Prism.highlight(ele.textContent, Prism.languages[codeLang], codeLang); 349 + } 350 + }); 351 + } 352 + } else { 353 + env.content = Prism.highlight(textContent(env.content), grammar, codeLang); 354 + } 355 + }); 356 + 357 + var tagPattern = RegExp(Prism.languages.markup.tag.pattern.source, 'gi'); 358 + 359 + /** 360 + * A list of known entity names. 361 + * 362 + * This will always be incomplete to save space. The current list is the one used by lowdash's unescape function. 363 + * 364 + * @see {@link https://github.com/lodash/lodash/blob/2da024c3b4f9947a48517639de7560457cd4ec6c/unescape.js#L2} 365 + */ 366 + var KNOWN_ENTITY_NAMES = { 367 + 'amp': '&', 368 + 'lt': '<', 369 + 'gt': '>', 370 + 'quot': '"', 371 + }; 372 + 373 + // IE 11 doesn't support `String.fromCodePoint` 374 + var fromCodePoint = String.fromCodePoint || String.fromCharCode; 375 + 376 + /** 377 + * Returns the text content of a given HTML source code string. 378 + * 379 + * @param {string} html 380 + * @returns {string} 381 + */ 382 + function textContent(html) { 383 + // remove all tags 384 + var text = html.replace(tagPattern, ''); 385 + 386 + // decode known entities 387 + text = text.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi, function (m, code) { 388 + code = code.toLowerCase(); 389 + 390 + if (code[0] === '#') { 391 + var value; 392 + if (code[1] === 'x') { 393 + value = parseInt(code.slice(2), 16); 394 + } else { 395 + value = Number(code.slice(1)); 396 + } 397 + 398 + return fromCodePoint(value); 399 + } else { 400 + var known = KNOWN_ENTITY_NAMES[code]; 401 + if (known) { 402 + return known; 403 + } 404 + 405 + // unable to decode 406 + return m; 407 + } 408 + }); 409 + 410 + return text; 411 + } 412 + 413 + Prism.languages.md = Prism.languages.markdown; 414 + 415 + }(Prism));
+186
public/prism/prism-markup.js
··· 1 + Prism.languages.markup = { 2 + 'comment': { 3 + pattern: /<!--(?:(?!<!--)[\s\S])*?-->/, 4 + greedy: true 5 + }, 6 + 'prolog': { 7 + pattern: /<\?[\s\S]+?\?>/, 8 + greedy: true 9 + }, 10 + 'doctype': { 11 + // https://www.w3.org/TR/xml/#NT-doctypedecl 12 + pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i, 13 + greedy: true, 14 + inside: { 15 + 'internal-subset': { 16 + pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/, 17 + lookbehind: true, 18 + greedy: true, 19 + inside: null // see below 20 + }, 21 + 'string': { 22 + pattern: /"[^"]*"|'[^']*'/, 23 + greedy: true 24 + }, 25 + 'punctuation': /^<!|>$|[[\]]/, 26 + 'doctype-tag': /^DOCTYPE/i, 27 + 'name': /[^\s<>'"]+/ 28 + } 29 + }, 30 + 'cdata': { 31 + pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i, 32 + greedy: true 33 + }, 34 + 'tag': { 35 + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/, 36 + greedy: true, 37 + inside: { 38 + 'tag': { 39 + pattern: /^<\/?[^\s>\/]+/, 40 + inside: { 41 + 'punctuation': /^<\/?/, 42 + 'namespace': /^[^\s>\/:]+:/ 43 + } 44 + }, 45 + 'special-attr': [], 46 + 'attr-value': { 47 + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/, 48 + inside: { 49 + 'punctuation': [ 50 + { 51 + pattern: /^=/, 52 + alias: 'attr-equals' 53 + }, 54 + { 55 + pattern: /^(\s*)["']|["']$/, 56 + lookbehind: true 57 + } 58 + ] 59 + } 60 + }, 61 + 'punctuation': /\/?>/, 62 + 'attr-name': { 63 + pattern: /[^\s>\/]+/, 64 + inside: { 65 + 'namespace': /^[^\s>\/:]+:/ 66 + } 67 + } 68 + 69 + } 70 + }, 71 + 'entity': [ 72 + { 73 + pattern: /&[\da-z]{1,8};/i, 74 + alias: 'named-entity' 75 + }, 76 + /&#x?[\da-f]{1,8};/i 77 + ] 78 + }; 79 + 80 + Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = 81 + Prism.languages.markup['entity']; 82 + Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup; 83 + 84 + // Plugin to make entity title show the real entity, idea by Roman Komarov 85 + Prism.hooks.add('wrap', function (env) { 86 + 87 + if (env.type === 'entity') { 88 + env.attributes['title'] = env.content.replace(/&amp;/, '&'); 89 + } 90 + }); 91 + 92 + Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { 93 + /** 94 + * Adds an inlined language to markup. 95 + * 96 + * An example of an inlined language is CSS with `<style>` tags. 97 + * 98 + * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as 99 + * case insensitive. 100 + * @param {string} lang The language key. 101 + * @example 102 + * addInlined('style', 'css'); 103 + */ 104 + value: function addInlined(tagName, lang) { 105 + var includedCdataInside = {}; 106 + includedCdataInside['language-' + lang] = { 107 + pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i, 108 + lookbehind: true, 109 + inside: Prism.languages[lang] 110 + }; 111 + includedCdataInside['cdata'] = /^<!\[CDATA\[|\]\]>$/i; 112 + 113 + var inside = { 114 + 'included-cdata': { 115 + pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i, 116 + inside: includedCdataInside 117 + } 118 + }; 119 + inside['language-' + lang] = { 120 + pattern: /[\s\S]+/, 121 + inside: Prism.languages[lang] 122 + }; 123 + 124 + var def = {}; 125 + def[tagName] = { 126 + pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'), 127 + lookbehind: true, 128 + greedy: true, 129 + inside: inside 130 + }; 131 + 132 + Prism.languages.insertBefore('markup', 'cdata', def); 133 + } 134 + }); 135 + Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', { 136 + /** 137 + * Adds an pattern to highlight languages embedded in HTML attributes. 138 + * 139 + * An example of an inlined language is CSS with `style` attributes. 140 + * 141 + * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as 142 + * case insensitive. 143 + * @param {string} lang The language key. 144 + * @example 145 + * addAttribute('style', 'css'); 146 + */ 147 + value: function (attrName, lang) { 148 + Prism.languages.markup.tag.inside['special-attr'].push({ 149 + pattern: RegExp( 150 + /(^|["'\s])/.source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source, 151 + 'i' 152 + ), 153 + lookbehind: true, 154 + inside: { 155 + 'attr-name': /^[^\s=]+/, 156 + 'attr-value': { 157 + pattern: /=[\s\S]+/, 158 + inside: { 159 + 'value': { 160 + pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/, 161 + lookbehind: true, 162 + alias: [lang, 'language-' + lang], 163 + inside: Prism.languages[lang] 164 + }, 165 + 'punctuation': [ 166 + { 167 + pattern: /^=/, 168 + alias: 'attr-equals' 169 + }, 170 + /"|'/ 171 + ] 172 + } 173 + } 174 + } 175 + }); 176 + } 177 + }); 178 + 179 + Prism.languages.html = Prism.languages.markup; 180 + Prism.languages.mathml = Prism.languages.markup; 181 + Prism.languages.svg = Prism.languages.markup; 182 + 183 + Prism.languages.xml = Prism.languages.extend('markup', {}); 184 + Prism.languages.ssml = Prism.languages.xml; 185 + Prism.languages.atom = Prism.languages.xml; 186 + Prism.languages.rss = Prism.languages.xml;
+58
public/prism/prism-pwsh.js
··· 1 + (function (Prism) { 2 + 3 + var powershell = Prism.languages.powershell = { 4 + 'comment': [ 5 + { 6 + pattern: /(^|[^`])<#[\s\S]*?#>/, 7 + lookbehind: true 8 + }, 9 + { 10 + pattern: /(^|[^`])#.*/, 11 + lookbehind: true 12 + } 13 + ], 14 + 'string': [ 15 + { 16 + pattern: /"(?:`[\s\S]|[^`"])*"/, 17 + greedy: true, 18 + inside: null // see below 19 + }, 20 + { 21 + pattern: /'(?:[^']|'')*'/, 22 + greedy: true 23 + } 24 + ], 25 + // Matches name spaces as well as casts, attribute decorators. Force starting with letter to avoid matching array indices 26 + // Supports two levels of nested brackets (e.g. `[OutputType([System.Collections.Generic.List[int]])]`) 27 + 'namespace': /\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i, 28 + 'boolean': /\$(?:false|true)\b/i, 29 + 'variable': /\$\w+\b/, 30 + // Cmdlets and aliases. Aliases should come last, otherwise "write" gets preferred over "write-host" for example 31 + // Get-Command | ?{ $_.ModuleName -match "Microsoft.PowerShell.(Util|Core|Management)" } 32 + // Get-Alias | ?{ $_.ReferencedCommand.Module.Name -match "Microsoft.PowerShell.(Util|Core|Management)" } 33 + 'function': [ 34 + /\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i, 35 + /\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i 36 + ], 37 + // per http://technet.microsoft.com/en-us/library/hh847744.aspx 38 + 'keyword': /\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i, 39 + 'operator': { 40 + pattern: /(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i, 41 + lookbehind: true 42 + }, 43 + 'punctuation': /[|{}[\];(),.]/ 44 + }; 45 + 46 + // Variable interpolation inside strings, and nested expressions 47 + powershell.string[0].inside = { 48 + 'function': { 49 + // Allow for one level of nesting 50 + pattern: /(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/, 51 + lookbehind: true, 52 + inside: powershell 53 + }, 54 + 'boolean': powershell.boolean, 55 + 'variable': powershell.variable, 56 + }; 57 + 58 + }(Prism));
+65
public/prism/prism-python.js
··· 1 + Prism.languages.python = { 2 + 'comment': { 3 + pattern: /(^|[^\\])#.*/, 4 + lookbehind: true, 5 + greedy: true 6 + }, 7 + 'string-interpolation': { 8 + pattern: /(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, 9 + greedy: true, 10 + inside: { 11 + 'interpolation': { 12 + // "{" <expression> <optional "!s", "!r", or "!a"> <optional ":" format specifier> "}" 13 + pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/, 14 + lookbehind: true, 15 + inside: { 16 + 'format-spec': { 17 + pattern: /(:)[^:(){}]+(?=\}$)/, 18 + lookbehind: true 19 + }, 20 + 'conversion-option': { 21 + pattern: /![sra](?=[:}]$)/, 22 + alias: 'punctuation' 23 + }, 24 + rest: null 25 + } 26 + }, 27 + 'string': /[\s\S]+/ 28 + } 29 + }, 30 + 'triple-quoted-string': { 31 + pattern: /(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i, 32 + greedy: true, 33 + alias: 'string' 34 + }, 35 + 'string': { 36 + pattern: /(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, 37 + greedy: true 38 + }, 39 + 'function': { 40 + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, 41 + lookbehind: true 42 + }, 43 + 'class-name': { 44 + pattern: /(\bclass\s+)\w+/i, 45 + lookbehind: true 46 + }, 47 + 'decorator': { 48 + pattern: /(^[\t ]*)@\w+(?:\.\w+)*/m, 49 + lookbehind: true, 50 + alias: ['annotation', 'punctuation'], 51 + inside: { 52 + 'punctuation': /\./ 53 + } 54 + }, 55 + 'keyword': /\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, 56 + 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, 57 + 'boolean': /\b(?:False|None|True)\b/, 58 + 'number': /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i, 59 + 'operator': /[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, 60 + 'punctuation': /[{}[\];(),.:]/ 61 + }; 62 + 63 + Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; 64 + 65 + Prism.languages.py = Prism.languages.python;
+104
public/prism/prism-regex.js
··· 1 + (function (Prism) { 2 + 3 + var specialEscape = { 4 + pattern: /\\[\\(){}[\]^$+*?|.]/, 5 + alias: 'escape' 6 + }; 7 + var escape = /\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/; 8 + var charSet = { 9 + pattern: /\.|\\[wsd]|\\p\{[^{}]+\}/i, 10 + alias: 'class-name' 11 + }; 12 + var charSetWithoutDot = { 13 + pattern: /\\[wsd]|\\p\{[^{}]+\}/i, 14 + alias: 'class-name' 15 + }; 16 + 17 + var rangeChar = '(?:[^\\\\-]|' + escape.source + ')'; 18 + var range = RegExp(rangeChar + '-' + rangeChar); 19 + 20 + // the name of a capturing group 21 + var groupName = { 22 + pattern: /(<|')[^<>']+(?=[>']$)/, 23 + lookbehind: true, 24 + alias: 'variable' 25 + }; 26 + 27 + Prism.languages.regex = { 28 + 'char-class': { 29 + pattern: /((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/, 30 + lookbehind: true, 31 + inside: { 32 + 'char-class-negation': { 33 + pattern: /(^\[)\^/, 34 + lookbehind: true, 35 + alias: 'operator' 36 + }, 37 + 'char-class-punctuation': { 38 + pattern: /^\[|\]$/, 39 + alias: 'punctuation' 40 + }, 41 + 'range': { 42 + pattern: range, 43 + inside: { 44 + 'escape': escape, 45 + 'range-punctuation': { 46 + pattern: /-/, 47 + alias: 'operator' 48 + } 49 + } 50 + }, 51 + 'special-escape': specialEscape, 52 + 'char-set': charSetWithoutDot, 53 + 'escape': escape 54 + } 55 + }, 56 + 'special-escape': specialEscape, 57 + 'char-set': charSet, 58 + 'backreference': [ 59 + { 60 + // a backreference which is not an octal escape 61 + pattern: /\\(?![123][0-7]{2})[1-9]/, 62 + alias: 'keyword' 63 + }, 64 + { 65 + pattern: /\\k<[^<>']+>/, 66 + alias: 'keyword', 67 + inside: { 68 + 'group-name': groupName 69 + } 70 + } 71 + ], 72 + 'anchor': { 73 + pattern: /[$^]|\\[ABbGZz]/, 74 + alias: 'function' 75 + }, 76 + 'escape': escape, 77 + 'group': [ 78 + { 79 + // https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html 80 + // https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference?view=netframework-4.7.2#grouping-constructs 81 + 82 + // (), (?<name>), (?'name'), (?>), (?:), (?=), (?!), (?<=), (?<!), (?is-m), (?i-m:) 83 + pattern: /\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/, 84 + alias: 'punctuation', 85 + inside: { 86 + 'group-name': groupName 87 + } 88 + }, 89 + { 90 + pattern: /\)/, 91 + alias: 'punctuation' 92 + } 93 + ], 94 + 'quantifier': { 95 + pattern: /(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/, 96 + alias: 'number' 97 + }, 98 + 'alternation': { 99 + pattern: /\|/, 100 + alias: 'keyword' 101 + } 102 + }; 103 + 104 + }(Prism));
+128
public/prism/prism-rust.js
··· 1 + (function (Prism) { 2 + 3 + var multilineComment = /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source; 4 + for (var i = 0; i < 2; i++) { 5 + // support 4 levels of nested comments 6 + multilineComment = multilineComment.replace(/<self>/g, function () { return multilineComment; }); 7 + } 8 + multilineComment = multilineComment.replace(/<self>/g, function () { return /[^\s\S]/.source; }); 9 + 10 + 11 + Prism.languages.rust = { 12 + 'comment': [ 13 + { 14 + pattern: RegExp(/(^|[^\\])/.source + multilineComment), 15 + lookbehind: true, 16 + greedy: true 17 + }, 18 + { 19 + pattern: /(^|[^\\:])\/\/.*/, 20 + lookbehind: true, 21 + greedy: true 22 + } 23 + ], 24 + 'string': { 25 + pattern: /b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/, 26 + greedy: true 27 + }, 28 + 'char': { 29 + pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/, 30 + greedy: true 31 + }, 32 + 'attribute': { 33 + pattern: /#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/, 34 + greedy: true, 35 + alias: 'attr-name', 36 + inside: { 37 + 'string': null // see below 38 + } 39 + }, 40 + 41 + // Closure params should not be confused with bitwise OR | 42 + 'closure-params': { 43 + pattern: /([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/, 44 + lookbehind: true, 45 + greedy: true, 46 + inside: { 47 + 'closure-punctuation': { 48 + pattern: /^\||\|$/, 49 + alias: 'punctuation' 50 + }, 51 + rest: null // see below 52 + } 53 + }, 54 + 55 + 'lifetime-annotation': { 56 + pattern: /'\w+/, 57 + alias: 'symbol' 58 + }, 59 + 60 + 'fragment-specifier': { 61 + pattern: /(\$\w+:)[a-z]+/, 62 + lookbehind: true, 63 + alias: 'punctuation' 64 + }, 65 + 'variable': /\$\w+/, 66 + 67 + 'function-definition': { 68 + pattern: /(\bfn\s+)\w+/, 69 + lookbehind: true, 70 + alias: 'function' 71 + }, 72 + 'type-definition': { 73 + pattern: /(\b(?:enum|struct|trait|type|union)\s+)\w+/, 74 + lookbehind: true, 75 + alias: 'class-name' 76 + }, 77 + 'module-declaration': [ 78 + { 79 + pattern: /(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/, 80 + lookbehind: true, 81 + alias: 'namespace' 82 + }, 83 + { 84 + pattern: /(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/, 85 + lookbehind: true, 86 + alias: 'namespace', 87 + inside: { 88 + 'punctuation': /::/ 89 + } 90 + } 91 + ], 92 + 'keyword': [ 93 + // https://github.com/rust-lang/reference/blob/master/src/keywords.md 94 + /\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/, 95 + // primitives and str 96 + // https://doc.rust-lang.org/stable/rust-by-example/primitives.html 97 + /\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/ 98 + ], 99 + 100 + // functions can technically start with an upper-case letter, but this will introduce a lot of false positives 101 + // and Rust's naming conventions recommend snake_case anyway. 102 + // https://doc.rust-lang.org/1.0.0/style/style/naming/README.html 103 + 'function': /\b[a-z_]\w*(?=\s*(?:::\s*<|\())/, 104 + 'macro': { 105 + pattern: /\b\w+!/, 106 + alias: 'property' 107 + }, 108 + 'constant': /\b[A-Z_][A-Z_\d]+\b/, 109 + 'class-name': /\b[A-Z]\w*\b/, 110 + 111 + 'namespace': { 112 + pattern: /(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/, 113 + inside: { 114 + 'punctuation': /::/ 115 + } 116 + }, 117 + 118 + // Hex, oct, bin, dec numbers with visual separators and type suffix 119 + 'number': /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/, 120 + 'boolean': /\b(?:false|true)\b/, 121 + 'punctuation': /->|\.\.=|\.{1,3}|::|[{}[\];(),:]/, 122 + 'operator': /[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/ 123 + }; 124 + 125 + Prism.languages.rust['closure-params'].inside.rest = Prism.languages.rust; 126 + Prism.languages.rust['attribute'].inside['string'] = Prism.languages.rust['string']; 127 + 128 + }(Prism));
+32
public/prism/prism-sql.js
··· 1 + Prism.languages.sql = { 2 + 'comment': { 3 + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/, 4 + lookbehind: true 5 + }, 6 + 'variable': [ 7 + { 8 + pattern: /@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/, 9 + greedy: true 10 + }, 11 + /@[\w.$]+/ 12 + ], 13 + 'string': { 14 + pattern: /(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/, 15 + greedy: true, 16 + lookbehind: true 17 + }, 18 + 'identifier': { 19 + pattern: /(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/, 20 + greedy: true, 21 + lookbehind: true, 22 + inside: { 23 + 'punctuation': /^`|`$/ 24 + } 25 + }, 26 + 'function': /\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i, // Should we highlight user defined functions too? 27 + 'keyword': /\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i, 28 + 'boolean': /\b(?:FALSE|NULL|TRUE)\b/i, 29 + 'number': /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i, 30 + 'operator': /[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i, 31 + 'punctuation': /[;[\]()`,.]/ 32 + };
+74
public/prism/prism-systemd.js
··· 1 + // https://www.freedesktop.org/software/systemd/man/systemd.syntax.html 2 + 3 + (function (Prism) { 4 + 5 + var comment = { 6 + pattern: /^[;#].*/m, 7 + greedy: true 8 + }; 9 + 10 + var quotesSource = /"(?:[^\r\n"\\]|\\(?:[^\r]|\r\n?))*"(?!\S)/.source; 11 + 12 + Prism.languages.systemd = { 13 + 'comment': comment, 14 + 15 + 'section': { 16 + pattern: /^\[[^\n\r\[\]]*\](?=[ \t]*$)/m, 17 + greedy: true, 18 + inside: { 19 + 'punctuation': /^\[|\]$/, 20 + 'section-name': { 21 + pattern: /[\s\S]+/, 22 + alias: 'selector' 23 + }, 24 + } 25 + }, 26 + 27 + 'key': { 28 + pattern: /^[^\s=]+(?=[ \t]*=)/m, 29 + greedy: true, 30 + alias: 'attr-name' 31 + }, 32 + 'value': { 33 + // This pattern is quite complex because of two properties: 34 + // 1) Quotes (strings) must be preceded by a space. Since we can't use lookbehinds, we have to "resolve" 35 + // the lookbehind. You will see this in the main loop where spaces are handled separately. 36 + // 2) Line continuations. 37 + // After line continuations, empty lines and comments are ignored so we have to consume them. 38 + pattern: RegExp( 39 + /(=[ \t]*(?!\s))/.source + 40 + // the value either starts with quotes or not 41 + '(?:' + quotesSource + '|(?=[^"\r\n]))' + 42 + // main loop 43 + '(?:' + ( 44 + /[^\s\\]/.source + 45 + // handle spaces separately because of quotes 46 + '|' + '[ \t]+(?:(?![ \t"])|' + quotesSource + ')' + 47 + // line continuation 48 + '|' + /\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source 49 + ) + 50 + ')*' 51 + ), 52 + lookbehind: true, 53 + greedy: true, 54 + alias: 'attr-value', 55 + inside: { 56 + 'comment': comment, 57 + 'quoted': { 58 + pattern: RegExp(/(^|\s)/.source + quotesSource), 59 + lookbehind: true, 60 + greedy: true, 61 + }, 62 + 'punctuation': /\\$/m, 63 + 64 + 'boolean': { 65 + pattern: /^(?:false|no|off|on|true|yes)$/, 66 + greedy: true 67 + } 68 + } 69 + }, 70 + 71 + 'punctuation': /=/ 72 + }; 73 + 74 + }(Prism));
+96
public/prism/prism-uri.js
··· 1 + // https://tools.ietf.org/html/rfc3986#appendix-A 2 + 3 + Prism.languages.uri = { 4 + 'scheme': { 5 + pattern: /^[a-z][a-z0-9+.-]*:/im, 6 + greedy: true, 7 + inside: { 8 + 'scheme-delimiter': /:$/ 9 + } 10 + }, 11 + 'fragment': { 12 + pattern: /#[\w\-.~!$&'()*+,;=%:@/?]*/, 13 + inside: { 14 + 'fragment-delimiter': /^#/ 15 + } 16 + }, 17 + 'query': { 18 + pattern: /\?[\w\-.~!$&'()*+,;=%:@/?]*/, 19 + inside: { 20 + 'query-delimiter': { 21 + pattern: /^\?/, 22 + greedy: true 23 + }, 24 + 'pair-delimiter': /[&;]/, 25 + 'pair': { 26 + pattern: /^[^=][\s\S]*/, 27 + inside: { 28 + 'key': /^[^=]+/, 29 + 'value': { 30 + pattern: /(^=)[\s\S]+/, 31 + lookbehind: true 32 + } 33 + } 34 + } 35 + } 36 + }, 37 + 'authority': { 38 + pattern: RegExp( 39 + /^\/\//.source 40 + // [ userinfo "@" ] 41 + + /(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source 42 + // host 43 + + ( 44 + '(?:' 45 + // IP-literal 46 + + /\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/.source 47 + + '|' 48 + // IPv4address or registered name 49 + + /[\w\-.~!$&'()*+,;=%]*/.source 50 + + ')' 51 + ) 52 + // [ ":" port ] 53 + + /(?::\d*)?/.source, 54 + 'm' 55 + ), 56 + inside: { 57 + 'authority-delimiter': /^\/\//, 58 + 'user-info-segment': { 59 + pattern: /^[\w\-.~!$&'()*+,;=%:]*@/, 60 + inside: { 61 + 'user-info-delimiter': /@$/, 62 + 'user-info': /^[\w\-.~!$&'()*+,;=%:]+/ 63 + } 64 + }, 65 + 'port-segment': { 66 + pattern: /:\d*$/, 67 + inside: { 68 + 'port-delimiter': /^:/, 69 + 'port': /^\d+/ 70 + } 71 + }, 72 + 'host': { 73 + pattern: /[\s\S]+/, 74 + inside: { 75 + 'ip-literal': { 76 + pattern: /^\[[\s\S]+\]$/, 77 + inside: { 78 + 'ip-literal-delimiter': /^\[|\]$/, 79 + 'ipv-future': /^v[\s\S]+/, 80 + 'ipv6-address': /^[\s\S]+/ 81 + } 82 + }, 83 + 'ipv4-address': /^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/ 84 + } 85 + } 86 + } 87 + }, 88 + 'path': { 89 + pattern: /^[\w\-.~!$&'()*+,;=%:@/]+/m, 90 + inside: { 91 + 'path-separator': /\// 92 + } 93 + } 94 + }; 95 + 96 + Prism.languages.url = Prism.languages.uri;
+40
public/prism/prism-xml-doc.js
··· 1 + (function (Prism) { 2 + 3 + /** 4 + * If the given language is present, it will insert the given doc comment grammar token into it. 5 + * 6 + * @param {string} lang 7 + * @param {any} docComment 8 + */ 9 + function insertDocComment(lang, docComment) { 10 + if (Prism.languages[lang]) { 11 + Prism.languages.insertBefore(lang, 'comment', { 12 + 'doc-comment': docComment 13 + }); 14 + } 15 + } 16 + 17 + var tag = Prism.languages.markup.tag; 18 + 19 + var slashDocComment = { 20 + pattern: /\/\/\/.*/, 21 + greedy: true, 22 + alias: 'comment', 23 + inside: { 24 + 'tag': tag 25 + } 26 + }; 27 + var tickDocComment = { 28 + pattern: /'''.*/, 29 + greedy: true, 30 + alias: 'comment', 31 + inside: { 32 + 'tag': tag 33 + } 34 + }; 35 + 36 + insertDocComment('csharp', slashDocComment); 37 + insertDocComment('fsharp', slashDocComment); 38 + insertDocComment('vbnet', tickDocComment); 39 + 40 + }(Prism));
+83
public/prism/prism-yaml.js
··· 1 + (function (Prism) { 2 + 3 + // https://yaml.org/spec/1.2/spec.html#c-ns-anchor-property 4 + // https://yaml.org/spec/1.2/spec.html#c-ns-alias-node 5 + var anchorOrAlias = /[*&][^\s[\]{},]+/; 6 + // https://yaml.org/spec/1.2/spec.html#c-ns-tag-property 7 + var tag = /!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/; 8 + // https://yaml.org/spec/1.2/spec.html#c-ns-properties(n,c) 9 + var properties = '(?:' + tag.source + '(?:[ \t]+' + anchorOrAlias.source + ')?|' 10 + + anchorOrAlias.source + '(?:[ \t]+' + tag.source + ')?)'; 11 + // https://yaml.org/spec/1.2/spec.html#ns-plain(n,c) 12 + // This is a simplified version that doesn't support "#" and multiline keys 13 + // All these long scarry character classes are simplified versions of YAML's characters 14 + var plainKey = /(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source 15 + .replace(/<PLAIN>/g, function () { return /[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source; }); 16 + var string = /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source; 17 + 18 + /** 19 + * 20 + * @param {string} value 21 + * @param {string} [flags] 22 + * @returns {RegExp} 23 + */ 24 + function createValuePattern(value, flags) { 25 + flags = (flags || '').replace(/m/g, '') + 'm'; // add m flag 26 + var pattern = /([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source 27 + .replace(/<<prop>>/g, function () { return properties; }).replace(/<<value>>/g, function () { return value; }); 28 + return RegExp(pattern, flags); 29 + } 30 + 31 + Prism.languages.yaml = { 32 + 'scalar': { 33 + pattern: RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source 34 + .replace(/<<prop>>/g, function () { return properties; })), 35 + lookbehind: true, 36 + alias: 'string' 37 + }, 38 + 'comment': /#.*/, 39 + 'key': { 40 + pattern: RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source 41 + .replace(/<<prop>>/g, function () { return properties; }) 42 + .replace(/<<key>>/g, function () { return '(?:' + plainKey + '|' + string + ')'; })), 43 + lookbehind: true, 44 + greedy: true, 45 + alias: 'atrule' 46 + }, 47 + 'directive': { 48 + pattern: /(^[ \t]*)%.+/m, 49 + lookbehind: true, 50 + alias: 'important' 51 + }, 52 + 'datetime': { 53 + pattern: createValuePattern(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source), 54 + lookbehind: true, 55 + alias: 'number' 56 + }, 57 + 'boolean': { 58 + pattern: createValuePattern(/false|true/.source, 'i'), 59 + lookbehind: true, 60 + alias: 'important' 61 + }, 62 + 'null': { 63 + pattern: createValuePattern(/null|~/.source, 'i'), 64 + lookbehind: true, 65 + alias: 'important' 66 + }, 67 + 'string': { 68 + pattern: createValuePattern(string), 69 + lookbehind: true, 70 + greedy: true 71 + }, 72 + 'number': { 73 + pattern: createValuePattern(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source, 'i'), 74 + lookbehind: true 75 + }, 76 + 'tag': tag, 77 + 'important': anchorOrAlias, 78 + 'punctuation': /---|[:[\]{}\-,|>?]|\.\.\./ 79 + }; 80 + 81 + Prism.languages.yml = Prism.languages.yaml; 82 + 83 + }(Prism));
+3878
public/style.css
··· 1 + /*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */ 2 + @layer properties; 3 + @layer theme, base, components, utilities; 4 + @layer theme { 5 + :root, :host { 6 + --font-sans: 'IBM Plex Sans JP', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; 7 + --font-mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; 8 + --color-red-300: oklch(80.8% 0.114 19.571); 9 + --color-red-500: oklch(63.7% 0.237 25.331); 10 + --color-green-100: oklch(96.2% 0.044 156.743); 11 + --color-green-300: oklch(87.1% 0.15 154.449); 12 + --color-green-400: oklch(79.2% 0.209 151.711); 13 + --color-blue-600: oklch(54.6% 0.245 262.881); 14 + --color-blue-700: oklch(48.8% 0.243 264.376); 15 + --color-blue-900: oklch(37.9% 0.146 265.522); 16 + --color-gray-100: oklch(96.7% 0.003 264.542); 17 + --color-gray-200: oklch(92.8% 0.006 264.531); 18 + --color-gray-300: oklch(87.2% 0.01 258.338); 19 + --color-gray-400: oklch(70.7% 0.022 261.325); 20 + --color-gray-500: oklch(55.1% 0.027 264.364); 21 + --color-gray-600: oklch(44.6% 0.03 256.802); 22 + --color-gray-900: oklch(21% 0.034 264.665); 23 + --color-stone-400: oklch(70.9% 0.01 56.259); 24 + --color-black: #000; 25 + --spacing: 0.25rem; 26 + --container-6xl: 72rem; 27 + --text-4xl: 2.25rem; 28 + --text-4xl--line-height: calc(2.5 / 2.25); 29 + --text-6xl: 3.75rem; 30 + --text-6xl--line-height: 1; 31 + --radius-sm: 0.25rem; 32 + --radius-md: 0.375rem; 33 + --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1); 34 + --default-font-family: var(--font-sans); 35 + --default-mono-font-family: var(--font-mono); 36 + --color-ao-violet-darker: #19152a; 37 + --color-ao-violet: #2b203f; 38 + --color-ao-violet-lighter: #56417e; 39 + --color-ao-violet-even-lighter: #7c62ad; 40 + --color-ao-white-darker: #a094b7; 41 + --color-ao-white: #ede9f5; 42 + --color-ao-gold: #fec955; 43 + } 44 + } 45 + @layer base { 46 + *, ::after, ::before, ::backdrop, ::file-selector-button { 47 + box-sizing: border-box; 48 + margin: 0; 49 + padding: 0; 50 + border: 0 solid; 51 + } 52 + html, :host { 53 + line-height: 1.5; 54 + -webkit-text-size-adjust: 100%; 55 + tab-size: 4; 56 + font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'); 57 + font-feature-settings: var(--default-font-feature-settings, normal); 58 + font-variation-settings: var(--default-font-variation-settings, normal); 59 + -webkit-tap-highlight-color: transparent; 60 + } 61 + hr { 62 + height: 0; 63 + color: inherit; 64 + border-top-width: 1px; 65 + } 66 + abbr:where([title]) { 67 + -webkit-text-decoration: underline dotted; 68 + text-decoration: underline dotted; 69 + } 70 + h1, h2, h3, h4, h5, h6 { 71 + font-size: inherit; 72 + font-weight: inherit; 73 + } 74 + a { 75 + color: inherit; 76 + -webkit-text-decoration: inherit; 77 + text-decoration: inherit; 78 + } 79 + b, strong { 80 + font-weight: bolder; 81 + } 82 + code, kbd, samp, pre { 83 + font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace); 84 + font-feature-settings: var(--default-mono-font-feature-settings, normal); 85 + font-variation-settings: var(--default-mono-font-variation-settings, normal); 86 + font-size: 1em; 87 + } 88 + small { 89 + font-size: 80%; 90 + } 91 + sub, sup { 92 + font-size: 75%; 93 + line-height: 0; 94 + position: relative; 95 + vertical-align: baseline; 96 + } 97 + sub { 98 + bottom: -0.25em; 99 + } 100 + sup { 101 + top: -0.5em; 102 + } 103 + table { 104 + text-indent: 0; 105 + border-color: inherit; 106 + border-collapse: collapse; 107 + } 108 + :-moz-focusring { 109 + outline: auto; 110 + } 111 + progress { 112 + vertical-align: baseline; 113 + } 114 + summary { 115 + display: list-item; 116 + } 117 + ol, ul, menu { 118 + list-style: none; 119 + } 120 + img, svg, video, canvas, audio, iframe, embed, object { 121 + display: block; 122 + vertical-align: middle; 123 + } 124 + img, video { 125 + max-width: 100%; 126 + height: auto; 127 + } 128 + button, input, select, optgroup, textarea, ::file-selector-button { 129 + font: inherit; 130 + font-feature-settings: inherit; 131 + font-variation-settings: inherit; 132 + letter-spacing: inherit; 133 + color: inherit; 134 + border-radius: 0; 135 + background-color: transparent; 136 + opacity: 1; 137 + } 138 + :where(select:is([multiple], [size])) optgroup { 139 + font-weight: bolder; 140 + } 141 + :where(select:is([multiple], [size])) optgroup option { 142 + padding-inline-start: 20px; 143 + } 144 + ::file-selector-button { 145 + margin-inline-end: 4px; 146 + } 147 + ::placeholder { 148 + opacity: 1; 149 + } 150 + @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) { 151 + ::placeholder { 152 + color: currentcolor; 153 + @supports (color: color-mix(in lab, red, red)) { 154 + color: color-mix(in oklab, currentcolor 50%, transparent); 155 + } 156 + } 157 + } 158 + textarea { 159 + resize: vertical; 160 + } 161 + ::-webkit-search-decoration { 162 + -webkit-appearance: none; 163 + } 164 + ::-webkit-date-and-time-value { 165 + min-height: 1lh; 166 + text-align: inherit; 167 + } 168 + ::-webkit-datetime-edit { 169 + display: inline-flex; 170 + } 171 + ::-webkit-datetime-edit-fields-wrapper { 172 + padding: 0; 173 + } 174 + ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { 175 + padding-block: 0; 176 + } 177 + ::-webkit-calendar-picker-indicator { 178 + line-height: 1; 179 + } 180 + :-moz-ui-invalid { 181 + box-shadow: none; 182 + } 183 + button, input:where([type='button'], [type='reset'], [type='submit']), ::file-selector-button { 184 + appearance: button; 185 + } 186 + ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { 187 + height: auto; 188 + } 189 + [hidden]:where(:not([hidden='until-found'])) { 190 + display: none !important; 191 + } 192 + } 193 + @layer utilities { 194 + .visible { 195 + visibility: visible; 196 + } 197 + .absolute { 198 + position: absolute; 199 + } 200 + .fixed { 201 + position: fixed; 202 + } 203 + .static { 204 + position: static; 205 + } 206 + .float-left { 207 + float: left; 208 + } 209 + .float-right { 210 + float: right; 211 + } 212 + .container { 213 + width: 100%; 214 + @media (width >= 40rem) { 215 + max-width: 40rem; 216 + } 217 + @media (width >= 48rem) { 218 + max-width: 48rem; 219 + } 220 + @media (width >= 64rem) { 221 + max-width: 64rem; 222 + } 223 + @media (width >= 80rem) { 224 + max-width: 80rem; 225 + } 226 + @media (width >= 96rem) { 227 + max-width: 96rem; 228 + } 229 + } 230 + .mx-64 { 231 + margin-inline: calc(var(--spacing) * 64); 232 + } 233 + .ms-6 { 234 + margin-inline-start: calc(var(--spacing) * 6); 235 + } 236 + .mt-2\! { 237 + margin-top: calc(var(--spacing) * 2) !important; 238 + } 239 + .mb-1\! { 240 + margin-bottom: calc(var(--spacing) * 1) !important; 241 + } 242 + .contents { 243 + display: contents; 244 + } 245 + .flex { 246 + display: flex; 247 + } 248 + .hidden { 249 + display: none; 250 + } 251 + .inline-block { 252 + display: inline-block; 253 + } 254 + .table { 255 + display: table; 256 + } 257 + .w-full { 258 + width: 100%; 259 + } 260 + .flex-col { 261 + flex-direction: column; 262 + } 263 + .flex-row\! { 264 + flex-direction: row !important; 265 + } 266 + .items-center { 267 + align-items: center; 268 + } 269 + .gap-2 { 270 + gap: calc(var(--spacing) * 2); 271 + } 272 + .gap-4 { 273 + gap: calc(var(--spacing) * 4); 274 + } 275 + .rounded-md { 276 + border-radius: var(--radius-md); 277 + } 278 + .from-red-300\! { 279 + --tw-gradient-from: var(--color-red-300) !important; 280 + --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)) !important; 281 + } 282 + .to-red-500\! { 283 + --tw-gradient-to: var(--color-red-500) !important; 284 + --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)) !important; 285 + } 286 + .p-4 { 287 + padding: calc(var(--spacing) * 4); 288 + } 289 + .p-\[0\.5ch\]\! { 290 + padding: 0.5ch !important; 291 + } 292 + .p-\[1rem\]\! { 293 + padding: 1rem !important; 294 + } 295 + .text-center { 296 + text-align: center; 297 + } 298 + .text-4xl { 299 + font-size: var(--text-4xl); 300 + line-height: var(--tw-leading, var(--text-4xl--line-height)); 301 + } 302 + .text-6xl { 303 + font-size: var(--text-6xl); 304 + line-height: var(--tw-leading, var(--text-6xl--line-height)); 305 + } 306 + .text-blue-600 { 307 + color: var(--color-blue-600); 308 + } 309 + .text-current\/50 { 310 + color: currentcolor; 311 + @supports (color: color-mix(in lab, red, red)) { 312 + color: color-mix(in oklab, currentcolor 50%, transparent); 313 + } 314 + } 315 + .no-underline\! { 316 + text-decoration-line: none !important; 317 + } 318 + .underline { 319 + text-decoration-line: underline; 320 + } 321 + .filter { 322 + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); 323 + } 324 + } 325 + .tx { 326 + --tw-prose-body: var(--color-black); 327 + --tw-prose-headings: var(--color-gray-900); 328 + --tw-prose-lead: var(--color-gray-600); 329 + --tw-prose-links: var(--color-blue-700); 330 + --tw-prose-bold: var(--color-gray-900); 331 + --tw-prose-counters: var(--color-gray-600); 332 + --tw-prose-bullets: var(--color-gray-500); 333 + --tw-prose-hr: var(--color-gray-400); 334 + --tw-prose-quotes: var(--color-gray-900); 335 + --tw-prose-quote-borders: var(--color-gray-400); 336 + --tw-prose-captions: var(--color-gray-500); 337 + --tw-prose-kbd: var(--color-gray-900); 338 + --tw-prose-kbd-shadows: var(--color-gray-900); 339 + --tw-prose-code: var(--color-gray-900); 340 + --tw-prose-pre-code: var(--color-gray-200); 341 + --tw-prose-pre-bg: transparent; 342 + --tw-prose-th-borders: var(--color-gray-300); 343 + --tw-prose-td-borders: var(--color-gray-200); 344 + padding: calc(var(--spacing) * 10) !important; 345 + color: var(--tw-prose-body); 346 + font-size: 1.05rem; 347 + line-height: 1.5; 348 + & img[align="left"] { 349 + padding-right: 20px; 350 + } 351 + & p { 352 + margin-block: 0.5em; 353 + } 354 + & [class~="lead"] { 355 + font-size: 1.22em; 356 + line-height: round(32/22); 357 + margin-block: 1.09em; 358 + } 359 + & h1, & h2, h3, & h4 { 360 + margin-top: 1rem; 361 + margin-bottom: 0.75rem; 362 + font-weight: 600; 363 + line-height: 1.25; 364 + padding-bottom: calc(var(--spacing) * 2); 365 + } 366 + & h1 { 367 + font-size: 2.33em; 368 + border-bottom: 1px solid var(--tw-prose-hr); 369 + color: var(--tw-prose-headings); 370 + font-weight: 600; 371 + & strong { 372 + font-weight: 700; 373 + } 374 + } 375 + & h2 { 376 + font-size: 1.66em; 377 + border-bottom: 1px solid var(--tw-prose-hr); 378 + color: var(--tw-prose-headings); 379 + font-weight: 550; 380 + & strong { 381 + font-weight: 650; 382 + } 383 + & code { 384 + font-size: 0.86em; 385 + } 386 + & + * { 387 + margin-top: 0px; 388 + } 389 + } 390 + & h3 { 391 + font-size: 1.33em; 392 + color: var(--tw-prose-headings); 393 + font-weight: 550; 394 + & strong { 395 + font-weight: 600; 396 + } 397 + & code { 398 + font-size: 0.88em; 399 + } 400 + & + * { 401 + margin-top: 0px; 402 + } 403 + } 404 + & h4 { 405 + color: var(--tw-prose-headings); 406 + font-weight: 500; 407 + & strong { 408 + font-weight: 600; 409 + } 410 + & + * { 411 + margin-top: 0px; 412 + } 413 + } 414 + & picture > img { 415 + margin-block: 0px; 416 + } 417 + & kbd { 418 + font-size: 0.88em; 419 + border-radius: 0.28rem; 420 + padding-inline: 0.44em; 421 + padding-block: 0.22em; 422 + } 423 + & code { 424 + font-size: 0.88em; 425 + } 426 + & ol { 427 + padding-inline-start: 1.55em; 428 + margin-block: 0.5em; 429 + } 430 + & ul { 431 + padding-inline-start: 1.55em; 432 + } 433 + & li { 434 + margin-block: 0.25em; 435 + } 436 + & ol > li { 437 + padding-inline-start: 0.44em; 438 + } 439 + & ul > li { 440 + padding-inline-start: 0.44em; 441 + } 442 + & > ul > li p { 443 + margin-block: 0.88em; 444 + } 445 + & > ul > li > p:first-child { 446 + margin-top: 0.25em; 447 + } 448 + & > ul > li > p:last-child { 449 + margin-bottom: 0.25em; 450 + } 451 + & > ol > li > p:first-child { 452 + margin-top: 0.25em; 453 + } 454 + & > ol > li > p:last-child { 455 + margin-bottom: 0.25em; 456 + } 457 + & ul ul, ul ol, ol ul, ol ol { 458 + margin-block: 0.5em; 459 + } 460 + & dl { 461 + margin-block: 1.33em; 462 + } 463 + & dt { 464 + margin-top: 1.33em; 465 + } 466 + & dd { 467 + margin-top: 0.66em; 468 + padding-inline-start: 1.55em; 469 + } 470 + & hr { 471 + margin-block: 1em; 472 + } 473 + & hr + * { 474 + margin-top: 0px; 475 + } 476 + & table { 477 + font-size: 0.88em; 478 + line-height: round(24 / 16); 479 + } 480 + & thead th { 481 + padding-inline: 0.75em; 482 + padding-bottom: 0.75em; 483 + } 484 + & figure { 485 + margin-block: 1.77em; 486 + & > * { 487 + margin-block: 0px; 488 + } 489 + } 490 + & figcaption { 491 + font-size: 0.88em; 492 + line-height: round(24 / 16); 493 + margin-top: 1em; 494 + } 495 + & > :first-child { 496 + margin-top: 0px; 497 + } 498 + & > :last-child { 499 + margin-bottom: 0px; 500 + } 501 + & [class~="lead"] { 502 + color: var(--tw-prose-lead); 503 + } 504 + & a { 505 + color: var(--tw-prose-links); 506 + text-decoration: underline; 507 + } 508 + & strong { 509 + color: var(--tw-prose-bold); 510 + font-weight: 600; 511 + } 512 + & a strong { 513 + color: inherit; 514 + } 515 + & blockquote strong { 516 + color: inherit; 517 + } 518 + & thead th strong { 519 + color: inherit; 520 + } 521 + & ol { 522 + list-style-type: decimal; 523 + } 524 + & ol[type="A"] { 525 + list-style-type: upper-alpha; 526 + } 527 + & ol[type="a"] { 528 + list-style-type: lower-alpha; 529 + } 530 + & ol[type="A" s] { 531 + list-style-type: upper-alpha; 532 + } 533 + & ol[type="a" s] { 534 + list-style-type: lower-alpha; 535 + } 536 + & ol[type="-i"] { 537 + list-style-type: upper-roman; 538 + } 539 + & ol[type="i"] { 540 + list-style-type: lower-roman; 541 + } 542 + & ol[type="-i" s] { 543 + list-style-type: upper-roman; 544 + } 545 + & ol[type="i" s] { 546 + list-style-type: lower-roman; 547 + } 548 + & ol[type="1"] { 549 + list-style-type: decimal; 550 + } 551 + & ul { 552 + list-style-type: disc; 553 + } 554 + & ol > li::marker { 555 + font-weight: 400; 556 + color: var(--tw-prose-counters); 557 + } 558 + & ul > li::marker { 559 + color: var(--tw-prose-bullets); 560 + } 561 + & dt { 562 + color: var(--tw-prose-headings); 563 + font-weight: 600; 564 + } 565 + & hr { 566 + border-color: var(--tw-prose-hr); 567 + border-top-width: 1px; 568 + border-top-style: var(--tw-border-style); 569 + border-top-width: 0.25em; 570 + } 571 + & blockquote { 572 + font-weight: 500; 573 + font-style: italic; 574 + color: var(--tw-prose-quotes); 575 + border-inline-start-width: 0.25rem; 576 + border-inline-start-color: var(--tw-prose-quote-borders); 577 + quotes: '"' '"' "'" "'"; 578 + margin-block: 1.25em; 579 + padding-inline-start: 1em; 580 + & + blockquote { 581 + margin-top: 0px; 582 + } 583 + & pre { 584 + padding-inline-start: 0.5em; 585 + } 586 + } 587 + & picture { 588 + display: block; 589 + } 590 + & kbd { 591 + font-weight: 500; 592 + font-family: inherit; 593 + color: var(--tw-prose-kbd); 594 + box-shadow: '0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%)'; 595 + } 596 + & code { 597 + padding-inline: 0.25em; 598 + border-radius: 4px; 599 + font-weight: inherit; 600 + font-size: inherit; 601 + font-family: var(--font-mono); 602 + line-height: inherit; 603 + } 604 + & pre { 605 + font-size: 0.88em; 606 + line-height: 28/16; 607 + border-radius: 0.33rem; 608 + margin-block: 1em; 609 + padding-inline: 0.25em; 610 + padding-block: 0.24em; 611 + color: var(--tw-prose-pre-code); 612 + background-color: transparent !important; 613 + font-weight: 400; 614 + } 615 + & pre code { 616 + border-radius: var(--radius-md); 617 + font-family: var(--font-mono); 618 + padding: 0; 619 + font-weight: inherit; 620 + color: inherit; 621 + font-size: inherit; 622 + line-height: inherit; 623 + display: block; 624 + color: #ffffff; 625 + padding: calc(var(--spacing) * 4); 626 + overflow-x: visible; 627 + overflow-y: hidden; 628 + } 629 + & pre code::before { 630 + content: none; 631 + } 632 + & pre code::after { 633 + content: none; 634 + } 635 + & table { 636 + width: 100%; 637 + table-layout: auto; 638 + margin-top: 2em; 639 + margin-bottom: 2em; 640 + display: block; 641 + width: max-content; 642 + max-width: 100%; 643 + overflow: auto; 644 + font-variant-numeric: tabular-nums; 645 + } 646 + & thead { 647 + border-bottom-width: 1px; 648 + border-bottom-color: var(--tw-prose-th-borders); 649 + & tr { 650 + border: 1px solid var(--tw-prose-hr); 651 + } 652 + & th { 653 + color: var(--tw-prose-headings); 654 + font-weight: 600; 655 + vertical-align: bottom; 656 + padding-inline: 13px; 657 + padding-block: 6px; 658 + border: 1px solid var(--tw-prose-hr); 659 + } 660 + } 661 + & tbody tr { 662 + border-bottom-width: 1px; 663 + border-bottom-color: var(--tw-prose-td-borders); 664 + border: 1px solid var(--tw-prose-hr); 665 + } 666 + & tbody tr:last-child { 667 + border-bottom-width: 0; 668 + } 669 + & tbody td { 670 + vertical-align: baseline; 671 + padding-inline: 13px; 672 + padding-block: 6px; 673 + border: 1px solid var(--tw-prose-hr); 674 + } 675 + & tfoot { 676 + border-top-width: 1px; 677 + border-top-color: var(--tw-prose-th-borders); 678 + & td { 679 + vertical-align: top; 680 + } 681 + } 682 + & th, td { 683 + text-align: start; 684 + } 685 + & figcaption { 686 + color: var(--tw-prose-captions); 687 + } 688 + & .footnotes { 689 + font-size: smaller; 690 + } 691 + } 692 + :not(pre) > code { 693 + background-color: var(--color-ao-violet); 694 + color: var(--color-ao-white); 695 + margin-inline: 0.3ch; 696 + background-color: var(--color-ao-white); 697 + color: var(--color-ao-violet-darker); 698 + font-weight: bolder; 699 + &::selection, & ::selection { 700 + background-color: var(--color-ao-violet-lighter); 701 + } 702 + } 703 + pre > code { 704 + border-style: var(--tw-border-style); 705 + border-width: 2px; 706 + border-color: var(--color-ao-gold); 707 + background-color: var(--color-ao-violet); 708 + color: var(--color-ao-white); 709 + scrollbar-width: auto; 710 + scrollbar-color: var(--color-ao-violet-even-lighter) var(--color-ao-violet); 711 + } 712 + code[class*="language-"], pre[class*="language-"] { 713 + text-align: left; 714 + word-spacing: normal; 715 + line-height: 1.5; 716 + word-break: normal; 717 + overflow-wrap: normal; 718 + white-space: pre; 719 + tab-size: 4; 720 + -webkit-hyphens: none; 721 + hyphens: none; 722 + } 723 + pre[class*="language-"], code[class*="language-"] { 724 + &::selection, & ::selection { 725 + background-color: var(--color-ao-violet-lighter); 726 + } 727 + } 728 + :not(pre) > code[class*="language-"] { 729 + border-radius: var(--radius-sm); 730 + white-space: normal; 731 + } 732 + .token { 733 + &.comment { 734 + color: #73688d; 735 + } 736 + &.string { 737 + color: #e6be7d; 738 + } 739 + &.function, &.class-name { 740 + color: #e678e8; 741 + } 742 + &.namespace { 743 + color: #e678e8; 744 + font-style: italic; 745 + } 746 + &.boolean { 747 + color: #b573b4; 748 + } 749 + &.variable { 750 + color: #c07cff; 751 + } 752 + &.keyword, &.operator { 753 + color: #c7a8ed; 754 + } 755 + &.punctuation { 756 + color: #c7a8ed; 757 + } 758 + &.directive { 759 + font-style: italic; 760 + } 761 + &.number { 762 + color: #fc6a9d; 763 + } 764 + &.tag { 765 + color: #bba5d4; 766 + } 767 + &.attr-name { 768 + color: var(--color-ao-white); 769 + } 770 + &.attr-value, &.markup-attr-quotes { 771 + color: #ddb672; 772 + } 773 + } 774 + div.code-toolbar { 775 + position: relative; 776 + & > .toolbar { 777 + transition: opacity 0.3s ease-in-out; 778 + position: absolute; 779 + top: 0.4em; 780 + right: calc(var(--spacing) * 4); 781 + z-index: 10; 782 + display: flex; 783 + gap: 1ch; 784 + opacity: 0%; 785 + } 786 + &:hover > .toolbar { 787 + opacity: 100%; 788 + } 789 + & > .toolbar > .toolbar-item { 790 + display: inline-block; 791 + cursor: default; 792 + & > button, & > a { 793 + cursor: pointer; 794 + } 795 + } 796 + & > .toolbar > .toolbar-item { 797 + font-size: .8em; 798 + padding: 0 .5em; 799 + border-radius: var(--radius-md); 800 + background-color: var(--color-ao-violet); 801 + color: var(--color-ao-white); 802 + &:has(> button, > a) { 803 + border-style: var(--tw-border-style); 804 + border-width: 2px; 805 + border-color: var(--color-ao-gold); 806 + } 807 + & > span { 808 + vertical-align: sub; 809 + } 810 + } 811 + & > .toolbar > .toolbar-item { 812 + &:hover, &:focus { 813 + background-color: var(--color-ao-violet-lighter); 814 + } 815 + } 816 + } 817 + .token.treeview-part { 818 + & .entry-line { 819 + position: relative; 820 + display: inline-block; 821 + width: 1.2em; 822 + text-indent: -99em; 823 + vertical-align: top; 824 + } 825 + & .entry-name { 826 + position: relative; 827 + display: inline-block; 828 + vertical-align: top; 829 + margin-left: 0ch; 830 + } 831 + & .entry-line + .entry-name { 832 + margin-left: 0.5ch; 833 + } 834 + & .entry-name.dotfile { 835 + opacity: 60%; 836 + } 837 + & .entry-name.dir:after { 838 + content: "/"; 839 + color: var(--color-ao-white-darker); 840 + } 841 + & .entry-line:before, & .line-h:after { 842 + content: ""; 843 + position: absolute; 844 + top: calc(var(--spacing) * 0); 845 + left: calc(1/2 * 100%); 846 + height: 100%; 847 + width: calc(1/2 * 100%); 848 + } 849 + & .line-h:before, & .line-v:before { 850 + border-left-style: var(--tw-border-style); 851 + border-left-width: 1px; 852 + border-color: var(--color-ao-white-darker); 853 + } 854 + & .line-v-last:before { 855 + height: calc(1/2 * 100%); 856 + border-bottom-style: var(--tw-border-style); 857 + border-bottom-width: 1px; 858 + border-left-style: var(--tw-border-style); 859 + border-left-width: 1px; 860 + border-color: var(--color-ao-white-darker); 861 + } 862 + & .line-h:after { 863 + height: calc(1/2 * 100%); 864 + border-bottom-style: var(--tw-border-style); 865 + border-bottom-width: 1px; 866 + border-color: var(--color-ao-white-darker); 867 + } 868 + } 869 + @font-face { 870 + font-family: IBM Plex Mono; 871 + font-style: normal; 872 + font-weight: 400; 873 + font-display: swap; 874 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/001.woff2) format('woff2'); 875 + unicode-range: U+0-7e; 876 + } 877 + @font-face { 878 + font-family: IBM Plex Mono; 879 + font-style: normal; 880 + font-weight: 400; 881 + font-display: swap; 882 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/002.woff2) format('woff2'); 883 + unicode-range: U+80-ff; 884 + } 885 + @font-face { 886 + font-family: IBM Plex Mono; 887 + font-style: normal; 888 + font-weight: 400; 889 + font-display: swap; 890 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/003.woff2) format('woff2'); 891 + unicode-range: U+100-17f; 892 + } 893 + @font-face { 894 + font-family: IBM Plex Mono; 895 + font-style: normal; 896 + font-weight: 400; 897 + font-display: swap; 898 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/004.woff2) format('woff2'); 899 + unicode-range: U+18f-237; 900 + } 901 + @font-face { 902 + font-family: IBM Plex Mono; 903 + font-style: normal; 904 + font-weight: 400; 905 + font-display: swap; 906 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/005.woff2) format('woff2'); 907 + unicode-range: U+259; 908 + } 909 + @font-face { 910 + font-family: IBM Plex Mono; 911 + font-style: normal; 912 + font-weight: 400; 913 + font-display: swap; 914 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/006.woff2) format('woff2'); 915 + unicode-range: U+2bb-2dd; 916 + } 917 + @font-face { 918 + font-family: IBM Plex Mono; 919 + font-style: normal; 920 + font-weight: 400; 921 + font-display: swap; 922 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/007.woff2) format('woff2'); 923 + unicode-range: U+300-328; 924 + } 925 + @font-face { 926 + font-family: IBM Plex Mono; 927 + font-style: normal; 928 + font-weight: 400; 929 + font-display: swap; 930 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/008.woff2) format('woff2'); 931 + unicode-range: U+3c0; 932 + } 933 + @font-face { 934 + font-family: IBM Plex Mono; 935 + font-style: normal; 936 + font-weight: 400; 937 + font-display: swap; 938 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/009.woff2) format('woff2'); 939 + unicode-range: U+400-4a7; 940 + } 941 + @font-face { 942 + font-family: IBM Plex Mono; 943 + font-style: normal; 944 + font-weight: 400; 945 + font-display: swap; 946 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/010.woff2) format('woff2'); 947 + unicode-range: U+4a8-4f9; 948 + } 949 + @font-face { 950 + font-family: IBM Plex Mono; 951 + font-style: normal; 952 + font-weight: 400; 953 + font-display: swap; 954 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/011.woff2) format('woff2'); 955 + unicode-range: U+524-525; 956 + } 957 + @font-face { 958 + font-family: IBM Plex Mono; 959 + font-style: normal; 960 + font-weight: 400; 961 + font-display: swap; 962 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/012.woff2) format('woff2'); 963 + unicode-range: U+e3f; 964 + } 965 + @font-face { 966 + font-family: IBM Plex Mono; 967 + font-style: normal; 968 + font-weight: 400; 969 + font-display: swap; 970 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/013.woff2) format('woff2'); 971 + unicode-range: U+1e80-1ef9; 972 + } 973 + @font-face { 974 + font-family: IBM Plex Mono; 975 + font-style: normal; 976 + font-weight: 400; 977 + font-display: swap; 978 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/014.woff2) format('woff2'); 979 + unicode-range: U+2000-205f; 980 + } 981 + @font-face { 982 + font-family: IBM Plex Mono; 983 + font-style: normal; 984 + font-weight: 400; 985 + font-display: swap; 986 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/015.woff2) format('woff2'); 987 + unicode-range: U+2070-2089; 988 + } 989 + @font-face { 990 + font-family: IBM Plex Mono; 991 + font-style: normal; 992 + font-weight: 400; 993 + font-display: swap; 994 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/016.woff2) format('woff2'); 995 + unicode-range: U+20a1-20bf; 996 + } 997 + @font-face { 998 + font-family: IBM Plex Mono; 999 + font-style: normal; 1000 + font-weight: 400; 1001 + font-display: swap; 1002 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/017.woff2) format('woff2'); 1003 + unicode-range: U+2113-212e; 1004 + } 1005 + @font-face { 1006 + font-family: IBM Plex Mono; 1007 + font-style: normal; 1008 + font-weight: 400; 1009 + font-display: swap; 1010 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/018.woff2) format('woff2'); 1011 + unicode-range: U+2150-215e; 1012 + } 1013 + @font-face { 1014 + font-family: IBM Plex Mono; 1015 + font-style: normal; 1016 + font-weight: 400; 1017 + font-display: swap; 1018 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/019.woff2) format('woff2'); 1019 + unicode-range: U+2190-21c6; 1020 + } 1021 + @font-face { 1022 + font-family: IBM Plex Mono; 1023 + font-style: normal; 1024 + font-weight: 400; 1025 + font-display: swap; 1026 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/020.woff2) format('woff2'); 1027 + unicode-range: U+2202-2265; 1028 + } 1029 + @font-face { 1030 + font-family: IBM Plex Mono; 1031 + font-style: normal; 1032 + font-weight: 400; 1033 + font-display: swap; 1034 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/021.woff2) format('woff2'); 1035 + unicode-range: U+2500-257f; 1036 + } 1037 + @font-face { 1038 + font-family: IBM Plex Mono; 1039 + font-style: normal; 1040 + font-weight: 400; 1041 + font-display: swap; 1042 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/022.woff2) format('woff2'); 1043 + unicode-range: U+2580-259f; 1044 + } 1045 + @font-face { 1046 + font-family: IBM Plex Mono; 1047 + font-style: normal; 1048 + font-weight: 400; 1049 + font-display: swap; 1050 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/023.woff2) format('woff2'); 1051 + unicode-range: U+25ca; 1052 + } 1053 + @font-face { 1054 + font-family: IBM Plex Mono; 1055 + font-style: normal; 1056 + font-weight: 400; 1057 + font-display: swap; 1058 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/024.woff2) format('woff2'); 1059 + unicode-range: U+2713-274c; 1060 + } 1061 + @font-face { 1062 + font-family: IBM Plex Mono; 1063 + font-style: normal; 1064 + font-weight: 400; 1065 + font-display: swap; 1066 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/025.woff2) format('woff2'); 1067 + unicode-range: U+2b0e-2b11; 1068 + } 1069 + @font-face { 1070 + font-family: IBM Plex Mono; 1071 + font-style: normal; 1072 + font-weight: 400; 1073 + font-display: swap; 1074 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/026.woff2) format('woff2'); 1075 + unicode-range: U+3000; 1076 + } 1077 + @font-face { 1078 + font-family: IBM Plex Mono; 1079 + font-style: normal; 1080 + font-weight: 400; 1081 + font-display: swap; 1082 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/027.woff2) format('woff2'); 1083 + unicode-range: U+f6d7-f6d8; 1084 + } 1085 + @font-face { 1086 + font-family: IBM Plex Mono; 1087 + font-style: normal; 1088 + font-weight: 400; 1089 + font-display: swap; 1090 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/028.woff2) format('woff2'); 1091 + unicode-range: U+fb01-fb02; 1092 + } 1093 + @font-face { 1094 + font-family: IBM Plex Mono; 1095 + font-style: normal; 1096 + font-weight: 400; 1097 + font-display: swap; 1098 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/029.woff2) format('woff2'); 1099 + unicode-range: U+feff; 1100 + } 1101 + @font-face { 1102 + font-family: IBM Plex Mono; 1103 + font-style: normal; 1104 + font-weight: 400; 1105 + font-display: swap; 1106 + src: local('IBM Plex Mono'), local('IBMPlexMono'), url(/font/IBMPlexMono-Regular/030.woff2) format('woff2'); 1107 + unicode-range: U+fffd; 1108 + } 1109 + @font-face { 1110 + font-family: IBM Plex Sans JP; 1111 + font-style: normal; 1112 + font-weight: 400; 1113 + font-display: swap; 1114 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/001.woff2) format('woff2'); 1115 + unicode-range: U+20-7e; 1116 + } 1117 + @font-face { 1118 + font-family: IBM Plex Sans JP; 1119 + font-style: normal; 1120 + font-weight: 400; 1121 + font-display: swap; 1122 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/002.woff2) format('woff2'); 1123 + unicode-range: U+a0-ff; 1124 + } 1125 + @font-face { 1126 + font-family: IBM Plex Sans JP; 1127 + font-style: normal; 1128 + font-weight: 400; 1129 + font-display: swap; 1130 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/003.woff2) format('woff2'); 1131 + unicode-range: U+100-17e; 1132 + } 1133 + @font-face { 1134 + font-family: IBM Plex Sans JP; 1135 + font-style: normal; 1136 + font-weight: 400; 1137 + font-display: swap; 1138 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/004.woff2) format('woff2'); 1139 + unicode-range: U+192-237; 1140 + } 1141 + @font-face { 1142 + font-family: IBM Plex Sans JP; 1143 + font-style: normal; 1144 + font-weight: 400; 1145 + font-display: swap; 1146 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/005.woff2) format('woff2'); 1147 + unicode-range: U+250-2a2; 1148 + } 1149 + @font-face { 1150 + font-family: IBM Plex Sans JP; 1151 + font-style: normal; 1152 + font-weight: 400; 1153 + font-display: swap; 1154 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/006.woff2) format('woff2'); 1155 + unicode-range: U+2b0-2e9; 1156 + } 1157 + @font-face { 1158 + font-family: IBM Plex Sans JP; 1159 + font-style: normal; 1160 + font-weight: 400; 1161 + font-display: swap; 1162 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/007.woff2) format('woff2'); 1163 + unicode-range: U+300-361; 1164 + } 1165 + @font-face { 1166 + font-family: IBM Plex Sans JP; 1167 + font-style: normal; 1168 + font-weight: 400; 1169 + font-display: swap; 1170 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/008.woff2) format('woff2'); 1171 + unicode-range: U+384-3db; 1172 + } 1173 + @font-face { 1174 + font-family: IBM Plex Sans JP; 1175 + font-style: normal; 1176 + font-weight: 400; 1177 + font-display: swap; 1178 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/009.woff2) format('woff2'); 1179 + unicode-range: U+401-45f; 1180 + } 1181 + @font-face { 1182 + font-family: IBM Plex Sans JP; 1183 + font-style: normal; 1184 + font-weight: 400; 1185 + font-display: swap; 1186 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/010.woff2) format('woff2'); 1187 + unicode-range: U+1e3e-1ebd; 1188 + } 1189 + @font-face { 1190 + font-family: IBM Plex Sans JP; 1191 + font-style: normal; 1192 + font-weight: 400; 1193 + font-display: swap; 1194 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/011.woff2) format('woff2'); 1195 + unicode-range: U+1f70-1f73; 1196 + } 1197 + @font-face { 1198 + font-family: IBM Plex Sans JP; 1199 + font-style: normal; 1200 + font-weight: 400; 1201 + font-display: swap; 1202 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/012.woff2) format('woff2'); 1203 + unicode-range: U+2002-205d; 1204 + } 1205 + @font-face { 1206 + font-family: IBM Plex Sans JP; 1207 + font-style: normal; 1208 + font-weight: 400; 1209 + font-display: swap; 1210 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/013.woff2) format('woff2'); 1211 + unicode-range: U+2070-2089; 1212 + } 1213 + @font-face { 1214 + font-family: IBM Plex Sans JP; 1215 + font-style: normal; 1216 + font-weight: 400; 1217 + font-display: swap; 1218 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/014.woff2) format('woff2'); 1219 + unicode-range: U+20ac; 1220 + } 1221 + @font-face { 1222 + font-family: IBM Plex Sans JP; 1223 + font-style: normal; 1224 + font-weight: 400; 1225 + font-display: swap; 1226 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/015.woff2) format('woff2'); 1227 + unicode-range: U+20dd-20de; 1228 + } 1229 + @font-face { 1230 + font-family: IBM Plex Sans JP; 1231 + font-style: normal; 1232 + font-weight: 400; 1233 + font-display: swap; 1234 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/016.woff2) format('woff2'); 1235 + unicode-range: U+2100-213b; 1236 + } 1237 + @font-face { 1238 + font-family: IBM Plex Sans JP; 1239 + font-style: normal; 1240 + font-weight: 400; 1241 + font-display: swap; 1242 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/017.woff2) format('woff2'); 1243 + unicode-range: U+2150-2189; 1244 + } 1245 + @font-face { 1246 + font-family: IBM Plex Sans JP; 1247 + font-style: normal; 1248 + font-weight: 400; 1249 + font-display: swap; 1250 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/018.woff2) format('woff2'); 1251 + unicode-range: U+2190-21f5; 1252 + } 1253 + @font-face { 1254 + font-family: IBM Plex Sans JP; 1255 + font-style: normal; 1256 + font-weight: 400; 1257 + font-display: swap; 1258 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/019.woff2) format('woff2'); 1259 + unicode-range: U+2200-22db; 1260 + } 1261 + @font-face { 1262 + font-family: IBM Plex Sans JP; 1263 + font-style: normal; 1264 + font-weight: 400; 1265 + font-display: swap; 1266 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/020.woff2) format('woff2'); 1267 + unicode-range: U+2305-23ce; 1268 + } 1269 + @font-face { 1270 + font-family: IBM Plex Sans JP; 1271 + font-style: normal; 1272 + font-weight: 400; 1273 + font-display: swap; 1274 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/021.woff2) format('woff2'); 1275 + unicode-range: U+2423; 1276 + } 1277 + @font-face { 1278 + font-family: IBM Plex Sans JP; 1279 + font-style: normal; 1280 + font-weight: 400; 1281 + font-display: swap; 1282 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/022.woff2) format('woff2'); 1283 + unicode-range: U+2460-24e8; 1284 + } 1285 + @font-face { 1286 + font-family: IBM Plex Sans JP; 1287 + font-style: normal; 1288 + font-weight: 400; 1289 + font-display: swap; 1290 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/023.woff2) format('woff2'); 1291 + unicode-range: U+24e9-24ff; 1292 + } 1293 + @font-face { 1294 + font-family: IBM Plex Sans JP; 1295 + font-style: normal; 1296 + font-weight: 400; 1297 + font-display: swap; 1298 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/024.woff2) format('woff2'); 1299 + unicode-range: U+2500-2573; 1300 + } 1301 + @font-face { 1302 + font-family: IBM Plex Sans JP; 1303 + font-style: normal; 1304 + font-weight: 400; 1305 + font-display: swap; 1306 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/025.woff2) format('woff2'); 1307 + unicode-range: U+2581-2595; 1308 + } 1309 + @font-face { 1310 + font-family: IBM Plex Sans JP; 1311 + font-style: normal; 1312 + font-weight: 400; 1313 + font-display: swap; 1314 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/026.woff2) format('woff2'); 1315 + unicode-range: U+25a0-25ef; 1316 + } 1317 + @font-face { 1318 + font-family: IBM Plex Sans JP; 1319 + font-style: normal; 1320 + font-weight: 400; 1321 + font-display: swap; 1322 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/027.woff2) format('woff2'); 1323 + unicode-range: U+2600-26a0; 1324 + } 1325 + @font-face { 1326 + font-family: IBM Plex Sans JP; 1327 + font-style: normal; 1328 + font-weight: 400; 1329 + font-display: swap; 1330 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/028.woff2) format('woff2'); 1331 + unicode-range: U+2702-27a1; 1332 + } 1333 + @font-face { 1334 + font-family: IBM Plex Sans JP; 1335 + font-style: normal; 1336 + font-weight: 400; 1337 + font-display: swap; 1338 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/029.woff2) format('woff2'); 1339 + unicode-range: U+2934-2935; 1340 + } 1341 + @font-face { 1342 + font-family: IBM Plex Sans JP; 1343 + font-style: normal; 1344 + font-weight: 400; 1345 + font-display: swap; 1346 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/030.woff2) format('woff2'); 1347 + unicode-range: U+29bf-29fb; 1348 + } 1349 + @font-face { 1350 + font-family: IBM Plex Sans JP; 1351 + font-style: normal; 1352 + font-weight: 400; 1353 + font-display: swap; 1354 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/031.woff2) format('woff2'); 1355 + unicode-range: U+2b05-2b95; 1356 + } 1357 + @font-face { 1358 + font-family: IBM Plex Sans JP; 1359 + font-style: normal; 1360 + font-weight: 400; 1361 + font-display: swap; 1362 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/032.woff2) format('woff2'); 1363 + unicode-range: U+2e83-2ef2; 1364 + } 1365 + @font-face { 1366 + font-family: IBM Plex Sans JP; 1367 + font-style: normal; 1368 + font-weight: 400; 1369 + font-display: swap; 1370 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/033.woff2) format('woff2'); 1371 + unicode-range: U+2f00-2f7f; 1372 + } 1373 + @font-face { 1374 + font-family: IBM Plex Sans JP; 1375 + font-style: normal; 1376 + font-weight: 400; 1377 + font-display: swap; 1378 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/034.woff2) format('woff2'); 1379 + unicode-range: U+2f80-2fd5; 1380 + } 1381 + @font-face { 1382 + font-family: IBM Plex Sans JP; 1383 + font-style: normal; 1384 + font-weight: 400; 1385 + font-display: swap; 1386 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/035.woff2) format('woff2'); 1387 + unicode-range: U+3000-303d; 1388 + } 1389 + @font-face { 1390 + font-family: IBM Plex Sans JP; 1391 + font-style: normal; 1392 + font-weight: 400; 1393 + font-display: swap; 1394 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/036.woff2) format('woff2'); 1395 + unicode-range: U+3041-309f; 1396 + } 1397 + @font-face { 1398 + font-family: IBM Plex Sans JP; 1399 + font-style: normal; 1400 + font-weight: 400; 1401 + font-display: swap; 1402 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/037.woff2) format('woff2'); 1403 + unicode-range: U+30a0-30ff; 1404 + } 1405 + @font-face { 1406 + font-family: IBM Plex Sans JP; 1407 + font-style: normal; 1408 + font-weight: 400; 1409 + font-display: swap; 1410 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/038.woff2) format('woff2'); 1411 + unicode-range: U+3190-319f; 1412 + } 1413 + @font-face { 1414 + font-family: IBM Plex Sans JP; 1415 + font-style: normal; 1416 + font-weight: 400; 1417 + font-display: swap; 1418 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/039.woff2) format('woff2'); 1419 + unicode-range: U+31f0-31ff; 1420 + } 1421 + @font-face { 1422 + font-family: IBM Plex Sans JP; 1423 + font-style: normal; 1424 + font-weight: 400; 1425 + font-display: swap; 1426 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/040.woff2) format('woff2'); 1427 + unicode-range: U+3220-32dc; 1428 + } 1429 + @font-face { 1430 + font-family: IBM Plex Sans JP; 1431 + font-style: normal; 1432 + font-weight: 400; 1433 + font-display: swap; 1434 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/041.woff2) format('woff2'); 1435 + unicode-range: U+32dd-32ff; 1436 + } 1437 + @font-face { 1438 + font-family: IBM Plex Sans JP; 1439 + font-style: normal; 1440 + font-weight: 400; 1441 + font-display: swap; 1442 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/042.woff2) format('woff2'); 1443 + unicode-range: U+3300-33d4; 1444 + } 1445 + @font-face { 1446 + font-family: IBM Plex Sans JP; 1447 + font-style: normal; 1448 + font-weight: 400; 1449 + font-display: swap; 1450 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/043.woff2) format('woff2'); 1451 + unicode-range: U+33d7-33da; 1452 + } 1453 + @font-face { 1454 + font-family: IBM Plex Sans JP; 1455 + font-style: normal; 1456 + font-weight: 400; 1457 + font-display: swap; 1458 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/044.woff2) format('woff2'); 1459 + unicode-range: U+3402-41ee; 1460 + } 1461 + @font-face { 1462 + font-family: IBM Plex Sans JP; 1463 + font-style: normal; 1464 + font-weight: 400; 1465 + font-display: swap; 1466 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/045.woff2) format('woff2'); 1467 + unicode-range: U+41f3-4d77; 1468 + } 1469 + @font-face { 1470 + font-family: IBM Plex Sans JP; 1471 + font-style: normal; 1472 + font-weight: 400; 1473 + font-display: swap; 1474 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/046.woff2) format('woff2'); 1475 + unicode-range: U+4e00-4ec1; 1476 + } 1477 + @font-face { 1478 + font-family: IBM Plex Sans JP; 1479 + font-style: normal; 1480 + font-weight: 400; 1481 + font-display: swap; 1482 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/047.woff2) format('woff2'); 1483 + unicode-range: U+4ec2-4f78; 1484 + } 1485 + @font-face { 1486 + font-family: IBM Plex Sans JP; 1487 + font-style: normal; 1488 + font-weight: 400; 1489 + font-display: swap; 1490 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/048.woff2) format('woff2'); 1491 + unicode-range: U+4f79-501f; 1492 + } 1493 + @font-face { 1494 + font-family: IBM Plex Sans JP; 1495 + font-style: normal; 1496 + font-weight: 400; 1497 + font-display: swap; 1498 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/049.woff2) format('woff2'); 1499 + unicode-range: U+5021-50d9; 1500 + } 1501 + @font-face { 1502 + font-family: IBM Plex Sans JP; 1503 + font-style: normal; 1504 + font-weight: 400; 1505 + font-display: swap; 1506 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/050.woff2) format('woff2'); 1507 + unicode-range: U+50da-5183; 1508 + } 1509 + @font-face { 1510 + font-family: IBM Plex Sans JP; 1511 + font-style: normal; 1512 + font-weight: 400; 1513 + font-display: swap; 1514 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/051.woff2) format('woff2'); 1515 + unicode-range: U+5184-5231; 1516 + } 1517 + @font-face { 1518 + font-family: IBM Plex Sans JP; 1519 + font-style: normal; 1520 + font-weight: 400; 1521 + font-display: swap; 1522 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/052.woff2) format('woff2'); 1523 + unicode-range: U+5232-52df; 1524 + } 1525 + @font-face { 1526 + font-family: IBM Plex Sans JP; 1527 + font-style: normal; 1528 + font-weight: 400; 1529 + font-display: swap; 1530 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/053.woff2) format('woff2'); 1531 + unicode-range: U+52e0-537f; 1532 + } 1533 + @font-face { 1534 + font-family: IBM Plex Sans JP; 1535 + font-style: normal; 1536 + font-weight: 400; 1537 + font-display: swap; 1538 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/054.woff2) format('woff2'); 1539 + unicode-range: U+5382-5435; 1540 + } 1541 + @font-face { 1542 + font-family: IBM Plex Sans JP; 1543 + font-style: normal; 1544 + font-weight: 400; 1545 + font-display: swap; 1546 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/055.woff2) format('woff2'); 1547 + unicode-range: U+5436-54fe; 1548 + } 1549 + @font-face { 1550 + font-family: IBM Plex Sans JP; 1551 + font-style: normal; 1552 + font-weight: 400; 1553 + font-display: swap; 1554 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/056.woff2) format('woff2'); 1555 + unicode-range: U+54ff-55e3; 1556 + } 1557 + @font-face { 1558 + font-family: IBM Plex Sans JP; 1559 + font-style: normal; 1560 + font-weight: 400; 1561 + font-display: swap; 1562 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/057.woff2) format('woff2'); 1563 + unicode-range: U+55e4-56c5; 1564 + } 1565 + @font-face { 1566 + font-family: IBM Plex Sans JP; 1567 + font-style: normal; 1568 + font-weight: 400; 1569 + font-display: swap; 1570 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/058.woff2) format('woff2'); 1571 + unicode-range: U+56c8-577e; 1572 + } 1573 + @font-face { 1574 + font-family: IBM Plex Sans JP; 1575 + font-style: normal; 1576 + font-weight: 400; 1577 + font-display: swap; 1578 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/059.woff2) format('woff2'); 1579 + unicode-range: U+577f-5861; 1580 + } 1581 + @font-face { 1582 + font-family: IBM Plex Sans JP; 1583 + font-style: normal; 1584 + font-weight: 400; 1585 + font-display: swap; 1586 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/060.woff2) format('woff2'); 1587 + unicode-range: U+5862-5924; 1588 + } 1589 + @font-face { 1590 + font-family: IBM Plex Sans JP; 1591 + font-style: normal; 1592 + font-weight: 400; 1593 + font-display: swap; 1594 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/061.woff2) format('woff2'); 1595 + unicode-range: U+5925-59e6; 1596 + } 1597 + @font-face { 1598 + font-family: IBM Plex Sans JP; 1599 + font-style: normal; 1600 + font-weight: 400; 1601 + font-display: swap; 1602 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/062.woff2) format('woff2'); 1603 + unicode-range: U+59e7-5afd; 1604 + } 1605 + @font-face { 1606 + font-family: IBM Plex Sans JP; 1607 + font-style: normal; 1608 + font-weight: 400; 1609 + font-display: swap; 1610 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/063.woff2) format('woff2'); 1611 + unicode-range: U+5b00-5bcd; 1612 + } 1613 + @font-face { 1614 + font-family: IBM Plex Sans JP; 1615 + font-style: normal; 1616 + font-weight: 400; 1617 + font-display: swap; 1618 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/064.woff2) format('woff2'); 1619 + unicode-range: U+5bce-5c79; 1620 + } 1621 + @font-face { 1622 + font-family: IBM Plex Sans JP; 1623 + font-style: normal; 1624 + font-weight: 400; 1625 + font-display: swap; 1626 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/065.woff2) format('woff2'); 1627 + unicode-range: U+5c7a-5d79; 1628 + } 1629 + @font-face { 1630 + font-family: IBM Plex Sans JP; 1631 + font-style: normal; 1632 + font-weight: 400; 1633 + font-display: swap; 1634 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/066.woff2) format('woff2'); 1635 + unicode-range: U+5d7a-5e55; 1636 + } 1637 + @font-face { 1638 + font-family: IBM Plex Sans JP; 1639 + font-style: normal; 1640 + font-weight: 400; 1641 + font-display: swap; 1642 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/067.woff2) format('woff2'); 1643 + unicode-range: U+5e56-5f0c; 1644 + } 1645 + @font-face { 1646 + font-family: IBM Plex Sans JP; 1647 + font-style: normal; 1648 + font-weight: 400; 1649 + font-display: swap; 1650 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/068.woff2) format('woff2'); 1651 + unicode-range: U+5f0d-5fac; 1652 + } 1653 + @font-face { 1654 + font-family: IBM Plex Sans JP; 1655 + font-style: normal; 1656 + font-weight: 400; 1657 + font-display: swap; 1658 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/069.woff2) format('woff2'); 1659 + unicode-range: U+5fad-606b; 1660 + } 1661 + @font-face { 1662 + font-family: IBM Plex Sans JP; 1663 + font-style: normal; 1664 + font-weight: 400; 1665 + font-display: swap; 1666 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/070.woff2) format('woff2'); 1667 + unicode-range: U+606c-611c; 1668 + } 1669 + @font-face { 1670 + font-family: IBM Plex Sans JP; 1671 + font-style: normal; 1672 + font-weight: 400; 1673 + font-display: swap; 1674 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/071.woff2) format('woff2'); 1675 + unicode-range: U+611e-61de; 1676 + } 1677 + @font-face { 1678 + font-family: IBM Plex Sans JP; 1679 + font-style: normal; 1680 + font-weight: 400; 1681 + font-display: swap; 1682 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/072.woff2) format('woff2'); 1683 + unicode-range: U+61df-6294; 1684 + } 1685 + @font-face { 1686 + font-family: IBM Plex Sans JP; 1687 + font-style: normal; 1688 + font-weight: 400; 1689 + font-display: swap; 1690 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/073.woff2) format('woff2'); 1691 + unicode-range: U+6295-6366; 1692 + } 1693 + @font-face { 1694 + font-family: IBM Plex Sans JP; 1695 + font-style: normal; 1696 + font-weight: 400; 1697 + font-display: swap; 1698 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/074.woff2) format('woff2'); 1699 + unicode-range: U+6367-6430; 1700 + } 1701 + @font-face { 1702 + font-family: IBM Plex Sans JP; 1703 + font-style: normal; 1704 + font-weight: 400; 1705 + font-display: swap; 1706 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/075.woff2) format('woff2'); 1707 + unicode-range: U+6434-6516; 1708 + } 1709 + @font-face { 1710 + font-family: IBM Plex Sans JP; 1711 + font-style: normal; 1712 + font-weight: 400; 1713 + font-display: swap; 1714 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/076.woff2) format('woff2'); 1715 + unicode-range: U+6518-65d4; 1716 + } 1717 + @font-face { 1718 + font-family: IBM Plex Sans JP; 1719 + font-style: normal; 1720 + font-weight: 400; 1721 + font-display: swap; 1722 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/077.woff2) format('woff2'); 1723 + unicode-range: U+65d6-6679; 1724 + } 1725 + @font-face { 1726 + font-family: IBM Plex Sans JP; 1727 + font-style: normal; 1728 + font-weight: 400; 1729 + font-display: swap; 1730 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/078.woff2) format('woff2'); 1731 + unicode-range: U+667a-6738; 1732 + } 1733 + @font-face { 1734 + font-family: IBM Plex Sans JP; 1735 + font-style: normal; 1736 + font-weight: 400; 1737 + font-display: swap; 1738 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/079.woff2) format('woff2'); 1739 + unicode-range: U+673a-67ef; 1740 + } 1741 + @font-face { 1742 + font-family: IBM Plex Sans JP; 1743 + font-style: normal; 1744 + font-weight: 400; 1745 + font-display: swap; 1746 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/080.woff2) format('woff2'); 1747 + unicode-range: U+67f0-68ab; 1748 + } 1749 + @font-face { 1750 + font-family: IBM Plex Sans JP; 1751 + font-style: normal; 1752 + font-weight: 400; 1753 + font-display: swap; 1754 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/081.woff2) format('woff2'); 1755 + unicode-range: U+68ad-6965; 1756 + } 1757 + @font-face { 1758 + font-family: IBM Plex Sans JP; 1759 + font-style: normal; 1760 + font-weight: 400; 1761 + font-display: swap; 1762 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/082.woff2) format('woff2'); 1763 + unicode-range: U+6966-6a23; 1764 + } 1765 + @font-face { 1766 + font-family: IBM Plex Sans JP; 1767 + font-style: normal; 1768 + font-weight: 400; 1769 + font-display: swap; 1770 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/083.woff2) format('woff2'); 1771 + unicode-range: U+6a24-6b04; 1772 + } 1773 + @font-face { 1774 + font-family: IBM Plex Sans JP; 1775 + font-style: normal; 1776 + font-weight: 400; 1777 + font-display: swap; 1778 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/084.woff2) format('woff2'); 1779 + unicode-range: U+6b05-6bc3; 1780 + } 1781 + @font-face { 1782 + font-family: IBM Plex Sans JP; 1783 + font-style: normal; 1784 + font-weight: 400; 1785 + font-display: swap; 1786 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/085.woff2) format('woff2'); 1787 + unicode-range: U+6bc4-6c9a; 1788 + } 1789 + @font-face { 1790 + font-family: IBM Plex Sans JP; 1791 + font-style: normal; 1792 + font-weight: 400; 1793 + font-display: swap; 1794 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/086.woff2) format('woff2'); 1795 + unicode-range: U+6c9b-6d6c; 1796 + } 1797 + @font-face { 1798 + font-family: IBM Plex Sans JP; 1799 + font-style: normal; 1800 + font-weight: 400; 1801 + font-display: swap; 1802 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/087.woff2) format('woff2'); 1803 + unicode-range: U+6d6e-6e36; 1804 + } 1805 + @font-face { 1806 + font-family: IBM Plex Sans JP; 1807 + font-style: normal; 1808 + font-weight: 400; 1809 + font-display: swap; 1810 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/088.woff2) format('woff2'); 1811 + unicode-range: U+6e38-6f10; 1812 + } 1813 + @font-face { 1814 + font-family: IBM Plex Sans JP; 1815 + font-style: normal; 1816 + font-weight: 400; 1817 + font-display: swap; 1818 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/089.woff2) format('woff2'); 1819 + unicode-range: U+6f11-6fe9; 1820 + } 1821 + @font-face { 1822 + font-family: IBM Plex Sans JP; 1823 + font-style: normal; 1824 + font-weight: 400; 1825 + font-display: swap; 1826 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/090.woff2) format('woff2'); 1827 + unicode-range: U+6feb-70fd; 1828 + } 1829 + @font-face { 1830 + font-family: IBM Plex Sans JP; 1831 + font-style: normal; 1832 + font-weight: 400; 1833 + font-display: swap; 1834 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/091.woff2) format('woff2'); 1835 + unicode-range: U+7103-7208; 1836 + } 1837 + @font-face { 1838 + font-family: IBM Plex Sans JP; 1839 + font-style: normal; 1840 + font-weight: 400; 1841 + font-display: swap; 1842 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/092.woff2) format('woff2'); 1843 + unicode-range: U+7209-72e9; 1844 + } 1845 + @font-face { 1846 + font-family: IBM Plex Sans JP; 1847 + font-style: normal; 1848 + font-weight: 400; 1849 + font-display: swap; 1850 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/093.woff2) format('woff2'); 1851 + unicode-range: U+72ec-73bd; 1852 + } 1853 + @font-face { 1854 + font-family: IBM Plex Sans JP; 1855 + font-style: normal; 1856 + font-weight: 400; 1857 + font-display: swap; 1858 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/094.woff2) format('woff2'); 1859 + unicode-range: U+73bf-7491; 1860 + } 1861 + @font-face { 1862 + font-family: IBM Plex Sans JP; 1863 + font-style: normal; 1864 + font-weight: 400; 1865 + font-display: swap; 1866 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/095.woff2) format('woff2'); 1867 + unicode-range: U+7492-754f; 1868 + } 1869 + @font-face { 1870 + font-family: IBM Plex Sans JP; 1871 + font-style: normal; 1872 + font-weight: 400; 1873 + font-display: swap; 1874 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/096.woff2) format('woff2'); 1875 + unicode-range: U+7550-7601; 1876 + } 1877 + @font-face { 1878 + font-family: IBM Plex Sans JP; 1879 + font-style: normal; 1880 + font-weight: 400; 1881 + font-display: swap; 1882 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/097.woff2) format('woff2'); 1883 + unicode-range: U+7602-76b7; 1884 + } 1885 + @font-face { 1886 + font-family: IBM Plex Sans JP; 1887 + font-style: normal; 1888 + font-weight: 400; 1889 + font-display: swap; 1890 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/098.woff2) format('woff2'); 1891 + unicode-range: U+76b8-777e; 1892 + } 1893 + @font-face { 1894 + font-family: IBM Plex Sans JP; 1895 + font-style: normal; 1896 + font-weight: 400; 1897 + font-display: swap; 1898 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/099.woff2) format('woff2'); 1899 + unicode-range: U+777f-787c; 1900 + } 1901 + @font-face { 1902 + font-family: IBM Plex Sans JP; 1903 + font-style: normal; 1904 + font-weight: 400; 1905 + font-display: swap; 1906 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/100.woff2) format('woff2'); 1907 + unicode-range: U+787e-794f; 1908 + } 1909 + @font-face { 1910 + font-family: IBM Plex Sans JP; 1911 + font-style: normal; 1912 + font-weight: 400; 1913 + font-display: swap; 1914 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/101.woff2) format('woff2'); 1915 + unicode-range: U+7950-7a1a; 1916 + } 1917 + @font-face { 1918 + font-family: IBM Plex Sans JP; 1919 + font-style: normal; 1920 + font-weight: 400; 1921 + font-display: swap; 1922 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/102.woff2) format('woff2'); 1923 + unicode-range: U+7a1b-7adf; 1924 + } 1925 + @font-face { 1926 + font-family: IBM Plex Sans JP; 1927 + font-style: normal; 1928 + font-weight: 400; 1929 + font-display: swap; 1930 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/103.woff2) format('woff2'); 1931 + unicode-range: U+7ae0-7b9f; 1932 + } 1933 + @font-face { 1934 + font-family: IBM Plex Sans JP; 1935 + font-style: normal; 1936 + font-weight: 400; 1937 + font-display: swap; 1938 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/104.woff2) format('woff2'); 1939 + unicode-range: U+7ba0-7c60; 1940 + } 1941 + @font-face { 1942 + font-family: IBM Plex Sans JP; 1943 + font-style: normal; 1944 + font-weight: 400; 1945 + font-display: swap; 1946 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/105.woff2) format('woff2'); 1947 + unicode-range: U+7c61-7d1e; 1948 + } 1949 + @font-face { 1950 + font-family: IBM Plex Sans JP; 1951 + font-style: normal; 1952 + font-weight: 400; 1953 + font-display: swap; 1954 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/106.woff2) format('woff2'); 1955 + unicode-range: U+7d20-7dcd; 1956 + } 1957 + @font-face { 1958 + font-family: IBM Plex Sans JP; 1959 + font-style: normal; 1960 + font-weight: 400; 1961 + font-display: swap; 1962 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/107.woff2) format('woff2'); 1963 + unicode-range: U+7dce-7e89; 1964 + } 1965 + @font-face { 1966 + font-family: IBM Plex Sans JP; 1967 + font-style: normal; 1968 + font-weight: 400; 1969 + font-display: swap; 1970 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/108.woff2) format('woff2'); 1971 + unicode-range: U+7e8a-7fe5; 1972 + } 1973 + @font-face { 1974 + font-family: IBM Plex Sans JP; 1975 + font-style: normal; 1976 + font-weight: 400; 1977 + font-display: swap; 1978 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/109.woff2) format('woff2'); 1979 + unicode-range: U+7fe6-80ad; 1980 + } 1981 + @font-face { 1982 + font-family: IBM Plex Sans JP; 1983 + font-style: normal; 1984 + font-weight: 400; 1985 + font-display: swap; 1986 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/110.woff2) format('woff2'); 1987 + unicode-range: U+80af-8186; 1988 + } 1989 + @font-face { 1990 + font-family: IBM Plex Sans JP; 1991 + font-style: normal; 1992 + font-weight: 400; 1993 + font-display: swap; 1994 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/111.woff2) format('woff2'); 1995 + unicode-range: U+8188-8237; 1996 + } 1997 + @font-face { 1998 + font-family: IBM Plex Sans JP; 1999 + font-style: normal; 2000 + font-weight: 400; 2001 + font-display: swap; 2002 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/112.woff2) format('woff2'); 2003 + unicode-range: U+8238-82f6; 2004 + } 2005 + @font-face { 2006 + font-family: IBM Plex Sans JP; 2007 + font-style: normal; 2008 + font-weight: 400; 2009 + font-display: swap; 2010 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/113.woff2) format('woff2'); 2011 + unicode-range: U+82f7-83cc; 2012 + } 2013 + @font-face { 2014 + font-family: IBM Plex Sans JP; 2015 + font-style: normal; 2016 + font-weight: 400; 2017 + font-display: swap; 2018 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/114.woff2) format('woff2'); 2019 + unicode-range: U+83ce-84b2; 2020 + } 2021 + @font-face { 2022 + font-family: IBM Plex Sans JP; 2023 + font-style: normal; 2024 + font-weight: 400; 2025 + font-display: swap; 2026 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/115.woff2) format('woff2'); 2027 + unicode-range: U+84b4-8581; 2028 + } 2029 + @font-face { 2030 + font-family: IBM Plex Sans JP; 2031 + font-style: normal; 2032 + font-weight: 400; 2033 + font-display: swap; 2034 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/116.woff2) format('woff2'); 2035 + unicode-range: U+8584-8654; 2036 + } 2037 + @font-face { 2038 + font-family: IBM Plex Sans JP; 2039 + font-style: normal; 2040 + font-weight: 400; 2041 + font-display: swap; 2042 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/117.woff2) format('woff2'); 2043 + unicode-range: U+8655-871c; 2044 + } 2045 + @font-face { 2046 + font-family: IBM Plex Sans JP; 2047 + font-style: normal; 2048 + font-weight: 400; 2049 + font-display: swap; 2050 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/118.woff2) format('woff2'); 2051 + unicode-range: U+871e-87f8; 2052 + } 2053 + @font-face { 2054 + font-family: IBM Plex Sans JP; 2055 + font-style: normal; 2056 + font-weight: 400; 2057 + font-display: swap; 2058 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/119.woff2) format('woff2'); 2059 + unicode-range: U+87f9-88c0; 2060 + } 2061 + @font-face { 2062 + font-family: IBM Plex Sans JP; 2063 + font-style: normal; 2064 + font-weight: 400; 2065 + font-display: swap; 2066 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/120.woff2) format('woff2'); 2067 + unicode-range: U+88c1-8988; 2068 + } 2069 + @font-face { 2070 + font-family: IBM Plex Sans JP; 2071 + font-style: normal; 2072 + font-weight: 400; 2073 + font-display: swap; 2074 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/121.woff2) format('woff2'); 2075 + unicode-range: U+8989-8a58; 2076 + } 2077 + @font-face { 2078 + font-family: IBM Plex Sans JP; 2079 + font-style: normal; 2080 + font-weight: 400; 2081 + font-display: swap; 2082 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/122.woff2) format('woff2'); 2083 + unicode-range: U+8a5b-8b02; 2084 + } 2085 + @font-face { 2086 + font-family: IBM Plex Sans JP; 2087 + font-style: normal; 2088 + font-weight: 400; 2089 + font-display: swap; 2090 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/123.woff2) format('woff2'); 2091 + unicode-range: U+8b04-8c5a; 2092 + } 2093 + @font-face { 2094 + font-family: IBM Plex Sans JP; 2095 + font-style: normal; 2096 + font-weight: 400; 2097 + font-display: swap; 2098 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/124.woff2) format('woff2'); 2099 + unicode-range: U+8c5b-8d0b; 2100 + } 2101 + @font-face { 2102 + font-family: IBM Plex Sans JP; 2103 + font-style: normal; 2104 + font-weight: 400; 2105 + font-display: swap; 2106 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/125.woff2) format('woff2'); 2107 + unicode-range: U+8d0d-8e38; 2108 + } 2109 + @font-face { 2110 + font-family: IBM Plex Sans JP; 2111 + font-style: normal; 2112 + font-weight: 400; 2113 + font-display: swap; 2114 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/126.woff2) format('woff2'); 2115 + unicode-range: U+8e39-8f0c; 2116 + } 2117 + @font-face { 2118 + font-family: IBM Plex Sans JP; 2119 + font-style: normal; 2120 + font-weight: 400; 2121 + font-display: swap; 2122 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/127.woff2) format('woff2'); 2123 + unicode-range: U+8f0f-8feb; 2124 + } 2125 + @font-face { 2126 + font-family: IBM Plex Sans JP; 2127 + font-style: normal; 2128 + font-weight: 400; 2129 + font-display: swap; 2130 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/128.woff2) format('woff2'); 2131 + unicode-range: U+8fed-908b; 2132 + } 2133 + @font-face { 2134 + font-family: IBM Plex Sans JP; 2135 + font-style: normal; 2136 + font-weight: 400; 2137 + font-display: swap; 2138 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/129.woff2) format('woff2'); 2139 + unicode-range: U+908c-9165; 2140 + } 2141 + @font-face { 2142 + font-family: IBM Plex Sans JP; 2143 + font-style: normal; 2144 + font-weight: 400; 2145 + font-display: swap; 2146 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/130.woff2) format('woff2'); 2147 + unicode-range: U+9167-9216; 2148 + } 2149 + @font-face { 2150 + font-family: IBM Plex Sans JP; 2151 + font-style: normal; 2152 + font-weight: 400; 2153 + font-display: swap; 2154 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/131.woff2) format('woff2'); 2155 + unicode-range: U+9217-92d2; 2156 + } 2157 + @font-face { 2158 + font-family: IBM Plex Sans JP; 2159 + font-style: normal; 2160 + font-weight: 400; 2161 + font-display: swap; 2162 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/132.woff2) format('woff2'); 2163 + unicode-range: U+92d3-939a; 2164 + } 2165 + @font-face { 2166 + font-family: IBM Plex Sans JP; 2167 + font-style: normal; 2168 + font-weight: 400; 2169 + font-display: swap; 2170 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/133.woff2) format('woff2'); 2171 + unicode-range: U+939b-947e; 2172 + } 2173 + @font-face { 2174 + font-family: IBM Plex Sans JP; 2175 + font-style: normal; 2176 + font-weight: 400; 2177 + font-display: swap; 2178 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/134.woff2) format('woff2'); 2179 + unicode-range: U+947f-965d; 2180 + } 2181 + @font-face { 2182 + font-family: IBM Plex Sans JP; 2183 + font-style: normal; 2184 + font-weight: 400; 2185 + font-display: swap; 2186 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/135.woff2) format('woff2'); 2187 + unicode-range: U+965e-9713; 2188 + } 2189 + @font-face { 2190 + font-family: IBM Plex Sans JP; 2191 + font-style: normal; 2192 + font-weight: 400; 2193 + font-display: swap; 2194 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/136.woff2) format('woff2'); 2195 + unicode-range: U+9714-97d1; 2196 + } 2197 + @font-face { 2198 + font-family: IBM Plex Sans JP; 2199 + font-style: normal; 2200 + font-weight: 400; 2201 + font-display: swap; 2202 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/137.woff2) format('woff2'); 2203 + unicode-range: U+97d3-98c5; 2204 + } 2205 + @font-face { 2206 + font-family: IBM Plex Sans JP; 2207 + font-style: normal; 2208 + font-weight: 400; 2209 + font-display: swap; 2210 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/138.woff2) format('woff2'); 2211 + unicode-range: U+98c6-99c4; 2212 + } 2213 + @font-face { 2214 + font-family: IBM Plex Sans JP; 2215 + font-style: normal; 2216 + font-weight: 400; 2217 + font-display: swap; 2218 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/139.woff2) format('woff2'); 2219 + unicode-range: U+99c5-9ac8; 2220 + } 2221 + @font-face { 2222 + font-family: IBM Plex Sans JP; 2223 + font-style: normal; 2224 + font-weight: 400; 2225 + font-display: swap; 2226 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/140.woff2) format('woff2'); 2227 + unicode-range: U+9ace-9b79; 2228 + } 2229 + @font-face { 2230 + font-family: IBM Plex Sans JP; 2231 + font-style: normal; 2232 + font-weight: 400; 2233 + font-display: swap; 2234 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/141.woff2) format('woff2'); 2235 + unicode-range: U+9b7f-9c35; 2236 + } 2237 + @font-face { 2238 + font-family: IBM Plex Sans JP; 2239 + font-style: normal; 2240 + font-weight: 400; 2241 + font-display: swap; 2242 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/142.woff2) format('woff2'); 2243 + unicode-range: U+9c36-9d6f; 2244 + } 2245 + @font-face { 2246 + font-family: IBM Plex Sans JP; 2247 + font-style: normal; 2248 + font-weight: 400; 2249 + font-display: swap; 2250 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/143.woff2) format('woff2'); 2251 + unicode-range: U+9d70-9e9d; 2252 + } 2253 + @font-face { 2254 + font-family: IBM Plex Sans JP; 2255 + font-style: normal; 2256 + font-weight: 400; 2257 + font-display: swap; 2258 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/144.woff2) format('woff2'); 2259 + unicode-range: U+9e9e-9f61; 2260 + } 2261 + @font-face { 2262 + font-family: IBM Plex Sans JP; 2263 + font-style: normal; 2264 + font-weight: 400; 2265 + font-display: swap; 2266 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/145.woff2) format('woff2'); 2267 + unicode-range: U+9f62-9fb4; 2268 + } 2269 + @font-face { 2270 + font-family: IBM Plex Sans JP; 2271 + font-style: normal; 2272 + font-weight: 400; 2273 + font-display: swap; 2274 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/146.woff2) format('woff2'); 2275 + unicode-range: U+f860-f87f; 2276 + } 2277 + @font-face { 2278 + font-family: IBM Plex Sans JP; 2279 + font-style: normal; 2280 + font-weight: 400; 2281 + font-display: swap; 2282 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/147.woff2) format('woff2'); 2283 + unicode-range: U+f909-fa6a; 2284 + } 2285 + @font-face { 2286 + font-family: IBM Plex Sans JP; 2287 + font-style: normal; 2288 + font-weight: 400; 2289 + font-display: swap; 2290 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/148.woff2) format('woff2'); 2291 + unicode-range: U+fb00-fb04; 2292 + } 2293 + @font-face { 2294 + font-family: IBM Plex Sans JP; 2295 + font-style: normal; 2296 + font-weight: 400; 2297 + font-display: swap; 2298 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/149.woff2) format('woff2'); 2299 + unicode-range: U+fe10-fe19; 2300 + } 2301 + @font-face { 2302 + font-family: IBM Plex Sans JP; 2303 + font-style: normal; 2304 + font-weight: 400; 2305 + font-display: swap; 2306 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/150.woff2) format('woff2'); 2307 + unicode-range: U+fe30-fe48; 2308 + } 2309 + @font-face { 2310 + font-family: IBM Plex Sans JP; 2311 + font-style: normal; 2312 + font-weight: 400; 2313 + font-display: swap; 2314 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/151.woff2) format('woff2'); 2315 + unicode-range: U+ff01-ff80; 2316 + } 2317 + @font-face { 2318 + font-family: IBM Plex Sans JP; 2319 + font-style: normal; 2320 + font-weight: 400; 2321 + font-display: swap; 2322 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/152.woff2) format('woff2'); 2323 + unicode-range: U+ff81-ffe8; 2324 + } 2325 + @font-face { 2326 + font-family: IBM Plex Sans JP; 2327 + font-style: normal; 2328 + font-weight: 400; 2329 + font-display: swap; 2330 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/153.woff2) format('woff2'); 2331 + unicode-range: U+1f100; 2332 + } 2333 + @font-face { 2334 + font-family: IBM Plex Sans JP; 2335 + font-style: normal; 2336 + font-weight: 400; 2337 + font-display: swap; 2338 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/154.woff2) format('woff2'); 2339 + unicode-range: U+2000b-23763; 2340 + } 2341 + @font-face { 2342 + font-family: IBM Plex Sans JP; 2343 + font-style: normal; 2344 + font-weight: 400; 2345 + font-display: swap; 2346 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/155.woff2) format('woff2'); 2347 + unicode-range: U+23764-2770e; 2348 + } 2349 + @font-face { 2350 + font-family: IBM Plex Sans JP; 2351 + font-style: normal; 2352 + font-weight: 400; 2353 + font-display: swap; 2354 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/156.woff2) format('woff2'); 2355 + unicode-range: U+27723-2a6b2; 2356 + } 2357 + @font-face { 2358 + font-family: IBM Plex Sans JP; 2359 + font-style: normal; 2360 + font-weight: 400; 2361 + font-display: swap; 2362 + src: local('IBM Plex Sans JP'), local('IBMPlexSansJP'), url(/font/IBMPlexSansJP-Regular/157.woff2) format('woff2'); 2363 + unicode-range: U+2f804-2f9f4; 2364 + } 2365 + @font-face { 2366 + font-family: IBM Plex Sans JP; 2367 + font-style: normal; 2368 + font-weight: 700; 2369 + font-display: swap; 2370 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/001.woff2) format('woff2'); 2371 + unicode-range: U+20-7e; 2372 + } 2373 + @font-face { 2374 + font-family: IBM Plex Sans JP; 2375 + font-style: normal; 2376 + font-weight: 700; 2377 + font-display: swap; 2378 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/002.woff2) format('woff2'); 2379 + unicode-range: U+a0-ff; 2380 + } 2381 + @font-face { 2382 + font-family: IBM Plex Sans JP; 2383 + font-style: normal; 2384 + font-weight: 700; 2385 + font-display: swap; 2386 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/003.woff2) format('woff2'); 2387 + unicode-range: U+100-17e; 2388 + } 2389 + @font-face { 2390 + font-family: IBM Plex Sans JP; 2391 + font-style: normal; 2392 + font-weight: 700; 2393 + font-display: swap; 2394 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/004.woff2) format('woff2'); 2395 + unicode-range: U+192-237; 2396 + } 2397 + @font-face { 2398 + font-family: IBM Plex Sans JP; 2399 + font-style: normal; 2400 + font-weight: 700; 2401 + font-display: swap; 2402 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/005.woff2) format('woff2'); 2403 + unicode-range: U+250-2a2; 2404 + } 2405 + @font-face { 2406 + font-family: IBM Plex Sans JP; 2407 + font-style: normal; 2408 + font-weight: 700; 2409 + font-display: swap; 2410 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/006.woff2) format('woff2'); 2411 + unicode-range: U+2b0-2e9; 2412 + } 2413 + @font-face { 2414 + font-family: IBM Plex Sans JP; 2415 + font-style: normal; 2416 + font-weight: 700; 2417 + font-display: swap; 2418 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/007.woff2) format('woff2'); 2419 + unicode-range: U+300-361; 2420 + } 2421 + @font-face { 2422 + font-family: IBM Plex Sans JP; 2423 + font-style: normal; 2424 + font-weight: 700; 2425 + font-display: swap; 2426 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/008.woff2) format('woff2'); 2427 + unicode-range: U+384-3db; 2428 + } 2429 + @font-face { 2430 + font-family: IBM Plex Sans JP; 2431 + font-style: normal; 2432 + font-weight: 700; 2433 + font-display: swap; 2434 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/009.woff2) format('woff2'); 2435 + unicode-range: U+401-45f; 2436 + } 2437 + @font-face { 2438 + font-family: IBM Plex Sans JP; 2439 + font-style: normal; 2440 + font-weight: 700; 2441 + font-display: swap; 2442 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/010.woff2) format('woff2'); 2443 + unicode-range: U+1e3e-1ebd; 2444 + } 2445 + @font-face { 2446 + font-family: IBM Plex Sans JP; 2447 + font-style: normal; 2448 + font-weight: 700; 2449 + font-display: swap; 2450 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/011.woff2) format('woff2'); 2451 + unicode-range: U+1f70-1f73; 2452 + } 2453 + @font-face { 2454 + font-family: IBM Plex Sans JP; 2455 + font-style: normal; 2456 + font-weight: 700; 2457 + font-display: swap; 2458 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/012.woff2) format('woff2'); 2459 + unicode-range: U+2002-205d; 2460 + } 2461 + @font-face { 2462 + font-family: IBM Plex Sans JP; 2463 + font-style: normal; 2464 + font-weight: 700; 2465 + font-display: swap; 2466 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/013.woff2) format('woff2'); 2467 + unicode-range: U+2070-2089; 2468 + } 2469 + @font-face { 2470 + font-family: IBM Plex Sans JP; 2471 + font-style: normal; 2472 + font-weight: 700; 2473 + font-display: swap; 2474 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/014.woff2) format('woff2'); 2475 + unicode-range: U+20ac; 2476 + } 2477 + @font-face { 2478 + font-family: IBM Plex Sans JP; 2479 + font-style: normal; 2480 + font-weight: 700; 2481 + font-display: swap; 2482 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/015.woff2) format('woff2'); 2483 + unicode-range: U+20dd-20de; 2484 + } 2485 + @font-face { 2486 + font-family: IBM Plex Sans JP; 2487 + font-style: normal; 2488 + font-weight: 700; 2489 + font-display: swap; 2490 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/016.woff2) format('woff2'); 2491 + unicode-range: U+2100-213b; 2492 + } 2493 + @font-face { 2494 + font-family: IBM Plex Sans JP; 2495 + font-style: normal; 2496 + font-weight: 700; 2497 + font-display: swap; 2498 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/017.woff2) format('woff2'); 2499 + unicode-range: U+2150-2189; 2500 + } 2501 + @font-face { 2502 + font-family: IBM Plex Sans JP; 2503 + font-style: normal; 2504 + font-weight: 700; 2505 + font-display: swap; 2506 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/018.woff2) format('woff2'); 2507 + unicode-range: U+2190-21f5; 2508 + } 2509 + @font-face { 2510 + font-family: IBM Plex Sans JP; 2511 + font-style: normal; 2512 + font-weight: 700; 2513 + font-display: swap; 2514 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/019.woff2) format('woff2'); 2515 + unicode-range: U+2200-22db; 2516 + } 2517 + @font-face { 2518 + font-family: IBM Plex Sans JP; 2519 + font-style: normal; 2520 + font-weight: 700; 2521 + font-display: swap; 2522 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/020.woff2) format('woff2'); 2523 + unicode-range: U+2305-23ce; 2524 + } 2525 + @font-face { 2526 + font-family: IBM Plex Sans JP; 2527 + font-style: normal; 2528 + font-weight: 700; 2529 + font-display: swap; 2530 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/021.woff2) format('woff2'); 2531 + unicode-range: U+2423; 2532 + } 2533 + @font-face { 2534 + font-family: IBM Plex Sans JP; 2535 + font-style: normal; 2536 + font-weight: 700; 2537 + font-display: swap; 2538 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/022.woff2) format('woff2'); 2539 + unicode-range: U+2460-24e8; 2540 + } 2541 + @font-face { 2542 + font-family: IBM Plex Sans JP; 2543 + font-style: normal; 2544 + font-weight: 700; 2545 + font-display: swap; 2546 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/023.woff2) format('woff2'); 2547 + unicode-range: U+24e9-24ff; 2548 + } 2549 + @font-face { 2550 + font-family: IBM Plex Sans JP; 2551 + font-style: normal; 2552 + font-weight: 700; 2553 + font-display: swap; 2554 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/024.woff2) format('woff2'); 2555 + unicode-range: U+2500-2573; 2556 + } 2557 + @font-face { 2558 + font-family: IBM Plex Sans JP; 2559 + font-style: normal; 2560 + font-weight: 700; 2561 + font-display: swap; 2562 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/025.woff2) format('woff2'); 2563 + unicode-range: U+2581-2595; 2564 + } 2565 + @font-face { 2566 + font-family: IBM Plex Sans JP; 2567 + font-style: normal; 2568 + font-weight: 700; 2569 + font-display: swap; 2570 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/026.woff2) format('woff2'); 2571 + unicode-range: U+25a0-25ef; 2572 + } 2573 + @font-face { 2574 + font-family: IBM Plex Sans JP; 2575 + font-style: normal; 2576 + font-weight: 700; 2577 + font-display: swap; 2578 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/027.woff2) format('woff2'); 2579 + unicode-range: U+2600-26a0; 2580 + } 2581 + @font-face { 2582 + font-family: IBM Plex Sans JP; 2583 + font-style: normal; 2584 + font-weight: 700; 2585 + font-display: swap; 2586 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/028.woff2) format('woff2'); 2587 + unicode-range: U+2702-27a1; 2588 + } 2589 + @font-face { 2590 + font-family: IBM Plex Sans JP; 2591 + font-style: normal; 2592 + font-weight: 700; 2593 + font-display: swap; 2594 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/029.woff2) format('woff2'); 2595 + unicode-range: U+2934-2935; 2596 + } 2597 + @font-face { 2598 + font-family: IBM Plex Sans JP; 2599 + font-style: normal; 2600 + font-weight: 700; 2601 + font-display: swap; 2602 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/030.woff2) format('woff2'); 2603 + unicode-range: U+29bf-29fb; 2604 + } 2605 + @font-face { 2606 + font-family: IBM Plex Sans JP; 2607 + font-style: normal; 2608 + font-weight: 700; 2609 + font-display: swap; 2610 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/031.woff2) format('woff2'); 2611 + unicode-range: U+2b05-2b95; 2612 + } 2613 + @font-face { 2614 + font-family: IBM Plex Sans JP; 2615 + font-style: normal; 2616 + font-weight: 700; 2617 + font-display: swap; 2618 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/032.woff2) format('woff2'); 2619 + unicode-range: U+2e83-2ef2; 2620 + } 2621 + @font-face { 2622 + font-family: IBM Plex Sans JP; 2623 + font-style: normal; 2624 + font-weight: 700; 2625 + font-display: swap; 2626 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/033.woff2) format('woff2'); 2627 + unicode-range: U+2f00-2f7f; 2628 + } 2629 + @font-face { 2630 + font-family: IBM Plex Sans JP; 2631 + font-style: normal; 2632 + font-weight: 700; 2633 + font-display: swap; 2634 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/034.woff2) format('woff2'); 2635 + unicode-range: U+2f80-2fd5; 2636 + } 2637 + @font-face { 2638 + font-family: IBM Plex Sans JP; 2639 + font-style: normal; 2640 + font-weight: 700; 2641 + font-display: swap; 2642 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/035.woff2) format('woff2'); 2643 + unicode-range: U+3000-303d; 2644 + } 2645 + @font-face { 2646 + font-family: IBM Plex Sans JP; 2647 + font-style: normal; 2648 + font-weight: 700; 2649 + font-display: swap; 2650 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/036.woff2) format('woff2'); 2651 + unicode-range: U+3041-309f; 2652 + } 2653 + @font-face { 2654 + font-family: IBM Plex Sans JP; 2655 + font-style: normal; 2656 + font-weight: 700; 2657 + font-display: swap; 2658 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/037.woff2) format('woff2'); 2659 + unicode-range: U+30a0-30ff; 2660 + } 2661 + @font-face { 2662 + font-family: IBM Plex Sans JP; 2663 + font-style: normal; 2664 + font-weight: 700; 2665 + font-display: swap; 2666 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/038.woff2) format('woff2'); 2667 + unicode-range: U+3190-319f; 2668 + } 2669 + @font-face { 2670 + font-family: IBM Plex Sans JP; 2671 + font-style: normal; 2672 + font-weight: 700; 2673 + font-display: swap; 2674 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/039.woff2) format('woff2'); 2675 + unicode-range: U+31f0-31ff; 2676 + } 2677 + @font-face { 2678 + font-family: IBM Plex Sans JP; 2679 + font-style: normal; 2680 + font-weight: 700; 2681 + font-display: swap; 2682 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/040.woff2) format('woff2'); 2683 + unicode-range: U+3220-32dc; 2684 + } 2685 + @font-face { 2686 + font-family: IBM Plex Sans JP; 2687 + font-style: normal; 2688 + font-weight: 700; 2689 + font-display: swap; 2690 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/041.woff2) format('woff2'); 2691 + unicode-range: U+32dd-32ff; 2692 + } 2693 + @font-face { 2694 + font-family: IBM Plex Sans JP; 2695 + font-style: normal; 2696 + font-weight: 700; 2697 + font-display: swap; 2698 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/042.woff2) format('woff2'); 2699 + unicode-range: U+3300-33d4; 2700 + } 2701 + @font-face { 2702 + font-family: IBM Plex Sans JP; 2703 + font-style: normal; 2704 + font-weight: 700; 2705 + font-display: swap; 2706 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/043.woff2) format('woff2'); 2707 + unicode-range: U+33d7-33da; 2708 + } 2709 + @font-face { 2710 + font-family: IBM Plex Sans JP; 2711 + font-style: normal; 2712 + font-weight: 700; 2713 + font-display: swap; 2714 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/044.woff2) format('woff2'); 2715 + unicode-range: U+3402-41ee; 2716 + } 2717 + @font-face { 2718 + font-family: IBM Plex Sans JP; 2719 + font-style: normal; 2720 + font-weight: 700; 2721 + font-display: swap; 2722 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/045.woff2) format('woff2'); 2723 + unicode-range: U+41f3-4d77; 2724 + } 2725 + @font-face { 2726 + font-family: IBM Plex Sans JP; 2727 + font-style: normal; 2728 + font-weight: 700; 2729 + font-display: swap; 2730 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/046.woff2) format('woff2'); 2731 + unicode-range: U+4e00-4ec1; 2732 + } 2733 + @font-face { 2734 + font-family: IBM Plex Sans JP; 2735 + font-style: normal; 2736 + font-weight: 700; 2737 + font-display: swap; 2738 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/047.woff2) format('woff2'); 2739 + unicode-range: U+4ec2-4f78; 2740 + } 2741 + @font-face { 2742 + font-family: IBM Plex Sans JP; 2743 + font-style: normal; 2744 + font-weight: 700; 2745 + font-display: swap; 2746 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/048.woff2) format('woff2'); 2747 + unicode-range: U+4f79-501f; 2748 + } 2749 + @font-face { 2750 + font-family: IBM Plex Sans JP; 2751 + font-style: normal; 2752 + font-weight: 700; 2753 + font-display: swap; 2754 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/049.woff2) format('woff2'); 2755 + unicode-range: U+5021-50d9; 2756 + } 2757 + @font-face { 2758 + font-family: IBM Plex Sans JP; 2759 + font-style: normal; 2760 + font-weight: 700; 2761 + font-display: swap; 2762 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/050.woff2) format('woff2'); 2763 + unicode-range: U+50da-5183; 2764 + } 2765 + @font-face { 2766 + font-family: IBM Plex Sans JP; 2767 + font-style: normal; 2768 + font-weight: 700; 2769 + font-display: swap; 2770 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/051.woff2) format('woff2'); 2771 + unicode-range: U+5184-5231; 2772 + } 2773 + @font-face { 2774 + font-family: IBM Plex Sans JP; 2775 + font-style: normal; 2776 + font-weight: 700; 2777 + font-display: swap; 2778 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/052.woff2) format('woff2'); 2779 + unicode-range: U+5232-52df; 2780 + } 2781 + @font-face { 2782 + font-family: IBM Plex Sans JP; 2783 + font-style: normal; 2784 + font-weight: 700; 2785 + font-display: swap; 2786 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/053.woff2) format('woff2'); 2787 + unicode-range: U+52e0-537f; 2788 + } 2789 + @font-face { 2790 + font-family: IBM Plex Sans JP; 2791 + font-style: normal; 2792 + font-weight: 700; 2793 + font-display: swap; 2794 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/054.woff2) format('woff2'); 2795 + unicode-range: U+5382-5435; 2796 + } 2797 + @font-face { 2798 + font-family: IBM Plex Sans JP; 2799 + font-style: normal; 2800 + font-weight: 700; 2801 + font-display: swap; 2802 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/055.woff2) format('woff2'); 2803 + unicode-range: U+5436-54fe; 2804 + } 2805 + @font-face { 2806 + font-family: IBM Plex Sans JP; 2807 + font-style: normal; 2808 + font-weight: 700; 2809 + font-display: swap; 2810 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/056.woff2) format('woff2'); 2811 + unicode-range: U+54ff-55e3; 2812 + } 2813 + @font-face { 2814 + font-family: IBM Plex Sans JP; 2815 + font-style: normal; 2816 + font-weight: 700; 2817 + font-display: swap; 2818 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/057.woff2) format('woff2'); 2819 + unicode-range: U+55e4-56c5; 2820 + } 2821 + @font-face { 2822 + font-family: IBM Plex Sans JP; 2823 + font-style: normal; 2824 + font-weight: 700; 2825 + font-display: swap; 2826 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/058.woff2) format('woff2'); 2827 + unicode-range: U+56c8-577e; 2828 + } 2829 + @font-face { 2830 + font-family: IBM Plex Sans JP; 2831 + font-style: normal; 2832 + font-weight: 700; 2833 + font-display: swap; 2834 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/059.woff2) format('woff2'); 2835 + unicode-range: U+577f-5861; 2836 + } 2837 + @font-face { 2838 + font-family: IBM Plex Sans JP; 2839 + font-style: normal; 2840 + font-weight: 700; 2841 + font-display: swap; 2842 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/060.woff2) format('woff2'); 2843 + unicode-range: U+5862-5924; 2844 + } 2845 + @font-face { 2846 + font-family: IBM Plex Sans JP; 2847 + font-style: normal; 2848 + font-weight: 700; 2849 + font-display: swap; 2850 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/061.woff2) format('woff2'); 2851 + unicode-range: U+5925-59e6; 2852 + } 2853 + @font-face { 2854 + font-family: IBM Plex Sans JP; 2855 + font-style: normal; 2856 + font-weight: 700; 2857 + font-display: swap; 2858 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/062.woff2) format('woff2'); 2859 + unicode-range: U+59e7-5afd; 2860 + } 2861 + @font-face { 2862 + font-family: IBM Plex Sans JP; 2863 + font-style: normal; 2864 + font-weight: 700; 2865 + font-display: swap; 2866 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/063.woff2) format('woff2'); 2867 + unicode-range: U+5b00-5bcd; 2868 + } 2869 + @font-face { 2870 + font-family: IBM Plex Sans JP; 2871 + font-style: normal; 2872 + font-weight: 700; 2873 + font-display: swap; 2874 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/064.woff2) format('woff2'); 2875 + unicode-range: U+5bce-5c79; 2876 + } 2877 + @font-face { 2878 + font-family: IBM Plex Sans JP; 2879 + font-style: normal; 2880 + font-weight: 700; 2881 + font-display: swap; 2882 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/065.woff2) format('woff2'); 2883 + unicode-range: U+5c7a-5d79; 2884 + } 2885 + @font-face { 2886 + font-family: IBM Plex Sans JP; 2887 + font-style: normal; 2888 + font-weight: 700; 2889 + font-display: swap; 2890 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/066.woff2) format('woff2'); 2891 + unicode-range: U+5d7a-5e55; 2892 + } 2893 + @font-face { 2894 + font-family: IBM Plex Sans JP; 2895 + font-style: normal; 2896 + font-weight: 700; 2897 + font-display: swap; 2898 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/067.woff2) format('woff2'); 2899 + unicode-range: U+5e56-5f0c; 2900 + } 2901 + @font-face { 2902 + font-family: IBM Plex Sans JP; 2903 + font-style: normal; 2904 + font-weight: 700; 2905 + font-display: swap; 2906 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/068.woff2) format('woff2'); 2907 + unicode-range: U+5f0d-5fac; 2908 + } 2909 + @font-face { 2910 + font-family: IBM Plex Sans JP; 2911 + font-style: normal; 2912 + font-weight: 700; 2913 + font-display: swap; 2914 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/069.woff2) format('woff2'); 2915 + unicode-range: U+5fad-606b; 2916 + } 2917 + @font-face { 2918 + font-family: IBM Plex Sans JP; 2919 + font-style: normal; 2920 + font-weight: 700; 2921 + font-display: swap; 2922 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/070.woff2) format('woff2'); 2923 + unicode-range: U+606c-611c; 2924 + } 2925 + @font-face { 2926 + font-family: IBM Plex Sans JP; 2927 + font-style: normal; 2928 + font-weight: 700; 2929 + font-display: swap; 2930 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/071.woff2) format('woff2'); 2931 + unicode-range: U+611e-61de; 2932 + } 2933 + @font-face { 2934 + font-family: IBM Plex Sans JP; 2935 + font-style: normal; 2936 + font-weight: 700; 2937 + font-display: swap; 2938 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/072.woff2) format('woff2'); 2939 + unicode-range: U+61df-6294; 2940 + } 2941 + @font-face { 2942 + font-family: IBM Plex Sans JP; 2943 + font-style: normal; 2944 + font-weight: 700; 2945 + font-display: swap; 2946 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/073.woff2) format('woff2'); 2947 + unicode-range: U+6295-6366; 2948 + } 2949 + @font-face { 2950 + font-family: IBM Plex Sans JP; 2951 + font-style: normal; 2952 + font-weight: 700; 2953 + font-display: swap; 2954 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/074.woff2) format('woff2'); 2955 + unicode-range: U+6367-6430; 2956 + } 2957 + @font-face { 2958 + font-family: IBM Plex Sans JP; 2959 + font-style: normal; 2960 + font-weight: 700; 2961 + font-display: swap; 2962 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/075.woff2) format('woff2'); 2963 + unicode-range: U+6434-6516; 2964 + } 2965 + @font-face { 2966 + font-family: IBM Plex Sans JP; 2967 + font-style: normal; 2968 + font-weight: 700; 2969 + font-display: swap; 2970 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/076.woff2) format('woff2'); 2971 + unicode-range: U+6518-65d4; 2972 + } 2973 + @font-face { 2974 + font-family: IBM Plex Sans JP; 2975 + font-style: normal; 2976 + font-weight: 700; 2977 + font-display: swap; 2978 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/077.woff2) format('woff2'); 2979 + unicode-range: U+65d6-6679; 2980 + } 2981 + @font-face { 2982 + font-family: IBM Plex Sans JP; 2983 + font-style: normal; 2984 + font-weight: 700; 2985 + font-display: swap; 2986 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/078.woff2) format('woff2'); 2987 + unicode-range: U+667a-6738; 2988 + } 2989 + @font-face { 2990 + font-family: IBM Plex Sans JP; 2991 + font-style: normal; 2992 + font-weight: 700; 2993 + font-display: swap; 2994 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/079.woff2) format('woff2'); 2995 + unicode-range: U+673a-67ef; 2996 + } 2997 + @font-face { 2998 + font-family: IBM Plex Sans JP; 2999 + font-style: normal; 3000 + font-weight: 700; 3001 + font-display: swap; 3002 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/080.woff2) format('woff2'); 3003 + unicode-range: U+67f0-68ab; 3004 + } 3005 + @font-face { 3006 + font-family: IBM Plex Sans JP; 3007 + font-style: normal; 3008 + font-weight: 700; 3009 + font-display: swap; 3010 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/081.woff2) format('woff2'); 3011 + unicode-range: U+68ad-6965; 3012 + } 3013 + @font-face { 3014 + font-family: IBM Plex Sans JP; 3015 + font-style: normal; 3016 + font-weight: 700; 3017 + font-display: swap; 3018 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/082.woff2) format('woff2'); 3019 + unicode-range: U+6966-6a23; 3020 + } 3021 + @font-face { 3022 + font-family: IBM Plex Sans JP; 3023 + font-style: normal; 3024 + font-weight: 700; 3025 + font-display: swap; 3026 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/083.woff2) format('woff2'); 3027 + unicode-range: U+6a24-6b04; 3028 + } 3029 + @font-face { 3030 + font-family: IBM Plex Sans JP; 3031 + font-style: normal; 3032 + font-weight: 700; 3033 + font-display: swap; 3034 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/084.woff2) format('woff2'); 3035 + unicode-range: U+6b05-6bc3; 3036 + } 3037 + @font-face { 3038 + font-family: IBM Plex Sans JP; 3039 + font-style: normal; 3040 + font-weight: 700; 3041 + font-display: swap; 3042 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/085.woff2) format('woff2'); 3043 + unicode-range: U+6bc4-6c9a; 3044 + } 3045 + @font-face { 3046 + font-family: IBM Plex Sans JP; 3047 + font-style: normal; 3048 + font-weight: 700; 3049 + font-display: swap; 3050 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/086.woff2) format('woff2'); 3051 + unicode-range: U+6c9b-6d6c; 3052 + } 3053 + @font-face { 3054 + font-family: IBM Plex Sans JP; 3055 + font-style: normal; 3056 + font-weight: 700; 3057 + font-display: swap; 3058 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/087.woff2) format('woff2'); 3059 + unicode-range: U+6d6e-6e36; 3060 + } 3061 + @font-face { 3062 + font-family: IBM Plex Sans JP; 3063 + font-style: normal; 3064 + font-weight: 700; 3065 + font-display: swap; 3066 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/088.woff2) format('woff2'); 3067 + unicode-range: U+6e38-6f10; 3068 + } 3069 + @font-face { 3070 + font-family: IBM Plex Sans JP; 3071 + font-style: normal; 3072 + font-weight: 700; 3073 + font-display: swap; 3074 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/089.woff2) format('woff2'); 3075 + unicode-range: U+6f11-6fe9; 3076 + } 3077 + @font-face { 3078 + font-family: IBM Plex Sans JP; 3079 + font-style: normal; 3080 + font-weight: 700; 3081 + font-display: swap; 3082 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/090.woff2) format('woff2'); 3083 + unicode-range: U+6feb-70fd; 3084 + } 3085 + @font-face { 3086 + font-family: IBM Plex Sans JP; 3087 + font-style: normal; 3088 + font-weight: 700; 3089 + font-display: swap; 3090 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/091.woff2) format('woff2'); 3091 + unicode-range: U+7103-7208; 3092 + } 3093 + @font-face { 3094 + font-family: IBM Plex Sans JP; 3095 + font-style: normal; 3096 + font-weight: 700; 3097 + font-display: swap; 3098 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/092.woff2) format('woff2'); 3099 + unicode-range: U+7209-72e9; 3100 + } 3101 + @font-face { 3102 + font-family: IBM Plex Sans JP; 3103 + font-style: normal; 3104 + font-weight: 700; 3105 + font-display: swap; 3106 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/093.woff2) format('woff2'); 3107 + unicode-range: U+72ec-73bd; 3108 + } 3109 + @font-face { 3110 + font-family: IBM Plex Sans JP; 3111 + font-style: normal; 3112 + font-weight: 700; 3113 + font-display: swap; 3114 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/094.woff2) format('woff2'); 3115 + unicode-range: U+73bf-7491; 3116 + } 3117 + @font-face { 3118 + font-family: IBM Plex Sans JP; 3119 + font-style: normal; 3120 + font-weight: 700; 3121 + font-display: swap; 3122 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/095.woff2) format('woff2'); 3123 + unicode-range: U+7492-754f; 3124 + } 3125 + @font-face { 3126 + font-family: IBM Plex Sans JP; 3127 + font-style: normal; 3128 + font-weight: 700; 3129 + font-display: swap; 3130 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/096.woff2) format('woff2'); 3131 + unicode-range: U+7550-7601; 3132 + } 3133 + @font-face { 3134 + font-family: IBM Plex Sans JP; 3135 + font-style: normal; 3136 + font-weight: 700; 3137 + font-display: swap; 3138 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/097.woff2) format('woff2'); 3139 + unicode-range: U+7602-76b7; 3140 + } 3141 + @font-face { 3142 + font-family: IBM Plex Sans JP; 3143 + font-style: normal; 3144 + font-weight: 700; 3145 + font-display: swap; 3146 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/098.woff2) format('woff2'); 3147 + unicode-range: U+76b8-777e; 3148 + } 3149 + @font-face { 3150 + font-family: IBM Plex Sans JP; 3151 + font-style: normal; 3152 + font-weight: 700; 3153 + font-display: swap; 3154 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/099.woff2) format('woff2'); 3155 + unicode-range: U+777f-787c; 3156 + } 3157 + @font-face { 3158 + font-family: IBM Plex Sans JP; 3159 + font-style: normal; 3160 + font-weight: 700; 3161 + font-display: swap; 3162 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/100.woff2) format('woff2'); 3163 + unicode-range: U+787e-794f; 3164 + } 3165 + @font-face { 3166 + font-family: IBM Plex Sans JP; 3167 + font-style: normal; 3168 + font-weight: 700; 3169 + font-display: swap; 3170 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/101.woff2) format('woff2'); 3171 + unicode-range: U+7950-7a1a; 3172 + } 3173 + @font-face { 3174 + font-family: IBM Plex Sans JP; 3175 + font-style: normal; 3176 + font-weight: 700; 3177 + font-display: swap; 3178 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/102.woff2) format('woff2'); 3179 + unicode-range: U+7a1b-7adf; 3180 + } 3181 + @font-face { 3182 + font-family: IBM Plex Sans JP; 3183 + font-style: normal; 3184 + font-weight: 700; 3185 + font-display: swap; 3186 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/103.woff2) format('woff2'); 3187 + unicode-range: U+7ae0-7b9f; 3188 + } 3189 + @font-face { 3190 + font-family: IBM Plex Sans JP; 3191 + font-style: normal; 3192 + font-weight: 700; 3193 + font-display: swap; 3194 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/104.woff2) format('woff2'); 3195 + unicode-range: U+7ba0-7c60; 3196 + } 3197 + @font-face { 3198 + font-family: IBM Plex Sans JP; 3199 + font-style: normal; 3200 + font-weight: 700; 3201 + font-display: swap; 3202 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/105.woff2) format('woff2'); 3203 + unicode-range: U+7c61-7d1e; 3204 + } 3205 + @font-face { 3206 + font-family: IBM Plex Sans JP; 3207 + font-style: normal; 3208 + font-weight: 700; 3209 + font-display: swap; 3210 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/106.woff2) format('woff2'); 3211 + unicode-range: U+7d20-7dcd; 3212 + } 3213 + @font-face { 3214 + font-family: IBM Plex Sans JP; 3215 + font-style: normal; 3216 + font-weight: 700; 3217 + font-display: swap; 3218 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/107.woff2) format('woff2'); 3219 + unicode-range: U+7dce-7e89; 3220 + } 3221 + @font-face { 3222 + font-family: IBM Plex Sans JP; 3223 + font-style: normal; 3224 + font-weight: 700; 3225 + font-display: swap; 3226 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/108.woff2) format('woff2'); 3227 + unicode-range: U+7e8a-7fe5; 3228 + } 3229 + @font-face { 3230 + font-family: IBM Plex Sans JP; 3231 + font-style: normal; 3232 + font-weight: 700; 3233 + font-display: swap; 3234 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/109.woff2) format('woff2'); 3235 + unicode-range: U+7fe6-80ad; 3236 + } 3237 + @font-face { 3238 + font-family: IBM Plex Sans JP; 3239 + font-style: normal; 3240 + font-weight: 700; 3241 + font-display: swap; 3242 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/110.woff2) format('woff2'); 3243 + unicode-range: U+80af-8186; 3244 + } 3245 + @font-face { 3246 + font-family: IBM Plex Sans JP; 3247 + font-style: normal; 3248 + font-weight: 700; 3249 + font-display: swap; 3250 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/111.woff2) format('woff2'); 3251 + unicode-range: U+8188-8237; 3252 + } 3253 + @font-face { 3254 + font-family: IBM Plex Sans JP; 3255 + font-style: normal; 3256 + font-weight: 700; 3257 + font-display: swap; 3258 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/112.woff2) format('woff2'); 3259 + unicode-range: U+8238-82f6; 3260 + } 3261 + @font-face { 3262 + font-family: IBM Plex Sans JP; 3263 + font-style: normal; 3264 + font-weight: 700; 3265 + font-display: swap; 3266 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/113.woff2) format('woff2'); 3267 + unicode-range: U+82f7-83cc; 3268 + } 3269 + @font-face { 3270 + font-family: IBM Plex Sans JP; 3271 + font-style: normal; 3272 + font-weight: 700; 3273 + font-display: swap; 3274 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/114.woff2) format('woff2'); 3275 + unicode-range: U+83ce-84b2; 3276 + } 3277 + @font-face { 3278 + font-family: IBM Plex Sans JP; 3279 + font-style: normal; 3280 + font-weight: 700; 3281 + font-display: swap; 3282 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/115.woff2) format('woff2'); 3283 + unicode-range: U+84b4-8581; 3284 + } 3285 + @font-face { 3286 + font-family: IBM Plex Sans JP; 3287 + font-style: normal; 3288 + font-weight: 700; 3289 + font-display: swap; 3290 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/116.woff2) format('woff2'); 3291 + unicode-range: U+8584-8654; 3292 + } 3293 + @font-face { 3294 + font-family: IBM Plex Sans JP; 3295 + font-style: normal; 3296 + font-weight: 700; 3297 + font-display: swap; 3298 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/117.woff2) format('woff2'); 3299 + unicode-range: U+8655-871c; 3300 + } 3301 + @font-face { 3302 + font-family: IBM Plex Sans JP; 3303 + font-style: normal; 3304 + font-weight: 700; 3305 + font-display: swap; 3306 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/118.woff2) format('woff2'); 3307 + unicode-range: U+871e-87f8; 3308 + } 3309 + @font-face { 3310 + font-family: IBM Plex Sans JP; 3311 + font-style: normal; 3312 + font-weight: 700; 3313 + font-display: swap; 3314 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/119.woff2) format('woff2'); 3315 + unicode-range: U+87f9-88c0; 3316 + } 3317 + @font-face { 3318 + font-family: IBM Plex Sans JP; 3319 + font-style: normal; 3320 + font-weight: 700; 3321 + font-display: swap; 3322 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/120.woff2) format('woff2'); 3323 + unicode-range: U+88c1-8988; 3324 + } 3325 + @font-face { 3326 + font-family: IBM Plex Sans JP; 3327 + font-style: normal; 3328 + font-weight: 700; 3329 + font-display: swap; 3330 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/121.woff2) format('woff2'); 3331 + unicode-range: U+8989-8a58; 3332 + } 3333 + @font-face { 3334 + font-family: IBM Plex Sans JP; 3335 + font-style: normal; 3336 + font-weight: 700; 3337 + font-display: swap; 3338 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/122.woff2) format('woff2'); 3339 + unicode-range: U+8a5b-8b02; 3340 + } 3341 + @font-face { 3342 + font-family: IBM Plex Sans JP; 3343 + font-style: normal; 3344 + font-weight: 700; 3345 + font-display: swap; 3346 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/123.woff2) format('woff2'); 3347 + unicode-range: U+8b04-8c5a; 3348 + } 3349 + @font-face { 3350 + font-family: IBM Plex Sans JP; 3351 + font-style: normal; 3352 + font-weight: 700; 3353 + font-display: swap; 3354 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/124.woff2) format('woff2'); 3355 + unicode-range: U+8c5b-8d0b; 3356 + } 3357 + @font-face { 3358 + font-family: IBM Plex Sans JP; 3359 + font-style: normal; 3360 + font-weight: 700; 3361 + font-display: swap; 3362 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/125.woff2) format('woff2'); 3363 + unicode-range: U+8d0d-8e38; 3364 + } 3365 + @font-face { 3366 + font-family: IBM Plex Sans JP; 3367 + font-style: normal; 3368 + font-weight: 700; 3369 + font-display: swap; 3370 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/126.woff2) format('woff2'); 3371 + unicode-range: U+8e39-8f0c; 3372 + } 3373 + @font-face { 3374 + font-family: IBM Plex Sans JP; 3375 + font-style: normal; 3376 + font-weight: 700; 3377 + font-display: swap; 3378 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/127.woff2) format('woff2'); 3379 + unicode-range: U+8f0f-8feb; 3380 + } 3381 + @font-face { 3382 + font-family: IBM Plex Sans JP; 3383 + font-style: normal; 3384 + font-weight: 700; 3385 + font-display: swap; 3386 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/128.woff2) format('woff2'); 3387 + unicode-range: U+8fed-908b; 3388 + } 3389 + @font-face { 3390 + font-family: IBM Plex Sans JP; 3391 + font-style: normal; 3392 + font-weight: 700; 3393 + font-display: swap; 3394 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/129.woff2) format('woff2'); 3395 + unicode-range: U+908c-9165; 3396 + } 3397 + @font-face { 3398 + font-family: IBM Plex Sans JP; 3399 + font-style: normal; 3400 + font-weight: 700; 3401 + font-display: swap; 3402 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/130.woff2) format('woff2'); 3403 + unicode-range: U+9167-9216; 3404 + } 3405 + @font-face { 3406 + font-family: IBM Plex Sans JP; 3407 + font-style: normal; 3408 + font-weight: 700; 3409 + font-display: swap; 3410 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/131.woff2) format('woff2'); 3411 + unicode-range: U+9217-92d2; 3412 + } 3413 + @font-face { 3414 + font-family: IBM Plex Sans JP; 3415 + font-style: normal; 3416 + font-weight: 700; 3417 + font-display: swap; 3418 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/132.woff2) format('woff2'); 3419 + unicode-range: U+92d3-939a; 3420 + } 3421 + @font-face { 3422 + font-family: IBM Plex Sans JP; 3423 + font-style: normal; 3424 + font-weight: 700; 3425 + font-display: swap; 3426 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/133.woff2) format('woff2'); 3427 + unicode-range: U+939b-947e; 3428 + } 3429 + @font-face { 3430 + font-family: IBM Plex Sans JP; 3431 + font-style: normal; 3432 + font-weight: 700; 3433 + font-display: swap; 3434 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/134.woff2) format('woff2'); 3435 + unicode-range: U+947f-965d; 3436 + } 3437 + @font-face { 3438 + font-family: IBM Plex Sans JP; 3439 + font-style: normal; 3440 + font-weight: 700; 3441 + font-display: swap; 3442 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/135.woff2) format('woff2'); 3443 + unicode-range: U+965e-9713; 3444 + } 3445 + @font-face { 3446 + font-family: IBM Plex Sans JP; 3447 + font-style: normal; 3448 + font-weight: 700; 3449 + font-display: swap; 3450 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/136.woff2) format('woff2'); 3451 + unicode-range: U+9714-97d1; 3452 + } 3453 + @font-face { 3454 + font-family: IBM Plex Sans JP; 3455 + font-style: normal; 3456 + font-weight: 700; 3457 + font-display: swap; 3458 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/137.woff2) format('woff2'); 3459 + unicode-range: U+97d3-98c5; 3460 + } 3461 + @font-face { 3462 + font-family: IBM Plex Sans JP; 3463 + font-style: normal; 3464 + font-weight: 700; 3465 + font-display: swap; 3466 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/138.woff2) format('woff2'); 3467 + unicode-range: U+98c6-99c4; 3468 + } 3469 + @font-face { 3470 + font-family: IBM Plex Sans JP; 3471 + font-style: normal; 3472 + font-weight: 700; 3473 + font-display: swap; 3474 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/139.woff2) format('woff2'); 3475 + unicode-range: U+99c5-9ac8; 3476 + } 3477 + @font-face { 3478 + font-family: IBM Plex Sans JP; 3479 + font-style: normal; 3480 + font-weight: 700; 3481 + font-display: swap; 3482 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/140.woff2) format('woff2'); 3483 + unicode-range: U+9ace-9b79; 3484 + } 3485 + @font-face { 3486 + font-family: IBM Plex Sans JP; 3487 + font-style: normal; 3488 + font-weight: 700; 3489 + font-display: swap; 3490 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/141.woff2) format('woff2'); 3491 + unicode-range: U+9b7f-9c35; 3492 + } 3493 + @font-face { 3494 + font-family: IBM Plex Sans JP; 3495 + font-style: normal; 3496 + font-weight: 700; 3497 + font-display: swap; 3498 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/142.woff2) format('woff2'); 3499 + unicode-range: U+9c36-9d6f; 3500 + } 3501 + @font-face { 3502 + font-family: IBM Plex Sans JP; 3503 + font-style: normal; 3504 + font-weight: 700; 3505 + font-display: swap; 3506 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/143.woff2) format('woff2'); 3507 + unicode-range: U+9d70-9e9d; 3508 + } 3509 + @font-face { 3510 + font-family: IBM Plex Sans JP; 3511 + font-style: normal; 3512 + font-weight: 700; 3513 + font-display: swap; 3514 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/144.woff2) format('woff2'); 3515 + unicode-range: U+9e9e-9f61; 3516 + } 3517 + @font-face { 3518 + font-family: IBM Plex Sans JP; 3519 + font-style: normal; 3520 + font-weight: 700; 3521 + font-display: swap; 3522 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/145.woff2) format('woff2'); 3523 + unicode-range: U+9f62-9fb4; 3524 + } 3525 + @font-face { 3526 + font-family: IBM Plex Sans JP; 3527 + font-style: normal; 3528 + font-weight: 700; 3529 + font-display: swap; 3530 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/146.woff2) format('woff2'); 3531 + unicode-range: U+f860-f87f; 3532 + } 3533 + @font-face { 3534 + font-family: IBM Plex Sans JP; 3535 + font-style: normal; 3536 + font-weight: 700; 3537 + font-display: swap; 3538 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/147.woff2) format('woff2'); 3539 + unicode-range: U+f909-fa6a; 3540 + } 3541 + @font-face { 3542 + font-family: IBM Plex Sans JP; 3543 + font-style: normal; 3544 + font-weight: 700; 3545 + font-display: swap; 3546 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/148.woff2) format('woff2'); 3547 + unicode-range: U+fb00-fb04; 3548 + } 3549 + @font-face { 3550 + font-family: IBM Plex Sans JP; 3551 + font-style: normal; 3552 + font-weight: 700; 3553 + font-display: swap; 3554 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/149.woff2) format('woff2'); 3555 + unicode-range: U+fe10-fe19; 3556 + } 3557 + @font-face { 3558 + font-family: IBM Plex Sans JP; 3559 + font-style: normal; 3560 + font-weight: 700; 3561 + font-display: swap; 3562 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/150.woff2) format('woff2'); 3563 + unicode-range: U+fe30-fe48; 3564 + } 3565 + @font-face { 3566 + font-family: IBM Plex Sans JP; 3567 + font-style: normal; 3568 + font-weight: 700; 3569 + font-display: swap; 3570 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/151.woff2) format('woff2'); 3571 + unicode-range: U+ff01-ff80; 3572 + } 3573 + @font-face { 3574 + font-family: IBM Plex Sans JP; 3575 + font-style: normal; 3576 + font-weight: 700; 3577 + font-display: swap; 3578 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/152.woff2) format('woff2'); 3579 + unicode-range: U+ff81-ffe8; 3580 + } 3581 + @font-face { 3582 + font-family: IBM Plex Sans JP; 3583 + font-style: normal; 3584 + font-weight: 700; 3585 + font-display: swap; 3586 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/153.woff2) format('woff2'); 3587 + unicode-range: U+1f100; 3588 + } 3589 + @font-face { 3590 + font-family: IBM Plex Sans JP; 3591 + font-style: normal; 3592 + font-weight: 700; 3593 + font-display: swap; 3594 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/154.woff2) format('woff2'); 3595 + unicode-range: U+2000b-23763; 3596 + } 3597 + @font-face { 3598 + font-family: IBM Plex Sans JP; 3599 + font-style: normal; 3600 + font-weight: 700; 3601 + font-display: swap; 3602 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/155.woff2) format('woff2'); 3603 + unicode-range: U+23764-2770e; 3604 + } 3605 + @font-face { 3606 + font-family: IBM Plex Sans JP; 3607 + font-style: normal; 3608 + font-weight: 700; 3609 + font-display: swap; 3610 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/156.woff2) format('woff2'); 3611 + unicode-range: U+27723-2a6b2; 3612 + } 3613 + @font-face { 3614 + font-family: IBM Plex Sans JP; 3615 + font-style: normal; 3616 + font-weight: 700; 3617 + font-display: swap; 3618 + src: local('IBM Plex Sans JP Bold'), local('IBMPlexSansJP-Bold'), url(/font/IBMPlexSansJP-Bold/157.woff2) format('woff2'); 3619 + unicode-range: U+2f804-2f9f4; 3620 + } 3621 + html { 3622 + --tw-gradient-position: to bottom; 3623 + @supports (background-image: linear-gradient(in lab, red, red)) { 3624 + --tw-gradient-position: to bottom in oklab; 3625 + } 3626 + background-image: linear-gradient(var(--tw-gradient-stops)); 3627 + background-attachment: fixed; 3628 + --tw-gradient-from: var(--color-green-100); 3629 + --tw-gradient-to: var(--color-green-300); 3630 + --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); 3631 + font-family: var(--font-sans); 3632 + --tw-leading: 1.65; 3633 + line-height: 1.65; 3634 + } 3635 + hr { 3636 + margin-block: calc(var(--spacing) * 4); 3637 + color: var(--color-stone-400); 3638 + } 3639 + a { 3640 + color: var(--color-blue-600); 3641 + text-decoration-line: underline; 3642 + } 3643 + a:visited { 3644 + color: var(--color-blue-900); 3645 + } 3646 + .n-box { 3647 + width: min(80%, var(--container-6xl)); 3648 + border-style: var(--tw-border-style); 3649 + border-width: 1px; 3650 + --tw-border-style: solid; 3651 + border-style: solid; 3652 + border-color: var(--color-black); 3653 + margin-top: calc(var(--spacing) * 8); 3654 + margin-bottom: calc(var(--spacing) * 20); 3655 + display: flex; 3656 + flex-direction: column; 3657 + border-radius: var(--radius-sm); 3658 + padding: calc(var(--spacing) * 4); 3659 + --tw-drop-shadow-size: drop-shadow(0 9px 7px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.1))); 3660 + --tw-drop-shadow: drop-shadow(var(--drop-shadow-xl)); 3661 + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); 3662 + background-color: #ffffff; 3663 + margin-inline: auto; 3664 + &:has(+ .n-box) { 3665 + margin-bottom: calc(var(--spacing) * 8); 3666 + } 3667 + } 3668 + .clear-n-box { 3669 + border-color: transparent; 3670 + background-color: transparent; 3671 + --tw-drop-shadow: ; 3672 + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); 3673 + } 3674 + .clickable { 3675 + background-color: var(--color-gray-100); 3676 + padding-right: 0.5ch; 3677 + padding-left: 0.5ch; 3678 + border-style: var(--tw-border-style); 3679 + border-width: 1px; 3680 + --tw-border-style: solid; 3681 + border-style: solid; 3682 + border-color: var(--color-black); 3683 + border-radius: var(--radius-sm); 3684 + text-decoration: none; 3685 + &:hover { 3686 + background-color: var(--color-gray-200); 3687 + } 3688 + &:disabled, &[aria-disabled="True"] { 3689 + pointer-events: none; 3690 + border-color: var(--color-stone-400); 3691 + color: var(--color-stone-400); 3692 + } 3693 + } 3694 + .pfp { 3695 + --tw-drop-shadow-alpha: 25%; 3696 + --tw-drop-shadow-size: drop-shadow(0 9px 7px var(--tw-drop-shadow-color, oklab(from rgb(0 0 0 / 0.1) l a b / 25%))); 3697 + --tw-drop-shadow: var(--tw-drop-shadow-size); 3698 + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); 3699 + } 3700 + #splash, .you-know-you-want-to { 3701 + width: min-content; 3702 + cursor: pointer; 3703 + padding-inline: 2ch; 3704 + white-space: nowrap; 3705 + font-smooth: never; 3706 + animation-duration: .25s; 3707 + animation-name: splashscale; 3708 + animation-timing-function: transform 0.6s cubic-bezier(0.68, -0.6, 0.32, 1.6); 3709 + animation-direction: alternate; 3710 + animation-iteration-count: infinite; 3711 + transition-property: background-color; 3712 + transition-duration: 0.3s; 3713 + transition-timing-function: ease-in-out; 3714 + border-radius: var(--radius-md); 3715 + &:hover { 3716 + background-color: color-mix(in srgb, oklch(79.2% 0.209 151.711) 50%, transparent); 3717 + @supports (color: color-mix(in lab, red, red)) { 3718 + background-color: color-mix(in oklab, var(--color-green-400) 50%, transparent); 3719 + } 3720 + } 3721 + } 3722 + @media (prefers-reduced-motion) { 3723 + #splash, .you-know-you-want-to { 3724 + transform: rotateZ(-1.5deg); 3725 + font-smooth: auto; 3726 + animation: none; 3727 + } 3728 + } 3729 + .post-component { 3730 + margin: calc(var(--spacing) * 2); 3731 + h1 a { 3732 + font-size: 2.33em; 3733 + font-weight: 800; 3734 + text-decoration: none !important; 3735 + } 3736 + } 3737 + @keyframes splashscale { 3738 + 0% { 3739 + transform: scale(0.99) rotateZ(-1deg); 3740 + } 3741 + 100% { 3742 + transform: scale(1.02) rotateZ(-1deg); 3743 + } 3744 + } 3745 + @property --tw-gradient-position { 3746 + syntax: "*"; 3747 + inherits: false; 3748 + } 3749 + @property --tw-gradient-from { 3750 + syntax: "<color>"; 3751 + inherits: false; 3752 + initial-value: #0000; 3753 + } 3754 + @property --tw-gradient-via { 3755 + syntax: "<color>"; 3756 + inherits: false; 3757 + initial-value: #0000; 3758 + } 3759 + @property --tw-gradient-to { 3760 + syntax: "<color>"; 3761 + inherits: false; 3762 + initial-value: #0000; 3763 + } 3764 + @property --tw-gradient-stops { 3765 + syntax: "*"; 3766 + inherits: false; 3767 + } 3768 + @property --tw-gradient-via-stops { 3769 + syntax: "*"; 3770 + inherits: false; 3771 + } 3772 + @property --tw-gradient-from-position { 3773 + syntax: "<length-percentage>"; 3774 + inherits: false; 3775 + initial-value: 0%; 3776 + } 3777 + @property --tw-gradient-via-position { 3778 + syntax: "<length-percentage>"; 3779 + inherits: false; 3780 + initial-value: 50%; 3781 + } 3782 + @property --tw-gradient-to-position { 3783 + syntax: "<length-percentage>"; 3784 + inherits: false; 3785 + initial-value: 100%; 3786 + } 3787 + @property --tw-blur { 3788 + syntax: "*"; 3789 + inherits: false; 3790 + } 3791 + @property --tw-brightness { 3792 + syntax: "*"; 3793 + inherits: false; 3794 + } 3795 + @property --tw-contrast { 3796 + syntax: "*"; 3797 + inherits: false; 3798 + } 3799 + @property --tw-grayscale { 3800 + syntax: "*"; 3801 + inherits: false; 3802 + } 3803 + @property --tw-hue-rotate { 3804 + syntax: "*"; 3805 + inherits: false; 3806 + } 3807 + @property --tw-invert { 3808 + syntax: "*"; 3809 + inherits: false; 3810 + } 3811 + @property --tw-opacity { 3812 + syntax: "*"; 3813 + inherits: false; 3814 + } 3815 + @property --tw-saturate { 3816 + syntax: "*"; 3817 + inherits: false; 3818 + } 3819 + @property --tw-sepia { 3820 + syntax: "*"; 3821 + inherits: false; 3822 + } 3823 + @property --tw-drop-shadow { 3824 + syntax: "*"; 3825 + inherits: false; 3826 + } 3827 + @property --tw-drop-shadow-color { 3828 + syntax: "*"; 3829 + inherits: false; 3830 + } 3831 + @property --tw-drop-shadow-alpha { 3832 + syntax: "<percentage>"; 3833 + inherits: false; 3834 + initial-value: 100%; 3835 + } 3836 + @property --tw-drop-shadow-size { 3837 + syntax: "*"; 3838 + inherits: false; 3839 + } 3840 + @property --tw-border-style { 3841 + syntax: "*"; 3842 + inherits: false; 3843 + initial-value: solid; 3844 + } 3845 + @property --tw-leading { 3846 + syntax: "*"; 3847 + inherits: false; 3848 + } 3849 + @layer properties { 3850 + @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { 3851 + *, ::before, ::after, ::backdrop { 3852 + --tw-gradient-position: initial; 3853 + --tw-gradient-from: #0000; 3854 + --tw-gradient-via: #0000; 3855 + --tw-gradient-to: #0000; 3856 + --tw-gradient-stops: initial; 3857 + --tw-gradient-via-stops: initial; 3858 + --tw-gradient-from-position: 0%; 3859 + --tw-gradient-via-position: 50%; 3860 + --tw-gradient-to-position: 100%; 3861 + --tw-blur: initial; 3862 + --tw-brightness: initial; 3863 + --tw-contrast: initial; 3864 + --tw-grayscale: initial; 3865 + --tw-hue-rotate: initial; 3866 + --tw-invert: initial; 3867 + --tw-opacity: initial; 3868 + --tw-saturate: initial; 3869 + --tw-sepia: initial; 3870 + --tw-drop-shadow: initial; 3871 + --tw-drop-shadow-color: initial; 3872 + --tw-drop-shadow-alpha: 100%; 3873 + --tw-drop-shadow-size: initial; 3874 + --tw-border-style: solid; 3875 + --tw-leading: initial; 3876 + } 3877 + } 3878 + }
public/user.webp

This is a binary file and will not be displayed.

sayings/img/mizumiya.jpg

This is a binary file and will not be displayed.

sayings/img/small.jpg

This is a binary file and will not be displayed.

+367
sayings/making-of-mizumiya.md
··· 1 + { "Title": "Making of Mizumiya", "Description": "The creation story of Mizumiya, its core functionality, and notes on a few quirks.", "Created": "2025-10-10" } 2 + # Making of Mizumiya 3 + 4 + <img src="img/mizumiya.jpg" align=middle class="mx-64" alt="Logo/banner of Mizumiya" /> 5 + 6 + <sup>alernatively: "what poor licensing does to a mf"</sup> 7 + 8 + Mizumiya was made to exceed [PSHTML](https://github.com/Stephanevg/PSHTML) in 9 + its main game: Being a usable HTML DSL. 10 + 11 + And, it features built-in support for [HTMX](https://htmx.org/), the hottest new 12 + development in the web development world! More on that later! 13 + 14 + ## Origins {#origins} 15 + The PSHTML module is the *original* PowerShell DSL for HTML. That is, it is a 16 + specialized mini-language within PowerShell that reads similarly to HTML, and 17 + that itself generates HTML. See the following (abridged) example from their 18 + README: 19 + ```pwsh-mizumiya 20 + Import-Module PSHTML 21 + 22 + html { 23 + head { 24 + title "woop title" 25 + link "css/normalize.css" "stylesheet" 26 + } 27 + 28 + body { 29 + h1 "This is h1 Title in header" 30 + div { 31 + p { "This is simply a paragraph in a div." } 32 + h1 "This is h1" 33 + h2 "This is h2" 34 + ``` 35 + ... you get the idea. 36 + 37 + 38 + To preface, I don't mean this in a rude way-- for one, I'm not particularly good 39 + with words. But I have a lot of respect for what PSHTML has been able to do and 40 + all of the capabilities it has with stuff like Charts.js. 41 + 42 + However, I also found it lacking in a few areas. 43 + 44 + Firstly, it's missing several HTML tags. As part of a now-discarded iteration of 45 + Utatane (probably still unreleased), I needed to use the `<video>` and 46 + `<source>` tags -- both of which are missing from PSHTML! These are among 47 + a handful more of which I don't feel like retrieving again, but it is an 48 + inconvenience. The workaround for this is to manually write the HTML like so: 49 + ```pwsh-mizumiya 50 + body -Class '...' -Id '...' { 51 + div { 52 + @" 53 + <video> 54 + <source src="$(somewhere else)" type="video/mp4"/> 55 + </video> 56 + "@ 57 + } 58 + } 59 + ``` 60 + Not ideal! 61 + 62 + Secondly, it's also missing most of the global attributes. This is things like 63 + `autofocus` and `lang`, as well as the ARIA accessability attributes like 64 + `aria-label`, `role`, and `aria-disabled`. These are not commonly used, but when 65 + they are, they end up stuffed in the (IMO) ugly-looking `Attributes` parameter: 66 + ```pwsh-mizumiya 67 + button -Class x -Id y -Attributes @{ 68 + type = button 69 + {aria-label} = 'Reload' 70 + } { '↻' } 71 + ``` 72 + 73 + Third-ly (and mainly), PSHTML is *not* easily extensible. All elements and their 74 + attributes are defined in their own seperate files and functions, which means 75 + that would-be extensions, like adding the global/ARIA attribute set to the 76 + element functions, requires manually duplicating them across all functions. This 77 + makes the other two issues a hassle to fix. 78 + 79 + ## Process {#process} 80 + Rather than fork PSHTML, I decided to start over from scratch. The driving force 81 + behind this, rather than forking it and bodge over the bad, was PSHTML's 82 + license. I originally recognized it as MIT, which I would have been about fine 83 + with despite being a GPL person. Upon closer inspection, commit 84 + [531e680](https://github.com/Stephanevg/PSHTML/commit/531e680613cd16d77c9d929a530864cb394d1980) 85 + actually removes the users' right to commercial use, which I was 86 + [not okay with](https://www.gnu.org/licenses/gpl-faq.html#NoMilitary). 87 + 88 + Another reason, though less-so, was features like the asset manager, the 89 + aforementioned chart creator, and the color enum: these were features that I 90 + didn't need and considered "bloat" -- of course this ignores all of the valid 91 + use cases by others, but at the very least I was going to 92 + [start](https://www.dreamsongs.com/WorseIsBetter.html) 93 + [simple](https://www.dreamsongs.com/RiseOfWorseIsBetter.html). 94 + 95 + So, I started over. A few weeks of on/off work and transcribing every supported 96 + tags' attribute rules, to a self-imposed deadline of June 16th, and Mizumiya was 97 + finished. 98 + 99 + ## Functionality {#functionality} 100 + The root issue, extensability, is fixed by integrating another smaller 101 + DSL to codegen Mizumiya's element module code. 102 + 103 + Rather than initially defining each element as a function by itself, an element 104 + can be quickly defined like so: 105 + ```pwsh-mizumiya 106 + _new_tag form -Params @( 107 + @('Accept', 'String'), 108 + @('Autocomplete', 'String', @('on', 'off')), 109 + @('Name', 'String'), 110 + @('Rel', 'OptionalString', @('about', 'alternate', 'amphtml', 111 + 'apple-touch-icon', 'apple-touch-icon-precompressed', 112 + 'apple-touch-startup-image', '...')), 113 + @('Action', 'String'), 114 + @('EncType', 'String', @('application/x-www-form-urlencoded', 115 + 'multipart/form-data', 'text/plain')), 116 + @('Method', 'String', @('post', 'get', 'dialog')), 117 + @('NoValidate', 'Switch'), 118 + @('Target', 'String', @('_self', '_blank', '_parent', '_top')) 119 + ) 120 + ``` 121 + `_new_tag` is an easy helper for `New-HTMLElementFunction` that takes a 122 + specially-formed array and outputs a function definition (as a string). The 123 + general form is: 124 + ```pwsh 125 + @( 126 + @('Attribute Name', 'Type', 'Value Set' ), 127 + ... 128 + ) 129 + ``` 130 + The `Attribute Name` is the HTML attribute name as it will be used in 131 + PowerShell. In the example, you may notice that the names are pascal-cased (as 132 + PowerShell is). The names are automatically fixed when output as HTML; most 133 + names are just lowercased (even though this doesn't actually matter according to 134 + the HTML spec), but some are specially transformed to appear in ways that either 135 + can't be expressed in PowerShell or to better fit the pascal-casing of other 136 + attributes. These special attributes are: 137 + * `AriaDescribedBy` → `aria-describedby` 138 + * `DownloadStr` → `download="..."`: This is due to a limitation in 139 + PowerShell [^1] 140 + * `HttpEquiv` → `http-equiv` This is the only standard non-ARIA attribute that 141 + has a dash in it 142 + * `HxSelect-Oob` → `hx-select-oob`: `hx` is the HTMX attribute prefix. 143 + 144 + The `Type` is the "type" of the attribute -- not exactly the type of argument 145 + the parameter will expect. There are only three valid types: 146 + * `String`: For attributes that can accept a value. When the `Value Set` is also 147 + passed, the value of this attribute *must* also belong to that set. HTML 148 + attribute values, at least when passed from the server to the client, can only 149 + be strings, so the distinction between strings, integers, floats, etc. isn't 150 + needed. 151 + * `OptionalString`: This is like `String`, but it requires passing the 152 + `Value Set`. When using this type, PowerShell will suggest 153 + values for it, just like `String`, but it won't require them. This is especially 154 + useful in `<meta rel="...">`, where `rel` has 155 + [a set of agreed-upon values](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel), 156 + but also allows free-form input for 157 + [HTML extensions and microdata](https://microformats.org/wiki/existing-rel-values). 158 + * `Switch`: Attributes in HTML that only need their presence to be activated are 159 + called "boolean" attributes (like `<a download>` or `<input checked>`). 160 + PowerShell has a synonym for this: switch parameters! The usage is essentially 161 + the same; a call to `a -Download` becomes `<a download></a>`. 162 + 163 + So, a call like 164 + ```pwsh-mizumiya 165 + _new_tag element -Void:$False -Params @( 166 + @('Autocomplete', 'String', @('on', 'off')), 167 + @('Name', 'String'), 168 + @('Rel', 'OptionalString', @('about', 'alternate', 'amphtml', 169 + 'apple-touch-icon', '...')), 170 + @('NoValidate', 'Switch') 171 + ) 172 + ``` 173 + Would result in a function 174 + ```pwsh 175 + function element { 176 + [CmdletBinding()] 177 + param ( 178 + [Parameter(ValueFromPipeline)] $InnerHTML, 179 + [ValidateSet('on', 'off')] [String] ${Autocomplete}, 180 + [String] ${Name}, 181 + [ArgumentCompletions('about', 'alternate', 'amphtml', 'apple-touch-icon', '...')] [String] ${Rel}, 182 + [Switch] ${NoValidate}, 183 + [Hashtable] $Attributes 184 + ) 185 + 186 + New-HTMLElement -Tag element -Attributes $PSBoundParameters -InnerHTML $InnerHTML 187 + } 188 + ``` 189 + with the signature 190 + ```pwsh-functionsignature 191 + element [[-InnerHTML] <Object>] [[-Autocomplete] {on | off}] [[-Name] 192 + <string>] [[-Rel] <string>] [[-Attributes] <hashtable>] [-NoValidate] 193 + [<CommonParameters>] 194 + ``` 195 + 196 + All generated functions will call into `New-HTMLElement`; it is the "meat", the 197 + actual inner function that takes a tag name and hashtable (`$PSBoundParameters` 198 + is a hashtable of all of a function's parameters) and emits a whole element. 199 + 200 + You can now use `element` like just another PowerShell function. This example: 201 + ```pwsh-mizumiya 202 + element -Autocomplete on -Name hello -Rel awawa -NoValidate -Attributes @{ 'data-first' = 'value' } { 203 + 1..3 | % { 204 + element -NoValidate:$([bool]($_ % 2)) { $_ } 205 + } 206 + } 207 + ``` 208 + will output... <sup>(formatted for clarity)</sup> 209 + ```html 210 + <element data-first="value" autocomplete="on" novalidate rel="awawa" name="hello"> 211 + <element novalidate>1</element> 212 + <element>2</element> 213 + <element novalidate>3</element> 214 + </element> 215 + ``` 216 + You can find here, like in the PSHTML example, my favorite feature of Mizumiya: 217 + the innerHTML (to use the DOM vocabulary) of an element can easily be defined 218 + by adding a positional scriptblock to the end[^2] of the 219 + function call. It feels almost like home, as if you were still writing HTML, 220 + while also allowing you to execute whatever you want inside. You can also 221 + explicitly ask for it with `-InnerHTML` 222 + 223 + Small side note: the main `ElementGenerator.ps1` file defines a 224 + `__GLOBAL_ATTR__` "pseudo" element 225 + ([not that one](https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements)); 226 + when `_new_tag` gets an element named as such, it saves all of 227 + its attributes and applies it to all future elements (until you clear 228 + `$Script:GLOBAL_ATTR`). 229 + 230 + This does, of course, only work with 231 + [non-void](https://developer.mozilla.org/en-US/docs/Glossary/Void_element) 232 + elements that do not accept innerHTML. This is represented in `_new_tag`, 233 + `New-HTMLElementFunction`, and `New-HTMLElement`'s `-Void` parameter. Void 234 + elements will not accept an innerHTML at all. 235 + 236 + Attribute values are automatically escaped while the innerHTML is *not*, a 237 + relation I hope is accurately portrayed by the parameter name, somewhat inspired 238 + by the name of React's 239 + [`dangerouslySetInnerHTML`](https://legacy.reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml). 240 + 241 + ### A Short Note on HTMX {#htmx} 242 + Mizumiya has native support for the [HTMX](https://htmx.org) 243 + [attribute set](https://htmx.org/reference)! This is only because I found it 244 + useful for work on Utatane and NKK (this site!) -- if you want something else, 245 + you can clone Mizumiya and poke the `__GLOBAL_ATTR__` pseudo-element to add your 246 + own! 247 + 248 + ## A Note on Semantics {#semantics} 249 + While Mizumiya generates syntactically valid HTML, it does not check the 250 + *semantics*, at least in terms of element heirarchy and attribute values (these, 251 + not beyond the value sets). An `<area>` element should only exist under a 252 + `<map>` element -- they are meaningless otherwise; likewise, the ARIA attribute 253 + `role=listbox` on a parent element is useless when its children list items don't 254 + have `role=option`; Mizumiya won't check for this and will happily let you 255 + generate the following semantically invalid HTML: 256 + ```pwsh-mizumiya 257 + area { 258 + map { 259 + <# ... #> 260 + } 261 + } 262 + 263 + li -Role listbox { 264 + ul { 265 + li <# no -Role option! #> { <# ... #> } 266 + } 267 + } 268 + ``` 269 + Mizumiya's functions are essentially just fancy string formatters. There's no 270 + intermediate object representations (though this model *may* be worth 271 + exploring), so this type of advanced checking is not possible. 272 + 273 + ## A Note on Performance {#performance} 274 + There is unfortunately a small performance concern, though for most cases[^3] 275 + you will probably not experience it. In Utatane, my file index meant to replace 276 + Caddy's build-in file server, loading my `/bin` directory (which contains almost 277 + 4000 files) took just about 30 seconds to generate the table rows using 278 + Mizymiya. After days and days spend optimizing the generator, including 279 + experiments in C, C#, and a terrible experience wrangling C#'s FFI, the best 280 + solution was to work around Mizumiya entirely and use string interpolation, 281 + earning a 6x speedup from 30s to 5 seconds! 282 + ```pwsh 283 + @" 284 + <tr class="fsobject $( $IsFile ? "file" : "directory" )"> 285 + <td>$( if ($IsFile) { @" 286 + <a 287 + download 288 + class="file-dl clickable" 289 + href="$FilePath" 290 + aria-label="Download file">⭳</a> 291 + "@ }) 292 + "@ 293 + <# ... #> 294 + ``` 295 + 296 + ## Pode and Mizumiya {#pode} 297 + Mizumiya, being just PowerShell, is compatible with the Pode web framework. 298 + It can easily be used as the preferred view engine, similarly to PSHTML! For 299 + example, with the following file structure: 300 + ```treeview 301 + server_root/ 302 + |-- Server.ps1 303 + `-- views/ 304 + |-- home.ps1 305 + |-- index.ps1 306 + `-- login.ps1 307 + ``` 308 + 309 + and the following engine definition... 310 + ```pwsh 311 + Import-Module Mizumiya 312 + 313 + Start-PodeServer { 314 + Set-PodeViewEngine -Type Mizumiya -Extension ps1 -ScriptBlock { 315 + param ($Path, $Data) 316 + 317 + [String] (. $Path $Data) 318 + } 319 + 320 + <# ... #> 321 + } 322 + ``` 323 + 324 + Pode will run any `.ps1` file in a route and return its output as an HTML 325 + document! 326 + 327 + ## And a Note on the Gallery... {#psgallery} 328 + The module hasn't been submitted yet to the PowerShell Gallery, but it can be 329 + manually installed by copying the `git:Mizumiya/Mizumiya` directory to a path 330 + in your `$env:PSModulePath` as such: 331 + ```treeview 332 + /.../share/powershell/Modules/ 333 + `-- Mizumiya <-- git:Mizumiya/Mizumiya 334 + |-- Mizumiya.psd1 335 + `-- Mizumiya.psm1 336 + ``` 337 + 338 + You can see the source code and download or clone it at my 339 + [Forgejo instance](https://git.helpimnotdrowning.net/helpimnotdrowning/Mizumiya) 340 + (or its [GitHub mirror](https://github.com/helpimnotdrowning/Mizumiya))! 341 + 342 + [^1]: A PowerShell parameter can only be either a switch or not-a-switch. In 343 + HTML, an `<a>` tag's `download` attribute can either have a value, which is the 344 + requested file name upon download, or it can merely be present, where it will be 345 + "assigned" a file name (which is usually just the file name on the server). This 346 + optional-value behavior 347 + [can't be done](https://github.com/PowerShell/PowerShell/issues/12104) 348 + in PowerShell. The two workarounds I found are to either: 349 + 1. Require the user to pass an empty string when they wanted the default 350 + behavior; I found this to feel clunky: 351 + `a -Href https://somewhere/file.txt -Download ""` 352 + and 353 + `a -Href https://somewhere/file.txt -Download myname.txt` 354 + 2. Use two different parameters for the different modes. This is the option 355 + I went with: 356 + `a -Href https://somewhere/file.txt -Download` and 357 + `a -Href https://somewhere/file.txt -DownloadStr myname.txt` 358 + 359 + [^2]: Technically anywhere, but for readability you will probably place it at 360 + the end. When the functions are generated (and the element is 361 + [non-void](https://developer.mozilla.org/en-US/docs/Glossary/Void_element)), the 362 + `-InnerHTML` parameter is placed first *without a defined type*. This tells 363 + PowerShell that the first argument to the function without a preceding name (a 364 + positonal parameter) should be consumed by `-InnerHTML`. If this is a 365 + scriptblock, it is executed. Otherwise it is just stringified and plainly 366 + printed in the HTML. 367 + [^3]: basically untested other than exclusively this case, but nevertheless,
+547
sayings/powershell-test.md
··· 1 + { "Title": "PowerShell syntax test file", "Description": "file test for custom prism.js PowerShell syntax highlighter", "Created": "2025-09-22" } 2 + ## POWERSHELL TEST FILE 3 + 4 + ```pwsh 5 + using namespace System.Management.Automation 6 + #Requires -PSSnapin DiskSnapin -Version 1.2 7 + #Requires -PSSnapin DiskSnapin 8 + #Requires -Version 3 9 + #Requires -Version 3.0 10 + #Requires -Version 3 -RunAsAdministrator 11 + #Requires -RunAsAdministrator 12 + #Requires -Modules PSWorkflow 13 + #Requires -Modules PSWorkflow -ThisIsInvalid 14 + #Requires -Modules PSWorkflow, ActiveDirectory 15 + #Requires -Modules PSWorkflow,ActiveDirectory 16 + #Requires -ShellId MyLocalShell 17 + #Requires -PSEdition Core 18 + #Requires -Assembly System 19 + #Requires -Modules PSWorkflow @{ 20 + ModuleName="PSScheduledJob" 21 + ModuleVersion="1.0.0.0" 22 + } 23 + 24 + throw "Do not run this file!" 25 + 26 + <# 27 + 28 + The big PowerShell syntax highlighting test file 29 + 30 + #> 31 + 32 + # Stop parsing 33 + & tool.exe /arg1 'value' /arg2 $value --% /arg3 $value /arg4 "value" # Comment 34 + 35 + # Automatic variables 36 + $_ 37 + $args 38 + $error 39 + $home 40 + $foreach 41 + 42 + # Normal variables 43 + $variable 44 + $script:variable 45 + $ENV:ComputerName 46 + # This is not allowed 47 + $ENV: 48 + ${variable} 49 + ${script:variable} 50 + ${#variableName} 51 + ${'variableName'} 52 + ${"$variableName"} 53 + ${variable name} 54 + ${script:this`{name`}is"valid"} 55 + 56 + # Variable properties should be highlighted 57 + $variable.Name 58 + ($variable).Name 59 + 60 + # In double-quoted strings, only the variable should be highlighted, not the property 61 + "This is my $variable.Name!" 62 + 63 + # When used in a subexpression, both should be highlighted 64 + "This is my $($variable.Name)!" 65 + 66 + # $ENV:ComputerName should be highlighted 67 + "This is the name of my computer: $ENV:ComputerName" 68 + 69 + # Here as well 70 + "This is the name of my computer: ${ENV:ComputerName}" 71 + 72 + # This is still not allowed though 73 + "This is the name of my computer $ENV: " 74 + 75 + # This is an illegal variable name 76 + $variable-name 77 + 78 + # Hashtable 79 + $properties = @{ 80 + Name = 'Name' 81 + Something = $else 82 + Number = 16 83 + from = 'hello world' 84 + hash = @{ 85 + hello = 'world' 86 + } 87 + } 88 + 89 + # Spatting 90 + Invoke-Something @properties 91 + 92 + # ScriptBlock 93 + {Invoke-Something @properties} 94 + { 95 + Invoke-Something @properties 96 + } 97 + $sb = { 98 + Invoke-Something @properties 99 + } 100 + 101 + # Arrays 102 + $a1 = @(1,2,3,4) 103 + $a2 = ('one','two','three','four') 104 + $a3 = $one, $two, $three, $four 105 + $a1[0] 106 + $a2[-1] 107 + $a3[1..2] 108 + @(@($a)) 109 + @(($i = 10); (++$j)) 110 + @($i = 10) 111 + $i[($y - 1) + $x] 112 + 113 + # Single quoted strings 114 + 'This is a single quoted string.' 115 + '$This is a single ''quoted'' string.' 116 + 'This is a 117 + single quoted string.' 118 + 'This #also' 119 + '$(Invoke-Something)' 120 + 'This "string" is nice.' 121 + 122 + # Single quoted here-string 123 + @' 124 + $This is a ''single quoted'' 125 + $('Here-String') 126 + Isn't it "nice"?? 127 + '@ 128 + 129 + # Double quoted strings 130 + "This is a double quoted string." 131 + "$This is a double ""quoted"" string." 132 + "This is a 133 + double quoted string." 134 + "This #also" 135 + "$(Invoke-Something)" 136 + "This 'string' is nice." 137 + 138 + # Double quoted here-string 139 + @" 140 + $This is a 'double quoted' 141 + $('Here-String') 142 + Isn't it "nice"?? 143 + "@ 144 + 145 + # Numeric constants 146 + -3 147 + .5 148 + +.5 149 + 1. 150 + 1.d 151 + 1.lGB 152 + 1.e+12d 153 + 1e+12d 154 + 1.5 155 + -1.5 156 + -3 + -2 157 + -3+-2 158 + 3++2 159 + +2 160 + -3+- 161 + 10/-10 162 + 10/-10D 163 + -10.002L 164 + $x..5.40D 165 + -500..-495 166 + $true..3 167 + -2..$null 168 + -3..3 169 + 1 .. 3kb 170 + 1..3 171 + 6,10,-3 172 + 0x476 173 + +0x20 174 + -0x20 175 + .0.0 176 + 177 + # Types 178 + [string] 179 + [string[]] 180 + [int32] 181 + [System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Management.Automation.ParameterMetadata,System.Management.Automation]]] 182 + [System.Array+SZArrayEnumerator] 183 + [int]::MinValue 184 + [System.DateTime]::Parse('2016/09/21') 185 + 186 + # Commands (functions) 187 + Invoke-Something -foobar 188 + Invoke-Something -foobar value 189 + Invoke-Something -foobar:$true 190 + Invoke-Something -foobar: $true 191 + Invoke-Something -p1 v1 -p2 10 -p3 'value' -switch -verbose 192 + Invoke-Something (1..20 | Invoke-Something) -p2 'value' 193 + Invoke-Something -p1 v2 -p2 30 | Invoke-Something -switch 194 + Invoke-Something -p1 { 195 + Invoke-Something -foobar:$true 196 + } | Invoke-Something 197 + Invoke-Something -p1 value ` 198 + -p2 14.4 ` 199 + -p3 $value | Invoke-Something -verbose 200 + 201 + # Commands (Built-in variables) 202 + ls *.ps1 -recurse 203 + 204 + # Commands (executable files) 205 + . .\scripts\myscript.ps1 -parameter 'value' 206 + & tool.exe 207 + something.cmd 208 + øyvind.com # this should also highlight - TODO! 209 + 210 + # But this should not highlight anything 211 + file.1 212 + This.txt 213 + Function.txt 214 + Where.txt 215 + ForEach-Object.txt 216 + 217 + # switch 218 + switch ("fourteen") {} 219 + switch -CaseSensitive ("fourteen") {} 220 + switch -Illegal ("fourteen") {} # Using illegal switch parameter 221 + switch -Regex ("fourteen") {} 222 + switch -Wildcard ($a) {} 223 + switch -regex -file .\somefile.txt {} 224 + switch (3) {} 225 + switch (4, 2) {} 226 + 227 + switch -Regex -File $filePath { 228 + '.' {} 229 + default {} 230 + } 231 + 232 + switch -Wildcard -CaseSensitive ($something) { 233 + '.' {} 234 + default {} 235 + } 236 + 237 + switch ('this') { 238 + 'this' {} 239 + default {} 240 + } 241 + 242 + # Illegal backtick 243 + Invoke-Command -arg1 $val1 ` 244 + -arg2 $val2 ` 245 + 246 + # Functions and filters 247 + functioN MyFunction{} 248 + function My-Function {} 249 + Function My.Function{} 250 + function My-Function.Other{} 251 + function Some.other.function{} 252 + FUNCTION MyFunction2 {} 253 + function MyFunction3 254 + { 255 + 256 + } 257 + function New-File { } 258 + function New-File ($Name) { } 259 + function NewFile($Name) { } 260 + functionMyFunction{} 261 + filter myfilter($param) {} 262 + Filter my-Filter ($param){} 263 + 264 + function foo 265 + #comment 266 + { 267 + 268 + } 269 + 270 + # This one will not highlight the function name, 271 + # because of the comments after 'function'. TODO? 272 + function 273 + <# another comment #> 274 + test 275 + ( 276 + [string] 277 + <# another comment #> 278 + [parameter(mandatory)] 279 + $s 280 + ) 281 + { 282 + "test $s" 283 + } 284 + 285 + # Note that the # in the path should highlight as a comment! 286 + function Test-Drive([string]$roman) { 287 + $roman | c:\users\Me\Documents\Programming\F#\test.exe $roman 288 + } 289 + 290 + function Get-EscapedPath 291 + { 292 + param( 293 + [Parameter( 294 + Position=0, 295 + Mandatory=$true 296 + ValueFromPipeline=$true, 297 + ValueFromPipelineByPropertyName=$true) 298 + ] 299 + [string]$path 300 + ) 301 + 302 + process { 303 + if ($path.Contains(' ')) 304 + { 305 + return '"' + $path + '"' 306 + } 307 + return $path 308 + } 309 + } 310 + 311 + # Enum 312 + enum test 313 + { 314 + listItem1 315 + listItem2 316 + listItem3 317 + } 318 + 319 + # Illegal enum name 320 + enum my-Enum { 321 + 322 + } 323 + 324 + # Class 325 + class Vehicle { 326 + Vehicle() {} 327 + Vehicle([string]$Owner) { 328 + $this.Owner = $Owner 329 + } 330 + 331 + [int]$Mileage 332 + [int]$Age 333 + [string]$Owner 334 + 335 + [void]Drive([int]$NumberOfMiles) { 336 + $this.Mileage += $NumberOfMiles 337 + } 338 + } 339 + 340 + class Car: Vehicle { 341 + Car() {} 342 + 343 + Car([int]$Age) { 344 + $this.Age = $Age 345 + } 346 + 347 + Car([int]$Age, [string]$Owner) : base([string]$Owner) { 348 + $this.Age = $Age 349 + $this.Owner = $Owner 350 + } 351 + 352 + hidden [int]$Length 353 + static [int]$Width 354 + 355 + SetLength([int]$Length) { 356 + $this.Length = $Length 357 + } 358 + } 359 + 360 + # Illegal class name 361 + class my-class {} 362 + 363 + # Control words 364 + foreach ($item in $collection) { 365 + try { 366 + if ($item -gt 100) { 367 + continue 368 + } 369 + } 370 + catch { 371 + break 372 + } 373 + } 374 + 375 + # Reserved words 376 + Configuration Crazyness { 377 + Node Whatever { 378 + } 379 + } 380 + param () 381 + 382 + # Redirection 383 + notepad.exe > log.txt 384 + notepad.exe 1> log.txt 385 + notepad.exe 2>&1 386 + notepad.exe 3>&1 387 + notepad.exe 4>&1 388 + notepad.exe 5>&1 389 + notepad.exe 6>&1 390 + notepad.exe 2>&1> log.txt 391 + 392 + # Note: 7 isn't a valid stream 393 + notepad.exe 7>&1 394 + 395 + # Operators 396 + if (10 -cgt 100) { } 397 + $a -is $b 398 + $b -contains $c 399 + $x -notcontains $c 400 + $c -in $b 401 + $c -notin $x 402 + $a -match $b 403 + $a -notmatch $b 404 + $x -like $c 405 + 100 -and 0 406 + $a -ceq 4 -and $a -ine $d -or 407 + $c -is [Type] 408 + $c -isnot [Type] 409 + $c -as [Type] 410 + $k = $y -bor $k 411 + $x = $y -band $x 412 + $z = -bnot $x 413 + $k = $y -xor $b 414 + $k = $y -bxor $b 415 + $a -icontains $c 416 + $a -ccontains $c 417 + $a -iNotContains $c 418 + $a -cNotContains $c 419 + $a -cmatch $c 420 + $x -iMatch $c 421 + $x -iNotMatch $c 422 + $a -iLike $b 423 + $b -cLike $c 424 + "hey" -cgt "Hey" 425 + "Hey" -igt "hey" 426 + "hey" -cge "Hey" 427 + "Hey" -ige "hey" 428 + "HEY" -clt "hey" 429 + "HEY" -ilt "hey" 430 + "HEY" -cle "hey" 431 + "HEY" -ile "hey" 432 + 433 + # this isn't a valid operator: 434 + $x -foobar $y 435 + 436 + # Negative: these are cmdlets with unapproved verbs 437 + # we should not highlight keywords in them 438 + Foo-Is 439 + Foo-Not 440 + Foo-Join 441 + Foo-Bxor 442 + Foo-f 443 + Foo-eq 444 + Foo-match 445 + 446 + # format 447 + "{0:N2}" -f $a 448 + "{0:D8}" -f $a 449 + "{0:C2}" -f $a 450 + "{0:P0}" -f $a 451 + "{0:X0}" -f $a 452 + (1.11).tostring("#.#") 453 + "{1,10} {0,10} {2,10:x}" -f "First", "Second", 255 454 + ("{0,6}" -f 4.99), ("{0,6:##.00}" -f 15.9) 455 + "{0:R}" -f (1mb/2.0) 456 + "{0:00.0}" -f 4.12341234 457 + "{0:##.#}" -f 4.12341234 458 + "{0:#,#.#}" -f 1234.121234 459 + "{0:##,,.000}" -f 1048576 460 + "{this is not a #comment}" 461 + "{0:##.#E000}" -f 2.71828 462 + "{0:#.00'##'}" -f 2.71828 463 + "{0:POS;NEG;ZERO}" -f -14 464 + "{0:$## Please}" -f 14 465 + "{0,-8:P1}" -f 1.75 466 + "{0,10:N3}{1,10:N3}{2,10:N3}{3,10:N3}" -f 0.2, 0.3, 0.45, 0.91 467 + '{0:00000.000}' -f 7.125 468 + 469 + # Help Directives (Comment based help) 470 + 471 + # Should also be able to use with line comments 472 + # .DESCRIPTION 473 + # .EXAMPLE sdkl 474 + # 475 + # .EXTERNALHELP some 476 + # .REMOTEHELPRUNSPACE some 477 + # .ExternalHelp some 478 + 479 + <# 480 + .DESCRIPTION 481 + This is a description. 482 + .REMOTEHELPRUNSPACE some 483 + .example 484 + .EXAMPLE 485 + Get-Power 3 4 486 + 81 487 + 488 + .ExternalHelp C:\MyScripts\Update-Month-Help.xml 489 + 490 + .FORWARDHELPCATEGORY Cmdlet 491 + 492 + .FORWARDHELPTARGETNAME Get-Help 493 + 494 + .INPUTS 495 + None. 496 + 497 + .LINK 498 + Online version: http://www.acmecorp.com/widget.html 499 + .LINK 500 + Set-ProcedureName 501 + 502 + .NOTES 503 + Something. 504 + 505 + .OUTPUTS 506 + None unless the -PassThru switch parameter is used. 507 + 508 + .PARAMETER ParameterName 509 + 510 + .SYNOPSIS 511 + Something. 512 + #> 513 + 514 + # Misc test cases 515 + @("any","array","has").foreach({ $_ }) 516 + @('any','array','has').foreach{ $_ } 517 + @("any","array","has").where({ $_.Length -gt 3 }) 518 + @("any","array","has").where{ $_.Length -gt 3 } 519 + foo "$(x).exe" 520 + $file = join-path $env:SystemDrive "$([System.io.path]::GetRandomFileName()).ps1" 521 + $ScriptBlock | Out-File $file -Force 522 + workflow w1 {} 523 + Workflow work {} 524 + get-thing | Out-WithYou > $null # destroy 525 + "Escaped chars: `", `n, `$, `b, `t, `"" 526 + 'But here they''re not escape chars: `", `n, `$, `b, `"' 527 + "When you call a method: $( get-number | %{ invoke-command $( [string]::format("Like (this{0})","what?") ) $var } )" 528 + foo 529 + $a = $("Guess what, happens ""here, hey""" | "Hm... $("this, is" strange.) you can't really pipe to a string, but nevermind for now.") 530 + this-isnot.ps1 531 + a_mistake.here.ps1 532 + "anothermistake.ps1" 533 + $users.Split(',').Trim() 534 + TestConfiguration -OutputPath $workingDirectory 535 + "blablabla $(invoke-foo baz $a.bar) blablabla" 536 + invoke-foo baz $a.bar 537 + var 538 + -var 539 + _var 540 + jvar 541 + varj 542 + [ValidatePattern('^(?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$)')] 543 + $foo.bar 544 + ($foo).bar 545 + (Invoke-Something).bar 546 + #comment 547 + some#comment # we need a space before the # for it to become a comment
+78
server.psd1
··· 1 + <# 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + #> 17 + 18 + Import-Module Mizumiya 19 + 20 + @{ 21 + NKK = @{ 22 + EnableSplashText = $true 23 + # these are markdown! 24 + Splashes = @( 25 + "bau bau", 26 + "konrushi", 27 + "System.Object[]", 28 + "null", 29 + "missingno", 30 + "mooming", 31 + "2:23 AM", 32 + "Proudly sponsored by SPAM® Less Sodium: There’s no sacrifice with this meat treat!!1!", 33 + (HTMLEncode "hi :) `"</p><script id=`"jk`" src=https://xplo.it.ru/q.js></script>"), 34 + "TAke a look, y'all: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH6QIbFgkBvik3CQAAANNJREFUCNcByAA3/wF0z7UFAgIzFBkLDQQBBfzt8fnj7PJL+xIDHSo2ECMU4PHz6/X07fb57vj58///9gb9AhkqFw8QCh0HAvn+/vD4+ur1+jQPDuwNAQT/BgMd+wE1FBfWDfrz8vUKBgo5+Q7O8eEC/QcBFvH55bK9NPIKPwYUGdPj4LzFF/4CBP79/xUKDicrLwkMFAADAhkiBQAV9c776wL//gvd6u0JIR8A/f0A/P0FDArzAQDt+/0E9/IEoOju/PPeTjAlCAgH4+jvk9bm3/n8b9hiDUdDcYcAAAAASUVORK5CYII=", 35 + "hello world!", 36 + "%x%x%x%x", 37 + "[object Function]", 38 + "professional git commit history entangler", 39 + "chronic minecraft player", 40 + "[SYNTAX ERROR ON LINE (6408082)]", 41 + "nananan", 42 + "[恋をして!](https://jamies.page/)", 43 + "Not hosted on GitHub!", 44 + "OpenGL 2.1 (if supported)!", 45 + "Now With Multiplayer!", 46 + "Alpha version!", 47 + "As seen on TV!", 48 + "$(Get-ChildItem -Force -File -Recurse | ? { $_.Extension -notin '.woff2','.jpg','.png','.md','.ico' } | % { cat $_ } | wc -l) lines of code!", 49 + # this only runs once on (re)load so its always the same number until the server restarts, good enough? 50 + "The instruction at 0x$( "{0:x}" -f (get-random -min 0 -max 0x7fffffff) ) referenced memory at 0x00000000. The memory could not be read. Click [here](/garbage/bugs_when_you_lift_up_a_rock.jpg) to terminate the program.", 51 + "buhhhh", 52 + "こんるし〜" 53 + ) 54 + } 55 + 56 + Server = @{ 57 + AllowedActions = @{ 58 + Suspend = $false 59 + Disable = $false 60 + } 61 + } 62 + 63 + Web = @{ 64 + Compression = @{ 65 + Enable = $true 66 + } 67 + 68 + Static = @{ 69 + Cache = @{ 70 + Enable = $true 71 + Include = @( 72 + '/font/*', 73 + '/prism/grammars/*' 74 + ) 75 + } 76 + } 77 + } 78 + }
+448
tailwind/00.typography.tw.css
··· 1 + /* 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + */ 17 + 18 + /* 19 + * adapted from https://github.com/tailwindlabs/tailwindcss-typography 20 + * :heart: 21 + */ 22 + .tx { 23 + --tw-prose-body: var(--color-black); 24 + --tw-prose-headings: var(--color-gray-900); 25 + --tw-prose-lead: var(--color-gray-600); 26 + --tw-prose-links: var(--color-blue-700); 27 + --tw-prose-bold: var(--color-gray-900); 28 + --tw-prose-counters: var(--color-gray-600); 29 + --tw-prose-bullets: var(--color-gray-500); 30 + --tw-prose-hr: var(--color-gray-400); 31 + --tw-prose-quotes: var(--color-gray-900); 32 + --tw-prose-quote-borders: var(--color-gray-400); 33 + --tw-prose-captions: var(--color-gray-500); 34 + --tw-prose-kbd: var(--color-gray-900); 35 + --tw-prose-kbd-shadows: var(--color-gray-900); 36 + --tw-prose-code: var(--color-gray-900); 37 + --tw-prose-pre-code: var(--color-gray-200); 38 + --tw-prose-pre-bg: transparent; 39 + --tw-prose-th-borders: var(--color-gray-300); 40 + --tw-prose-td-borders: var(--color-gray-200); 41 + 42 + @apply p-10!; 43 + 44 + color: var(--tw-prose-body); 45 + 46 + /* lg */ 47 + font-size: 1.05rem; 48 + line-height: 1.5; 49 + 50 + & img[align="left"] { 51 + @apply pr-[20px]; 52 + } 53 + & p { 54 + @apply my-[0.5em]; 55 + } 56 + & [class~="lead"] { 57 + font-size: 1.22em; 58 + line-height: round(32/22); 59 + @apply my-[1.09em]; 60 + } 61 + & h1, & h2, h3, & h4 { 62 + @apply mt-[1rem] mb-[0.75rem]; 63 + font-weight: 600; 64 + line-height: 1.25; 65 + @apply pb-2; 66 + } 67 + & h1 { 68 + font-size: 2.33em; 69 + border-bottom: 1px solid var(--tw-prose-hr); 70 + 71 + color: var(--tw-prose-headings); 72 + font-weight: 600; 73 + 74 + & strong { 75 + font-weight: 700; 76 + } 77 + } 78 + & h2 { 79 + font-size: 1.66em; 80 + border-bottom: 1px solid var(--tw-prose-hr); 81 + 82 + color: var(--tw-prose-headings); 83 + font-weight: 550; 84 + 85 + & strong { 86 + font-weight: 650; 87 + } 88 + & code { 89 + font-size: 0.86em; 90 + } 91 + 92 + & + * { 93 + @apply mt-[0px]; 94 + } 95 + } 96 + & h3 { 97 + font-size: 1.33em; 98 + 99 + color: var(--tw-prose-headings); 100 + font-weight: 550; 101 + 102 + & strong { 103 + font-weight: 600; 104 + } 105 + & code { 106 + font-size: 0.88em 107 + } 108 + 109 + & + * { 110 + @apply mt-[0px]; 111 + } 112 + } 113 + & h4 { 114 + color: var(--tw-prose-headings); 115 + font-weight: 500; 116 + 117 + & strong { 118 + font-weight: 600; 119 + } 120 + 121 + & + * { 122 + @apply mt-[0px]; 123 + } 124 + } 125 + & img, picture { 126 + /*@apply my-[1.77em];*/ 127 + } 128 + & picture > img { 129 + @apply my-[0px]; 130 + } 131 + & video { 132 + /*@apply my-[1.77em];*/ 133 + } 134 + & kbd { 135 + font-size: 0.88em; 136 + border-radius: 0.28rem; 137 + @apply py-[0.22em] px-[0.44em] 138 + } 139 + & code { 140 + font-size: 0.88em; 141 + } 142 + & ol { 143 + padding-inline-start: 1.55em; 144 + @apply my-[0.5em]; 145 + } 146 + & ul { 147 + @apply /* my-[1.2em] */ ps-[1.55em]; 148 + } 149 + & li { 150 + @apply my-[0.25em]; 151 + } 152 + & ol > li { 153 + @apply ps-[0.44em]; 154 + } 155 + & ul > li { 156 + @apply ps-[0.44em]; 157 + } 158 + & > ul > li p { 159 + @apply my-[0.88em]; 160 + } 161 + & > ul > li > p:first-child { 162 + @apply mt-[0.25em]; 163 + } 164 + & > ul > li > p:last-child { 165 + @apply mb-[0.25em]; 166 + } 167 + & > ol > li > p:first-child { 168 + @apply mt-[0.25em]; 169 + } 170 + & > ol > li > p:last-child { 171 + @apply mb-[0.25em]; 172 + } 173 + & ul ul, ul ol, ol ul, ol ol { 174 + @apply my-[0.5em]; 175 + } 176 + & dl { 177 + @apply my-[1.33em]; 178 + } 179 + & dt { 180 + @apply mt-[1.33em]; 181 + } 182 + & dd { 183 + @apply mt-[0.66em]; 184 + @apply ps-[1.55em]; 185 + } 186 + & hr { 187 + @apply my-[1em]; 188 + } 189 + & hr + * { 190 + @apply mt-[0px]; 191 + } 192 + & table { 193 + font-size: 0.88em; 194 + line-height: round(24 / 16); 195 + } 196 + & thead th { 197 + @apply px-[0.75em] pb-[0.75em]; 198 + } 199 + & figure { 200 + @apply my-[1.77em]; 201 + 202 + & > * { 203 + @apply my-[0px]; 204 + } 205 + } 206 + & figcaption { 207 + font-size: 0.88em; 208 + line-height: round(24 / 16); 209 + @apply mt-[1em]; 210 + } 211 + & > :first-child { 212 + @apply mt-[0px]; 213 + } 214 + & > :last-child { 215 + @apply mb-[0px]; 216 + } 217 + 218 + /* defaults */ 219 + 220 + /* max-width: 65ch; */ 221 + p {} 222 + & [class~="lead"] { 223 + color: var(--tw-prose-lead); 224 + } 225 + & a { 226 + color: var(--tw-prose-links); 227 + text-decoration: underline; 228 + } 229 + & strong { 230 + color: var(--tw-prose-bold); 231 + font-weight: 600; 232 + } 233 + & a strong { 234 + color: inherit; 235 + } 236 + & blockquote strong { 237 + color: inherit; 238 + } 239 + & thead th strong { 240 + color: inherit; 241 + } 242 + & ol { 243 + list-style-type: decimal; 244 + } 245 + & ol[type="A"] { 246 + list-style-type: upper-alpha; 247 + } 248 + & ol[type="a"] { 249 + list-style-type: lower-alpha; 250 + } 251 + & ol[type="A" s] { 252 + list-style-type: upper-alpha; 253 + } 254 + & ol[type="a" s] { 255 + list-style-type: lower-alpha; 256 + } 257 + & ol[type="-i"] { 258 + list-style-type: upper-roman; 259 + } 260 + & ol[type="i"] { 261 + list-style-type: lower-roman; 262 + } 263 + & ol[type="-i" s] { 264 + list-style-type: upper-roman; 265 + } 266 + & ol[type="i" s] { 267 + list-style-type: lower-roman; 268 + } 269 + & ol[type="1"] { 270 + list-style-type: decimal; 271 + } 272 + & ul { 273 + list-style-type: disc; 274 + } 275 + & ol > li::marker { 276 + font-weight: 400; 277 + color: var(--tw-prose-counters); 278 + } 279 + & ul > li::marker { 280 + color: var(--tw-prose-bullets); 281 + } 282 + & dt { 283 + color: var(--tw-prose-headings); 284 + font-weight: 600; 285 + } 286 + & hr { 287 + border-color: var(--tw-prose-hr); 288 + border-top-width: 1px; 289 + @apply border-t-[0.25em]; 290 + } 291 + & blockquote { 292 + font-weight: 500; 293 + font-style: italic; 294 + color: var(--tw-prose-quotes); 295 + border-inline-start-width: 0.25rem; 296 + border-inline-start-color: var(--tw-prose-quote-borders); 297 + quotes: '"' '"' "'" "'"; 298 + 299 + @apply my-[1.25em] ps-[1em]; 300 + 301 + & + blockquote { 302 + @apply mt-[0px]; 303 + } 304 + 305 + /* & p:first-of-type::before { 306 + content: open-quote; 307 + } 308 + 309 + & p:last-of-type::after { 310 + content: close-quote; 311 + } */ 312 + 313 + & pre { 314 + @apply ps-[0.5em]; 315 + } 316 + } 317 + & img {} 318 + & picture { 319 + display: block; 320 + } 321 + & video {} 322 + & kbd { 323 + font-weight: 500; 324 + font-family: inherit; 325 + color: var(--tw-prose-kbd); 326 + box-shadow: 327 + '0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%)'; 328 + } 329 + & code { 330 + /* background-color: #2b203f; moved to 01.prismjs */ 331 + /* color: #ede9f5; moved to 01.prismjs */ 332 + /* font-weight: 600; */ 333 + @apply px-[0.25em]; 334 + border-radius: 4px; 335 + font-weight: inherit; 336 + font-size: inherit; 337 + @apply font-mono; 338 + line-height: inherit; 339 + 340 + /* border-color: #FEC955; moved to 01.prismjs */ 341 + } 342 + 343 + & pre { 344 + font-size: 0.88em; 345 + line-height: 28/16; 346 + border-radius: 0.33rem; 347 + @apply my-[1em]; 348 + @apply py-[0.24em] px-[0.25em]; 349 + color: var(--tw-prose-pre-code); 350 + /* background-color: var(--tw-prose-pre-bg); */ 351 + background-color: transparent !important; 352 + font-weight: 400; 353 + } 354 + & pre code { 355 + @apply /* border-2 moved to 01.prismjs */ rounded-md; 356 + @apply font-mono; 357 + 358 + padding: 0; 359 + font-weight: inherit; 360 + color: inherit; 361 + font-size: inherit; 362 + line-height: inherit; 363 + display: block; 364 + 365 + color: #ffffff; /* was: c0bbcb */ 366 + @apply p-4; 367 + 368 + overflow-x: visible; 369 + overflow-y: hidden; 370 + 371 + /* jp ascii 372 + font-family: MS Pゴシック,MS PGothic,IPAMonaPGothic,sans-serif; 373 + letter-spacing: 0; 374 + font-size: 16px; 375 + font-style: normal; 376 + font-weight: 400; 377 + line-height: 18px; */ 378 + } 379 + & pre code::before { 380 + content: none; 381 + } 382 + & pre code::after { 383 + content: none; 384 + } 385 + & table { 386 + width: 100%; 387 + table-layout: auto; 388 + margin-top: 2em; 389 + margin-bottom: 2em; 390 + 391 + display: block; 392 + width: max-content; 393 + max-width: 100%; 394 + overflow: auto; 395 + font-variant-numeric: tabular-nums; 396 + } 397 + & thead { 398 + border-bottom-width: 1px; 399 + border-bottom-color: var(--tw-prose-th-borders); 400 + 401 + & tr { 402 + border: 1px solid var(--tw-prose-hr); 403 + } 404 + 405 + & th { 406 + color: var(--tw-prose-headings); 407 + font-weight: 600; 408 + vertical-align: bottom; 409 + 410 + @apply px-[13px] py-[6px]; 411 + border: 1px solid var(--tw-prose-hr); 412 + } 413 + } 414 + & tbody tr { 415 + border-bottom-width: 1px; 416 + border-bottom-color: var(--tw-prose-td-borders); 417 + 418 + border: 1px solid var(--tw-prose-hr); 419 + } 420 + & tbody tr:last-child { 421 + border-bottom-width: 0; 422 + } 423 + & tbody td { 424 + vertical-align: baseline; 425 + 426 + @apply px-[13px] py-[6px]; 427 + border: 1px solid var(--tw-prose-hr); 428 + } 429 + & tfoot { 430 + border-top-width: 1px; 431 + border-top-color: var(--tw-prose-th-borders); 432 + 433 + & td { 434 + vertical-align: top; 435 + } 436 + } 437 + & th, td { 438 + text-align: start; 439 + } 440 + & figure > * {} 441 + & figcaption { 442 + color: var(--tw-prose-captions); 443 + } 444 + 445 + & .footnotes { 446 + font-size: smaller; 447 + } 448 + }
+335
tailwind/01.prismjs.tw.css
··· 1 + /* 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + */ 17 + 18 + /* PrismJS 1.30.0 19 + https://prismjs.com/download#themes=prism&languages=markup+css+clike+javascript+bash+batch+c+cpp+css-extras+diff+http+javastacktrace+json+json5+markdown+powershell+python+rust+yaml&plugins=autolinker+custom-class+show-language+autoloader+command-line+toolbar+copy-to-clipboard+match-braces */ 20 + /** 21 + * prism.js AO-Dark Violet theme 22 + * Based on Ancient One Dark (https://github.com/sigvt/ancient-one-dark) 23 + * Using the prism.js default theme as a base 24 + * @author Lea Verou (base) 25 + * @author uetchy@github (original) 26 + * @author helpimnotdrowning (tailwind-ification, ao-dark port to prism.js) 27 + */ 28 + 29 + @theme { 30 + --color-ao-violet-darker: #19152a; 31 + --color-ao-violet: #2b203f; 32 + --color-ao-violet-lighter: #56417e; 33 + --color-ao-violet-even-lighter: #7c62ad; 34 + 35 + --color-ao-white-darker: #a094b7; 36 + --color-ao-white: #ede9f5; 37 + 38 + --color-ao-gold: #fec955; 39 + } 40 + 41 + :not(pre) > code { 42 + @apply text-ao-white bg-ao-violet mx-[0.3ch]; 43 + @apply text-ao-violet-darker bg-ao-white mx-[0.3ch]; 44 + font-weight: bolder; 45 + 46 + &::selection, & ::selection { 47 + @apply bg-ao-violet-lighter; 48 + } 49 + } 50 + 51 + pre > code { 52 + @apply border-2 text-ao-white border-ao-gold bg-ao-violet; 53 + scrollbar-width: auto; 54 + scrollbar-color: var(--color-ao-violet-even-lighter) var(--color-ao-violet); 55 + } 56 + 57 + code[class*="language-"], 58 + pre[class*="language-"] { 59 + text-align: left; 60 + word-spacing: normal; 61 + line-height: 1.5; 62 + @apply whitespace-pre break-normal wrap-normal; 63 + 64 + tab-size: 4; 65 + 66 + @apply hyphens-none; 67 + } 68 + 69 + pre[class*="language-"], code[class*="language-"] { 70 + &::selection, & ::selection { 71 + @apply bg-ao-violet-lighter; 72 + } 73 + } 74 + 75 + /* Inline code */ 76 + :not(pre) > code[class*="language-"] { 77 + @apply rounded-sm whitespace-normal; 78 + } 79 + 80 + .token { 81 + /* 82 + &.keyword, &.operator { 83 + color: #c7a8ed; 84 + } 85 + 86 + &.builtin, &.class-name &{ 87 + color: #e678e8 88 + } 89 + 90 + &.number { 91 + color: #fc6a9d; 92 + } 93 + 94 + &.string, &.char, &.attr-value { 95 + color: #e6be7d; 96 + } 97 + 98 + &.symbol, &.variable { 99 + color: #c07cff; 100 + } 101 + 102 + &.regex { 103 + color: #c0bbcb; 104 + } 105 + 106 + &.constant { 107 + color: #b573b4; 108 + } 109 + 110 + &.property { 111 + color: #c07cff; 112 + } 113 + 114 + &.punctuation { 115 + color: #6C607A; 116 + } 117 + 118 + &.comment, &.prolog, &.doctype, &.cdata { 119 + color: #73688d; 120 + } 121 + 122 + &.tag { 123 + color: #bba5d4; 124 + } 125 + 126 + &.attr-name { 127 + color: #8c76c0; 128 + } 129 + 130 + &.bold { 131 + font-style: bold; 132 + } 133 + 134 + &.italic { 135 + font-style: italic; 136 + } 137 + 138 + &.selector { 139 + color: #bcaee5; 140 + } 141 + 142 + &.inserted { 143 + color: #96bd65; 144 + } 145 + 146 + &.deleted { 147 + color: #d36666; 148 + } 149 + 150 + &.function, &.boolean, &.url, 151 + &.important, &.namespace, &.entity, 152 + &.atrule 153 + */ 154 + 155 + &.comment 156 + { @apply text-[#73688d]; } 157 + &.string 158 + { @apply text-[#e6be7d]; } 159 + &.function, &.class-name 160 + { @apply text-[#e678e8]; } 161 + &.namespace 162 + { @apply text-[#e678e8] italic; } 163 + &.boolean 164 + { @apply text-[#b573b4]; } 165 + &.variable 166 + { @apply text-[#c07cff]; } 167 + &.keyword, &.operator 168 + { @apply text-[#c7a8ed]; } 169 + &.punctuation 170 + { @apply text-[#c7a8ed]; } 171 + &.directive 172 + { @apply italic; } 173 + &.number 174 + { @apply text-[#fc6a9d]; } 175 + &.tag 176 + { @apply text-[#bba5d4]; } 177 + &.attr-name 178 + { @apply text-ao-white; } 179 + &.attr-value, &.markup-attr-quotes 180 + { @apply text-[#ddb672]; } 181 + } 182 + 183 + /* .token { 184 + &.comment, 185 + &.prolog, 186 + &.doctype, 187 + &.cdata { 188 + color: slategray; 189 + } 190 + 191 + &.punctuation { 192 + color: #999; 193 + } 194 + 195 + &.namespace { 196 + opacity: .7; 197 + } 198 + 199 + &.property, &.tag, &.boolean, 200 + &.number, &.constant, &.symbol, 201 + &.deleted { 202 + color: #905; 203 + } 204 + 205 + &.selector, &.attr-name, &.string, 206 + &.char, &.builtin, &.inserted { 207 + color: #690; 208 + } 209 + 210 + &.operator, &.entity, &.url, 211 + .language-css &.string, 212 + .style &.string { 213 + color: #9a6e3a; 214 + background: hsla(0, 0%, 100%, .5); 215 + } 216 + 217 + &.atrule, &.attr-value, &.keyword { 218 + color: #07a; 219 + } 220 + 221 + &.function, &.class-name { 222 + color: #DD4A68; 223 + } 224 + 225 + &.regex, &.important, &.variable { 226 + color: #e90; 227 + } 228 + 229 + &.important, &.bold { 230 + font-weight: bold; 231 + } 232 + 233 + &.italic { 234 + font-style: italic; 235 + } 236 + 237 + &.entity { 238 + cursor: help; 239 + } 240 + 241 + & a { 242 + color: inherit; 243 + } 244 + } */ 245 + 246 + div.code-toolbar { 247 + position: relative; 248 + 249 + & > .toolbar { 250 + transition: opacity 0.3s ease-in-out; 251 + 252 + @apply absolute right-4 top-[0.4em] z-10; 253 + @apply gap-[1ch] flex opacity-0; 254 + } 255 + 256 + &:hover > .toolbar { 257 + @apply opacity-100; 258 + } 259 + 260 + & > .toolbar > .toolbar-item { 261 + @apply inline-block cursor-default; 262 + 263 + & > button, & > a { 264 + @apply cursor-pointer; 265 + } 266 + } 267 + 268 + & > .toolbar > .toolbar-item { 269 + font-size: .8em; 270 + padding: 0 .5em; 271 + @apply rounded-md; 272 + 273 + @apply bg-ao-violet text-ao-white; 274 + 275 + &:has(> button, > a) { 276 + @apply border-2 border-ao-gold; 277 + } 278 + 279 + & > span { 280 + @apply align-sub; 281 + } 282 + } 283 + 284 + & > .toolbar > .toolbar-item { 285 + &:hover, &:focus { 286 + @apply bg-ao-violet-lighter; 287 + } 288 + } 289 + } 290 + 291 + /* *** *** *** */ 292 + 293 + .token.treeview-part { 294 + & .entry-line { 295 + @apply relative indent-[-99em] inline-block align-top w-[1.2em]; 296 + } 297 + 298 + & .entry-name { 299 + @apply relative inline-block align-top; 300 + @apply ml-[0ch]; 301 + } 302 + 303 + & .entry-line + .entry-name { 304 + @apply ml-[0.5ch]; 305 + } 306 + 307 + & .entry-name.dotfile { 308 + @apply opacity-60; 309 + } 310 + 311 + & .entry-name.dir:after { 312 + content: "/"; 313 + 314 + @apply text-ao-white-darker; 315 + } 316 + 317 + & .entry-line:before, 318 + & .line-h:after { 319 + content: ""; 320 + @apply absolute top-0 left-1/2 w-1/2 h-full; 321 + } 322 + 323 + & .line-h:before, 324 + & .line-v:before { 325 + @apply border-l border-ao-white-darker; 326 + } 327 + 328 + & .line-v-last:before { 329 + @apply h-1/2 border-l border-b border-ao-white-darker; 330 + } 331 + 332 + & .line-h:after { 333 + @apply h-1/2 border-b border-ao-white-darker; 334 + } 335 + }
+139
tailwind/style.tw.css
··· 1 + /* 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + */ 17 + 18 + @import "tailwindcss" source(none); 19 + @import "./00.typography.tw.css"; 20 + @import "./01.prismjs.tw.css"; 21 + @import "../public/font/IBMPlexMono-Regular/IBMPlexMono-Regular.css"; 22 + @import "../public/font/IBMPlexSansJP-Regular/IBMPlexSansJP-Regular.css"; 23 + @import "../public/font/IBMPlexSansJP-Bold/IBMPlexSansJP-Bold.css"; 24 + 25 + @source "../**/*.{ps1,html,css,md}"; 26 + @source not "../public"; 27 + 28 + @theme { 29 + --font-mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; 30 + --font-sans: 'IBM Plex Sans JP', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; 31 + } 32 + 33 + html { 34 + @apply bg-fixed bg-linear-to-b; 35 + @apply from-green-100 to-green-300; 36 + @apply font-sans leading-[1.65]; 37 + } 38 + 39 + hr { 40 + @apply my-4; 41 + @apply text-stone-400; 42 + } 43 + 44 + a { 45 + @apply text-blue-600 underline; 46 + } 47 + 48 + a:visited { 49 + @apply text-blue-900; 50 + } 51 + 52 + .n-box { 53 + @apply w-[min(80%,_var(--container-6xl))]; 54 + @apply border border-black border-solid; 55 + @apply flex flex-col mt-8 mb-20 p-4 rounded-sm drop-shadow-xl; 56 + @apply bg-[#ffffff]; 57 + @apply mx-auto; 58 + 59 + /* subsequent `n-box`es have their bottom margin shrunk */ 60 + &:has(+ .n-box) { 61 + @apply mb-8; 62 + } 63 + } 64 + 65 + .clear-n-box { 66 + @apply border-transparent; 67 + @apply bg-transparent; 68 + @apply drop-shadow-none; 69 + } 70 + 71 + .clickable { 72 + @apply bg-gray-100; 73 + @apply pl-[0.5ch] pr-[0.5ch]; 74 + 75 + @apply border border-black border-solid; 76 + @apply rounded-sm; 77 + 78 + text-decoration: none; 79 + 80 + &:hover { 81 + @apply bg-gray-200; 82 + } 83 + 84 + &:disabled, &[aria-disabled="True"] { 85 + @apply text-stone-400 border-stone-400 pointer-events-none; 86 + } 87 + } 88 + 89 + .pfp { 90 + @apply drop-shadow-xl/25; 91 + } 92 + 93 + #splash, .you-know-you-want-to { 94 + @apply whitespace-nowrap w-min px-[2ch] cursor-pointer; 95 + 96 + font-smooth: never; 97 + 98 + animation-duration: .25s; 99 + animation-name: splashscale; 100 + animation-timing-function: transform 0.6s cubic-bezier(0.68, -0.6, 0.32, 1.6); 101 + animation-direction: alternate; 102 + animation-iteration-count: infinite; 103 + 104 + transition-property: background-color; 105 + transition-duration: 0.3s; 106 + transition-timing-function: ease-in-out; 107 + @apply rounded-md; 108 + 109 + &:hover { 110 + @apply bg-green-400/50; 111 + } 112 + } 113 + 114 + @media (prefers-reduced-motion) { 115 + #splash, .you-know-you-want-to { 116 + transform: rotateZ(-1.5deg); 117 + font-smooth: auto; 118 + @apply animate-none; 119 + } 120 + } 121 + 122 + .post-component { 123 + @apply m-2; 124 + h1 a { 125 + font-size: 2.33em; 126 + font-weight: 800; 127 + text-decoration: none !important; 128 + } 129 + } 130 + 131 + @keyframes splashscale { 132 + 0% { 133 + transform: scale(0.99) rotateZ(-1deg); 134 + } 135 + 136 + 100% { 137 + transform: scale(1.02) rotateZ(-1deg); 138 + } 139 + }
+62
views/index.ps1
··· 1 + <# 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + #> 17 + 18 + function _link { 19 + param ($Title, $Href) 20 + 21 + return li { 22 + a -Href $Href { $Title } 23 + } 24 + } 25 + 26 + <# ### ### ### #> 27 + 28 + doctype 29 + 30 + html -Lang en { 31 + head { 32 + link -Rel stylesheet -Type text/css -Href /style.css 33 + _scripts 34 + 35 + meta -Name darkreader-lock 36 + } 37 + 38 + body { 39 + _header 40 + 41 + # tailwind wont pick up the class if I leave it as ".no_underline!", 42 + # since the preceding "." in the class directive prevents it from 43 + # recognizing the class name 44 + # https://github.com/tailwindlabs/tailwindcss/pull/18967#issuecomment-3393700620 45 + $no_underline = 'no-underline!' 46 + $tb = 'target="_blank"' 47 + # can you tell I like markdown? 48 + div -Class "n-box tx p-[1rem]!" { 49 + @" 50 + i would have a portfolio thing here, but for now you can... 51 + 52 + * read my [posts](/sayings)! 53 + * click the <div class="you-know-you-want-to inline-block p-[0.5ch]!">splash</div> ↑↑↑ 54 + * consider consulting my archives: [files.helpimnotdrowning.net](https://files.helpimnotdrowning.net){$tb} 55 + * (currently using Caddy's fileserver but will soon use my own!) 56 + * collect my pages[:](/garbage/my_pages.png){.$no_underline $tb} 57 + * [My Forgejo instance](https://git.helpimnotdrowning.net/explore/repos){$tb} 58 + * [Github](https://github.com/helpimnotdrowning){$tb} 59 + "@ | ConvertFrom-Markdown | % html 60 + } 61 + } 62 + }
+20
views/random_splash.ps1
··· 1 + <# 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + #> 17 + 18 + . ./functions.ps1 19 + 20 + return _get_splash $WebEvent.Query.Index
+72
views/sayings.ps1
··· 1 + <# 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + #> 17 + 18 + function _post_component { 19 + param ($PostData) 20 + 21 + div -Class 'post-component' { 22 + h1 -Class 'post-title' { 23 + a -Href $PostData.Path -InnerHTML $PostData.Title 24 + } 25 + p -Class 'flex gap-2' { 26 + span -Class 'text-current/50' {$PostData.Created} 27 + $PostData.Description 28 + } 29 + } 30 + } 31 + 32 + <# ### ### ### #> 33 + 34 + doctype 35 + 36 + html -Lang en { 37 + head { 38 + link -Rel stylesheet -Type text/css -Href /style.css 39 + _scripts 40 + 41 + script -Src /prism.js 42 + script @" 43 + Prism.plugins.autoloader.languages_path = '/prism/'; 44 + Prism.plugins.autoloader.use_minified = false; 45 + "@ 46 + 47 + title Posts 48 + meta -Name darkreader-lock 49 + meta -Name description -Content "" 50 + meta -Name viewport -Content "width=device-width, initial-scale=1" 51 + } 52 + 53 + body { 54 + _header 55 + 56 + div -Class 'n-box flex flex-col gap-2' { 57 + $Posts = gci $Data.SayingsRoot *.md 58 + 59 + for ($i=0; $i -lt $Posts.Count; $i++) { 60 + try { 61 + _post_component (_parse_saying_header $Posts[$i]) 62 + if ($i+1 -ne $Posts.Count) { 63 + # add divider after all except last post 64 + hr 65 + } 66 + } catch { 67 + _warn $_ 68 + } 69 + } 70 + } 71 + } 72 + }
+51
views/sayings_post.ps1
··· 1 + <# 2 + This file is part of NKK. 3 + 4 + NKK is free software: you can redistribute it and/or modify it under the 5 + terms of the GNU Affero General Public License as published by the Free 6 + Software Foundation, either version 3 of the License, or (at your option) 7 + any later version. 8 + 9 + NKK is distributed in the hope that it will be useful, but WITHOUT ANY 10 + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for 12 + more details. 13 + 14 + You should have received a copy of the GNU Affero General Public License 15 + along with NKK. If not, see <http://www.gnu.org/licenses/>. 16 + #> 17 + 18 + # ASSUMING THE PATH HAS BEEN PRECHECKED... 19 + 20 + $Path = $Data.Path 21 + $PostData = _parse_saying_header ($Path) 22 + 23 + <# ### ### ### #> 24 + 25 + doctype 26 + 27 + html -Lang en { 28 + head { 29 + link -Rel stylesheet -Type text/css -Href /style.css 30 + _scripts 31 + 32 + script -Src /prism.js 33 + script @" 34 + Prism.plugins.autoloader.languages_path = '/prism/'; 35 + Prism.plugins.autoloader.use_minified = false; 36 + "@ 37 + 38 + title $PostData.Title 39 + meta -Name darkreader-lock 40 + meta -Name description -Content "" 41 + meta -Name viewport -Content "width=device-width, initial-scale=1" 42 + } 43 + 44 + body { 45 + _header 46 + 47 + div -Class "n-box xmin-h-[10em]! tx" -HxDisable { 48 + ConvertFrom-Markdown -InputObject (Get-Content $Path | Select-Object -skip 1 | Join-String -Sep "`n") | % Html 49 + } 50 + } 51 + }