gubes mirror. how does this work
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add gay sex

leah 7abec6e7 a21c815a

+1629 -1068
+4
.nova/Configuration.json
··· 1 + { 2 + "workspace.color" : 2, 3 + "workspace.name" : "tubes" 4 + }
+581 -293
LICENCE
··· 1 - Mozilla Public License Version 2.0 2 - ================================== 1 + GNU AFFERO GENERAL PUBLIC LICENSE 2 + Version 3, 19 November 2007 3 3 4 - 1. Definitions 5 - -------------- 4 + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> 5 + Everyone is permitted to copy and distribute verbatim copies 6 + of this license document, but changing it is not allowed. 6 7 7 - 1.1. "Contributor" 8 - means each individual or legal entity that creates, contributes to 9 - the creation of, or owns Covered Software. 8 + Preamble 10 9 11 - 1.2. "Contributor Version" 12 - means the combination of the Contributions of others (if any) used 13 - by a Contributor and that particular Contributor's Contribution. 10 + The GNU Affero General Public License is a free, copyleft license for 11 + software and other kinds of works, specifically designed to ensure 12 + cooperation with the community in the case of network server software. 14 13 15 - 1.3. "Contribution" 16 - means Covered Software of a particular Contributor. 14 + The licenses for most software and other practical works are designed 15 + to take away your freedom to share and change the works. By contrast, 16 + our General Public Licenses are intended to guarantee your freedom to 17 + share and change all versions of a program--to make sure it remains free 18 + software for all its users. 17 19 18 - 1.4. "Covered Software" 19 - means Source Code Form to which the initial Contributor has attached 20 - the notice in Exhibit A, the Executable Form of such Source Code 21 - Form, and Modifications of such Source Code Form, in each case 22 - including portions thereof. 20 + When we speak of free software, we are referring to freedom, not 21 + price. Our General Public Licenses are designed to make sure that you 22 + have the freedom to distribute copies of free software (and charge for 23 + them if you wish), that you receive source code or can get it if you 24 + want it, that you can change the software or use pieces of it in new 25 + free programs, and that you know you can do these things. 23 26 24 - 1.5. "Incompatible With Secondary Licenses" 25 - means 27 + Developers that use our General Public Licenses protect your rights 28 + with two steps: (1) assert copyright on the software, and (2) offer 29 + you this License which gives you legal permission to copy, distribute 30 + and/or modify the software. 26 31 27 - (a) that the initial Contributor has attached the notice described 28 - in Exhibit B to the Covered Software; or 32 + A secondary benefit of defending all users' freedom is that 33 + improvements made in alternate versions of the program, if they 34 + receive widespread use, become available for other developers to 35 + incorporate. Many developers of free software are heartened and 36 + encouraged by the resulting cooperation. However, in the case of 37 + software used on network servers, this result may fail to come about. 38 + The GNU General Public License permits making a modified version and 39 + letting the public access it on a server without ever releasing its 40 + source code to the public. 29 41 30 - (b) that the Covered Software was made available under the terms of 31 - version 1.1 or earlier of the License, but not also under the 32 - terms of a Secondary License. 42 + The GNU Affero General Public License is designed specifically to 43 + ensure that, in such cases, the modified source code becomes available 44 + to the community. It requires the operator of a network server to 45 + provide the source code of the modified version running there to the 46 + users of that server. Therefore, public use of a modified version, on 47 + a publicly accessible server, gives the public access to the source 48 + code of the modified version. 33 49 34 - 1.6. "Executable Form" 35 - means any form of the work other than Source Code Form. 50 + An older license, called the Affero General Public License and 51 + published by Affero, was designed to accomplish similar goals. This is 52 + a different license, not a version of the Affero GPL, but Affero has 53 + released a new version of the Affero GPL which permits relicensing under 54 + this license. 36 55 37 - 1.7. "Larger Work" 38 - means a work that combines Covered Software with other material, in 39 - a separate file or files, that is not Covered Software. 56 + The precise terms and conditions for copying, distribution and 57 + modification follow. 40 58 41 - 1.8. "License" 42 - means this document. 59 + TERMS AND CONDITIONS 43 60 44 - 1.9. "Licensable" 45 - means having the right to grant, to the maximum extent possible, 46 - whether at the time of the initial grant or subsequently, any and 47 - all of the rights conveyed by this License. 61 + 0. Definitions. 48 62 49 - 1.10. "Modifications" 50 - means any of the following: 63 + "This License" refers to version 3 of the GNU Affero General Public License. 51 64 52 - (a) any file in Source Code Form that results from an addition to, 53 - deletion from, or modification of the contents of Covered 54 - Software; or 65 + "Copyright" also means copyright-like laws that apply to other kinds of 66 + works, such as semiconductor masks. 55 67 56 - (b) any new file in Source Code Form that contains any Covered 57 - Software. 68 + "The Program" refers to any copyrightable work licensed under this 69 + License. Each licensee is addressed as "you". "Licensees" and 70 + "recipients" may be individuals or organizations. 58 71 59 - 1.11. "Patent Claims" of a Contributor 60 - means any patent claim(s), including without limitation, method, 61 - process, and apparatus claims, in any patent Licensable by such 62 - Contributor that would be infringed, but for the grant of the 63 - License, by the making, using, selling, offering for sale, having 64 - made, import, or transfer of either its Contributions or its 65 - Contributor Version. 72 + To "modify" a work means to copy from or adapt all or part of the work 73 + in a fashion requiring copyright permission, other than the making of an 74 + exact copy. The resulting work is called a "modified version" of the 75 + earlier work or a work "based on" the earlier work. 66 76 67 - 1.12. "Secondary License" 68 - means either the GNU General Public License, Version 2.0, the GNU 69 - Lesser General Public License, Version 2.1, the GNU Affero General 70 - Public License, Version 3.0, or any later versions of those 71 - licenses. 77 + A "covered work" means either the unmodified Program or a work based 78 + on the Program. 72 79 73 - 1.13. "Source Code Form" 74 - means the form of the work preferred for making modifications. 80 + To "propagate" a work means to do anything with it that, without 81 + permission, would make you directly or secondarily liable for 82 + infringement under applicable copyright law, except executing it on a 83 + computer or modifying a private copy. Propagation includes copying, 84 + distribution (with or without modification), making available to the 85 + public, and in some countries other activities as well. 75 86 76 - 1.14. "You" (or "Your") 77 - means an individual or a legal entity exercising rights under this 78 - License. For legal entities, "You" includes any entity that 79 - controls, is controlled by, or is under common control with You. For 80 - purposes of this definition, "control" means (a) the power, direct 81 - or indirect, to cause the direction or management of such entity, 82 - whether by contract or otherwise, or (b) ownership of more than 83 - fifty percent (50%) of the outstanding shares or beneficial 84 - ownership of such entity. 87 + To "convey" a work means any kind of propagation that enables other 88 + parties to make or receive copies. Mere interaction with a user through 89 + a computer network, with no transfer of a copy, is not conveying. 85 90 86 - 2. License Grants and Conditions 87 - -------------------------------- 91 + An interactive user interface displays "Appropriate Legal Notices" 92 + to the extent that it includes a convenient and prominently visible 93 + feature that (1) displays an appropriate copyright notice, and (2) 94 + tells the user that there is no warranty for the work (except to the 95 + extent that warranties are provided), that licensees may convey the 96 + work under this License, and how to view a copy of this License. If 97 + the interface presents a list of user commands or options, such as a 98 + menu, a prominent item in the list meets this criterion. 88 99 89 - 2.1. Grants 100 + 1. Source Code. 90 101 91 - Each Contributor hereby grants You a world-wide, royalty-free, 92 - non-exclusive license: 102 + The "source code" for a work means the preferred form of the work 103 + for making modifications to it. "Object code" means any non-source 104 + form of a work. 93 105 94 - (a) under intellectual property rights (other than patent or trademark) 95 - Licensable by such Contributor to use, reproduce, make available, 96 - modify, display, perform, distribute, and otherwise exploit its 97 - Contributions, either on an unmodified basis, with Modifications, or 98 - as part of a Larger Work; and 106 + A "Standard Interface" means an interface that either is an official 107 + standard defined by a recognized standards body, or, in the case of 108 + interfaces specified for a particular programming language, one that 109 + is widely used among developers working in that language. 99 110 100 - (b) under Patent Claims of such Contributor to make, use, sell, offer 101 - for sale, have made, import, and otherwise transfer either its 102 - Contributions or its Contributor Version. 111 + The "System Libraries" of an executable work include anything, other 112 + than the work as a whole, that (a) is included in the normal form of 113 + packaging a Major Component, but which is not part of that Major 114 + Component, and (b) serves only to enable use of the work with that 115 + Major Component, or to implement a Standard Interface for which an 116 + implementation is available to the public in source code form. A 117 + "Major Component", in this context, means a major essential component 118 + (kernel, window system, and so on) of the specific operating system 119 + (if any) on which the executable work runs, or a compiler used to 120 + produce the work, or an object code interpreter used to run it. 103 121 104 - 2.2. Effective Date 122 + The "Corresponding Source" for a work in object code form means all 123 + the source code needed to generate, install, and (for an executable 124 + work) run the object code and to modify the work, including scripts to 125 + control those activities. However, it does not include the work's 126 + System Libraries, or general-purpose tools or generally available free 127 + programs which are used unmodified in performing those activities but 128 + which are not part of the work. For example, Corresponding Source 129 + includes interface definition files associated with source files for 130 + the work, and the source code for shared libraries and dynamically 131 + linked subprograms that the work is specifically designed to require, 132 + such as by intimate data communication or control flow between those 133 + subprograms and other parts of the work. 105 134 106 - The licenses granted in Section 2.1 with respect to any Contribution 107 - become effective for each Contribution on the date the Contributor first 108 - distributes such Contribution. 135 + The Corresponding Source need not include anything that users 136 + can regenerate automatically from other parts of the Corresponding 137 + Source. 109 138 110 - 2.3. Limitations on Grant Scope 139 + The Corresponding Source for a work in source code form is that 140 + same work. 111 141 112 - The licenses granted in this Section 2 are the only rights granted under 113 - this License. No additional rights or licenses will be implied from the 114 - distribution or licensing of Covered Software under this License. 115 - Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 - Contributor: 142 + 2. Basic Permissions. 117 143 118 - (a) for any code that a Contributor has removed from Covered Software; 119 - or 144 + All rights granted under this License are granted for the term of 145 + copyright on the Program, and are irrevocable provided the stated 146 + conditions are met. This License explicitly affirms your unlimited 147 + permission to run the unmodified Program. The output from running a 148 + covered work is covered by this License only if the output, given its 149 + content, constitutes a covered work. This License acknowledges your 150 + rights of fair use or other equivalent, as provided by copyright law. 120 151 121 - (b) for infringements caused by: (i) Your and any other third party's 122 - modifications of Covered Software, or (ii) the combination of its 123 - Contributions with other software (except as part of its Contributor 124 - Version); or 152 + You may make, run and propagate covered works that you do not 153 + convey, without conditions so long as your license otherwise remains 154 + in force. You may convey covered works to others for the sole purpose 155 + of having them make modifications exclusively for you, or provide you 156 + with facilities for running those works, provided that you comply with 157 + the terms of this License in conveying all material for which you do 158 + not control copyright. Those thus making or running the covered works 159 + for you must do so exclusively on your behalf, under your direction 160 + and control, on terms that prohibit them from making any copies of 161 + your copyrighted material outside their relationship with you. 125 162 126 - (c) under Patent Claims infringed by Covered Software in the absence of 127 - its Contributions. 163 + Conveying under any other circumstances is permitted solely under 164 + the conditions stated below. Sublicensing is not allowed; section 10 165 + makes it unnecessary. 128 166 129 - This License does not grant any rights in the trademarks, service marks, 130 - or logos of any Contributor (except as may be necessary to comply with 131 - the notice requirements in Section 3.4). 167 + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 132 168 133 - 2.4. Subsequent Licenses 169 + No covered work shall be deemed part of an effective technological 170 + measure under any applicable law fulfilling obligations under article 171 + 11 of the WIPO copyright treaty adopted on 20 December 1996, or 172 + similar laws prohibiting or restricting circumvention of such 173 + measures. 134 174 135 - No Contributor makes additional grants as a result of Your choice to 136 - distribute the Covered Software under a subsequent version of this 137 - License (see Section 10.2) or under the terms of a Secondary License (if 138 - permitted under the terms of Section 3.3). 175 + When you convey a covered work, you waive any legal power to forbid 176 + circumvention of technological measures to the extent such circumvention 177 + is effected by exercising rights under this License with respect to 178 + the covered work, and you disclaim any intention to limit operation or 179 + modification of the work as a means of enforcing, against the work's 180 + users, your or third parties' legal rights to forbid circumvention of 181 + technological measures. 139 182 140 - 2.5. Representation 183 + 4. Conveying Verbatim Copies. 141 184 142 - Each Contributor represents that the Contributor believes its 143 - Contributions are its original creation(s) or it has sufficient rights 144 - to grant the rights to its Contributions conveyed by this License. 185 + You may convey verbatim copies of the Program's source code as you 186 + receive it, in any medium, provided that you conspicuously and 187 + appropriately publish on each copy an appropriate copyright notice; 188 + keep intact all notices stating that this License and any 189 + non-permissive terms added in accord with section 7 apply to the code; 190 + keep intact all notices of the absence of any warranty; and give all 191 + recipients a copy of this License along with the Program. 145 192 146 - 2.6. Fair Use 193 + You may charge any price or no price for each copy that you convey, 194 + and you may offer support or warranty protection for a fee. 147 195 148 - This License is not intended to limit any rights You have under 149 - applicable copyright doctrines of fair use, fair dealing, or other 150 - equivalents. 196 + 5. Conveying Modified Source Versions. 151 197 152 - 2.7. Conditions 198 + You may convey a work based on the Program, or the modifications to 199 + produce it from the Program, in the form of source code under the 200 + terms of section 4, provided that you also meet all of these conditions: 153 201 154 - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 - in Section 2.1. 202 + a) The work must carry prominent notices stating that you modified 203 + it, and giving a relevant date. 156 204 157 - 3. Responsibilities 158 - ------------------- 205 + b) The work must carry prominent notices stating that it is 206 + released under this License and any conditions added under section 207 + 7. This requirement modifies the requirement in section 4 to 208 + "keep intact all notices". 159 209 160 - 3.1. Distribution of Source Form 210 + c) You must license the entire work, as a whole, under this 211 + License to anyone who comes into possession of a copy. This 212 + License will therefore apply, along with any applicable section 7 213 + additional terms, to the whole of the work, and all its parts, 214 + regardless of how they are packaged. This License gives no 215 + permission to license the work in any other way, but it does not 216 + invalidate such permission if you have separately received it. 161 217 162 - All distribution of Covered Software in Source Code Form, including any 163 - Modifications that You create or to which You contribute, must be under 164 - the terms of this License. You must inform recipients that the Source 165 - Code Form of the Covered Software is governed by the terms of this 166 - License, and how they can obtain a copy of this License. You may not 167 - attempt to alter or restrict the recipients' rights in the Source Code 168 - Form. 218 + d) If the work has interactive user interfaces, each must display 219 + Appropriate Legal Notices; however, if the Program has interactive 220 + interfaces that do not display Appropriate Legal Notices, your 221 + work need not make them do so. 169 222 170 - 3.2. Distribution of Executable Form 223 + A compilation of a covered work with other separate and independent 224 + works, which are not by their nature extensions of the covered work, 225 + and which are not combined with it such as to form a larger program, 226 + in or on a volume of a storage or distribution medium, is called an 227 + "aggregate" if the compilation and its resulting copyright are not 228 + used to limit the access or legal rights of the compilation's users 229 + beyond what the individual works permit. Inclusion of a covered work 230 + in an aggregate does not cause this License to apply to the other 231 + parts of the aggregate. 171 232 172 - If You distribute Covered Software in Executable Form then: 233 + 6. Conveying Non-Source Forms. 173 234 174 - (a) such Covered Software must also be made available in Source Code 175 - Form, as described in Section 3.1, and You must inform recipients of 176 - the Executable Form how they can obtain a copy of such Source Code 177 - Form by reasonable means in a timely manner, at a charge no more 178 - than the cost of distribution to the recipient; and 235 + You may convey a covered work in object code form under the terms 236 + of sections 4 and 5, provided that you also convey the 237 + machine-readable Corresponding Source under the terms of this License, 238 + in one of these ways: 179 239 180 - (b) You may distribute such Executable Form under the terms of this 181 - License, or sublicense it under different terms, provided that the 182 - license for the Executable Form does not attempt to limit or alter 183 - the recipients' rights in the Source Code Form under this License. 240 + a) Convey the object code in, or embodied in, a physical product 241 + (including a physical distribution medium), accompanied by the 242 + Corresponding Source fixed on a durable physical medium 243 + customarily used for software interchange. 184 244 185 - 3.3. Distribution of a Larger Work 245 + b) Convey the object code in, or embodied in, a physical product 246 + (including a physical distribution medium), accompanied by a 247 + written offer, valid for at least three years and valid for as 248 + long as you offer spare parts or customer support for that product 249 + model, to give anyone who possesses the object code either (1) a 250 + copy of the Corresponding Source for all the software in the 251 + product that is covered by this License, on a durable physical 252 + medium customarily used for software interchange, for a price no 253 + more than your reasonable cost of physically performing this 254 + conveying of source, or (2) access to copy the 255 + Corresponding Source from a network server at no charge. 186 256 187 - You may create and distribute a Larger Work under terms of Your choice, 188 - provided that You also comply with the requirements of this License for 189 - the Covered Software. If the Larger Work is a combination of Covered 190 - Software with a work governed by one or more Secondary Licenses, and the 191 - Covered Software is not Incompatible With Secondary Licenses, this 192 - License permits You to additionally distribute such Covered Software 193 - under the terms of such Secondary License(s), so that the recipient of 194 - the Larger Work may, at their option, further distribute the Covered 195 - Software under the terms of either this License or such Secondary 196 - License(s). 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. 197 262 198 - 3.4. Notices 263 + d) Convey the object code by offering access from a designated 264 + place (gratis or for a charge), and offer equivalent access to the 265 + Corresponding Source in the same way through the same place at no 266 + further charge. You need not require recipients to copy the 267 + Corresponding Source along with the object code. If the place to 268 + copy the object code is a network server, the Corresponding Source 269 + may be on a different server (operated by you or a third party) 270 + that supports equivalent copying facilities, provided you maintain 271 + clear directions next to the object code saying where to find the 272 + Corresponding Source. Regardless of what server hosts the 273 + Corresponding Source, you remain obligated to ensure that it is 274 + available for as long as needed to satisfy these requirements. 199 275 200 - You may not remove or alter the substance of any license notices 201 - (including copyright notices, patent notices, disclaimers of warranty, 202 - or limitations of liability) contained within the Source Code Form of 203 - the Covered Software, except that You may alter any license notices to 204 - the extent required to remedy known factual inaccuracies. 276 + e) Convey the object code using peer-to-peer transmission, provided 277 + you inform other peers where the object code and Corresponding 278 + Source of the work are being offered to the general public at no 279 + charge under subsection 6d. 205 280 206 - 3.5. Application of Additional Terms 281 + A separable portion of the object code, whose source code is excluded 282 + from the Corresponding Source as a System Library, need not be 283 + included in conveying the object code work. 207 284 208 - You may choose to offer, and to charge a fee for, warranty, support, 209 - indemnity or liability obligations to one or more recipients of Covered 210 - Software. However, You may do so only on Your own behalf, and not on 211 - behalf of any Contributor. You must make it absolutely clear that any 212 - such warranty, support, indemnity, or liability obligation is offered by 213 - You alone, and You hereby agree to indemnify every Contributor for any 214 - liability incurred by such Contributor as a result of warranty, support, 215 - indemnity or liability terms You offer. You may include additional 216 - disclaimers of warranty and limitations of liability specific to any 217 - jurisdiction. 285 + A "User Product" is either (1) a "consumer product", which means any 286 + tangible personal property which is normally used for personal, family, 287 + or household purposes, or (2) anything designed or sold for incorporation 288 + into a dwelling. In determining whether a product is a consumer product, 289 + doubtful cases shall be resolved in favor of coverage. For a particular 290 + product received by a particular user, "normally used" refers to a 291 + typical or common use of that class of product, regardless of the status 292 + of the particular user or of the way in which the particular user 293 + actually uses, or expects or is expected to use, the product. A product 294 + is a consumer product regardless of whether the product has substantial 295 + commercial, industrial or non-consumer uses, unless such uses represent 296 + the only significant mode of use of the product. 218 297 219 - 4. Inability to Comply Due to Statute or Regulation 220 - --------------------------------------------------- 298 + "Installation Information" for a User Product means any methods, 299 + procedures, authorization keys, or other information required to install 300 + and execute modified versions of a covered work in that User Product from 301 + a modified version of its Corresponding Source. The information must 302 + suffice to ensure that the continued functioning of the modified object 303 + code is in no case prevented or interfered with solely because 304 + modification has been made. 221 305 222 - If it is impossible for You to comply with any of the terms of this 223 - License with respect to some or all of the Covered Software due to 224 - statute, judicial order, or regulation then You must: (a) comply with 225 - the terms of this License to the maximum extent possible; and (b) 226 - describe the limitations and the code they affect. Such description must 227 - be placed in a text file included with all distributions of the Covered 228 - Software under this License. Except to the extent prohibited by statute 229 - or regulation, such description must be sufficiently detailed for a 230 - recipient of ordinary skill to be able to understand it. 306 + If you convey an object code work under this section in, or with, or 307 + specifically for use in, a User Product, and the conveying occurs as 308 + part of a transaction in which the right of possession and use of the 309 + User Product is transferred to the recipient in perpetuity or for a 310 + fixed term (regardless of how the transaction is characterized), the 311 + Corresponding Source conveyed under this section must be accompanied 312 + by the Installation Information. But this requirement does not apply 313 + if neither you nor any third party retains the ability to install 314 + modified object code on the User Product (for example, the work has 315 + been installed in ROM). 231 316 232 - 5. Termination 233 - -------------- 317 + The requirement to provide Installation Information does not include a 318 + requirement to continue to provide support service, warranty, or updates 319 + for a work that has been modified or installed by the recipient, or for 320 + the User Product in which it has been modified or installed. Access to a 321 + network may be denied when the modification itself materially and 322 + adversely affects the operation of the network or violates the rules and 323 + protocols for communication across the network. 234 324 235 - 5.1. The rights granted under this License will terminate automatically 236 - if You fail to comply with any of its terms. However, if You become 237 - compliant, then the rights granted under this License from a particular 238 - Contributor are reinstated (a) provisionally, unless and until such 239 - Contributor explicitly and finally terminates Your grants, and (b) on an 240 - ongoing basis, if such Contributor fails to notify You of the 241 - non-compliance by some reasonable means prior to 60 days after You have 242 - come back into compliance. Moreover, Your grants from a particular 243 - Contributor are reinstated on an ongoing basis if such Contributor 244 - notifies You of the non-compliance by some reasonable means, this is the 245 - first time You have received notice of non-compliance with this License 246 - from such Contributor, and You become compliant prior to 30 days after 247 - Your receipt of the notice. 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 of 351 + 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 + 356 + b) Requiring preservation of specified reasonable legal notices or 357 + author attributions in that material or in the Appropriate Legal 358 + Notices displayed by works containing it; or 359 + 360 + c) Prohibiting misrepresentation of the origin of that material, or 361 + requiring that modified versions of such material be marked in 362 + reasonable ways as different from the original version; or 363 + 364 + d) Limiting the use for publicity purposes of names of licensors or 365 + authors of the material; or 366 + 367 + e) Declining to grant rights under trademark law for use of some 368 + trade names, trademarks, or service marks; or 369 + 370 + f) Requiring indemnification of licensors and authors of that 371 + material by anyone who conveys the material (or modified versions of 372 + it) with contractual assumptions of liability to the recipient, for 373 + any liability that these contractual assumptions directly impose on 374 + those licensors and authors. 375 + 376 + All other non-permissive additional terms are considered "further 377 + restrictions" within the meaning of section 10. If the Program as you 378 + received it, or any part of it, contains a notice stating that it is 379 + governed by this License along with a term that is a further 380 + restriction, you may remove that term. If a license document contains 381 + a further restriction but permits relicensing or conveying under this 382 + License, you may add to a covered work material governed by the terms 383 + of that license document, provided that the further restriction does 384 + not survive such relicensing or conveying. 385 + 386 + If you add terms to a covered work in accord with this section, you 387 + must place, in the relevant source files, a statement of the 388 + additional terms that apply to those files, or a notice indicating 389 + where to find the applicable terms. 390 + 391 + Additional terms, permissive or non-permissive, may be stated in the 392 + form of a separately written license, or stated as exceptions; 393 + the above requirements apply either way. 394 + 395 + 8. Termination. 396 + 397 + You may not propagate or modify a covered work except as expressly 398 + provided under this License. Any attempt otherwise to propagate or 399 + modify it is void, and will automatically terminate your rights under 400 + this License (including any patent licenses granted under the third 401 + paragraph of section 11). 402 + 403 + However, if you cease all violation of this License, then your 404 + license from a particular copyright holder is reinstated (a) 405 + provisionally, unless and until the copyright holder explicitly and 406 + finally terminates your license, and (b) permanently, if the copyright 407 + holder fails to notify you of the violation by some reasonable means 408 + prior to 60 days after the cessation. 409 + 410 + Moreover, your license from a particular copyright holder is 411 + reinstated permanently if the copyright holder notifies you of the 412 + violation by some reasonable means, this is the first time you have 413 + received notice of violation of this License (for any work) from that 414 + copyright holder, and you cure the violation prior to 30 days after 415 + your receipt of the notice. 416 + 417 + Termination of your rights under this section does not terminate the 418 + licenses of parties who have received copies or rights from you under 419 + this License. If your rights have been terminated and not permanently 420 + reinstated, you do not qualify to receive new licenses for the same 421 + material under section 10. 422 + 423 + 9. Acceptance Not Required for Having Copies. 424 + 425 + You are not required to accept this License in order to receive or 426 + run a copy of the Program. Ancillary propagation of a covered work 427 + occurring solely as a consequence of using peer-to-peer transmission 428 + to receive a copy likewise does not require acceptance. However, 429 + nothing other than this License grants you permission to propagate or 430 + modify any covered work. These actions infringe copyright if you do 431 + not accept this License. Therefore, by modifying or propagating a 432 + covered work, you indicate your acceptance of this License to do so. 433 + 434 + 10. Automatic Licensing of Downstream Recipients. 435 + 436 + Each time you convey a covered work, the recipient automatically 437 + receives a license from the original licensors, to run, modify and 438 + propagate that work, subject to this License. You are not responsible 439 + for enforcing compliance by third parties with this License. 440 + 441 + An "entity transaction" is a transaction transferring control of an 442 + organization, or substantially all assets of one, or subdividing an 443 + organization, or merging organizations. If propagation of a covered 444 + work results from an entity transaction, each party to that 445 + transaction who receives a copy of the work also receives whatever 446 + licenses to the work the party's predecessor in interest had or could 447 + give under the previous paragraph, plus a right to possession of the 448 + Corresponding Source of the work from the predecessor in interest, if 449 + the predecessor has it or can get it with reasonable efforts. 450 + 451 + You may not impose any further restrictions on the exercise of the 452 + rights granted or affirmed under this License. For example, you may 453 + not impose a license fee, royalty, or other charge for exercise of 454 + rights granted under this License, and you may not initiate litigation 455 + (including a cross-claim or counterclaim in a lawsuit) alleging that 456 + any patent claim is infringed by making, using, selling, offering for 457 + sale, or importing the Program or any portion of it. 458 + 459 + 11. Patents. 460 + 461 + A "contributor" is a copyright holder who authorizes use under this 462 + License of the Program or a work on which the Program is based. The 463 + work thus licensed is called the contributor's "contributor version". 464 + 465 + A contributor's "essential patent claims" are all patent claims 466 + owned or controlled by the contributor, whether already acquired or 467 + hereafter acquired, that would be infringed by some manner, permitted 468 + by this License, of making, using, or selling its contributor version, 469 + but do not include claims that would be infringed only as a 470 + consequence of further modification of the contributor version. For 471 + purposes of this definition, "control" includes the right to grant 472 + patent sublicenses in a manner consistent with the requirements of 473 + this License. 474 + 475 + Each contributor grants you a non-exclusive, worldwide, royalty-free 476 + patent license under the contributor's essential patent claims, to 477 + make, use, sell, offer for sale, import and otherwise run, modify and 478 + propagate the contents of its contributor version. 479 + 480 + In the following three paragraphs, a "patent license" is any express 481 + agreement or commitment, however denominated, not to enforce a patent 482 + (such as an express permission to practice a patent or covenant not to 483 + sue for patent infringement). To "grant" such a patent license to a 484 + party means to make such an agreement or commitment not to enforce a 485 + patent against the party. 486 + 487 + If you convey a covered work, knowingly relying on a patent license, 488 + and the Corresponding Source of the work is not available for anyone 489 + to copy, free of charge and under the terms of this License, through a 490 + publicly available network server or other readily accessible means, 491 + then you must either (1) cause the Corresponding Source to be so 492 + available, or (2) arrange to deprive yourself of the benefit of the 493 + patent license for this particular work, or (3) arrange, in a manner 494 + consistent with the requirements of this License, to extend the patent 495 + license to downstream recipients. "Knowingly relying" means you have 496 + actual knowledge that, but for the patent license, your conveying the 497 + covered work in a country, or your recipient's use of the covered work 498 + in a country, would infringe one or more identifiable patents in that 499 + country that you have reason to believe are valid. 500 + 501 + If, pursuant to or in connection with a single transaction or 502 + arrangement, you convey, or propagate by procuring conveyance of, a 503 + covered work, and grant a patent license to some of the parties 504 + receiving the covered work authorizing them to use, propagate, modify 505 + or convey a specific copy of the covered work, then the patent license 506 + you grant is automatically extended to all recipients of the covered 507 + work and works based on it. 508 + 509 + A patent license is "discriminatory" if it does not include within 510 + the scope of its coverage, prohibits the exercise of, or is 511 + conditioned on the non-exercise of one or more of the rights that are 512 + specifically granted under this License. You may not convey a covered 513 + work if you are a party to an arrangement with a third party that is 514 + in the business of distributing software, under which you make payment 515 + to the third party based on the extent of your activity of conveying 516 + the work, and under which the third party grants, to any of the 517 + parties who would receive the covered work from you, a discriminatory 518 + patent license (a) in connection with copies of the covered work 519 + conveyed by you (or copies made from those copies), or (b) primarily 520 + for and in connection with specific products or compilations that 521 + contain the covered work, unless you entered into that arrangement, 522 + or that patent license was granted, prior to 28 March 2007. 523 + 524 + Nothing in this License shall be construed as excluding or limiting 525 + any implied license or other defenses to infringement that may 526 + otherwise be available to you under applicable patent law. 527 + 528 + 12. No Surrender of Others' Freedom. 529 + 530 + If conditions are imposed on you (whether by court order, agreement or 531 + otherwise) that contradict the conditions of this License, they do not 532 + excuse you from the conditions of this License. If you cannot convey a 533 + covered work so as to satisfy simultaneously your obligations under this 534 + License and any other pertinent obligations, then as a consequence you may 535 + not convey it at all. For example, if you agree to terms that obligate you 536 + to collect a royalty for further conveying from those to whom you convey 537 + the Program, the only way you could satisfy both those terms and this 538 + License would be to refrain entirely from conveying the Program. 248 539 249 - 5.2. If You initiate litigation against any entity by asserting a patent 250 - infringement claim (excluding declaratory judgment actions, 251 - counter-claims, and cross-claims) alleging that a Contributor Version 252 - directly or indirectly infringes any patent, then the rights granted to 253 - You by any and all Contributors for the Covered Software under Section 254 - 2.1 of this License shall terminate. 540 + 13. Remote Network Interaction; Use with the GNU General Public License. 255 541 256 - 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 - end user license agreements (excluding distributors and resellers) which 258 - have been validly granted by You or Your distributors under this License 259 - prior to termination shall survive termination. 542 + Notwithstanding any other provision of this License, if you modify the 543 + Program, your modified version must prominently offer all users 544 + interacting with it remotely through a computer network (if your version 545 + supports such interaction) an opportunity to receive the Corresponding 546 + Source of your version by providing access to the Corresponding Source 547 + from a network server at no charge, through some standard or customary 548 + means of facilitating copying of software. This Corresponding Source 549 + shall include the Corresponding Source for any work covered by version 3 550 + of the GNU General Public License that is incorporated pursuant to the 551 + following paragraph. 260 552 261 - ************************************************************************ 262 - * * 263 - * 6. Disclaimer of Warranty * 264 - * ------------------------- * 265 - * * 266 - * Covered Software is provided under this License on an "as is" * 267 - * basis, without warranty of any kind, either expressed, implied, or * 268 - * statutory, including, without limitation, warranties that the * 269 - * Covered Software is free of defects, merchantable, fit for a * 270 - * particular purpose or non-infringing. The entire risk as to the * 271 - * quality and performance of the Covered Software is with You. * 272 - * Should any Covered Software prove defective in any respect, You * 273 - * (not any Contributor) assume the cost of any necessary servicing, * 274 - * repair, or correction. This disclaimer of warranty constitutes an * 275 - * essential part of this License. No use of any Covered Software is * 276 - * authorized under this License except under this disclaimer. * 277 - * * 278 - ************************************************************************ 553 + Notwithstanding any other provision of this License, you have 554 + permission to link or combine any covered work with a work licensed 555 + under version 3 of the GNU General Public License into a single 556 + combined work, and to convey the resulting work. The terms of this 557 + License will continue to apply to the part which is the covered work, 558 + but the work with which it is combined will remain governed by version 559 + 3 of the GNU General Public License. 279 560 280 - ************************************************************************ 281 - * * 282 - * 7. Limitation of Liability * 283 - * -------------------------- * 284 - * * 285 - * Under no circumstances and under no legal theory, whether tort * 286 - * (including negligence), contract, or otherwise, shall any * 287 - * Contributor, or anyone who distributes Covered Software as * 288 - * permitted above, be liable to You for any direct, indirect, * 289 - * special, incidental, or consequential damages of any character * 290 - * including, without limitation, damages for lost profits, loss of * 291 - * goodwill, work stoppage, computer failure or malfunction, or any * 292 - * and all other commercial damages or losses, even if such party * 293 - * shall have been informed of the possibility of such damages. This * 294 - * limitation of liability shall not apply to liability for death or * 295 - * personal injury resulting from such party's negligence to the * 296 - * extent applicable law prohibits such limitation. Some * 297 - * jurisdictions do not allow the exclusion or limitation of * 298 - * incidental or consequential damages, so this exclusion and * 299 - * limitation may not apply to You. * 300 - * * 301 - ************************************************************************ 561 + 14. Revised Versions of this License. 302 562 303 - 8. Litigation 304 - ------------- 563 + The Free Software Foundation may publish revised and/or new versions of 564 + the GNU Affero General Public License from time to time. Such new versions 565 + will be similar in spirit to the present version, but may differ in detail to 566 + address new problems or concerns. 305 567 306 - Any litigation relating to this License may be brought only in the 307 - courts of a jurisdiction where the defendant maintains its principal 308 - place of business and such litigation shall be governed by laws of that 309 - jurisdiction, without reference to its conflict-of-law provisions. 310 - Nothing in this Section shall prevent a party's ability to bring 311 - cross-claims or counter-claims. 568 + Each version is given a distinguishing version number. If the 569 + Program specifies that a certain numbered version of the GNU Affero General 570 + Public License "or any later version" applies to it, you have the 571 + option of following the terms and conditions either of that numbered 572 + version or of any later version published by the Free Software 573 + Foundation. If the Program does not specify a version number of the 574 + GNU Affero General Public License, you may choose any version ever published 575 + by the Free Software Foundation. 312 576 313 - 9. Miscellaneous 314 - ---------------- 577 + If the Program specifies that a proxy can decide which future 578 + versions of the GNU Affero General Public License can be used, that proxy's 579 + public statement of acceptance of a version permanently authorizes you 580 + to choose that version for the Program. 315 581 316 - This License represents the complete agreement concerning the subject 317 - matter hereof. If any provision of this License is held to be 318 - unenforceable, such provision shall be reformed only to the extent 319 - necessary to make it enforceable. Any law or regulation which provides 320 - that the language of a contract shall be construed against the drafter 321 - shall not be used to construe this License against a Contributor. 582 + Later license versions may give you additional or different 583 + permissions. However, no additional obligations are imposed on any 584 + author or copyright holder as a result of your choosing to follow a 585 + later version. 322 586 323 - 10. Versions of the License 324 - --------------------------- 587 + 15. Disclaimer of Warranty. 325 588 326 - 10.1. New Versions 589 + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 590 + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 591 + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 592 + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 593 + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 594 + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 595 + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 596 + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 597 + 598 + 16. Limitation of Liability. 599 + 600 + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 602 + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 603 + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 604 + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 605 + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 606 + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 607 + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 608 + SUCH DAMAGES. 327 609 328 - Mozilla Foundation is the license steward. Except as provided in Section 329 - 10.3, no one other than the license steward has the right to modify or 330 - publish new versions of this License. Each version will be given a 331 - distinguishing version number. 610 + 17. Interpretation of Sections 15 and 16. 332 611 333 - 10.2. Effect of New Versions 612 + If the disclaimer of warranty and limitation of liability provided 613 + above cannot be given local legal effect according to their terms, 614 + reviewing courts shall apply local law that most closely approximates 615 + an absolute waiver of all civil liability in connection with the 616 + Program, unless a warranty or assumption of liability accompanies a 617 + copy of the Program in return for a fee. 334 618 335 - You may distribute the Covered Software under the terms of the version 336 - of the License under which You originally received the Covered Software, 337 - or under the terms of any subsequent version published by the license 338 - steward. 619 + END OF TERMS AND CONDITIONS 339 620 340 - 10.3. Modified Versions 621 + How to Apply These Terms to Your New Programs 341 622 342 - If you create software not governed by this License, and you want to 343 - create a new license for such software, you may create and use a 344 - modified version of this License if you rename the license and remove 345 - any references to the name of the license steward (except to note that 346 - such modified license differs from this License). 623 + If you develop a new program, and you want it to be of the greatest 624 + possible use to the public, the best way to achieve this is to make it 625 + free software which everyone can redistribute and change under these terms. 347 626 348 - 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 - Licenses 627 + To do so, attach the following notices to the program. It is safest 628 + to attach them to the start of each source file to most effectively 629 + state the exclusion of warranty; and each file should have at least 630 + the "copyright" line and a pointer to where the full notice is found. 350 631 351 - If You choose to distribute Source Code Form that is Incompatible With 352 - Secondary Licenses under the terms of this version of the License, the 353 - notice described in Exhibit B of this License must be attached. 632 + <one line to give the program's name and a brief idea of what it does.> 633 + Copyright (C) <year> <name of author> 354 634 355 - Exhibit A - Source Code Form License Notice 356 - ------------------------------------------- 635 + This program is free software: you can redistribute it and/or modify 636 + it under the terms of the GNU Affero General Public License as published by 637 + the Free Software Foundation, either version 3 of the License, or 638 + (at your option) any later version. 357 639 358 - This Source Code Form is subject to the terms of the Mozilla Public 359 - License, v. 2.0. If a copy of the MPL was not distributed with this 360 - file, You can obtain one at https://mozilla.org/MPL/2.0/. 640 + This program is distributed in the hope that it will be useful, 641 + but WITHOUT ANY WARRANTY; without even the implied warranty of 642 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 643 + GNU Affero General Public License for more details. 361 644 362 - If it is not possible or desirable to put the notice in a particular 363 - file, then You may include the notice in a location (such as a LICENSE 364 - file in a relevant directory) where a recipient would be likely to look 365 - for such a notice. 645 + You should have received a copy of the GNU Affero General Public License 646 + along with this program. If not, see <https://www.gnu.org/licenses/>. 366 647 367 - You may add additional accurate notices of copyright ownership. 648 + Also add information on how to contact you by electronic and paper mail. 368 649 369 - Exhibit B - "Incompatible With Secondary Licenses" Notice 370 - --------------------------------------------------------- 650 + If your software can interact with users remotely through a computer 651 + network, you should also make sure that it provides a way for users to 652 + get its source. For example, if your program is a web application, its 653 + interface could display a "Source" link that leads users to an archive 654 + of the code. There are many ways you could offer source, and different 655 + solutions will be better for different programs; see section 13 for the 656 + specific requirements. 371 657 372 - This Source Code Form is "Incompatible With Secondary Licenses", as 373 - defined by the Mozilla Public License, v. 2.0. 658 + You should also get your employer (if you work as a programmer) or school, 659 + if any, to sign a "copyright disclaimer" for the program, if necessary. 660 + For more information on this, and how to apply and follow the GNU AGPL, see 661 + <https://www.gnu.org/licenses/>.
+1 -1
README.md
··· 49 49 50 50 ## licence 51 51 52 - MPL 2.0, except tubes_core (inside core/), which is ISC 52 + everything is AGPL. explodes you instantly.
+1 -1
core/history.ts
··· 24 24 return []; 25 25 } 26 26 27 - // TODO: msgids 27 + // TODO: msgids, during 28 28 // BEFORE 29 29 if (typeof range == "object" && "before" in range) { 30 30 conn.send(`CHATHISTORY BEFORE ${target} timestamp=${range.before.toISOString()} ${limit}`);
+503 -315
neo/package-lock.json
··· 5 5 "requires": true, 6 6 "packages": { 7 7 "": { 8 - "name": "tubes", 8 + "name": "neotubes", 9 9 "version": "0.0.0", 10 10 "dependencies": { 11 11 "@fontsource-variable/roboto-serif": "^5.0.14", 12 12 "@preact/signals": "^1.3.0", 13 13 "async-mutex": "^0.5.0", 14 + "dayjs": "^1.11.13", 14 15 "dexie": "^4.0.8", 15 16 "motion": "^10.18.0", 16 17 "preact": "^10.23.1", 17 - "tubes_core": "file:../core", 18 18 "wouter-preact": "^3.3.1" 19 19 }, 20 20 "devDependencies": { ··· 22 22 "@preact/preset-vite": "^2.9.0", 23 23 "@svgr/core": "^8.1.0", 24 24 "@svgr/plugin-jsx": "^8.1.0", 25 - "@types/node": "^20.14.13", 25 + "@types/node": "^22.10.1", 26 26 "typescript": "^5.5.4", 27 - "unplugin-icons": "^0.19.1", 28 - "vite": "^5.3.5" 27 + "unplugin-icons": "^0.20.2", 28 + "vite": "^6.0.1" 29 29 } 30 30 }, 31 31 "../core": { 32 + "name": "tubes_core", 32 33 "version": "0.0.9", 34 + "extraneous": true, 33 35 "license": "ISC", 34 36 "dependencies": { 35 - "@preact/signals": "^1.3.0", 37 + "@preact/signals-core": "^1.8.0", 36 38 "async-mutex": "^0.5.0", 37 39 "isomorphic-ws": "^5.0.0", 38 40 "nanoid": "^5.0.7", ··· 40 42 }, 41 43 "devDependencies": { 42 44 "@types/ws": "^8.5.12", 43 - "happy-dom": "14.12.3", 45 + "happy-dom": "15.11.7", 44 46 "typescript": "^5.5.4", 45 - "vite": "^5.3.5", 47 + "vite": "^6.0.1", 46 48 "vitest": "^2.0.4" 47 49 } 48 50 }, ··· 60 62 } 61 63 }, 62 64 "node_modules/@antfu/install-pkg": { 63 - "version": "0.4.1", 64 - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", 65 - "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", 65 + "version": "0.5.0", 66 + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.5.0.tgz", 67 + "integrity": "sha512-dKnk2xlAyC7rvTkpkHmu+Qy/2Zc3Vm/l8PtNyIOGDBtXPY3kThfU4ORNEp3V7SXw5XSOb+tOJaUYpfquPzL/Tg==", 66 68 "dev": true, 69 + "license": "MIT", 67 70 "dependencies": { 68 - "package-manager-detector": "^0.2.0", 69 - "tinyexec": "^0.3.0" 71 + "package-manager-detector": "^0.2.5", 72 + "tinyexec": "^0.3.1" 70 73 }, 71 74 "funding": { 72 75 "url": "https://github.com/sponsors/antfu" ··· 77 80 "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", 78 81 "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", 79 82 "dev": true, 83 + "license": "MIT", 80 84 "funding": { 81 85 "url": "https://github.com/sponsors/antfu" 82 86 } ··· 395 399 } 396 400 }, 397 401 "node_modules/@esbuild/aix-ppc64": { 398 - "version": "0.21.5", 399 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 400 - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 402 + "version": "0.24.2", 403 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", 404 + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", 401 405 "cpu": [ 402 406 "ppc64" 403 407 ], 404 408 "dev": true, 409 + "license": "MIT", 405 410 "optional": true, 406 411 "os": [ 407 412 "aix" 408 413 ], 409 414 "engines": { 410 - "node": ">=12" 415 + "node": ">=18" 411 416 } 412 417 }, 413 418 "node_modules/@esbuild/android-arm": { 414 - "version": "0.21.5", 415 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 416 - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 419 + "version": "0.24.2", 420 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", 421 + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", 417 422 "cpu": [ 418 423 "arm" 419 424 ], 420 425 "dev": true, 426 + "license": "MIT", 421 427 "optional": true, 422 428 "os": [ 423 429 "android" 424 430 ], 425 431 "engines": { 426 - "node": ">=12" 432 + "node": ">=18" 427 433 } 428 434 }, 429 435 "node_modules/@esbuild/android-arm64": { 430 - "version": "0.21.5", 431 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 432 - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 436 + "version": "0.24.2", 437 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", 438 + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", 433 439 "cpu": [ 434 440 "arm64" 435 441 ], 436 442 "dev": true, 443 + "license": "MIT", 437 444 "optional": true, 438 445 "os": [ 439 446 "android" 440 447 ], 441 448 "engines": { 442 - "node": ">=12" 449 + "node": ">=18" 443 450 } 444 451 }, 445 452 "node_modules/@esbuild/android-x64": { 446 - "version": "0.21.5", 447 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 448 - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 453 + "version": "0.24.2", 454 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", 455 + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", 449 456 "cpu": [ 450 457 "x64" 451 458 ], 452 459 "dev": true, 460 + "license": "MIT", 453 461 "optional": true, 454 462 "os": [ 455 463 "android" 456 464 ], 457 465 "engines": { 458 - "node": ">=12" 466 + "node": ">=18" 459 467 } 460 468 }, 461 469 "node_modules/@esbuild/darwin-arm64": { 462 - "version": "0.21.5", 463 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 464 - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 470 + "version": "0.24.2", 471 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", 472 + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", 465 473 "cpu": [ 466 474 "arm64" 467 475 ], 468 476 "dev": true, 477 + "license": "MIT", 469 478 "optional": true, 470 479 "os": [ 471 480 "darwin" 472 481 ], 473 482 "engines": { 474 - "node": ">=12" 483 + "node": ">=18" 475 484 } 476 485 }, 477 486 "node_modules/@esbuild/darwin-x64": { 478 - "version": "0.21.5", 479 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 480 - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 487 + "version": "0.24.2", 488 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", 489 + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", 481 490 "cpu": [ 482 491 "x64" 483 492 ], 484 493 "dev": true, 494 + "license": "MIT", 485 495 "optional": true, 486 496 "os": [ 487 497 "darwin" 488 498 ], 489 499 "engines": { 490 - "node": ">=12" 500 + "node": ">=18" 491 501 } 492 502 }, 493 503 "node_modules/@esbuild/freebsd-arm64": { 494 - "version": "0.21.5", 495 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 496 - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 504 + "version": "0.24.2", 505 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", 506 + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", 497 507 "cpu": [ 498 508 "arm64" 499 509 ], 500 510 "dev": true, 511 + "license": "MIT", 501 512 "optional": true, 502 513 "os": [ 503 514 "freebsd" 504 515 ], 505 516 "engines": { 506 - "node": ">=12" 517 + "node": ">=18" 507 518 } 508 519 }, 509 520 "node_modules/@esbuild/freebsd-x64": { 510 - "version": "0.21.5", 511 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 512 - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 521 + "version": "0.24.2", 522 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", 523 + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", 513 524 "cpu": [ 514 525 "x64" 515 526 ], 516 527 "dev": true, 528 + "license": "MIT", 517 529 "optional": true, 518 530 "os": [ 519 531 "freebsd" 520 532 ], 521 533 "engines": { 522 - "node": ">=12" 534 + "node": ">=18" 523 535 } 524 536 }, 525 537 "node_modules/@esbuild/linux-arm": { 526 - "version": "0.21.5", 527 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 528 - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 538 + "version": "0.24.2", 539 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", 540 + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", 529 541 "cpu": [ 530 542 "arm" 531 543 ], 532 544 "dev": true, 545 + "license": "MIT", 533 546 "optional": true, 534 547 "os": [ 535 548 "linux" 536 549 ], 537 550 "engines": { 538 - "node": ">=12" 551 + "node": ">=18" 539 552 } 540 553 }, 541 554 "node_modules/@esbuild/linux-arm64": { 542 - "version": "0.21.5", 543 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 544 - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 555 + "version": "0.24.2", 556 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", 557 + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", 545 558 "cpu": [ 546 559 "arm64" 547 560 ], 548 561 "dev": true, 562 + "license": "MIT", 549 563 "optional": true, 550 564 "os": [ 551 565 "linux" 552 566 ], 553 567 "engines": { 554 - "node": ">=12" 568 + "node": ">=18" 555 569 } 556 570 }, 557 571 "node_modules/@esbuild/linux-ia32": { 558 - "version": "0.21.5", 559 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 560 - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 572 + "version": "0.24.2", 573 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", 574 + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", 561 575 "cpu": [ 562 576 "ia32" 563 577 ], 564 578 "dev": true, 579 + "license": "MIT", 565 580 "optional": true, 566 581 "os": [ 567 582 "linux" 568 583 ], 569 584 "engines": { 570 - "node": ">=12" 585 + "node": ">=18" 571 586 } 572 587 }, 573 588 "node_modules/@esbuild/linux-loong64": { 574 - "version": "0.21.5", 575 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 576 - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 589 + "version": "0.24.2", 590 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", 591 + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", 577 592 "cpu": [ 578 593 "loong64" 579 594 ], 580 595 "dev": true, 596 + "license": "MIT", 581 597 "optional": true, 582 598 "os": [ 583 599 "linux" 584 600 ], 585 601 "engines": { 586 - "node": ">=12" 602 + "node": ">=18" 587 603 } 588 604 }, 589 605 "node_modules/@esbuild/linux-mips64el": { 590 - "version": "0.21.5", 591 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 592 - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 606 + "version": "0.24.2", 607 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", 608 + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", 593 609 "cpu": [ 594 610 "mips64el" 595 611 ], 596 612 "dev": true, 613 + "license": "MIT", 597 614 "optional": true, 598 615 "os": [ 599 616 "linux" 600 617 ], 601 618 "engines": { 602 - "node": ">=12" 619 + "node": ">=18" 603 620 } 604 621 }, 605 622 "node_modules/@esbuild/linux-ppc64": { 606 - "version": "0.21.5", 607 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 608 - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 623 + "version": "0.24.2", 624 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", 625 + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", 609 626 "cpu": [ 610 627 "ppc64" 611 628 ], 612 629 "dev": true, 630 + "license": "MIT", 613 631 "optional": true, 614 632 "os": [ 615 633 "linux" 616 634 ], 617 635 "engines": { 618 - "node": ">=12" 636 + "node": ">=18" 619 637 } 620 638 }, 621 639 "node_modules/@esbuild/linux-riscv64": { 622 - "version": "0.21.5", 623 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 624 - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 640 + "version": "0.24.2", 641 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", 642 + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", 625 643 "cpu": [ 626 644 "riscv64" 627 645 ], 628 646 "dev": true, 647 + "license": "MIT", 629 648 "optional": true, 630 649 "os": [ 631 650 "linux" 632 651 ], 633 652 "engines": { 634 - "node": ">=12" 653 + "node": ">=18" 635 654 } 636 655 }, 637 656 "node_modules/@esbuild/linux-s390x": { 638 - "version": "0.21.5", 639 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 640 - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 657 + "version": "0.24.2", 658 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", 659 + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", 641 660 "cpu": [ 642 661 "s390x" 643 662 ], 644 663 "dev": true, 664 + "license": "MIT", 645 665 "optional": true, 646 666 "os": [ 647 667 "linux" 648 668 ], 649 669 "engines": { 650 - "node": ">=12" 670 + "node": ">=18" 651 671 } 652 672 }, 653 673 "node_modules/@esbuild/linux-x64": { 654 - "version": "0.21.5", 655 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 656 - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 674 + "version": "0.24.2", 675 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", 676 + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", 657 677 "cpu": [ 658 678 "x64" 659 679 ], 660 680 "dev": true, 681 + "license": "MIT", 661 682 "optional": true, 662 683 "os": [ 663 684 "linux" 664 685 ], 665 686 "engines": { 666 - "node": ">=12" 687 + "node": ">=18" 688 + } 689 + }, 690 + "node_modules/@esbuild/netbsd-arm64": { 691 + "version": "0.24.2", 692 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", 693 + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", 694 + "cpu": [ 695 + "arm64" 696 + ], 697 + "dev": true, 698 + "license": "MIT", 699 + "optional": true, 700 + "os": [ 701 + "netbsd" 702 + ], 703 + "engines": { 704 + "node": ">=18" 667 705 } 668 706 }, 669 707 "node_modules/@esbuild/netbsd-x64": { 670 - "version": "0.21.5", 671 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 672 - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 708 + "version": "0.24.2", 709 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", 710 + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", 673 711 "cpu": [ 674 712 "x64" 675 713 ], 676 714 "dev": true, 715 + "license": "MIT", 677 716 "optional": true, 678 717 "os": [ 679 718 "netbsd" 680 719 ], 681 720 "engines": { 682 - "node": ">=12" 721 + "node": ">=18" 722 + } 723 + }, 724 + "node_modules/@esbuild/openbsd-arm64": { 725 + "version": "0.24.2", 726 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", 727 + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", 728 + "cpu": [ 729 + "arm64" 730 + ], 731 + "dev": true, 732 + "license": "MIT", 733 + "optional": true, 734 + "os": [ 735 + "openbsd" 736 + ], 737 + "engines": { 738 + "node": ">=18" 683 739 } 684 740 }, 685 741 "node_modules/@esbuild/openbsd-x64": { 686 - "version": "0.21.5", 687 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 688 - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 742 + "version": "0.24.2", 743 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", 744 + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", 689 745 "cpu": [ 690 746 "x64" 691 747 ], 692 748 "dev": true, 749 + "license": "MIT", 693 750 "optional": true, 694 751 "os": [ 695 752 "openbsd" 696 753 ], 697 754 "engines": { 698 - "node": ">=12" 755 + "node": ">=18" 699 756 } 700 757 }, 701 758 "node_modules/@esbuild/sunos-x64": { 702 - "version": "0.21.5", 703 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 704 - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 759 + "version": "0.24.2", 760 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", 761 + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", 705 762 "cpu": [ 706 763 "x64" 707 764 ], 708 765 "dev": true, 766 + "license": "MIT", 709 767 "optional": true, 710 768 "os": [ 711 769 "sunos" 712 770 ], 713 771 "engines": { 714 - "node": ">=12" 772 + "node": ">=18" 715 773 } 716 774 }, 717 775 "node_modules/@esbuild/win32-arm64": { 718 - "version": "0.21.5", 719 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 720 - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 776 + "version": "0.24.2", 777 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", 778 + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", 721 779 "cpu": [ 722 780 "arm64" 723 781 ], 724 782 "dev": true, 783 + "license": "MIT", 725 784 "optional": true, 726 785 "os": [ 727 786 "win32" 728 787 ], 729 788 "engines": { 730 - "node": ">=12" 789 + "node": ">=18" 731 790 } 732 791 }, 733 792 "node_modules/@esbuild/win32-ia32": { 734 - "version": "0.21.5", 735 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 736 - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 793 + "version": "0.24.2", 794 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", 795 + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", 737 796 "cpu": [ 738 797 "ia32" 739 798 ], 740 799 "dev": true, 800 + "license": "MIT", 741 801 "optional": true, 742 802 "os": [ 743 803 "win32" 744 804 ], 745 805 "engines": { 746 - "node": ">=12" 806 + "node": ">=18" 747 807 } 748 808 }, 749 809 "node_modules/@esbuild/win32-x64": { 750 - "version": "0.21.5", 751 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 752 - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 810 + "version": "0.24.2", 811 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", 812 + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", 753 813 "cpu": [ 754 814 "x64" 755 815 ], 756 816 "dev": true, 817 + "license": "MIT", 757 818 "optional": true, 758 819 "os": [ 759 820 "win32" 760 821 ], 761 822 "engines": { 762 - "node": ">=12" 823 + "node": ">=18" 763 824 } 764 825 }, 765 826 "node_modules/@fontsource-variable/roboto-serif": { ··· 783 844 "dev": true 784 845 }, 785 846 "node_modules/@iconify/utils": { 786 - "version": "2.1.32", 787 - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.32.tgz", 788 - "integrity": "sha512-LeifFZPPKu28O3AEDpYJNdEbvS4/ojAPyIW+pF/vUpJTYnbTiXUHkCh0bwgFRzKvdpb8H4Fbfd/742++MF4fPQ==", 847 + "version": "2.2.1", 848 + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.2.1.tgz", 849 + "integrity": "sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==", 789 850 "dev": true, 851 + "license": "MIT", 790 852 "dependencies": { 791 - "@antfu/install-pkg": "^0.4.0", 853 + "@antfu/install-pkg": "^0.4.1", 792 854 "@antfu/utils": "^0.7.10", 793 855 "@iconify/types": "^2.0.0", 794 - "debug": "^4.3.6", 856 + "debug": "^4.4.0", 857 + "globals": "^15.13.0", 795 858 "kolorist": "^1.8.0", 796 - "local-pkg": "^0.5.0", 797 - "mlly": "^1.7.1" 859 + "local-pkg": "^0.5.1", 860 + "mlly": "^1.7.3" 861 + } 862 + }, 863 + "node_modules/@iconify/utils/node_modules/@antfu/install-pkg": { 864 + "version": "0.4.1", 865 + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", 866 + "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", 867 + "dev": true, 868 + "license": "MIT", 869 + "dependencies": { 870 + "package-manager-detector": "^0.2.0", 871 + "tinyexec": "^0.3.0" 872 + }, 873 + "funding": { 874 + "url": "https://github.com/sponsors/antfu" 875 + } 876 + }, 877 + "node_modules/@iconify/utils/node_modules/globals": { 878 + "version": "15.14.0", 879 + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", 880 + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", 881 + "dev": true, 882 + "license": "MIT", 883 + "engines": { 884 + "node": ">=18" 885 + }, 886 + "funding": { 887 + "url": "https://github.com/sponsors/sindresorhus" 798 888 } 799 889 }, 800 890 "node_modules/@jridgewell/gen-mapping": { ··· 1004 1094 } 1005 1095 }, 1006 1096 "node_modules/@rollup/rollup-android-arm-eabi": { 1007 - "version": "4.21.2", 1008 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", 1009 - "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", 1097 + "version": "4.31.0", 1098 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz", 1099 + "integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==", 1010 1100 "cpu": [ 1011 1101 "arm" 1012 1102 ], 1013 1103 "dev": true, 1104 + "license": "MIT", 1014 1105 "optional": true, 1015 1106 "os": [ 1016 1107 "android" 1017 1108 ] 1018 1109 }, 1019 1110 "node_modules/@rollup/rollup-android-arm64": { 1020 - "version": "4.21.2", 1021 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", 1022 - "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", 1111 + "version": "4.31.0", 1112 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz", 1113 + "integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==", 1023 1114 "cpu": [ 1024 1115 "arm64" 1025 1116 ], 1026 1117 "dev": true, 1118 + "license": "MIT", 1027 1119 "optional": true, 1028 1120 "os": [ 1029 1121 "android" 1030 1122 ] 1031 1123 }, 1032 1124 "node_modules/@rollup/rollup-darwin-arm64": { 1033 - "version": "4.21.2", 1034 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", 1035 - "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", 1125 + "version": "4.31.0", 1126 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz", 1127 + "integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==", 1036 1128 "cpu": [ 1037 1129 "arm64" 1038 1130 ], 1039 1131 "dev": true, 1132 + "license": "MIT", 1040 1133 "optional": true, 1041 1134 "os": [ 1042 1135 "darwin" 1043 1136 ] 1044 1137 }, 1045 1138 "node_modules/@rollup/rollup-darwin-x64": { 1046 - "version": "4.21.2", 1047 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", 1048 - "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", 1139 + "version": "4.31.0", 1140 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz", 1141 + "integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==", 1049 1142 "cpu": [ 1050 1143 "x64" 1051 1144 ], 1052 1145 "dev": true, 1146 + "license": "MIT", 1053 1147 "optional": true, 1054 1148 "os": [ 1055 1149 "darwin" 1056 1150 ] 1057 1151 }, 1152 + "node_modules/@rollup/rollup-freebsd-arm64": { 1153 + "version": "4.31.0", 1154 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz", 1155 + "integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==", 1156 + "cpu": [ 1157 + "arm64" 1158 + ], 1159 + "dev": true, 1160 + "license": "MIT", 1161 + "optional": true, 1162 + "os": [ 1163 + "freebsd" 1164 + ] 1165 + }, 1166 + "node_modules/@rollup/rollup-freebsd-x64": { 1167 + "version": "4.31.0", 1168 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz", 1169 + "integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==", 1170 + "cpu": [ 1171 + "x64" 1172 + ], 1173 + "dev": true, 1174 + "license": "MIT", 1175 + "optional": true, 1176 + "os": [ 1177 + "freebsd" 1178 + ] 1179 + }, 1058 1180 "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1059 - "version": "4.21.2", 1060 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", 1061 - "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", 1181 + "version": "4.31.0", 1182 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz", 1183 + "integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==", 1062 1184 "cpu": [ 1063 1185 "arm" 1064 1186 ], 1065 1187 "dev": true, 1188 + "license": "MIT", 1066 1189 "optional": true, 1067 1190 "os": [ 1068 1191 "linux" 1069 1192 ] 1070 1193 }, 1071 1194 "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1072 - "version": "4.21.2", 1073 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", 1074 - "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", 1195 + "version": "4.31.0", 1196 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz", 1197 + "integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==", 1075 1198 "cpu": [ 1076 1199 "arm" 1077 1200 ], 1078 1201 "dev": true, 1202 + "license": "MIT", 1079 1203 "optional": true, 1080 1204 "os": [ 1081 1205 "linux" 1082 1206 ] 1083 1207 }, 1084 1208 "node_modules/@rollup/rollup-linux-arm64-gnu": { 1085 - "version": "4.21.2", 1086 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", 1087 - "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", 1209 + "version": "4.31.0", 1210 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz", 1211 + "integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==", 1088 1212 "cpu": [ 1089 1213 "arm64" 1090 1214 ], 1091 1215 "dev": true, 1216 + "license": "MIT", 1092 1217 "optional": true, 1093 1218 "os": [ 1094 1219 "linux" 1095 1220 ] 1096 1221 }, 1097 1222 "node_modules/@rollup/rollup-linux-arm64-musl": { 1098 - "version": "4.21.2", 1099 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", 1100 - "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", 1223 + "version": "4.31.0", 1224 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz", 1225 + "integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==", 1101 1226 "cpu": [ 1102 1227 "arm64" 1103 1228 ], 1104 1229 "dev": true, 1230 + "license": "MIT", 1231 + "optional": true, 1232 + "os": [ 1233 + "linux" 1234 + ] 1235 + }, 1236 + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1237 + "version": "4.31.0", 1238 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz", 1239 + "integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==", 1240 + "cpu": [ 1241 + "loong64" 1242 + ], 1243 + "dev": true, 1244 + "license": "MIT", 1105 1245 "optional": true, 1106 1246 "os": [ 1107 1247 "linux" 1108 1248 ] 1109 1249 }, 1110 1250 "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1111 - "version": "4.21.2", 1112 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", 1113 - "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", 1251 + "version": "4.31.0", 1252 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz", 1253 + "integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==", 1114 1254 "cpu": [ 1115 1255 "ppc64" 1116 1256 ], 1117 1257 "dev": true, 1258 + "license": "MIT", 1118 1259 "optional": true, 1119 1260 "os": [ 1120 1261 "linux" 1121 1262 ] 1122 1263 }, 1123 1264 "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1124 - "version": "4.21.2", 1125 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", 1126 - "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", 1265 + "version": "4.31.0", 1266 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz", 1267 + "integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==", 1127 1268 "cpu": [ 1128 1269 "riscv64" 1129 1270 ], 1130 1271 "dev": true, 1272 + "license": "MIT", 1131 1273 "optional": true, 1132 1274 "os": [ 1133 1275 "linux" 1134 1276 ] 1135 1277 }, 1136 1278 "node_modules/@rollup/rollup-linux-s390x-gnu": { 1137 - "version": "4.21.2", 1138 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", 1139 - "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", 1279 + "version": "4.31.0", 1280 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz", 1281 + "integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==", 1140 1282 "cpu": [ 1141 1283 "s390x" 1142 1284 ], 1143 1285 "dev": true, 1286 + "license": "MIT", 1144 1287 "optional": true, 1145 1288 "os": [ 1146 1289 "linux" 1147 1290 ] 1148 1291 }, 1149 1292 "node_modules/@rollup/rollup-linux-x64-gnu": { 1150 - "version": "4.21.2", 1151 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", 1152 - "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", 1293 + "version": "4.31.0", 1294 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz", 1295 + "integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==", 1153 1296 "cpu": [ 1154 1297 "x64" 1155 1298 ], 1156 1299 "dev": true, 1300 + "license": "MIT", 1157 1301 "optional": true, 1158 1302 "os": [ 1159 1303 "linux" 1160 1304 ] 1161 1305 }, 1162 1306 "node_modules/@rollup/rollup-linux-x64-musl": { 1163 - "version": "4.21.2", 1164 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", 1165 - "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", 1307 + "version": "4.31.0", 1308 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz", 1309 + "integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==", 1166 1310 "cpu": [ 1167 1311 "x64" 1168 1312 ], 1169 1313 "dev": true, 1314 + "license": "MIT", 1170 1315 "optional": true, 1171 1316 "os": [ 1172 1317 "linux" 1173 1318 ] 1174 1319 }, 1175 1320 "node_modules/@rollup/rollup-win32-arm64-msvc": { 1176 - "version": "4.21.2", 1177 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", 1178 - "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", 1321 + "version": "4.31.0", 1322 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz", 1323 + "integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==", 1179 1324 "cpu": [ 1180 1325 "arm64" 1181 1326 ], 1182 1327 "dev": true, 1328 + "license": "MIT", 1183 1329 "optional": true, 1184 1330 "os": [ 1185 1331 "win32" 1186 1332 ] 1187 1333 }, 1188 1334 "node_modules/@rollup/rollup-win32-ia32-msvc": { 1189 - "version": "4.21.2", 1190 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", 1191 - "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", 1335 + "version": "4.31.0", 1336 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz", 1337 + "integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==", 1192 1338 "cpu": [ 1193 1339 "ia32" 1194 1340 ], 1195 1341 "dev": true, 1342 + "license": "MIT", 1196 1343 "optional": true, 1197 1344 "os": [ 1198 1345 "win32" 1199 1346 ] 1200 1347 }, 1201 1348 "node_modules/@rollup/rollup-win32-x64-msvc": { 1202 - "version": "4.21.2", 1203 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", 1204 - "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", 1349 + "version": "4.31.0", 1350 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz", 1351 + "integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==", 1205 1352 "cpu": [ 1206 1353 "x64" 1207 1354 ], 1208 1355 "dev": true, 1356 + "license": "MIT", 1209 1357 "optional": true, 1210 1358 "os": [ 1211 1359 "win32" ··· 1425 1573 } 1426 1574 }, 1427 1575 "node_modules/@types/estree": { 1428 - "version": "1.0.5", 1429 - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 1430 - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 1431 - "dev": true 1576 + "version": "1.0.6", 1577 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1578 + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1579 + "dev": true, 1580 + "license": "MIT" 1432 1581 }, 1433 1582 "node_modules/@types/node": { 1434 - "version": "20.16.5", 1435 - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", 1436 - "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", 1583 + "version": "22.10.7", 1584 + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", 1585 + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", 1437 1586 "dev": true, 1587 + "license": "MIT", 1438 1588 "dependencies": { 1439 - "undici-types": "~6.19.2" 1589 + "undici-types": "~6.20.0" 1440 1590 } 1441 1591 }, 1442 1592 "node_modules/acorn": { 1443 - "version": "8.12.1", 1444 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 1445 - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 1593 + "version": "8.14.0", 1594 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1595 + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1446 1596 "dev": true, 1597 + "license": "MIT", 1447 1598 "bin": { 1448 1599 "acorn": "bin/acorn" 1449 1600 }, ··· 1595 1746 "dev": true 1596 1747 }, 1597 1748 "node_modules/confbox": { 1598 - "version": "0.1.7", 1599 - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", 1600 - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", 1601 - "dev": true 1749 + "version": "0.1.8", 1750 + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", 1751 + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", 1752 + "dev": true, 1753 + "license": "MIT" 1602 1754 }, 1603 1755 "node_modules/convert-source-map": { 1604 1756 "version": "2.0.0", ··· 1660 1812 "url": "https://github.com/sponsors/fb55" 1661 1813 } 1662 1814 }, 1815 + "node_modules/dayjs": { 1816 + "version": "1.11.13", 1817 + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", 1818 + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", 1819 + "license": "MIT" 1820 + }, 1663 1821 "node_modules/debug": { 1664 - "version": "4.3.6", 1665 - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 1666 - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 1822 + "version": "4.4.0", 1823 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1824 + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1667 1825 "dev": true, 1826 + "license": "MIT", 1668 1827 "dependencies": { 1669 - "ms": "2.1.2" 1828 + "ms": "^2.1.3" 1670 1829 }, 1671 1830 "engines": { 1672 1831 "node": ">=6.0" ··· 1775 1934 } 1776 1935 }, 1777 1936 "node_modules/esbuild": { 1778 - "version": "0.21.5", 1779 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 1780 - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 1937 + "version": "0.24.2", 1938 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", 1939 + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", 1781 1940 "dev": true, 1782 1941 "hasInstallScript": true, 1942 + "license": "MIT", 1783 1943 "bin": { 1784 1944 "esbuild": "bin/esbuild" 1785 1945 }, 1786 1946 "engines": { 1787 - "node": ">=12" 1947 + "node": ">=18" 1788 1948 }, 1789 1949 "optionalDependencies": { 1790 - "@esbuild/aix-ppc64": "0.21.5", 1791 - "@esbuild/android-arm": "0.21.5", 1792 - "@esbuild/android-arm64": "0.21.5", 1793 - "@esbuild/android-x64": "0.21.5", 1794 - "@esbuild/darwin-arm64": "0.21.5", 1795 - "@esbuild/darwin-x64": "0.21.5", 1796 - "@esbuild/freebsd-arm64": "0.21.5", 1797 - "@esbuild/freebsd-x64": "0.21.5", 1798 - "@esbuild/linux-arm": "0.21.5", 1799 - "@esbuild/linux-arm64": "0.21.5", 1800 - "@esbuild/linux-ia32": "0.21.5", 1801 - "@esbuild/linux-loong64": "0.21.5", 1802 - "@esbuild/linux-mips64el": "0.21.5", 1803 - "@esbuild/linux-ppc64": "0.21.5", 1804 - "@esbuild/linux-riscv64": "0.21.5", 1805 - "@esbuild/linux-s390x": "0.21.5", 1806 - "@esbuild/linux-x64": "0.21.5", 1807 - "@esbuild/netbsd-x64": "0.21.5", 1808 - "@esbuild/openbsd-x64": "0.21.5", 1809 - "@esbuild/sunos-x64": "0.21.5", 1810 - "@esbuild/win32-arm64": "0.21.5", 1811 - "@esbuild/win32-ia32": "0.21.5", 1812 - "@esbuild/win32-x64": "0.21.5" 1950 + "@esbuild/aix-ppc64": "0.24.2", 1951 + "@esbuild/android-arm": "0.24.2", 1952 + "@esbuild/android-arm64": "0.24.2", 1953 + "@esbuild/android-x64": "0.24.2", 1954 + "@esbuild/darwin-arm64": "0.24.2", 1955 + "@esbuild/darwin-x64": "0.24.2", 1956 + "@esbuild/freebsd-arm64": "0.24.2", 1957 + "@esbuild/freebsd-x64": "0.24.2", 1958 + "@esbuild/linux-arm": "0.24.2", 1959 + "@esbuild/linux-arm64": "0.24.2", 1960 + "@esbuild/linux-ia32": "0.24.2", 1961 + "@esbuild/linux-loong64": "0.24.2", 1962 + "@esbuild/linux-mips64el": "0.24.2", 1963 + "@esbuild/linux-ppc64": "0.24.2", 1964 + "@esbuild/linux-riscv64": "0.24.2", 1965 + "@esbuild/linux-s390x": "0.24.2", 1966 + "@esbuild/linux-x64": "0.24.2", 1967 + "@esbuild/netbsd-arm64": "0.24.2", 1968 + "@esbuild/netbsd-x64": "0.24.2", 1969 + "@esbuild/openbsd-arm64": "0.24.2", 1970 + "@esbuild/openbsd-x64": "0.24.2", 1971 + "@esbuild/sunos-x64": "0.24.2", 1972 + "@esbuild/win32-arm64": "0.24.2", 1973 + "@esbuild/win32-ia32": "0.24.2", 1974 + "@esbuild/win32-x64": "0.24.2" 1813 1975 } 1814 1976 }, 1815 1977 "node_modules/escalade": { ··· 1842 2004 "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1843 2005 "dev": true, 1844 2006 "hasInstallScript": true, 2007 + "license": "MIT", 1845 2008 "optional": true, 1846 2009 "os": [ 1847 2010 "darwin" ··· 2010 2173 "dev": true 2011 2174 }, 2012 2175 "node_modules/local-pkg": { 2013 - "version": "0.5.0", 2014 - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", 2015 - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", 2176 + "version": "0.5.1", 2177 + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", 2178 + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", 2016 2179 "dev": true, 2180 + "license": "MIT", 2017 2181 "dependencies": { 2018 - "mlly": "^1.4.2", 2019 - "pkg-types": "^1.0.3" 2182 + "mlly": "^1.7.3", 2183 + "pkg-types": "^1.2.1" 2020 2184 }, 2021 2185 "engines": { 2022 2186 "node": ">=14" ··· 2061 2225 "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" 2062 2226 }, 2063 2227 "node_modules/mlly": { 2064 - "version": "1.7.1", 2065 - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", 2066 - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", 2228 + "version": "1.7.4", 2229 + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", 2230 + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", 2067 2231 "dev": true, 2232 + "license": "MIT", 2068 2233 "dependencies": { 2069 - "acorn": "^8.11.3", 2070 - "pathe": "^1.1.2", 2071 - "pkg-types": "^1.1.1", 2072 - "ufo": "^1.5.3" 2234 + "acorn": "^8.14.0", 2235 + "pathe": "^2.0.1", 2236 + "pkg-types": "^1.3.0", 2237 + "ufo": "^1.5.4" 2073 2238 } 2074 2239 }, 2075 2240 "node_modules/motion": { ··· 2084 2249 } 2085 2250 }, 2086 2251 "node_modules/ms": { 2087 - "version": "2.1.2", 2088 - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2089 - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2090 - "dev": true 2252 + "version": "2.1.3", 2253 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2254 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2255 + "dev": true, 2256 + "license": "MIT" 2091 2257 }, 2092 2258 "node_modules/nanoid": { 2093 - "version": "3.3.7", 2094 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2095 - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2259 + "version": "3.3.8", 2260 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 2261 + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 2096 2262 "dev": true, 2097 2263 "funding": [ 2098 2264 { ··· 2100 2266 "url": "https://github.com/sponsors/ai" 2101 2267 } 2102 2268 ], 2269 + "license": "MIT", 2103 2270 "bin": { 2104 2271 "nanoid": "bin/nanoid.cjs" 2105 2272 }, ··· 2146 2313 } 2147 2314 }, 2148 2315 "node_modules/package-manager-detector": { 2149 - "version": "0.2.0", 2150 - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.0.tgz", 2151 - "integrity": "sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==", 2152 - "dev": true 2316 + "version": "0.2.8", 2317 + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.8.tgz", 2318 + "integrity": "sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==", 2319 + "dev": true, 2320 + "license": "MIT" 2153 2321 }, 2154 2322 "node_modules/parent-module": { 2155 2323 "version": "1.0.1", ··· 2197 2365 } 2198 2366 }, 2199 2367 "node_modules/pathe": { 2200 - "version": "1.1.2", 2201 - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", 2202 - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", 2203 - "dev": true 2368 + "version": "2.0.2", 2369 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", 2370 + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", 2371 + "dev": true, 2372 + "license": "MIT" 2204 2373 }, 2205 2374 "node_modules/picocolors": { 2206 - "version": "1.1.0", 2207 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 2208 - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 2209 - "dev": true 2375 + "version": "1.1.1", 2376 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2377 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2378 + "dev": true, 2379 + "license": "ISC" 2210 2380 }, 2211 2381 "node_modules/picomatch": { 2212 2382 "version": "2.3.1", ··· 2221 2391 } 2222 2392 }, 2223 2393 "node_modules/pkg-types": { 2224 - "version": "1.2.0", 2225 - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", 2226 - "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", 2394 + "version": "1.3.1", 2395 + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", 2396 + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", 2227 2397 "dev": true, 2398 + "license": "MIT", 2228 2399 "dependencies": { 2229 - "confbox": "^0.1.7", 2230 - "mlly": "^1.7.1", 2231 - "pathe": "^1.1.2" 2400 + "confbox": "^0.1.8", 2401 + "mlly": "^1.7.4", 2402 + "pathe": "^2.0.1" 2232 2403 } 2233 2404 }, 2234 2405 "node_modules/postcss": { 2235 - "version": "8.4.45", 2236 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", 2237 - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", 2406 + "version": "8.5.1", 2407 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", 2408 + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", 2238 2409 "dev": true, 2239 2410 "funding": [ 2240 2411 { ··· 2250 2421 "url": "https://github.com/sponsors/ai" 2251 2422 } 2252 2423 ], 2424 + "license": "MIT", 2253 2425 "dependencies": { 2254 - "nanoid": "^3.3.7", 2255 - "picocolors": "^1.0.1", 2256 - "source-map-js": "^1.2.0" 2426 + "nanoid": "^3.3.8", 2427 + "picocolors": "^1.1.1", 2428 + "source-map-js": "^1.2.1" 2257 2429 }, 2258 2430 "engines": { 2259 2431 "node": "^10 || ^12 || >=14" ··· 2303 2475 } 2304 2476 }, 2305 2477 "node_modules/rollup": { 2306 - "version": "4.21.2", 2307 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", 2308 - "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", 2478 + "version": "4.31.0", 2479 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz", 2480 + "integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==", 2309 2481 "dev": true, 2482 + "license": "MIT", 2310 2483 "dependencies": { 2311 - "@types/estree": "1.0.5" 2484 + "@types/estree": "1.0.6" 2312 2485 }, 2313 2486 "bin": { 2314 2487 "rollup": "dist/bin/rollup" ··· 2318 2491 "npm": ">=8.0.0" 2319 2492 }, 2320 2493 "optionalDependencies": { 2321 - "@rollup/rollup-android-arm-eabi": "4.21.2", 2322 - "@rollup/rollup-android-arm64": "4.21.2", 2323 - "@rollup/rollup-darwin-arm64": "4.21.2", 2324 - "@rollup/rollup-darwin-x64": "4.21.2", 2325 - "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", 2326 - "@rollup/rollup-linux-arm-musleabihf": "4.21.2", 2327 - "@rollup/rollup-linux-arm64-gnu": "4.21.2", 2328 - "@rollup/rollup-linux-arm64-musl": "4.21.2", 2329 - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", 2330 - "@rollup/rollup-linux-riscv64-gnu": "4.21.2", 2331 - "@rollup/rollup-linux-s390x-gnu": "4.21.2", 2332 - "@rollup/rollup-linux-x64-gnu": "4.21.2", 2333 - "@rollup/rollup-linux-x64-musl": "4.21.2", 2334 - "@rollup/rollup-win32-arm64-msvc": "4.21.2", 2335 - "@rollup/rollup-win32-ia32-msvc": "4.21.2", 2336 - "@rollup/rollup-win32-x64-msvc": "4.21.2", 2494 + "@rollup/rollup-android-arm-eabi": "4.31.0", 2495 + "@rollup/rollup-android-arm64": "4.31.0", 2496 + "@rollup/rollup-darwin-arm64": "4.31.0", 2497 + "@rollup/rollup-darwin-x64": "4.31.0", 2498 + "@rollup/rollup-freebsd-arm64": "4.31.0", 2499 + "@rollup/rollup-freebsd-x64": "4.31.0", 2500 + "@rollup/rollup-linux-arm-gnueabihf": "4.31.0", 2501 + "@rollup/rollup-linux-arm-musleabihf": "4.31.0", 2502 + "@rollup/rollup-linux-arm64-gnu": "4.31.0", 2503 + "@rollup/rollup-linux-arm64-musl": "4.31.0", 2504 + "@rollup/rollup-linux-loongarch64-gnu": "4.31.0", 2505 + "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0", 2506 + "@rollup/rollup-linux-riscv64-gnu": "4.31.0", 2507 + "@rollup/rollup-linux-s390x-gnu": "4.31.0", 2508 + "@rollup/rollup-linux-x64-gnu": "4.31.0", 2509 + "@rollup/rollup-linux-x64-musl": "4.31.0", 2510 + "@rollup/rollup-win32-arm64-msvc": "4.31.0", 2511 + "@rollup/rollup-win32-ia32-msvc": "4.31.0", 2512 + "@rollup/rollup-win32-x64-msvc": "4.31.0", 2337 2513 "fsevents": "~2.3.2" 2338 2514 } 2339 2515 }, ··· 2366 2542 } 2367 2543 }, 2368 2544 "node_modules/source-map-js": { 2369 - "version": "1.2.0", 2370 - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 2371 - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 2545 + "version": "1.2.1", 2546 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2547 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2372 2548 "dev": true, 2549 + "license": "BSD-3-Clause", 2373 2550 "engines": { 2374 2551 "node": ">=0.10.0" 2375 2552 } ··· 2414 2591 "dev": true 2415 2592 }, 2416 2593 "node_modules/tinyexec": { 2417 - "version": "0.3.0", 2418 - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", 2419 - "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", 2420 - "dev": true 2594 + "version": "0.3.2", 2595 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 2596 + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 2597 + "dev": true, 2598 + "license": "MIT" 2421 2599 }, 2422 2600 "node_modules/to-fast-properties": { 2423 2601 "version": "2.0.0", ··· 2432 2610 "version": "2.7.0", 2433 2611 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", 2434 2612 "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" 2435 - }, 2436 - "node_modules/tubes_core": { 2437 - "resolved": "../core", 2438 - "link": true 2439 2613 }, 2440 2614 "node_modules/typescript": { 2441 2615 "version": "5.5.4", ··· 2454 2628 "version": "1.5.4", 2455 2629 "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", 2456 2630 "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", 2457 - "dev": true 2631 + "dev": true, 2632 + "license": "MIT" 2458 2633 }, 2459 2634 "node_modules/undici-types": { 2460 - "version": "6.19.8", 2461 - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 2462 - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 2463 - "dev": true 2635 + "version": "6.20.0", 2636 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 2637 + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 2638 + "dev": true, 2639 + "license": "MIT" 2464 2640 }, 2465 2641 "node_modules/unplugin": { 2466 - "version": "1.13.1", 2467 - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.13.1.tgz", 2468 - "integrity": "sha512-6Kq1iSSwg7KyjcThRUks9LuqDAKvtnioxbL9iEtB9ctTyBA5OmrB8gZd/d225VJu1w3UpUsKV7eGrvf59J7+VA==", 2642 + "version": "1.16.1", 2643 + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", 2644 + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", 2469 2645 "dev": true, 2646 + "license": "MIT", 2470 2647 "dependencies": { 2471 - "acorn": "^8.12.1", 2648 + "acorn": "^8.14.0", 2472 2649 "webpack-virtual-modules": "^0.6.2" 2473 2650 }, 2474 2651 "engines": { 2475 2652 "node": ">=14.0.0" 2476 - }, 2477 - "peerDependencies": { 2478 - "webpack-sources": "^3" 2479 - }, 2480 - "peerDependenciesMeta": { 2481 - "webpack-sources": { 2482 - "optional": true 2483 - } 2484 2653 } 2485 2654 }, 2486 2655 "node_modules/unplugin-icons": { 2487 - "version": "0.19.3", 2488 - "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-0.19.3.tgz", 2489 - "integrity": "sha512-EUegRmsAI6+rrYr0vXjFlIP+lg4fSC4zb62zAZKx8FGXlWAGgEGBCa3JDe27aRAXhistObLPbBPhwa/0jYLFkQ==", 2656 + "version": "0.20.2", 2657 + "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-0.20.2.tgz", 2658 + "integrity": "sha512-Ak6TKAiO812aIUrCelrBSTQbYC4FiqawnFrAusP/hjmB8f9cAug9jr381ItvLl+Asi4IVcjoOiPbpy9CfFGKvQ==", 2490 2659 "dev": true, 2660 + "license": "MIT", 2491 2661 "dependencies": { 2492 - "@antfu/install-pkg": "^0.4.1", 2662 + "@antfu/install-pkg": "^0.5.0", 2493 2663 "@antfu/utils": "^0.7.10", 2494 - "@iconify/utils": "^2.1.29", 2495 - "debug": "^4.3.6", 2664 + "@iconify/utils": "^2.1.33", 2665 + "debug": "^4.3.7", 2496 2666 "kolorist": "^1.8.0", 2497 - "local-pkg": "^0.5.0", 2498 - "unplugin": "^1.12.0" 2667 + "local-pkg": "^0.5.1", 2668 + "unplugin": "^1.16.0" 2499 2669 }, 2500 2670 "funding": { 2501 2671 "url": "https://github.com/sponsors/antfu" ··· 2504 2674 "@svgr/core": ">=7.0.0", 2505 2675 "@svgx/core": "^1.0.1", 2506 2676 "@vue/compiler-sfc": "^3.0.2 || ^2.7.0", 2677 + "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0", 2507 2678 "vue-template-compiler": "^2.6.12", 2508 2679 "vue-template-es2015-compiler": "^1.9.0" 2509 2680 }, ··· 2515 2686 "optional": true 2516 2687 }, 2517 2688 "@vue/compiler-sfc": { 2689 + "optional": true 2690 + }, 2691 + "svelte": { 2518 2692 "optional": true 2519 2693 }, 2520 2694 "vue-template-compiler": { ··· 2556 2730 } 2557 2731 }, 2558 2732 "node_modules/vite": { 2559 - "version": "5.4.3", 2560 - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", 2561 - "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", 2733 + "version": "6.0.11", 2734 + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", 2735 + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", 2562 2736 "dev": true, 2737 + "license": "MIT", 2563 2738 "dependencies": { 2564 - "esbuild": "^0.21.3", 2565 - "postcss": "^8.4.43", 2566 - "rollup": "^4.20.0" 2739 + "esbuild": "^0.24.2", 2740 + "postcss": "^8.4.49", 2741 + "rollup": "^4.23.0" 2567 2742 }, 2568 2743 "bin": { 2569 2744 "vite": "bin/vite.js" 2570 2745 }, 2571 2746 "engines": { 2572 - "node": "^18.0.0 || >=20.0.0" 2747 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2573 2748 }, 2574 2749 "funding": { 2575 2750 "url": "https://github.com/vitejs/vite?sponsor=1" ··· 2578 2753 "fsevents": "~2.3.3" 2579 2754 }, 2580 2755 "peerDependencies": { 2581 - "@types/node": "^18.0.0 || >=20.0.0", 2756 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2757 + "jiti": ">=1.21.0", 2582 2758 "less": "*", 2583 2759 "lightningcss": "^1.21.0", 2584 2760 "sass": "*", 2585 2761 "sass-embedded": "*", 2586 2762 "stylus": "*", 2587 2763 "sugarss": "*", 2588 - "terser": "^5.4.0" 2764 + "terser": "^5.16.0", 2765 + "tsx": "^4.8.1", 2766 + "yaml": "^2.4.2" 2589 2767 }, 2590 2768 "peerDependenciesMeta": { 2591 2769 "@types/node": { 2592 2770 "optional": true 2593 2771 }, 2772 + "jiti": { 2773 + "optional": true 2774 + }, 2594 2775 "less": { 2595 2776 "optional": true 2596 2777 }, ··· 2611 2792 }, 2612 2793 "terser": { 2613 2794 "optional": true 2795 + }, 2796 + "tsx": { 2797 + "optional": true 2798 + }, 2799 + "yaml": { 2800 + "optional": true 2614 2801 } 2615 2802 } 2616 2803 }, ··· 2618 2805 "version": "0.6.2", 2619 2806 "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", 2620 2807 "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", 2621 - "dev": true 2808 + "dev": true, 2809 + "license": "MIT" 2622 2810 }, 2623 2811 "node_modules/wouter-preact": { 2624 2812 "version": "3.3.5",
+1 -1
neo/package.json
··· 14 14 "async-mutex": "^0.5.0", 15 15 "dayjs": "^1.11.13", 16 16 "dexie": "^4.0.8", 17 - "motion": "^10.18.0", 17 + "motion": "^11.0.3", 18 18 "preact": "^10.23.1", 19 19 "wouter-preact": "^3.3.1" 20 20 },
-112
neo/src/bits/conn-info/index.tsx
··· 1 - import "@css/connection-info.css"; 2 - import "@css/sidebar.css"; 3 - 4 - import { Signal } from "@preact/signals"; 5 - import { Connection } from "tubes_core"; 6 - import { DialogInnards } from "../dialog"; 7 - import { SidebarItem } from "../sidebar/sidebar-item"; 8 - 9 - export enum ConnInfoPage { 10 - About, 11 - Configuration, 12 - Profile, 13 - Channels, 14 - Storage, 15 - } 16 - 17 - const ConnectionInfo 18 - : DialogInnards<{ conn: Connection, page: Signal<ConnInfoPage | undefined> }> 19 - = ({ conn, page }) => { 20 - return <div class="conn-info"> 21 - <Sidebar conn={conn} page={page} /> 22 - {(() => { 23 - switch (page.value) { 24 - case ConnInfoPage.Configuration: return <ConfigurationPage conn={conn} />; 25 - case ConnInfoPage.Channels: return <ChannelsPage conn={conn} />; 26 - case ConnInfoPage.Profile: return <ProfilePage conn={conn} />; 27 - case ConnInfoPage.Storage: return <StoragePage conn={conn} />; 28 - default: return <AboutPage conn={conn} />; 29 - } 30 - })()} 31 - </div>; 32 - } 33 - 34 - import { ConnectionState } from "tubes_core/connection"; 35 - import StorageIcon from "~icons/ph/dresser"; 36 - import ChannelsIcon from "~icons/ph/hash"; 37 - import AboutIcon from "~icons/ph/info"; 38 - import DetailsIcon from "~icons/ph/pencil-simple"; 39 - import AccountIcon from "~icons/ph/user-square"; 40 - 41 - const Sidebar = ({ conn, page }: { conn: Connection, page: Signal<ConnInfoPage | undefined> }) => { 42 - const Item = ({ value, children }: { value: ConnInfoPage, children: any }) => <SidebarItem 43 - onClick={() => page.value = value} 44 - selected={page.value == value} 45 - > 46 - {children} 47 - </SidebarItem> 48 - 49 - return <aside class="sidebar"> 50 - <hgroup> 51 - <p>{(() => { 52 - switch (conn.$state.value) { 53 - case ConnectionState.Disconnected: return "disconnected from"; 54 - case ConnectionState.Disconnecting: return "disconnecting from"; 55 - case ConnectionState.Connecting: 56 - case ConnectionState.Registering: return "connecting to"; 57 - case ConnectionState.Connected: return "connected to"; 58 - case ConnectionState.Failed: return <span style="color: var(--colour-red-700);">aahh!!!</span>; 59 - } 60 - })()}</p> 61 - <h1>{conn.label}</h1> 62 - </hgroup> 63 - <ul> 64 - <SidebarItem 65 - onClick={() => page.value = ConnInfoPage.About} 66 - selected={page.value == ConnInfoPage.About || !page.value} 67 - > 68 - About <AboutIcon /> 69 - </SidebarItem> 70 - <Item value={ConnInfoPage.Configuration}>Configuration <DetailsIcon /></Item> 71 - <Item value={ConnInfoPage.Profile}>Profile <AccountIcon /></Item> 72 - <Item value={ConnInfoPage.Channels}>Channels <ChannelsIcon /></Item> 73 - <Item value={ConnInfoPage.Storage}>Storage <StorageIcon /></Item> 74 - </ul> 75 - </aside>; 76 - } 77 - 78 - const AboutPage = ({ conn }: { conn: Connection }) => { 79 - return <div class="about-page"> 80 - <h1>{conn.label}</h1> 81 - {conn.motd && <> 82 - <h2 class="heading">Message of the Day</h2> 83 - <pre>{conn.motd}</pre> 84 - </>} 85 - </div> 86 - } 87 - 88 - const ConfigurationPage = ({ }: { conn: Connection }) => { 89 - return <div class=""> 90 - <h1>Configuration</h1> 91 - </div> 92 - } 93 - 94 - const ChannelsPage = ({ }: { conn: Connection }) => { 95 - return <div class=""> 96 - <h1>Channels</h1> 97 - </div> 98 - } 99 - 100 - const ProfilePage = ({ }: { conn: Connection }) => { 101 - return <div class=""> 102 - <h1>Profile</h1> 103 - </div> 104 - } 105 - 106 - const StoragePage = ({ }: { conn: Connection }) => { 107 - return <div class=""> 108 - <h1>Storage</h1> 109 - </div> 110 - } 111 - 112 - export default ConnectionInfo;
+8 -9
neo/src/bits/dialog.tsx
··· 2 2 3 3 import { effect, signal } from "@preact/signals"; 4 4 import { reduced_motion } from "@src/support"; 5 - import { spring, timeline } from "motion"; 5 + import { animate } from "motion"; 6 6 import { useId } from "preact/hooks"; 7 7 import { createRef, render } from "preact"; 8 8 ··· 37 37 38 38 !reduced_motion() 39 39 ? transition(dialog_ref.current) 40 - .finished 41 40 .then(() => dialog_ref.current?.close()) 42 41 : dialog_ref.current?.close(); 43 42 }; ··· 87 86 } 88 87 } 89 88 90 - const dialog_spring = spring({ stiffness: 750, damping: 45 }); 89 + const dialog_spring = { type: "spring", stiffness: 750, damping: 45 }; 91 90 92 - const trans_in = (dialog: HTMLDialogElement) => timeline([ 91 + const trans_in = (dialog: HTMLDialogElement) => animate([ 93 92 [dialog.children[0], { opacity: [0, 1], scale: [0.5, 1] }], 94 93 [".dialog-scrim", { opacity: [0, 1] }, { at: 0 }], 95 - ], { defaultOptions: { easing: dialog_spring } }); 94 + ], { defaultTransition: dialog_spring }); 96 95 97 - const trans_out_cancel = (dialog: HTMLDialogElement) => timeline([ 96 + const trans_out_cancel = (dialog: HTMLDialogElement) => animate([ 98 97 [dialog.children[0], { opacity: [1, 0, null], scale: [1, 0.75] }, { at: 0 }], 99 98 [".dialog-scrim", { opacity: [1, 0] }, { at: 0 }], 100 - ], { defaultOptions: { easing: dialog_spring } }); 99 + ], { defaultTransition: dialog_spring }); 101 100 102 - const trans_out = (dialog: HTMLDialogElement) => timeline([ 101 + const trans_out = (dialog: HTMLDialogElement) => animate([ 103 102 [dialog.children[0], { opacity: [1, 0, null], scale: [1, 1.25] }], 104 103 [".dialog-scrim", { opacity: [1, 0] }, { at: 0 }], 105 - ], { defaultOptions: { easing: dialog_spring } }); 104 + ], { defaultTransition: dialog_spring });
+8 -8
neo/src/bits/menu.tsx
··· 2 2 import { createRef, FunctionalComponent, render } from "preact"; 3 3 import { useId } from "preact/hooks"; 4 4 import "@css/menu.css"; 5 - import { spring, timeline } from "motion"; 5 + import { animate } from "motion"; 6 + 7 + const coolspring = { type: "spring", stiffness: 3000, damping: 150, mass: 2 }; 6 8 7 - const animate_in = (elem: Element) => timeline([ 9 + const animate_in = (elem: Element) => animate([ 8 10 [elem.children[0], { scale: [0, 1] }, { at: 0 }], 9 11 [elem, { opacity: [0, 1] }, { at: 0 }], 10 - ], { defaultOptions: { easing: coolspring() } }); 11 - 12 - const coolspring = () => spring({ stiffness: 750, damping: 40 }); 12 + ], { defaultTransition: coolspring }); 13 13 14 - const animate_out = (elem: Element) => timeline([ 14 + const animate_out = (elem: Element) => animate([ 15 15 [elem.children[0], { scale: [1, 0] }, { at: 0 }], 16 16 [elem, { opacity: [1, 0] }, { at: 0 }], 17 - ], { defaultOptions: { easing: coolspring() } }); 17 + ], { defaultTransition: coolspring }); 18 18 19 19 export interface Menu { 20 20 open: (ev?: MouseEvent) => void; ··· 40 40 const id = useId(); 41 41 42 42 const on_outside_click = async () => { 43 - await animate_out(dialog_ref.current!).finished; 43 + await animate_out(dialog_ref.current!); 44 44 dialog_ref.current?.close(); 45 45 }; 46 46
+44 -44
neo/src/bits/navigator.tsx
··· 1 1 import { useSignal } from "@preact/signals"; 2 2 import { reduced_motion } from "@src/support"; 3 - import { animate, spring, timeline } from "motion"; 3 + import { animate } from "motion"; 4 4 import { ComponentChild, FunctionalComponent } from "preact"; 5 5 import { HTMLProps } from "preact/compat"; 6 6 import { useLayoutEffect, useRef } from "preact/hooks"; ··· 15 15 const MiniNavigator 16 16 : FunctionalComponent<{ children: Page, transitions?: boolean } & HTMLProps<HTMLDivElement>> 17 17 = ({ children, transitions, ...rest }) => { 18 - const page_stack = useSignal<Page[]>([children]); 18 + const page_stack = useSignal<Page[]>([children]); 19 19 20 - const navigator_div = useRef<HTMLDivElement>(null); 21 - const first = navigator_div.current?.getBoundingClientRect(); 22 - const div_children = () => navigator_div.current!.children as unknown as Element[]; 23 - const animate_out = async () => transitions && !reduced_motion() && animate( 24 - div_children(), 25 - { opacity: 0 }, 26 - { duration: .1 } 27 - ).finished 20 + const navigator_div = useRef<HTMLDivElement>(null); 21 + const first = navigator_div.current?.getBoundingClientRect(); 22 + const div_children = () => navigator_div.current!.children as unknown as Element[]; 23 + const animate_out = async () => transitions && !reduced_motion() && await animate( 24 + div_children(), 25 + { opacity: 0 }, 26 + { duration: .1 } 27 + ); 28 28 29 - const controls: NavigatorControls = { 30 - push: (x) => animate_out().then(() => 31 - page_stack.value = [...page_stack.value, x] 32 - ), 33 - pop: () => animate_out().then(() => 34 - page_stack.value = page_stack.value.slice(0, -1) 35 - ), 36 - } 29 + const controls: NavigatorControls = { 30 + push: (x) => animate_out().then(() => 31 + page_stack.value = [...page_stack.value, x] 32 + ), 33 + pop: () => animate_out().then(() => 34 + page_stack.value = page_stack.value.slice(0, -1) 35 + ), 36 + } 37 37 38 - useLayoutEffect(() => { 39 - if (!navigator_div.current || !first || !transitions || reduced_motion()) return; 40 - const last = navigator_div.current.getBoundingClientRect(); 38 + useLayoutEffect(() => { 39 + if (!navigator_div.current || !first || !transitions || reduced_motion()) return; 40 + const last = navigator_div.current.getBoundingClientRect(); 41 41 42 - const current_style = navigator_div.current.getAttribute("style"); 43 - navigator_div.current.style.overflow = "hidden"; 42 + const current_style = navigator_div.current.getAttribute("style"); 43 + navigator_div.current.style.overflow = "hidden"; 44 44 45 - timeline([ 46 - [div_children(), { opacity: 0 }, { duration: 0 }], 47 - [ 48 - navigator_div.current, 49 - { 50 - width: [first.width + "px", last.width + "px"], 51 - height: [first.height + "px", last.height + "px"], 52 - }, 53 - { easing: spring({ stiffness: 750, damping: 40 }) } 54 - ], 55 - [div_children(), { opacity: 1 }, { easing: "ease-out", duration: 0.15, at: 0.1 }] 56 - ]).finished.then(() => { 57 - navigator_div.current!.setAttribute("style", current_style ?? ""); 58 - navigator_div.current!.style.overflow = "unset"; 59 - }); 45 + animate([ 46 + [div_children(), { opacity: 0 }, { duration: 0 }], 47 + [ 48 + navigator_div.current, 49 + { 50 + width: [first.width + "px", last.width + "px"], 51 + height: [first.height + "px", last.height + "px"], 52 + }, 53 + { type: "spring", stiffness: 750, damping: 40 }, 54 + ], 55 + [div_children(), { opacity: 1 }, { ease: "easeOut", duration: 0.15, at: 0.1 }] 56 + ]).then(() => { 57 + navigator_div.current!.setAttribute("style", current_style ?? ""); 58 + navigator_div.current!.style.overflow = "unset"; 59 + }); 60 60 61 - console.log(first, last); 62 - }, [page_stack.value]) 61 + console.log(first, last); 62 + }, [page_stack.value]) 63 63 64 - return <div class="navigator" ref={navigator_div} {...rest}> 65 - {page_stack.value.at(-1)?.(controls)} 66 - </div> 67 - } 64 + return <div class="navigator" ref={navigator_div} {...rest}> 65 + {page_stack.value.at(-1)?.(controls)} 66 + </div> 67 + } 68 68 69 69 export default MiniNavigator;
+1 -1
neo/src/bits/sidebar/add-network.tsx
··· 39 39 } 40 40 41 41 const error = signal(""); 42 - return <MiniNavigator transitions style="padding: .75rem; width: 36rem;"> 42 + return <MiniNavigator transitions style="padding: 1rem; width: 36rem;"> 43 43 {controls => <> 44 44 <hgroup style="margin-bottom: 1rem"> 45 45 <h2 class="heading">Add a Network</h2>
+46 -60
neo/src/bits/sidebar/network-section.tsx
··· 8 8 import { ConnectionErrorCode, ConnectionState } from "tubes_core/connection"; 9 9 import { useLocation } from "wouter-preact"; 10 10 import { IconButton, TextButton } from "../buttons"; 11 - import ConnectionInfo, { ConnInfoPage } from "../conn-info"; 12 - import { create_dialog } from "../dialog"; 13 11 import { create_menu, MenuItem } from "../menu.tsx"; 14 12 import { SidebarLink } from "./sidebar-item"; 15 13 import SidebarSection from "./sidebar-section"; ··· 20 18 import ConnectionFailedIcon from "~icons/ph/diamond-fill"; 21 19 import EtcIcon from "~icons/ph/dots-three-bold"; 22 20 import DebugIcon from "~icons/ph/hammer"; 23 - import ConnectingIcon from "~icons/ph/hourglass-simple-fill"; 24 21 import RegisterIcon from "~icons/ph/identification-badge"; 25 22 import InfoIcon from "~icons/ph/info"; 26 23 import DisconnectedIcon from "~icons/ph/moon-fill"; ··· 32 29 import LoginIcon from "~icons/ph/sign-in"; 33 30 import { ChatBuffer } from "tubes_core/buffer"; 34 31 import { useEffect } from "preact/hooks"; 32 + import Spinner from "@src/bits/spinner.tsx"; 35 33 36 34 export const NetworkSection: FunctionalComponent<{ conn: Connection; }> = ({ conn }) => { 37 35 const errored = conn.$state.value == ConnectionState.Failed; ··· 56 54 57 55 const [, set_location] = useLocation(); 58 56 59 - const diag_page = useSignal<ConnInfoPage>(); 60 - const details_diag = create_dialog(ConnectionInfo, { 61 - conn, page: diag_page 62 - }); 63 - 64 57 const icon = useComputed(() => { 58 + if (recovering) { 59 + return <Spinner title="Reconnecting" />; 60 + } 65 61 switch (conn.$state.value) { 66 62 case ConnectionState.Disconnected: 67 63 case ConnectionState.Disconnecting: 68 - return <DisconnectedIcon title="Disconnected"/>; 64 + return <DisconnectedIcon title="Disconnected" />; 69 65 70 66 case ConnectionState.Connecting: 71 67 case ConnectionState.Registering: 72 - return <ConnectingIcon title="Connecting"/>; 68 + return <Spinner title="Connecting" />; 73 69 74 70 case ConnectionState.Failed: 75 - return <ConnectionFailedIcon title="Failed to Connect"/>; 71 + return <ConnectionFailedIcon title="Failed to Connect" />; 76 72 77 73 case ConnectionState.Connected: 78 74 return <></>; ··· 131 127 </MenuItem>} 132 128 133 129 <MenuItem 134 - onClick={() => { 135 - details_diag.open() 136 - }} 130 + onClick={() => set_location(`${connection_base(conn)}/info`)} 137 131 icon={InfoIcon} 138 132 > 139 133 Details ··· 161 155 {/* da header */} 162 156 <header class="sidebar-section-header"> 163 157 {/* connection label */} 164 - <h2> 165 - <button 166 - class={`${disconnected ? "disconnected" : ""} ${errored ? "errored" : ""}`} 167 - onClick={e => details_diag.open(e)} 168 - > 169 - {icon} 170 - {adapter_icon} 171 - {conn.label} 172 - </button> 173 - </h2> 158 + <button 159 + class={`title ${disconnected ? "disconnected" : ""} ${errored ? "errored" : ""}`} 160 + onClick={() => set_location(`${connection_base(conn)}/info`)} 161 + > 162 + {icon} 163 + {adapter_icon} 164 + <h2> 165 + <span class="label">{conn.label}</span> 166 + </h2> 167 + </button> 174 168 175 169 {/* buttons */} 176 - {errored || disconnected 177 - ? <IconButton 170 + {errored || disconnected && 171 + <IconButton 178 172 title="Connect" 179 173 onClick={() => conn.connect()} 180 174 > 181 - <ConnectIcon aria-hidden/> 182 - </IconButton> 183 - : <IconButton 184 - title="Connection Info" 185 - onClick={(e) => { 186 - diag_page.value = ConnInfoPage.About; 187 - details_diag.open(e) 188 - }} 189 - > 190 - <InfoIcon aria-hidden/> 175 + <ConnectIcon aria-hidden /> 191 176 </IconButton> 192 177 } 193 178 <IconButton 194 - onClick={(e) => { 195 - diag_page.value = ConnInfoPage.Configuration; 196 - details_diag.open(e) 197 - }} 179 + onClick={() => set_location(`${connection_base(conn)}/config`)} 198 180 title="Configure" 199 181 > 200 - <ConfIcon aria-hidden/> 182 + <ConfIcon aria-hidden /> 201 183 </IconButton> 202 - <IconButton title="More Stuff" onClick={(e) => menu.open(e)}><EtcIcon aria-hidden/></IconButton> 184 + <IconButton title="More Stuff" onClick={(e) => menu.open(e)}><EtcIcon aria-hidden /></IconButton> 185 + 186 + {recovering && conn.$state.value != ConnectionState.Connected 187 + && <p class="reconnecting"> 188 + {recover_countdown.value <= 0 189 + ? "Reconnecting..." 190 + : `Reconnecting in ${recover_countdown.value}s` 191 + } 192 + </p> 193 + } 203 194 </header> 204 195 205 - {recovering && conn.$state.value != ConnectionState.Connected 206 - && <p class="reconnecting"> 207 - {recover_countdown.value <= 0 208 - ? "Reconnecting..." 209 - : `Reconnecting in ${recover_countdown.value}s` 210 - } 211 - </p> 212 - } 213 - 214 196 {/* error message if there is one */} 215 - {errored && !recovering && <div class="connection-error"><ConnErrorMessage conn={conn}/></div>} 197 + {errored && !recovering && <div class="connection-error"><ConnErrorMessage conn={conn} /></div>} 216 198 217 199 {/* list of buffers */} 218 200 <ul class="sidebar-list"> 201 + <SidebarLink to={`${connection_base(conn)}/info`}> 202 + Details <InfoIcon /> 203 + </SidebarLink> 204 + 219 205 {/* buffers */} 220 - {dms.value.length != 0 && <h3>Channels</h3>} 221 - {channels.value.map(x => <BufferListItem buffer={x}/>)} 206 + {<h3>Channels</h3>} 207 + {channels.value.map(x => <BufferListItem buffer={x} />)} 222 208 <SidebarLink to={`${connection_base(conn)}/join`}> 223 - Join Channel <JoinIcon/> 209 + Join Channel <JoinIcon /> 224 210 </SidebarLink> 225 211 {dms.value.length != 0 && <h3>Direct Messages</h3>} 226 - {dms.value.map(x => <BufferListItem buffer={x}/>)} 212 + {dms.value.map(x => <BufferListItem buffer={x} />)} 227 213 </ul> 228 214 </SidebarSection>; 229 215 }; ··· 242 228 const ConnErrorMessage: FunctionalComponent<{ conn: Connection }> = ({ conn }) => { 243 229 switch (conn.$error.value?.[0]) { 244 230 case ConnectionErrorCode.NickTaken: 245 - return <NickTaken conn={conn}/> 231 + return <NickTaken conn={conn} /> 246 232 case ConnectionErrorCode.SocketError: 247 - return <SocketError conn={conn}/> 233 + return <SocketError conn={conn} /> 248 234 case ConnectionErrorCode.Banned: 249 - return <Banned conn={conn}/> 235 + return <Banned conn={conn} /> 250 236 // case ConnectionError.SaslFailed: 251 237 // case ConnectionError.SaslTooLong: 252 238 // case ConnectionError.SaslAborted: ··· 289 275 return <> 290 276 <h3>Couldn't Connect</h3> 291 277 <p class="body-small low-emphasis"> 292 - Tubes could not connect to <i>{conn.config.url}</i>. <br/> 278 + Tubes could not connect to <i>{conn.config.url}</i>. <br /> 293 279 Check if you're connected to the internet, the URL is correct 294 280 and the network isn't experiencing any downtime. 295 281 </p>
+56
neo/src/bits/spinner.tsx
··· 1 + import { useEffect, useId } from "preact/hooks"; 2 + import { animate, stagger } from "motion"; 3 + import { HTMLProps } from "preact/compat"; 4 + 5 + export default function Spinner({ size, active_colour, inactive_colour, ...rest }: { 6 + size?: number; 7 + active_colour?: string; 8 + inactive_colour?: string; 9 + } & HTMLProps<SVGElement>) { 10 + const id = useId(); 11 + size = size ?? 16; 12 + 13 + useEffect(() => { 14 + const spinner = document.getElementById(id)!; 15 + const segments = spinner.querySelectorAll("path"); 16 + const inactive = inactive_colour ?? "var(--colour-grey-200)"; 17 + const active = active_colour ?? "var(--colour-grey-600)"; 18 + 19 + const offset = .1; 20 + const delay = (segments.length - 1) * offset; 21 + 22 + const anim = animate( 23 + segments, 24 + { "--scale": [1.15, 1], "--fill": [active, inactive] }, 25 + { 26 + repeat: Infinity, 27 + repeatType: "mirror", 28 + repeatDelay: delay, 29 + delay: stagger(offset, { ease: "linear", startDelay: -1 }), 30 + 31 + duration: 0.4, 32 + bounce: 0.4, 33 + type: "spring", 34 + } 35 + ); 36 + 37 + return () => anim.stop(); 38 + }); 39 + // @ts-ignore 40 + return <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23.65 23.95" width={size} height={size} class="spinner" 41 + id={id} {...rest}> 42 + <path class="sect" d="M9.83,4c0-2.53.47-4,2-4s2,1.47,2,4c0,2-.53,4-2,4s-2-2-2-4Z"/> 43 + <path class="sect" 44 + d="M16.84,5.88c2.06-1.47,3.53-1.94,4.42-.69s-.04,2.48-2.09,3.95c-1.63,1.16-3.56,1.89-4.42.69s.47-2.79,2.09-3.95Z"/> 45 + <path class="sect" 46 + d="M20.06,12.53c2.48.47,3.84,1.21,3.56,2.71s-1.82,1.69-4.3,1.22c-1.97-.37-3.83-1.26-3.56-2.71s2.34-1.59,4.3-1.22Z"/> 47 + <path class="sect" 48 + d="M17.18,19.27c1.13,2.26,1.36,3.79,0,4.47s-2.45-.43-3.57-2.69c-.89-1.79-1.31-3.82,0-4.47s2.68.9,3.57,2.69Z"/> 49 + <path class="sect" 50 + d="M10.06,21.06c-1.13,2.26-2.21,3.37-3.57,2.69s-1.13-2.21,0-4.47c.89-1.79,2.25-3.35,3.57-2.69s.9,2.68,0,4.47Z"/> 51 + <path class="sect" 52 + d="M4.34,16.46c-2.48.47-4.02.28-4.3-1.22s1.08-2.24,3.56-2.71c1.97-.37,4.03-.22,4.3,1.22s-1.59,2.34-3.56,2.71Z"/> 53 + <path class="sect" 54 + d="M4.49,9.14c-2.06-1.47-2.98-2.71-2.09-3.95s2.36-.77,4.42.69c1.63,1.16,2.95,2.75,2.09,3.95s-2.79.47-4.42-.69Z"/> 55 + </svg> 56 + }
+4
neo/src/buffer/channel-info.tsx
··· 1 + export default function ChannelInfoDialog() { 2 + 3 + return <></> 4 + }
+1 -1
neo/src/buffer/list-elements.tsx
··· 68 68 import { useComputed } from "@preact/signals"; 69 69 import { IrcChannel } from "tubes_core/channel"; 70 70 import GoneIcon from "~icons/ph/arrow-left"; 71 - import { BufferContext } from "./view"; 71 + import { BufferContext } from "./page"; 72 72 73 73 export const Nick 74 74 : FunctionalComponent<{ colour?: string, nick: string, max_length?: number }>
+11
neo/src/buffer/members.tsx
··· 1 + import { FunctionalComponent } from "preact"; 2 + import { IrcChannel } from "tubes_core/channel"; 3 + 4 + export const MembersPanel: FunctionalComponent<{ channel: IrcChannel }> = ({channel}) => { 5 + const members = channel.$members.value; 6 + return <aside class="members-panel"> 7 + <ul> 8 + {members.map(x => <li>{x}</li>)} 9 + </ul> 10 + </aside> 11 + }
+59 -47
neo/src/buffer/view.tsx neo/src/buffer/page.tsx
··· 1 1 import "@css/messages.css"; 2 - import { Signal, useSignal } from "@preact/signals"; 2 + import { signal, Signal, useSignal } from "@preact/signals"; 3 3 import { execute_command } from "@src/chat/commands"; 4 4 import ReadMarkers, { ReadMarker } from "@src/chat/read"; 5 5 import Storage from "@src/chat/storage"; ··· 42 42 }); 43 43 } 44 44 45 - const BufferView: FunctionalComponent<{ buffer: ChatBuffer }> = ({ buffer }) => { 45 + const members_panel_open = signal(false); 46 + 47 + const BufferPage: FunctionalComponent<{ buffer: ChatBuffer }> = ({ buffer }) => { 46 48 const msgs = useSignal<IrcMessage[]>([]); 47 49 const marker = ReadMarkers.get(buffer.name, buffer.conn); 48 50 const is_loading = useSignal(false); 49 51 const finished_init = useSignal(false); 50 52 const list_elem = useRef<HTMLUListElement>(null); 53 + const is_channel = buffer instanceof IrcChannel; 51 54 52 55 const to_bottom = () => list_elem.current?.scroll({ top: list_elem.current?.scrollHeight }); 53 56 ··· 87 90 88 91 return <BufferContext.Provider value={buffer}> 89 92 <div class={`message-list ${message_style.value}`}> 90 - {buffer instanceof IrcChannel ? <ChannelHeader channel={buffer} debug_menu={DebugMenu}/> : <div/>} 93 + {is_channel ? <ChannelHeader channel={buffer} debug_menu={DebugMenu} /> : <div />} 91 94 {finished_init.value 92 95 ? <MessageList 93 96 list_elem={list_elem} ··· 101 104 marker.focused.value = elem.scrollHeight <= elem.scrollTop + elem.clientHeight + padding; 102 105 }} 103 106 /> 104 - : <SkeletonLoader ref2={list_elem}/> 107 + : <SkeletonLoader ref2={list_elem} /> 105 108 } 106 - {marker.unread_count.value != 0 && <UnreadBanner marker={marker}/>} 109 + {marker.unread_count.value != 0 && <UnreadBanner marker={marker} />} 107 110 <MessageInput 108 111 is_scrolled={!marker.focused.value} 109 112 onSubmit={async (text, is_cmd) => { ··· 123 126 msgs.value = [...msgs.value, msg]; 124 127 }} 125 128 /> 129 + {is_channel && members_panel_open.value ? <MembersPanel channel={buffer} /> : ""} 126 130 </div> 127 131 </BufferContext.Provider>; 128 132 } 129 133 130 134 export const MessageList 131 135 : FunctionalComponent<{ 132 - list_elem: RefObject<HTMLUListElement>, 133 - buffer: ChatBuffer, 134 - is_loading: Signal<boolean>, 135 - msgs: Signal<IrcMessage[]>, 136 - onScroll: HTMLProps<HTMLUListElement>['onScroll'], 137 - }> 136 + list_elem: RefObject<HTMLUListElement>, 137 + buffer: ChatBuffer, 138 + is_loading: Signal<boolean>, 139 + msgs: Signal<IrcMessage[]>, 140 + onScroll: HTMLProps<HTMLUListElement>['onScroll'], 141 + }> 138 142 = ({ list_elem, is_loading, onScroll, buffer, msgs }) => { 139 - const squished = squish_messages(buffer, msgs.value); 140 - return <ul class="messages" ref={list_elem} onScroll={onScroll}> 141 - {/* header. todo: should not be in a ul element */} 142 - <StartOfHistory buffer={buffer}/> 143 + const squished = squish_messages(buffer, msgs.value); 144 + return <ul class="messages" ref={list_elem} onScroll={onScroll}> 145 + {/* header. todo: should not be in a ul element */} 146 + <StartOfHistory buffer={buffer} /> 143 147 144 - {/* history getting bits */} 145 - {is_loading.value && "loadin"} 146 - {/* <LoadTrigger onIntersect={async () => {}} parent={list_elem} /> */} 148 + {/* history getting bits */} 149 + {is_loading.value && "loadin"} 150 + {/* <LoadTrigger onIntersect={async () => {}} parent={list_elem} /> */} 147 151 148 - {/* the messages themselves */} 149 - {squished} 150 - </ul>; 151 - } 152 + {/* the messages themselves */} 153 + {squished} 154 + </ul>; 155 + } 152 156 153 157 154 158 const UnreadBanner 155 159 : FunctionalComponent<{ marker: ReadMarker }> 156 160 = ({ marker }) => <div class="unread-banner"> 157 - <span class="number">{marker.unread_count}</span> 158 - unread {marker.unread_count.value == 1 ? "message" : "messages"} 159 - </div> 161 + <span class="number">{marker.unread_count}</span> 162 + unread {marker.unread_count.value == 1 ? "message" : "messages"} 163 + </div> 160 164 161 165 const ChannelHeader 162 166 : FunctionalComponent<{ channel: IrcChannel, debug_menu: Menu }> 163 167 = ({ channel, debug_menu }) => <header class="channel-header"> 164 - <h1> 165 - {channel.name} 166 - </h1> 167 - <p> 168 - {channel.$topic.value} 169 - </p> 170 - {process.env.NODE_ENV == "development" && 171 - <IconButton onClick={debug_menu.open}><DebugIcon/></IconButton> 172 - } 173 - <MemberCount count={channel.$members.value.length}/> 174 - </header> 168 + <div class="text"> 169 + <h1> 170 + {channel.name} 171 + </h1> 172 + <p> 173 + {channel.$topic.value} 174 + </p> 175 + </div> 176 + {process.env.NODE_ENV == "development" && 177 + <IconButton onClick={debug_menu.open}><DebugIcon /></IconButton> 178 + } 179 + <MemberCount count={channel.$members.value.length} /> 180 + </header> 175 181 176 182 const MemberCount: FunctionalComponent<{ count: number }> = ({ count }) => { 177 - return <IconButton><MembersIcon/>{count}</IconButton> 183 + return <IconButton 184 + onClick={() => members_panel_open.value = !members_panel_open.value} 185 + class={members_panel_open.value ? "active" : ""} 186 + > 187 + <MembersIcon />{count} 188 + </IconButton> 178 189 } 179 190 180 191 import DebugIcon from "~icons/ph/hammer"; 181 192 import { create_menu, Menu, MenuItem } from "@src/bits/menu.tsx"; 193 + import { MembersPanel } from "./members"; 182 194 183 195 const StartOfHistory: FunctionalComponent<{ buffer: ChatBuffer }> = ({ buffer }) => { 184 196 const chathistory = buffer.conn.capabilities.has("draft/chathistory"); ··· 187 199 <p class="subtitle">this is the start of the channel's logs.</p> 188 200 {!chathistory && 189 201 <p class="chathistory-warning"> 190 - <Trangle aria-hidden/> Messages sent while Tubes was closed might not be shown. 191 - <a href="/">Learn More</a> 202 + <Trangle aria-hidden /> Messages sent while Tubes was closed might not be shown. 203 + {/* <a href="/">Learn More</a> */} 192 204 </p>} 193 205 194 206 </div> ··· 197 209 const SkeletonLoader 198 210 : FunctionalComponent<{ ref2: RefObject<HTMLUListElement> }> 199 211 = ({ ref2 }) => <ul ref={ref2} class="messages skeleton"> 200 - {Array.from({ length: 50 }, () => { 201 - return <li aria-hidden> 202 - <span class="name">{"h".repeat(Math.floor(Math.random() * 10))}</span> 203 - <p>{"h ".repeat(Math.floor(Math.random() * 75))}</p> 204 - </li> 205 - })} 206 - </ul> 212 + {Array.from({ length: 50 }, () => { 213 + return <li aria-hidden> 214 + <span class="name">{"h".repeat(Math.floor(Math.random() * 10))}</span> 215 + <p>{"h ".repeat(Math.floor(Math.random() * 75))}</p> 216 + </li> 217 + })} 218 + </ul> 207 219 208 - export default BufferView; 220 + export default BufferPage;
+5 -1
neo/src/chat/adapters.ts
··· 3 3 import { SojuAdapter } from "tubes_core/soju/adapter"; 4 4 import tubes_handler from "./handler"; 5 5 import tubes_history from "./history"; 6 + import storage from "./storage"; 6 7 7 8 export const adapters = signal<Adapter[]>([]); 8 9 9 10 export const add_adapter = () => { 10 11 const adapter = new SojuAdapter({ 11 12 id: "yeah", 13 + url: "wss://irc.pronounmail.com/", 14 + username: "leah", 15 + password: "checkyourwifesemail", 12 16 }, { 13 17 history_fetcher: tubes_history, 14 18 handler: tubes_handler, 15 19 on_connect(conn) { 16 - conn.queue.subscribe("tubes storage", (msg) => store_message(conn, msg)); 20 + conn.queue.subscribe("tubes storage", (msg) => storage.store_message(msg, conn)); 17 21 }, 18 22 }); 19 23
+2 -1
neo/src/chat/conns.ts
··· 7 7 import tubes_handler from "./handler"; 8 8 import tubes_history from "./history"; 9 9 import { chathistory } from "tubes_core/history"; 10 + import { ChatBuffer } from "tubes_core/buffer"; 10 11 11 12 const local_connections: Signal<Connection[]> = signal([]); 12 13 export const connections: Signal<Connection[]> = computed(() => [ ··· 29 30 30 31 function init_connection(config: ConnectionConfig): WsConnection { 31 32 const conn: WsConnection = new WsConnection(config, { 32 - history_fetcher: tubes_history, 33 + history_fetcher: chathistory, 33 34 handler: tubes_handler, 34 35 }); 35 36
+2 -2
neo/src/chat/storage.ts
··· 74 74 false, true, 75 75 ); 76 76 77 - const cursor = await timestamps.openCursor(range, "prev"); 77 + let cursor = await timestamps.openCursor(range, "prev"); 78 78 const msgs = []; 79 79 let count = 0; 80 80 // todo: this could get slow over time. ··· 89 89 msgs.push(cursor.value); 90 90 count++; 91 91 } 92 - await cursor.continue(); 92 + cursor = await cursor.continue(); 93 93 } 94 94 95 95 return msgs.toReversed();
+4
neo/src/css/buttons.css
··· 14 14 &:hover { 15 15 background-color: var(--colour-grey-100); 16 16 } 17 + 18 + &.active { 19 + background-color: var(--colour-accent-200); 20 + } 17 21 } 18 22 19 23 .text-button {
-54
neo/src/css/connection-info.css
··· 1 - .conn-info { 2 - display: grid; 3 - grid-template-columns: 16rem 1fr; 4 - 5 - height: max(24rem, 80vh); 6 - width: max(64rem, 90vh); 7 - 8 - aside.sidebar { 9 - display: flex; 10 - flex-direction: column; 11 - border-right: 1px solid var(--colour-grey-100); 12 - padding: .75rem .25rem; 13 - 14 - ul { 15 - list-style: none; 16 - padding: 0; 17 - margin: 0; 18 - 19 - display: flex; 20 - flex-direction: column; 21 - gap: .15rem; 22 - } 23 - 24 - hgroup { 25 - padding: .75rem; 26 - 27 - p { 28 - margin: 0; 29 - font-size: .8rem; 30 - font-style: italic; 31 - color: var(--colour-grey-700); 32 - user-select: none; 33 - } 34 - 35 - h1 { 36 - margin: 0; 37 - margin-top: .5rem; 38 - font-size: .9rem; 39 - font-weight: 500; 40 - } 41 - } 42 - } 43 - } 44 - 45 - .conn-info .about-page { 46 - padding: .75rem; 47 - position: relative; 48 - overflow-x: hidden; 49 - 50 - h1 { 51 - color: var(--colour-grey-700); 52 - margin-top: 0; 53 - } 54 - }
+12
neo/src/css/main.css
··· 187 187 width: 12px; 188 188 height: 12px; 189 189 } 190 + } 191 + 192 + .spinner { 193 + overflow: visible; 194 + --active: white; 195 + --inactive: black; 196 + 197 + .sect { 198 + scale: var(--scale); 199 + transform-origin: center; 200 + fill: var(--fill); 201 + } 190 202 }
+10 -3
neo/src/css/messages.css
··· 387 387 388 388 align-items: center; 389 389 390 + .text { 391 + display: flex; 392 + align-items: baseline; 393 + gap: .5rem; 394 + } 395 + 390 396 h1 { 391 397 font-size: .95rem; 392 398 margin: 0; ··· 402 408 white-space: nowrap; 403 409 overflow: hidden; 404 410 text-overflow: ellipsis; 405 - align-self: baseline; 406 411 } 407 412 408 413 .icon-button { 409 - align-self: center; 410 - 411 414 svg { 412 415 width: 16px; 413 416 height: 16px; ··· 560 563 background-color: var(--colour-accent-600); 561 564 color: white; 562 565 } 566 + } 567 + 568 + .members-panel { 569 + display: flex; 563 570 }
+78
neo/src/css/network-info.css
··· 1 + .network-info { 2 + display: grid; 3 + grid-auto-rows: max-content; 4 + grid-template-columns: 1fr 1fr 1fr; 5 + max-width: 56rem; 6 + padding: 0 1rem; 7 + gap: 1rem; 8 + margin: auto; 9 + 10 + hgroup { 11 + grid-column: 1 / -1; 12 + display: flex; 13 + flex-direction: column; 14 + gap: .5rem; 15 + height: 12rem; 16 + align-items: center; 17 + justify-content: center; 18 + 19 + position: relative; 20 + 21 + h1 { 22 + font-weight: 100; 23 + font-size: 3rem; 24 + font-stretch: ultra-expanded; 25 + font-variation-settings: 'GRAD' 50; 26 + text-align: center; 27 + color: var(--colour-grey-700); 28 + grid-column: 1 / -1; 29 + margin: 0; 30 + } 31 + 32 + .status { 33 + text-align: center; 34 + margin: 0; 35 + font-size: 1rem; 36 + font-weight: 500; 37 + 38 + &.connected { 39 + color: var(--colour-ectoplasm-700); 40 + } 41 + } 42 + } 43 + 44 + .motd { 45 + grid-column: 1 / span 2; 46 + position: relative; 47 + 48 + pre { 49 + background-color: var(--colour-grey-50); 50 + border-radius: 8px; 51 + padding: .75rem; 52 + white-space: pre-line; 53 + } 54 + 55 + button { 56 + position: absolute; 57 + left: 0; 58 + right: 0; 59 + bottom: -2rem; 60 + 61 + margin: auto; 62 + width: max-content; 63 + } 64 + 65 + &:not(.expanded) { 66 + button { 67 + bottom: 1rem; 68 + } 69 + 70 + pre { 71 + max-height: 12rem; 72 + overflow: hidden; 73 + 74 + mask-image: linear-gradient(to bottom, black, transparent 90%); 75 + } 76 + } 77 + } 78 + }
+65 -32
neo/src/css/sidebar.css
··· 55 55 section.sidebar-section { 56 56 margin-top: .75rem; 57 57 58 - > header > h2 { 59 - margin: 0; 60 - margin-right: auto; 61 - } 62 - 63 - > header > h2 > button { 58 + .title { 64 59 all: unset; 65 60 cursor: pointer; 66 61 ··· 75 70 76 71 display: flex; 77 72 align-items: baseline; 78 - gap: .25rem; 79 - 80 - svg { 81 - width: 10px; 82 - height: 10px; 83 - } 73 + gap: 0 .25rem; 84 74 85 75 &.errored { 86 76 color: var(--colour-red-800); ··· 91 81 color: var(--colour-grey-700); 92 82 font-weight: 400; 93 83 font-variation-settings: 'GRAD' 0; 84 + } 85 + 86 + &:has(~ .reconnecting) { 87 + color: var(--colour-grey-700); 88 + font-weight: 400; 94 89 } 95 90 96 91 &:hover { ··· 103 98 } 104 99 } 105 100 101 + .title svg { 102 + width: 10px; 103 + height: 10px; 104 + } 105 + 106 106 &:has(+ .sidebar-section) { 107 107 padding-bottom: .5rem; 108 108 border-bottom: 1px solid var(--colour-grey-100); 109 109 } 110 110 111 - > header { 112 - display: flex; 111 + > .sidebar-section-header { 112 + display: grid; 113 113 align-items: center; 114 114 gap: .25rem; 115 115 margin: 0 var(--inner-padding); 116 116 margin-bottom: .25rem; 117 117 margin-right: .5rem; 118 + max-width: 100%; 118 119 119 - & > button { 120 + grid-template-columns: min-content 1fr; 121 + grid-auto-columns: max-content; 122 + grid-auto-flow: column; 123 + 124 + .title { 125 + grid-column: 1 / span 2; 126 + display: grid; 127 + grid-template-columns: subgrid; 128 + } 129 + 130 + h2 { 131 + all: inherit; 132 + 133 + display: grid; 134 + grid-template-columns: subgrid; 135 + grid-column: 1 / span 2; 136 + 137 + svg + & { 138 + grid-column: 2; 139 + } 140 + } 141 + 142 + .reconnecting { 143 + grid-column: 2; 144 + grid-row: 2; 145 + margin: 0; 146 + font-size: .7rem; 147 + font-weight: 500; 148 + font-variation-settings: 'GRAD' 100; 149 + color: var(--colour-orange-700); 150 + } 151 + 152 + & > .icon-button { 120 153 color: transparent; 121 154 transition: color 75ms var(--easing-subtle-out); 155 + grid-row: 1; 122 156 123 157 &:last-of-type { 124 158 color: var(--colour-grey-400); ··· 126 160 } 127 161 } 128 162 129 - &:hover > header > button, 130 - &:has(:focus-visible) > header > button { 163 + &:hover > header > .icon-button, 164 + &:has(:focus-visible) > header > .icon-button { 131 165 color: var(--colour-grey-800); 132 166 } 133 167 } ··· 211 245 212 246 font-variation-settings: 'GRAD' 100; 213 247 font-weight: 500; 214 - 248 + 215 249 background-color: var(--colour-grey-100); 216 250 217 251 li.sidebar-item:hover & { ··· 376 410 padding: .4rem .5rem; 377 411 378 412 @media screen and not (prefers-reduced-motion) { 379 - &:hover { 380 - animation: addbutton-rainbow 2s linear infinite; 381 - } 413 + &:hover { 414 + animation: addbutton-rainbow 2s linear infinite; 382 415 } 416 + } 383 417 384 418 &:hover { 385 - background: 386 - linear-gradient(to right, 387 - var(--colour-red-200), 388 - var(--colour-orange-200), 389 - var(--colour-yellow-200), 390 - var(--colour-ectoplasm-200), 391 - var(--colour-weezer-200), 392 - var(--colour-aubergine-200), 393 - var(--colour-bubblegum-200), 394 - var(--colour-red-200)) 0 0/200% 100%; 419 + background: linear-gradient(to right, 420 + var(--colour-red-200), 421 + var(--colour-orange-200), 422 + var(--colour-yellow-200), 423 + var(--colour-ectoplasm-200), 424 + var(--colour-weezer-200), 425 + var(--colour-aubergine-200), 426 + var(--colour-bubblegum-200), 427 + var(--colour-red-200)) 0 0/200% 100%; 395 428 396 429 font-variation-settings: 'GRAD' 100; 397 430 color: black; 398 431 } 399 - } 432 + }
+15 -4
neo/src/main.tsx
··· 5 5 6 6 import NoBufferPlaceholder from "@src/bits/placeholder"; 7 7 import { Sidebar } from '@src/bits/sidebar/sidebar'; 8 - import BufferView from "@src/buffer/view"; 8 + import BufferPage from "@src/buffer/page"; 9 9 import Connections from "@src/chat/conns"; 10 10 import DebugView from "@src/debug"; 11 11 import SettingsPage from '@src/settings'; ··· 14 14 import { Route, Router, Switch } from 'wouter-preact'; 15 15 import { useHashLocation } from "wouter-preact/use-hash-location"; 16 16 import JoinChannelPage from './pages/join-channel'; 17 + import Spinner from "@src/bits/spinner.tsx"; 18 + import NetworkInfoPage from './pages/network-info'; 17 19 18 20 Connections.initialise(); 19 21 ··· 38 40 const conn = Connections.fetch(id, adapter); 39 41 const chan = conn?.get_channel(target); 40 42 return chan 41 - ? <BufferView buffer={chan} /> 42 - : <p class="loader">(one sec)</p>; 43 + ? <BufferPage buffer={chan} /> 44 + : <Spinner />; 43 45 }} 44 46 </Route> 45 47 <Route path="/connection/:adapter?/:id/join"> ··· 48 50 49 51 return conn 50 52 ? <JoinChannelPage conn={conn} /> 51 - : <p class="loader">(one sec)</p>; 53 + : <Spinner />; 54 + }} 55 + </Route> 56 + <Route path="/connection/:adapter?/:id/info"> 57 + {({ adapter, id }) => { 58 + const conn = Connections.fetch(id, adapter); 59 + 60 + return conn 61 + ? <NetworkInfoPage conn={conn} /> 62 + : <Spinner />; 52 63 }} 53 64 </Route> 54 65 <Route path="/settings">
+43
neo/src/pages/network-info.tsx
··· 1 + import "@css/network-info.css"; 2 + import { useComputed, useSignal } from "@preact/signals"; 3 + import { PrimaryButton } from "@src/bits/buttons"; 4 + import { Connection } from "tubes_core"; 5 + import { ConnectionState } from "tubes_core/connection"; 6 + 7 + export default function NetworkInfoPage({ conn }: { conn: Connection }) { 8 + const status = useComputed(() => { 9 + switch (conn.$state.value) { 10 + case ConnectionState.Disconnected: return <>"disconnected"</>; 11 + case ConnectionState.Disconnecting: return "disconnected"; 12 + case ConnectionState.Connecting: return "connecting"; 13 + case ConnectionState.Registering: return "connecting"; 14 + case ConnectionState.Connected: return <>connected</>; 15 + case ConnectionState.Failed: return "uh oh!"; 16 + } 17 + }); 18 + const connected = useComputed(() => conn.$state.value == ConnectionState.Connected) 19 + 20 + return <article class="network-info"> 21 + <hgroup> 22 + <h1>{conn.label}</h1> 23 + <p class={`status ${connected.value ? "connected" : "disconnected"}`}>{status}</p> 24 + </hgroup> 25 + 26 + {conn.motd && <Motd motd={conn.motd} />} 27 + 28 + 29 + </article> 30 + } 31 + 32 + const Motd = ({ motd }: { motd: string }) => { 33 + const expanded = useSignal(false); 34 + return <section class={`motd ${expanded.value ? "expanded" : ""}`}> 35 + <h2 class="heading">Message of the Day</h2> 36 + <pre> 37 + {motd} 38 + </pre> 39 + <PrimaryButton onClick={() => expanded.value = !expanded.value}> 40 + {expanded.value ? "Collapse" : "Expand"} 41 + </PrimaryButton> 42 + </section> 43 + }
+64 -78
package-lock.json
··· 44 44 "async-mutex": "^0.5.0", 45 45 "dayjs": "^1.11.13", 46 46 "dexie": "^4.0.8", 47 - "motion": "^10.18.0", 47 + "motion": "^11.0.3", 48 48 "preact": "^10.23.1", 49 49 "wouter-preact": "^3.3.1" 50 50 }, ··· 59 59 "vite": "^6.0.1" 60 60 } 61 61 }, 62 + "neo/node_modules/framer-motion": { 63 + "version": "11.18.2", 64 + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", 65 + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", 66 + "license": "MIT", 67 + "dependencies": { 68 + "motion-dom": "^11.18.1", 69 + "motion-utils": "^11.18.1", 70 + "tslib": "^2.4.0" 71 + }, 72 + "peerDependencies": { 73 + "@emotion/is-prop-valid": "*", 74 + "react": "^18.0.0 || ^19.0.0", 75 + "react-dom": "^18.0.0 || ^19.0.0" 76 + }, 77 + "peerDependenciesMeta": { 78 + "@emotion/is-prop-valid": { 79 + "optional": true 80 + }, 81 + "react": { 82 + "optional": true 83 + }, 84 + "react-dom": { 85 + "optional": true 86 + } 87 + } 88 + }, 62 89 "neo/node_modules/motion": { 63 - "version": "10.18.0", 64 - "resolved": "https://registry.npmjs.org/motion/-/motion-10.18.0.tgz", 65 - "integrity": "sha512-MVAZZmwM/cp77BrNe1TxTMldxRPjwBNHheU5aPToqT4rJdZxLiADk58H+a0al5jKLxkB0OdgNq6DiVn11cjvIQ==", 90 + "version": "11.18.2", 91 + "resolved": "https://registry.npmjs.org/motion/-/motion-11.18.2.tgz", 92 + "integrity": "sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg==", 66 93 "license": "MIT", 67 94 "dependencies": { 68 - "@motionone/animation": "^10.18.0", 69 - "@motionone/dom": "^10.18.0", 70 - "@motionone/types": "^10.17.1", 71 - "@motionone/utils": "^10.18.0" 95 + "framer-motion": "^11.18.2", 96 + "tslib": "^2.4.0" 97 + }, 98 + "peerDependencies": { 99 + "@emotion/is-prop-valid": "*", 100 + "react": "^18.0.0 || ^19.0.0", 101 + "react-dom": "^18.0.0 || ^19.0.0" 102 + }, 103 + "peerDependenciesMeta": { 104 + "@emotion/is-prop-valid": { 105 + "optional": true 106 + }, 107 + "react": { 108 + "optional": true 109 + }, 110 + "react-dom": { 111 + "optional": true 112 + } 72 113 } 114 + }, 115 + "neo/node_modules/motion-dom": { 116 + "version": "11.18.1", 117 + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", 118 + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", 119 + "license": "MIT", 120 + "dependencies": { 121 + "motion-utils": "^11.18.1" 122 + } 123 + }, 124 + "neo/node_modules/motion-utils": { 125 + "version": "11.18.1", 126 + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", 127 + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", 128 + "license": "MIT" 73 129 }, 74 130 "node_modules/@ampproject/remapping": { 75 131 "version": "2.3.0", ··· 926 982 "dependencies": { 927 983 "@jridgewell/resolve-uri": "^3.1.0", 928 984 "@jridgewell/sourcemap-codec": "^1.4.14" 929 - } 930 - }, 931 - "node_modules/@motionone/animation": { 932 - "version": "10.18.0", 933 - "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", 934 - "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", 935 - "license": "MIT", 936 - "dependencies": { 937 - "@motionone/easing": "^10.18.0", 938 - "@motionone/types": "^10.17.1", 939 - "@motionone/utils": "^10.18.0", 940 - "tslib": "^2.3.1" 941 - } 942 - }, 943 - "node_modules/@motionone/dom": { 944 - "version": "10.18.0", 945 - "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", 946 - "integrity": "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==", 947 - "license": "MIT", 948 - "dependencies": { 949 - "@motionone/animation": "^10.18.0", 950 - "@motionone/generators": "^10.18.0", 951 - "@motionone/types": "^10.17.1", 952 - "@motionone/utils": "^10.18.0", 953 - "hey-listen": "^1.0.8", 954 - "tslib": "^2.3.1" 955 - } 956 - }, 957 - "node_modules/@motionone/easing": { 958 - "version": "10.18.0", 959 - "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", 960 - "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", 961 - "license": "MIT", 962 - "dependencies": { 963 - "@motionone/utils": "^10.18.0", 964 - "tslib": "^2.3.1" 965 - } 966 - }, 967 - "node_modules/@motionone/generators": { 968 - "version": "10.18.0", 969 - "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", 970 - "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", 971 - "license": "MIT", 972 - "dependencies": { 973 - "@motionone/types": "^10.17.1", 974 - "@motionone/utils": "^10.18.0", 975 - "tslib": "^2.3.1" 976 - } 977 - }, 978 - "node_modules/@motionone/types": { 979 - "version": "10.17.1", 980 - "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", 981 - "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==", 982 - "license": "MIT" 983 - }, 984 - "node_modules/@motionone/utils": { 985 - "version": "10.18.0", 986 - "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", 987 - "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", 988 - "license": "MIT", 989 - "dependencies": { 990 - "@motionone/types": "^10.17.1", 991 - "hey-listen": "^1.0.8", 992 - "tslib": "^2.3.1" 993 985 } 994 986 }, 995 987 "node_modules/@preact/preset-vite": { ··· 2260 2252 "bin": { 2261 2253 "he": "bin/he" 2262 2254 } 2263 - }, 2264 - "node_modules/hey-listen": { 2265 - "version": "1.0.8", 2266 - "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", 2267 - "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", 2268 - "license": "MIT" 2269 2255 }, 2270 2256 "node_modules/idb": { 2271 2257 "version": "8.0.0",