From dc837a188223f6aa6f1e7f245252294723fd5d4f Mon Sep 17 00:00:00 2001 From: liyunze <50455574+liyunze-coding@users.noreply.github.com> Date: Wed, 17 Jun 2026 13:02:13 +1000 Subject: [PATCH] added horizontal version --- horizontal_widget/.prettierrc | 4 + horizontal_widget/LICENSE.md | 636 ++++++++++++++++++ horizontal_widget/README.md | 49 ++ horizontal_widget/config.js | 34 + horizontal_widget/images/websocket.png | Bin 0 -> 82494 bytes horizontal_widget/index.html | 29 + horizontal_widget/lib/streamerbot-client.js | 1 + horizontal_widget/scripts/header-animation.js | 42 ++ horizontal_widget/scripts/streamerbot.js | 221 ++++++ horizontal_widget/scripts/tasklist-view.js | 580 ++++++++++++++++ .../styles/fonts/Fredoka-Bold.ttf | Bin 0 -> 49748 bytes .../styles/fonts/Fredoka-Regular.ttf | Bin 0 -> 50004 bytes horizontal_widget/styles/structure.css | 74 ++ horizontal_widget/styles/style.css | 143 ++++ 14 files changed, 1813 insertions(+) create mode 100644 horizontal_widget/.prettierrc create mode 100644 horizontal_widget/LICENSE.md create mode 100644 horizontal_widget/README.md create mode 100644 horizontal_widget/config.js create mode 100644 horizontal_widget/images/websocket.png create mode 100644 horizontal_widget/index.html create mode 100644 horizontal_widget/lib/streamerbot-client.js create mode 100644 horizontal_widget/scripts/header-animation.js create mode 100644 horizontal_widget/scripts/streamerbot.js create mode 100644 horizontal_widget/scripts/tasklist-view.js create mode 100644 horizontal_widget/styles/fonts/Fredoka-Bold.ttf create mode 100644 horizontal_widget/styles/fonts/Fredoka-Regular.ttf create mode 100644 horizontal_widget/styles/structure.css create mode 100644 horizontal_widget/styles/style.css diff --git a/horizontal_widget/.prettierrc b/horizontal_widget/.prettierrc new file mode 100644 index 0000000..5e695cb --- /dev/null +++ b/horizontal_widget/.prettierrc @@ -0,0 +1,4 @@ +{ + "tabWidth": 4, + "useTabs": true +} \ No newline at end of file diff --git a/horizontal_widget/LICENSE.md b/horizontal_widget/LICENSE.md new file mode 100644 index 0000000..ad60cea --- /dev/null +++ b/horizontal_widget/LICENSE.md @@ -0,0 +1,636 @@ +# GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2007 [Free Software Foundation, Inc.](http://fsf.org/) + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +## Preamble + +The GNU General Public License is a free, copyleft license for software and +other kinds of works. + +The licenses for most software and other practical works are designed to take +away your freedom to share and change the works. By contrast, the GNU General +Public License is intended to guarantee your freedom to share and change all +versions of a program--to make sure it remains free software for all its users. +We, the Free Software Foundation, use the GNU General Public License for most +of our software; it applies also to any other work released this way by its +authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for them if you wish), that you +receive source code or can get it if you want it, that you can change the +software or use pieces of it in new free programs, and that you know you can do +these things. + +To protect your rights, we need to prevent others from denying you these rights +or asking you to surrender the rights. Therefore, you have certain +responsibilities if you distribute copies of the software, or if you modify it: +responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must pass on to the recipients the same freedoms that you received. +You must make sure that they, too, receive or can get the source code. And you +must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: + + 1. assert copyright on the software, and + 2. offer you this License giving you legal permission to copy, distribute + and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that +there is no warranty for this free software. For both users' and authors' sake, +the GPL requires that modified versions be marked as changed, so that their +problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified +versions of the software inside them, although the manufacturer can do so. This +is fundamentally incompatible with the aim of protecting users' freedom to +change the software. The systematic pattern of such abuse occurs in the area of +products for individuals to use, which is precisely where it is most +unacceptable. Therefore, we have designed this version of the GPL to prohibit +the practice for those products. If such problems arise substantially in other +domains, we stand ready to extend this provision to those domains in future +versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States +should not allow patents to restrict development and use of software on +general-purpose computers, but in those that do, we wish to avoid the special +danger that patents applied to a free program could make it effectively +proprietary. To prevent this, the GPL assures that patents cannot be used to +render the program non-free. + +The precise terms and conditions for copying, distribution and modification +follow. + +## TERMS AND CONDITIONS + +### 0. Definitions. + +*This License* refers to version 3 of the GNU General Public License. + +*Copyright* also means copyright-like laws that apply to other kinds of works, +such as semiconductor masks. + +*The Program* refers to any copyrightable work licensed under this License. +Each licensee is addressed as *you*. *Licensees* and *recipients* may be +individuals or organizations. + +To *modify* a work means to copy from or adapt all or part of the work in a +fashion requiring copyright permission, other than the making of an exact copy. +The resulting work is called a *modified version* of the earlier work or a work +*based on* the earlier work. + +A *covered work* means either the unmodified Program or a work based on the +Program. + +To *propagate* a work means to do anything with it that, without permission, +would make you directly or secondarily liable for infringement under applicable +copyright law, except executing it on a computer or modifying a private copy. +Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as well. + +To *convey* a work means any kind of propagation that enables other parties to +make or receive copies. Mere interaction with a user through a computer +network, with no transfer of a copy, is not conveying. + +An interactive user interface displays *Appropriate Legal Notices* to the +extent that it includes a convenient and prominently visible feature that + + 1. displays an appropriate copyright notice, and + 2. tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the work + under this License, and how to view a copy of this License. + +If the interface presents a list of user commands or options, such as a menu, a +prominent item in the list meets this criterion. + +### 1. Source Code. + +The *source code* for a work means the preferred form of the work for making +modifications to it. *Object code* means any non-source form of a work. + +A *Standard Interface* means an interface that either is an official standard +defined by a recognized standards body, or, in the case of interfaces specified +for a particular programming language, one that is widely used among developers +working in that language. + +The *System Libraries* of an executable work include anything, other than the +work as a whole, that (a) is included in the normal form of packaging a Major +Component, but which is not part of that Major Component, and (b) serves only +to enable use of the work with that Major Component, or to implement a Standard +Interface for which an implementation is available to the public in source code +form. A *Major Component*, in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system (if any) on +which the executable work runs, or a compiler used to produce the work, or an +object code interpreter used to run it. + +The *Corresponding Source* for a work in object code form means all the source +code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. +However, it does not include the work's System Libraries, or general-purpose +tools or generally available free programs which are used unmodified in +performing those activities but which are not part of the work. For example, +Corresponding Source includes interface definition files associated with source +files for the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, such as +by intimate data communication or control flow between those subprograms and +other parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +### 2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright on +the Program, and are irrevocable provided the stated conditions are met. This +License explicitly affirms your unlimited permission to run the unmodified +Program. The output from running a covered work is covered by this License only +if the output, given its content, constitutes a covered work. This License +acknowledges your rights of fair use or other equivalent, as provided by +copyright law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey +covered works to others for the sole purpose of having them make modifications +exclusively for you, or provide you with facilities for running those works, +provided that you comply with the terms of this License in conveying all +material for which you do not control copyright. Those thus making or running +the covered works for you must do so exclusively on your behalf, under your +direction and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes it +unnecessary. + +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure +under any applicable law fulfilling obligations under article 11 of the WIPO +copyright treaty adopted on 20 December 1996, or similar laws prohibiting or +restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention is +effected by exercising rights under this License with respect to the covered +work, and you disclaim any intention to limit operation or modification of the +work as a means of enforcing, against the work's users, your or third parties' +legal rights to forbid circumvention of technological measures. + +### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive it, +in any medium, provided that you conspicuously and appropriately publish on +each copy an appropriate copyright notice; keep intact all notices stating that +this License and any non-permissive terms added in accord with section 7 apply +to the code; keep intact all notices of the absence of any warranty; and give +all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may +offer support or warranty protection for a fee. + +### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce it +from the Program, in the form of source code under the terms of section 4, +provided that you also meet all of these conditions: + + - a) The work must carry prominent notices stating that you modified it, and + giving a relevant date. + - b) The work must carry prominent notices stating that it is released under + this License and any conditions added under section 7. This requirement + modifies the requirement in section 4 to *keep intact all notices*. + - c) You must license the entire work, as a whole, under this License to + anyone who comes into possession of a copy. This License will therefore + apply, along with any applicable section 7 additional terms, to the whole + of the work, and all its parts, regardless of how they are packaged. This + License gives no permission to license the work in any other way, but it + does not invalidate such permission if you have separately received it. + - d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your work need + not make them do so. + +A compilation of a covered work with other separate and independent works, +which are not by their nature extensions of the covered work, and which are not +combined with it such as to form a larger program, in or on a volume of a +storage or distribution medium, is called an *aggregate* if the compilation and +its resulting copyright are not used to limit the access or legal rights of the +compilation's users beyond what the individual works permit. Inclusion of a +covered work in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections 4 +and 5, provided that you also convey the machine-readable Corresponding Source +under the terms of this License, in one of these ways: + + - a) Convey the object code in, or embodied in, a physical product (including + a physical distribution medium), accompanied by the Corresponding Source + fixed on a durable physical medium customarily used for software + interchange. + - b) Convey the object code in, or embodied in, a physical product (including + a physical distribution medium), accompanied by a written offer, valid for + at least three years and valid for as long as you offer spare parts or + customer support for that product model, to give anyone who possesses the + object code either + 1. a copy of the Corresponding Source for all the software in the product + that is covered by this License, on a durable physical medium + customarily used for software interchange, for a price no more than your + reasonable cost of physically performing this conveying of source, or + 2. access to copy the Corresponding Source from a network server at no + charge. + - c) Convey individual copies of the object code with a copy of the written + offer to provide the Corresponding Source. This alternative is allowed only + occasionally and noncommercially, and only if you received the object code + with such an offer, in accord with subsection 6b. + - d) Convey the object code by offering access from a designated place + (gratis or for a charge), and offer equivalent access to the Corresponding + Source in the same way through the same place at no further charge. You + need not require recipients to copy the Corresponding Source along with the + object code. If the place to copy the object code is a network server, the + Corresponding Source may be on a different server operated by you or a + third party) that supports equivalent copying facilities, provided you + maintain clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the Corresponding + Source, you remain obligated to ensure that it is available for as long as + needed to satisfy these requirements. + - e) Convey the object code using peer-to-peer transmission, provided you + inform other peers where the object code and Corresponding Source of the + work are being offered to the general public at no charge under subsection + 6d. + +A separable portion of the object code, whose source code is excluded from the +Corresponding Source as a System Library, need not be included in conveying the +object code work. + +A *User Product* is either + + 1. a *consumer product*, which means any tangible personal property which is + normally used for personal, family, or household purposes, or + 2. anything designed or sold for incorporation into a dwelling. + +In determining whether a product is a consumer product, doubtful cases shall be +resolved in favor of coverage. For a particular product received by a +particular user, *normally used* refers to a typical or common use of that +class of product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected to use, +the product. A product is a consumer product regardless of whether the product +has substantial commercial, industrial or non-consumer uses, unless such uses +represent the only significant mode of use of the product. + +*Installation Information* for a User Product means any methods, procedures, +authorization keys, or other information required to install and execute +modified versions of a covered work in that User Product from a modified +version of its Corresponding Source. The information must suffice to ensure +that the continued functioning of the modified object code is in no case +prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as part of a +transaction in which the right of possession and use of the User Product is +transferred to the recipient in perpetuity or for a fixed term (regardless of +how the transaction is characterized), the Corresponding Source conveyed under +this section must be accompanied by the Installation Information. But this +requirement does not apply if neither you nor any third party retains the +ability to install modified object code on the User Product (for example, the +work has been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates for a +work that has been modified or installed by the recipient, or for the User +Product in which it has been modified or installed. Access to a network may be +denied when the modification itself materially and adversely affects the +operation of the network or violates the rules and protocols for communication +across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord +with this section must be in a format that is publicly documented (and with an +implementation available to the public in source code form), and must require +no special password or key for unpacking, reading or copying. + +### 7. Additional Terms. + +*Additional permissions* are terms that supplement the terms of this License by +making exceptions from one or more of its conditions. Additional permissions +that are applicable to the entire Program shall be treated as though they were +included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part may +be used separately under those permissions, but the entire Program remains +governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when +you modify the work.) You may place additional permissions on material, added +by you to a covered work, for which you have or can give appropriate copyright +permission. + +Notwithstanding any other provision of this License, for material you add to a +covered work, you may (if authorized by the copyright holders of that material) +supplement the terms of this License with terms: + + - a) Disclaiming warranty or limiting liability differently from the terms of + sections 15 and 16 of this License; or + - b) Requiring preservation of specified reasonable legal notices or author + attributions in that material or in the Appropriate Legal Notices displayed + by works containing it; or + - c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in reasonable + ways as different from the original version; or + - d) Limiting the use for publicity purposes of names of licensors or authors + of the material; or + - e) Declining to grant rights under trademark law for use of some trade + names, trademarks, or service marks; or + - f) Requiring indemnification of licensors and authors of that material by + anyone who conveys the material (or modified versions of it) with + contractual assumptions of liability to the recipient, for any liability + that these contractual assumptions directly impose on those licensors and + authors. + +All other non-permissive additional terms are considered *further restrictions* +within the meaning of section 10. If the Program as you received it, or any +part of it, contains a notice stating that it is governed by this License along +with a term that is a further restriction, you may remove that term. If a +license document contains a further restriction but permits relicensing or +conveying under this License, you may add to a covered work material governed +by the terms of that license document, provided that the further restriction +does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, +in the relevant source files, a statement of the additional terms that apply to +those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a +separately written license, or stated as exceptions; the above requirements +apply either way. + +### 8. Termination. + +You may not propagate or modify a covered work except as expressly provided +under this License. Any attempt otherwise to propagate or modify it is void, +and will automatically terminate your rights under this License (including any +patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a +particular copyright holder is reinstated + + - a) provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and + - b) permanently, if the copyright holder fails to notify you of the + violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated +permanently if the copyright holder notifies you of the violation by some +reasonable means, this is the first time you have received notice of violation +of this License (for any work) from that copyright holder, and you cure the +violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses +of parties who have received copies or rights from you under this License. If +your rights have been terminated and not permanently reinstated, you do not +qualify to receive new licenses for the same material under section 10. + +### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy +of the Program. Ancillary propagation of a covered work occurring solely as a +consequence of using peer-to-peer transmission to receive a copy likewise does +not require acceptance. However, nothing other than this License grants you +permission to propagate or modify any covered work. These actions infringe +copyright if you do not accept this License. Therefore, by modifying or +propagating a covered work, you indicate your acceptance of this License to do +so. + +### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a +license from the original licensors, to run, modify and propagate that work, +subject to this License. You are not responsible for enforcing compliance by +third parties with this License. + +An *entity transaction* is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered work +results from an entity transaction, each party to that transaction who receives +a copy of the work also receives whatever licenses to the work the party's +predecessor in interest had or could give under the previous paragraph, plus a +right to possession of the Corresponding Source of the work from the +predecessor in interest, if the predecessor has it or can get it with +reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights +granted or affirmed under this License. For example, you may not impose a +license fee, royalty, or other charge for exercise of rights granted under this +License, and you may not initiate litigation (including a cross-claim or +counterclaim in a lawsuit) alleging that any patent claim is infringed by +making, using, selling, offering for sale, or importing the Program or any +portion of it. + +### 11. Patents. + +A *contributor* is a copyright holder who authorizes use under this License of +the Program or a work on which the Program is based. The work thus licensed is +called the contributor's *contributor version*. + +A contributor's *essential patent claims* are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter acquired, +that would be infringed by some manner, permitted by this License, of making, +using, or selling its contributor version, but do not include claims that would +be infringed only as a consequence of further modification of the contributor +version. For purposes of this definition, *control* includes the right to grant +patent sublicenses in a manner consistent with the requirements of this +License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent +license under the contributor's essential patent claims, to make, use, sell, +offer for sale, import and otherwise run, modify and propagate the contents of +its contributor version. + +In the following three paragraphs, a *patent license* is any express agreement +or commitment, however denominated, not to enforce a patent (such as an express +permission to practice a patent or covenant not to sue for patent +infringement). To *grant* such a patent license to a party means to make such +an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free of +charge and under the terms of this License, through a publicly available +network server or other readily accessible means, then you must either + + 1. cause the Corresponding Source to be so available, or + 2. arrange to deprive yourself of the benefit of the patent license for this + particular work, or + 3. arrange, in a manner consistent with the requirements of this License, to + extend the patent license to downstream recipients. + +*Knowingly relying* means you have actual knowledge that, but for the patent +license, your conveying the covered work in a country, or your recipient's use +of the covered work in a country, would infringe one or more identifiable +patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you +convey, or propagate by procuring conveyance of, a covered work, and grant a +patent license to some of the parties receiving the covered work authorizing +them to use, propagate, modify or convey a specific copy of the covered work, +then the patent license you grant is automatically extended to all recipients +of the covered work and works based on it. + +A patent license is *discriminatory* if it does not include within the scope of +its coverage, prohibits the exercise of, or is conditioned on the non-exercise +of one or more of the rights that are specifically granted under this License. +You may not convey a covered work if you are a party to an arrangement with a +third party that is in the business of distributing software, under which you +make payment to the third party based on the extent of your activity of +conveying the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory patent +license + + - a) in connection with copies of the covered work conveyed by you (or copies + made from those copies), or + - b) primarily for and in connection with specific products or compilations + that contain the covered work, unless you entered into that arrangement, or + that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available to +you under applicable patent law. + +### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not excuse +you from the conditions of this License. If you cannot convey a covered work so +as to satisfy simultaneously your obligations under this License and any other +pertinent obligations, then as a consequence you may not convey it at all. For +example, if you agree to terms that obligate you to collect a royalty for +further conveying from those to whom you convey the Program, the only way you +could satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to +link or combine any covered work with a work licensed under version 3 of the +GNU Affero General Public License into a single combined work, and to convey +the resulting work. The terms of this License will continue to apply to the +part which is the covered work, but the special requirements of the GNU Affero +General Public License, section 13, concerning interaction through a network +will apply to the combination as such. + +### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program specifies +that a certain numbered version of the GNU General Public License *or any later +version* applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published by +the Free Software Foundation. If the Program does not specify a version number +of the GNU General Public License, you may choose any version ever published by +the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the +GNU General Public License can be used, that proxy's public statement of +acceptance of a version permanently authorizes you to choose that version for +the Program. + +Later license versions may give you additional or different permissions. +However, no additional obligations are imposed on any author or copyright +holder as a result of your choosing to follow a later version. + +### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE +LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER +PARTIES PROVIDE THE PROGRAM *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE +THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY +HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot +be given local legal effect according to their terms, reviewing courts shall +apply local law that most closely approximates an absolute waiver of all civil +liability in connection with the Program, unless a warranty or assumption of +liability accompanies a copy of the Program in return for a fee. + +## END OF TERMS AND CONDITIONS ### + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively state the exclusion +of warranty; and each file should have at least the *copyright* line and a +pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like +this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w` and `show c` should show the appropriate +parts of the General Public License. Of course, your program's commands might +be different; for a GUI interface, you would use an *about box*. + +You should also get your employer (if you work as a programmer) or school, if +any, to sign a *copyright disclaimer* for the program, if necessary. For more +information on this, and how to apply and follow the GNU GPL, see +[http://www.gnu.org/licenses/](http://www.gnu.org/licenses/). + +The GNU General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may consider +it more useful to permit linking proprietary applications with the library. If +this is what you want to do, use the GNU Lesser General Public License instead +of this License. But first, please read +[http://www.gnu.org/philosophy/why-not-lgpl.html](http://www.gnu.org/philosophy/why-not-lgpl.html). \ No newline at end of file diff --git a/horizontal_widget/README.md b/horizontal_widget/README.md new file mode 100644 index 0000000..f49b08a --- /dev/null +++ b/horizontal_widget/README.md @@ -0,0 +1,49 @@ +# Widget - Rython Task Bot v2 + +## Instructions + +### Websocket Server + +Websocket server running is required for browser source to work. + +> ![websocket](./images/websocket.png) + +1. Streamer.Bot -> Servers/Clients -> Websocket Server +2. Auto Start: `ON`; Click on `Start Server` +3. If port number already taken, change port number +4. Ensure that [config.js](./config.js)'s websocket settings are in-sync with Streamer.Bot's + +### OBS + +1. Add a new browser source in your scene +2. Tick on "Local" +3. Navigate to the index.html file +4. Optionally customise the width and height +5. Click on "Ok" + +## Style Customisation + +Note: `styles/structure.css` is meant to be the bare structure to allow the task widget to be functional. + +Customise the styles in `styles/style.css`, whether it's through the CSS variables (in `:root`), or the CSS below it. + +### Fonts + +You can import Google fonts into your style.css: + +1. Open [Google Fonts](https://fonts.google.com/) +2. Select your desired fonts +3. Click on `View selected families` +4. Click on `Get Embed Code` +5. Select `@import` under Web +6. Copy the import `@import url('...');` +7. You can use it in your CSS already! + +```css +... { + font-family: "Fredoka"; + /* ... */ +} +``` + +--- \ No newline at end of file diff --git a/horizontal_widget/config.js b/horizontal_widget/config.js new file mode 100644 index 0000000..87ab103 --- /dev/null +++ b/horizontal_widget/config.js @@ -0,0 +1,34 @@ +"use strict"; + +const configs = (function () { + const streamerBotSettings = { + host: "127.0.0.1", + port: 6968, + endpoint: "/", + }; + + const commands = [ + "!taskhelp", + "!add", + "!edit", + "!done", + "!remove", + "!focus", + "!clearmydone", + ]; + + const twitchSettings = { + autoUserColor: true + } + + const kickSettings = { + autouserColor: true + } + + return { + streamerBotSettings, + commands, + twitchSettings, + kickSettings + }; +})(); diff --git a/horizontal_widget/images/websocket.png b/horizontal_widget/images/websocket.png new file mode 100644 index 0000000000000000000000000000000000000000..9bfc514bc14b50bdb24b91660a423d65c8db4fab GIT binary patch literal 82494 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 Kb3gg=n|}j^T*xi} literal 0 HcmV?d00001 diff --git a/horizontal_widget/index.html b/horizontal_widget/index.html new file mode 100644 index 0000000..43b57f5 --- /dev/null +++ b/horizontal_widget/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + Task List + + +
+
+ !taskhelp +
+
+
+
+ +
+
+
+
+ + diff --git a/horizontal_widget/lib/streamerbot-client.js b/horizontal_widget/lib/streamerbot-client.js new file mode 100644 index 0000000..1f1ad44 --- /dev/null +++ b/horizontal_widget/lib/streamerbot-client.js @@ -0,0 +1 @@ +"use strict";var Streamerbot=(()=>{var W=Object.create;var p=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var O=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),q=(n,e)=>{for(var t in e)p(n,t,{get:e[t],enumerable:!0})},E=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of U(e))!H.call(n,o)&&o!==t&&p(n,o,{get:()=>e[o],enumerable:!(r=L(e,o))||r.enumerable});return n};var M=(n,e,t)=>(t=n!=null?W(D(n)):{},E(e||!n||!n.__esModule?p(t,"default",{value:n,enumerable:!0}):t,n)),B=n=>E(p({},"__esModule",{value:!0}),n);var G=O((Q,P)=>{"use strict";P.exports=function(){throw new Error("ws does not work in the browser. Browser clients must use the native WebSocket object")}});var _={};q(_,{Client:()=>l});var m=class{constructor(e={}){this.logLevels={verbose:0,debug:1,info:2,warn:3,error:4,none:5};this.level=e.level||"info",this.customLogger=e.customLogger}setLevel(e){this.level=e}setCustomLogger(e){this.customLogger=e}verbose(...e){this.log("verbose",...e)}debug(...e){this.log("debug",...e)}info(...e){this.log("info",...e)}warn(...e){this.log("warn",...e)}error(...e){this.log("error",...e)}log(e,...t){if(!(this.logLevels[e]y.getRandomValues(n);function C(n="req"){return`sb:client:${n}:${Date.now()}-${R(new Uint32Array(12))[0]}`}function k(n){let e;return n.code==1e3?e="Connection closed.":n.code==1001?e='Endpoint is "going away".':n.code==1002?e="Connection closed due to a protocol error.":n.code==1003||n.code==1007||n.code==1008||n.code==1010?e="Bad request.":n.code==1004?e="Reserved":n.code==1005?e="Missing status code.":n.code==1006?e="The connection was closed abnormally.":n.code==1009?e="Message size limit exceeded.":n.code==1011?e="Server terminated connection because due to unexpected condition.":n.code==1015?e="TLS handshake failure":e="Unknown error",e}async function h(n,e){let{timeout:t,message:r="Operation timed out.",controller:o}=e,s;return await Promise.race([new Promise((i,a)=>{s=setTimeout(()=>(o.abort(),console.debug("[withTimeout] timeout reached",e),a(new Error(r))),t),e.signal?.addEventListener("abort",()=>{clearTimeout(s),o?.abort(),a(new Error("Operation aborted."))},{once:!0})}),n]).finally(()=>{clearTimeout(s),o.abort()})}async function S(n){let e=new TextEncoder().encode(n),t=await T.digest("SHA-256",e),o=Array.from(new Uint8Array(t)).map(s=>s.toString(16).padStart(2,"0")).join("");return I(o)}function I(n){let e=new Uint8Array(n.match(/.{1,2}/g).map(r=>parseInt(r,16)));return btoa(String.fromCharCode.apply(null,Array.from(e)))}function v({timeout:n=1e4,addEventListener:e,removeEventListener:t}){let r=C("res"),o=new AbortController,s=o.signal,i=new Promise((a,c)=>{let d=b=>{let f=b?.data;f?.eventName===r&&(o.abort(),a(f?.args))};e("Custom.Event",d);let u=setTimeout(()=>{o.abort(),c(new Error("Timed out waiting for Custom Event"))},n);s.addEventListener("abort",()=>{clearTimeout(u),t(b=>b.events?.includes("Custom.Event")&&b.callback===d)},{once:!0})});return{responseId:r,promise:i,controller:o}}var A={scheme:"ws",host:"127.0.0.1",port:8080,endpoint:"/",immediate:!0,autoReconnect:!0,retries:-1,subscribe:{},logger:w,logLevel:"info"},l=class{constructor(e=A){this._authEnabled=!1;this._authenticated=!1;this.listeners=[];this.subscriptions={};this._explicitlyClosed=!1;this._retried=0;this._connectController=new AbortController;this._reconnectTimeout=void 0;this.options={...A,...e},this.logger=this.options.logger||null,this.logger&&this.options.logLevel&&this.logger.setLevel(this.options.logLevel),this.options.immediate===!0&&this.connect().catch(t=>this.logger?.warn("Failed to connect:",t))}get authenticated(){return!!this.socket&&this.socket.readyState===this.socket.OPEN&&this._authenticated}get ready(){return!this.socket||this.socket.readyState!==this.socket.OPEN||this._authEnabled&&!this._authenticated?!1:!!this.info&&!!this.version}async connect(e=1e4){if(this.socket?.readyState!==this.socket?.CLOSED)try{await this.disconnect()}catch{}this._explicitlyClosed=!1,this._connectController.abort(),this._connectController=new AbortController;let t=new AbortController;return this._connectController.signal.addEventListener("abort",()=>{t.abort()},{once:!0}),await h(new Promise(async(r,o)=>{try{this.options.password&&(this._authEnabled=!0);let s=`${this.options.scheme}://${this.options.host}:${this.options.port}${this.options.endpoint}`;this.logger?.debug("Connecting to Streamer.bot WebSocket server at",s,this._authEnabled?"with authentication":""),this.socket=globalThis?.process?.versions?.node?new(await Promise.resolve().then(()=>M(G(),1))).WebSocket(s):new WebSocket(s),this.socket.onmessage=this.onMessage.bind(this),this.socket.onopen=this.onOpen.bind(this),this.socket.onclose=this.onClose.bind(this),this.socket.onerror=this.onError.bind(this),this.socket.addEventListener("open",()=>{if(!this.socket)return o(new Error("WebSocket not initialized"));r()},{signal:t.signal}),this.socket.addEventListener("close",()=>o(new Error("WebSocket closed")),{once:!0})}catch(s){try{await this.disconnect(),this?.options?.onError?.(s)}catch(i){this.logger?.warn("Error invoking onError handler",i)}o(s)}}),{timeout:e,message:"WebSocket connection timeout exceeded",controller:t})}async disconnect(e=1e3,t=1e3){if(this._explicitlyClosed=!0,this._connectController.abort(),this._reconnectTimeout&&clearTimeout(this._reconnectTimeout),!this.socket||this.socket.readyState===this.socket.CLOSED)return;let r=new AbortController,o=r.signal;return await h(new Promise((s,i)=>{if(this.socket?.addEventListener("close",()=>{this.logger?.debug("Disconnected from Streamer.bot WebSocket server"),s()},{signal:o}),this.socket?.readyState!==this.socket?.CLOSING)try{this.socket?.close(e)}catch(a){i(a)}}),{timeout:t,message:"Timeout exceeded while closing connection",controller:r})}async handshake(){if(!this.socket)throw new Error("WebSocket not initialized");let e=new AbortController,{signal:t}=e;this._connectController.signal.addEventListener("abort",()=>{e.abort()},{once:!0,signal:t});let r=await h(new Promise((o,s)=>{this.socket?.addEventListener("message",async i=>{if(!("data"in i)||!i.data||typeof i.data!="string"){this.logger?.debug("Unknown message received",i);return}try{let a=JSON.parse(i.data);a&&"info"in a&&o(a)}catch(a){this.logger?.warn("Invalid JSON payload received",i.data),s(a)}},{signal:t})}),{timeout:5e3,message:"Handshake timeout exceeded",controller:e});if(!r||!("info"in r))throw new Error("Handshake failed (invalid payload)");if("request"in r&&r?.request==="Hello"&&r.authentication)return await this.authenticate(r);if(r.info&&!r.authentication){this.logger?.debug("Connected to Streamer.bot WebSocket server",r.info),this.info=r.info,this.version=r.info.version;return}throw new Error("Handshake failed (unknown)")}async authenticate(e){if(!this._authEnabled||!this.options.password){if(this.logger?.debug("No password provided for authentication. Checking if auth is enforced for all requests..."),(await this.getInfo()).status==="ok"){this._authenticated=!1,this.version=e.info.version,this.info=e.info;return}throw await this.disconnect(),new Error("Authentication required")}if(!e.authentication)throw this.logger?.debug("Missing authentication payload"),await this.disconnect(),new Error("Invalid authentication payload");this.logger?.debug("Authenticating with Streamer.bot WebSocket server...");let{salt:t,challenge:r}=e?.authentication,o=await S(`${this.options.password}${t}`),s=await S(`${o}${r}`);if((await this.request({request:"Authenticate",authentication:s})).status==="ok")this._authenticated=!0,this.version=e.info.version,this.info=e.info;else throw await this.disconnect(),new Error("Authentication failed")}async onOpen(){this._retried=0,this._reconnectTimeout&&clearTimeout(this._reconnectTimeout);try{this._authEnabled||this.getInfo().catch(()=>this.logger?.debug("Failed to fetch Streamer.bot instance info")),await this.handshake(),this.version&&this.info&&(this.logger?.debug(`Connected to Streamer.bot: v${this.version} (${this.info.name})`),await this.updateSupportedEvents(),this?.options?.onConnect?.(this.info))}catch(e){return this.logger?.warn("Failed handshake with Streamer.bot",e),this.options?.onError?.(e instanceof Error?e:new Error("Failed handshake with Streamer.bot")),await this.disconnect()}try{if(this.options.subscribe==="*"||typeof this.options.subscribe=="object"&&!Array.isArray(this.options.subscribe)&&Object.keys(this.options.subscribe??{}).length)this.logger?.debug("Subscribing to initial events from options:",this.options.subscribe),await this.subscribe(this.options.subscribe);else if(typeof this.options.subscribe=="string"||Array.isArray(this.options.subscribe)){this.logger?.debug("Subscribing to initial events from options:",this.options.subscribe);let e=await this.getSubscriptionsFromEventStrings(this.options.subscribe);this.logger?.debug("Parsed subscriptions from options:",e),e&&await this.subscribe(e)}if(this.listeners.length){let e=await this.getSubscriptionsFromListeners();await this.subscribe(e)}this.logger?.verbose("Subscribed to requested events",this.subscriptions,this.listeners)}catch(e){this.logger?.warn("Error subscribing to requested events",e)}}onClose(e){this._connectController.abort();try{(e.type==="error"||!e.wasClean)&&this.options.onError&&this?.options?.onError(new Error(k(e))),this?.options?.onDisconnect?.()}catch(t){this.logger?.warn("Error invoking user-provided onDisconnect handler",t)}if(this._explicitlyClosed||!this.options.autoReconnect)return this.logger?.debug("Cleaning up..."),this.cleanup();this._retried+=1,typeof this.options.retries=="number"&&(this.options.retries<0||this._retried{if(!(this.socket&&this.socket.readyState!==this.socket.CLOSED)){this.logger?.debug(`Reconnecting... (attempt ${this._retried})`);try{await this.connect(1e4)}catch(t){this._retried&&this.logger?.warn(`Failed to reconnect (attempt ${this._retried-1})`,t)}}},Math.min(3e4,this._retried*1e3))):(this.logger?.debug("Auto-reconnect limit reached. Cleaning up..."),this.cleanup())}async onMessage(e){if(!e.data||typeof e.data!="string"){this.logger?.debug("Unknown message received",e);return}let t;try{t=JSON.parse(e.data)}catch(r){this.logger?.warn("Invalid JSON payload received",e.data,r);return}this.logger?.verbose("RECV",t);try{this.options.onData&&this?.options?.onData(t)}catch(r){this.logger?.warn("Error occurred within user-provided onData callback",r)}if(t?.event?.source&&t?.event?.type){for(let r of this.listeners)if(r.events?.length&&r.events.find(o=>o==="*"||o===`${t?.event?.source}.${t?.event?.type}`||o.split(".",2)?.[1]==="*"&&o.split(".",2)?.[0]===t?.event?.source))try{r.callback(t)}catch(o){this.logger?.warn(`Error occurred within user-provided event callback (${r.events})`,o)}}}onError(e){this.logger?.debug("WebSocket onError",e),this.socket&&this.socket.readyState!==this.socket.OPEN&&this._connectController.abort();try{this?.options?.onError?.(new Error("WebSocket Error"))}catch(t){this.logger?.warn("Error occurred within user-provided onError callback",t)}}cleanup(){this.socket&&(this.socket.onopen=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.onmessage=null,this.socket=void 0),this.listeners=[],this._retried=0,this._connectController.abort(),this._reconnectTimeout&&clearTimeout(this._reconnectTimeout)}send(e){this.socket?.send(JSON.stringify(e))}async request(e,t="",r=1e4){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("WebSocket is not connected");t||(t=C());let o=new AbortController,s=o.signal;this._connectController.signal.addEventListener("abort",()=>{o.abort()},{once:!0,signal:s});let i=await h(new Promise((a,c)=>{this.socket?.addEventListener("message",d=>{if(!("data"in d)||!d.data||typeof d.data!="string"){this.logger?.debug("Unknown message received",d.data);return}try{let u=JSON.parse(d?.data);if(u?.id===t)return this.logger?.verbose(`RECV :: ${e.request}`,u),a(u)}catch(u){this.logger?.warn("Invalid JSON payload received",d.data),c(u)}},{signal:s}),this.logger?.verbose(`SEND :: ${e.request}`,{...e,id:t}),this.send({...e,id:t})}),{timeout:r,message:"Request timed out",controller:o,signal:s});if(i?.status==="ok"){try{this.options.onData&&this?.options?.onData(i)}catch(a){this.logger?.warn("Error invoking onData handler",a)}return{event:{source:"Request",type:e.request??"Unknown"},...i}}throw new Error("Request failed")}async on(e,t){try{if(!e)return;let r={events:[e],callback:t};if(this.listeners.push(r),this.ready){let o=await this.getSubscriptionsFromListeners([r]);await this.subscribe(o)}this.logger?.debug(`Added event listener for "${e}"`)}catch(r){this.logger?.warn(`Failed adding event listener for "${e}"`,r)}}async updateSupportedEvents(){if(this.ready)try{let e=await this.getEvents();if(e.status!=="ok"||!e.events)throw new Error(e.status);this.supportedEvents=e.events,this.logger?.debug(`Successfully fetched supported event types for Streamer.bot v${this.version}`)}catch(e){this.logger?.warn("Failed to fetch supported events from Streamer.bot, falling back to stored events type.",e),this.supportedEvents=g}}async getSupportedEvents(){return this.supportedEvents||(this.logger?.warn("Supported event types not yet initialized, fetching from Streamer.bot instance..."),await this.updateSupportedEvents()),this.supportedEvents??g}getEventsFromListeners(e){return(e??this.listeners).reduce((t,r)=>(r.events.forEach(o=>{t[o]||(t[o]=[]),t[o].push(r.callback)}),t),{})}async getSubscriptionsFromListeners(e){let t=this.getEventsFromListeners(e);return this.getSubscriptionsFromEventStrings(Object.keys(t))}async getSubscriptionsFromEventStrings(e){let t={};typeof e=="string"&&(e=[e]);for(let r of e){let o=await this.parseEventString(r);if(o)for(let s of o){let{source:i,eventTypes:a}=s,c=new Set([...t[i]??[],...a]);t[i]=[...c]}}return t}async parseEventString(e){let t=await this.getSupportedEvents();if(!e||typeof e!="string"){this.logger?.warn(`Invalid event subscription requested "${e}"`);return}if(e==="*")return Object.keys(t).map(r=>{let o=r,s=t[o]??[];return{source:o,eventTypes:s}});{let[r,o]=e.split(".",2);if(!r||!o||!(r in t)){this.logger?.warn(`Invalid event subscription requested "${e}"`);return}let s=r,i=o;if(i)return[{source:s,eventTypes:i==="*"?t[s]:[i]}];this.logger?.warn(`Invalid event type requested "${e}"`);return}}async subscribe(e){let t=await this.getSupportedEvents();e==="*"&&(e=t);for(let r in e){if(!r||r==="err")continue;if(!(r in t)){this.logger?.warn(`Attempted to subscribe to empty or unknown event source: "${r}"`,Object.keys(e));continue}let o=r,s=e[o]??[];if(s&&s.length){let i=new Set([...this.subscriptions[o]??[],...s]);this.subscriptions[o]=[...i]}}return Object.keys(this.subscriptions).length===0?(this.logger?.warn("No valid events to subscribe to. Please provide valid event sources and types."),{id:"invalid",status:"error",error:"No valid events to subscribe to"}):await this.request({request:"Subscribe",events:this.subscriptions})}async unsubscribe(e){let t=await this.getSupportedEvents();e==="*"&&(e=t);for(let r in e){if(r===void 0||!Object.keys(t).includes(r))continue;let o=r,s=e[o];if(s&&s.length)for(let i of s)i&&this.subscriptions[o]?.filter&&(this.subscriptions[o]=this.subscriptions[o])?.filter(a=>i!==a)}return await this.request({request:"UnSubscribe",events:e})}async getEvents(){return await this.request({request:"GetEvents"})}async getActions(){return await this.request({request:"GetActions"})}async doAction(e,t,r){if(r?.customEventResponse)return this.doActionWithCustomEventResponse(e,t);let o,s;return typeof e=="string"?o=e:(o=e.id,s=e.name),await this.request({request:"DoAction",action:{id:o,name:s},args:t})}async doActionWithCustomEventResponse(e,t={},r=1e4){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("WebSocket is not connected");let{responseId:o,promise:s,controller:i}=v({timeout:r,addEventListener:(c,d)=>this.on(c,d),removeEventListener:c=>{this.listeners=this.listeners.filter(d=>!c(d))}}),a={...t,sbClientResponse:o};try{let c=await this.doAction(e,a),d=await s;return{...c,customEventResponseArgs:d}}catch(c){throw i.signal.aborted||i.abort(),c}}async getBroadcaster(){return await this.request({request:"GetBroadcaster"})}async getMonitoredYouTubeBroadcasts(){return await this.request({request:"GetMonitoredYouTubeBroadcasts"})}async getCredits(){return await this.request({request:"GetCredits"})}async testCredits(){return await this.request({request:"TestCredits"})}async clearCredits(){return await this.request({request:"ClearCredits"})}async getInfo(){return await this.request({request:"GetInfo"})}async getActiveViewers(){return await this.request({request:"GetActiveViewers"})}async executeCodeTrigger(e,t,r){return r?.customEventResponse?this.executeCodeTriggerWithCustomEventResponse(e,t):await this.request({request:"ExecuteCodeTrigger",triggerName:e,args:t})}async executeCodeTriggerWithCustomEventResponse(e,t={},r=1e4){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("WebSocket is not connected");let{responseId:o,promise:s,controller:i}=v({timeout:r,addEventListener:(c,d)=>this.on(c,d),removeEventListener:c=>{this.listeners=this.listeners.filter(d=>!c(d))}}),a={...t,sbClientResponse:o};try{let c=await this.executeCodeTrigger(e,a),d=await s;return{...c,customEventResponseArgs:d}}catch(c){throw i.signal.aborted||i.abort(),c}}async getCodeTriggers(){return await this.request({request:"GetCodeTriggers"})}async getCommands(){return await this.request({request:"GetCommands"})}async getEmotes(e){switch(e){case"twitch":return await this.request({request:"TwitchGetEmotes"});case"youtube":return await this.request({request:"YouTubeGetEmotes"});default:throw new Error("Invalid platform")}}async getGlobals(e=!0){return await this.request({request:"GetGlobals",persisted:e})}async getGlobal(e,t=!0){let r=await this.request({request:"GetGlobal",variable:e,persisted:t});return r.status==="ok"?r.variables[e]?{id:r.id,status:r.status,variable:r.variables[e]}:{status:"error",error:"Variable not found"}:r}async getUserGlobals(e,t=null,r=!0){let s={twitch:"TwitchGetUserGlobals",youtube:"YouTubeGetUserGlobals",trovo:"TrovoGetUserGlobals",kick:"KickGetUserGlobals"}[e];if(!s)throw new Error("Invalid platform");return await this.request({request:s,variable:t,persisted:r})}async getUserGlobal(e,t,r=null,o=!0){let i={twitch:"TwitchGetUserGlobal",youtube:"YouTubeGetUserGlobal",trovo:"TrovoGetUserGlobal",kick:"KickGetUserGlobal"}[e];if(!i)throw new Error("Invalid platform");let a=await this.request({request:i,userId:t,variable:r||null,persisted:o});if(a.status==="ok"&&t&&r){let c=a.variables.find(d=>d.name===r);return c?{id:a.id,status:a.status,variable:c}:{status:"error",error:"Variable not found"}}return a}async sendMessage(e,t,{bot:r=!1,internal:o=!0,...s}={}){if(!this._authenticated)return{status:"error",error:"Authentication required"};let i={platform:e,message:t,bot:r,internal:o};return["twitch","kick"].includes(e)&&s.replyId&&Object.assign(i,{replyId:s.replyId}),["youtube"].includes(e)&&s.broadcastId&&Object.assign(i,{broadcastId:s.broadcastId}),await this.request({...i,request:"SendMessage"})}async getUserPronouns(e,t){return await this.request({request:"GetUserPronouns",platform:e,userLogin:t})}};Object.assign(globalThis,{StreamerbotClient:l});return B(_);})(); diff --git a/horizontal_widget/scripts/header-animation.js b/horizontal_widget/scripts/header-animation.js new file mode 100644 index 0000000..ccf19bd --- /dev/null +++ b/horizontal_widget/scripts/header-animation.js @@ -0,0 +1,42 @@ +(function () { + const commands = configs.commands; + + const titleEl = document.getElementById("title"); + let currentIndex = 0; + + const DISPLAY_DURATION = 3000; // how long each command stays visible + const FADE_DURATION = 400; // fade in/out duration in ms + + function applyTransition() { + titleEl.style.transition = `opacity ${FADE_DURATION}ms ease-in-out`; + } + + function fadeOut() { + return new Promise((resolve) => { + titleEl.style.opacity = "0"; + setTimeout(resolve, FADE_DURATION); + }); + } + + function fadeIn() { + return new Promise((resolve) => { + titleEl.style.opacity = "1"; + setTimeout(resolve, FADE_DURATION); + }); + } + + async function cycle() { + await fadeOut(); + + currentIndex = (currentIndex + 1) % commands.length; + titleEl.textContent = commands[currentIndex]; + + await fadeIn(); + + setTimeout(cycle, DISPLAY_DURATION); + } + + applyTransition(); + titleEl.textContent = commands[0]; + setTimeout(cycle, DISPLAY_DURATION); +})(); diff --git a/horizontal_widget/scripts/streamerbot.js b/horizontal_widget/scripts/streamerbot.js new file mode 100644 index 0000000..00a73b6 --- /dev/null +++ b/horizontal_widget/scripts/streamerbot.js @@ -0,0 +1,221 @@ +// STREAMER.BOT SETTINGS + +const client = new StreamerbotClient({ + host: configs.streamerBotSettings.host, + port: configs.streamerBotSettings.port, + endpoint: configs.streamerBotSettings.endpoint, + onConnect: onConnect, + onDisconnect: onDisconnect, + onError: onError, +}); + +function getAllLocalstorage() { + const allLocalStorage = {}; + + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + allLocalStorage[key] = localStorage.getItem(key); + } + + return JSON.stringify(allLocalStorage); +} + +client.on("General.Custom", (data) => onCustom(data)); +if (configs.twitchSettings.autoUserColor) { + client.on("Twitch.ChatMessage", (data) => onTwitchFirstWord(data)); +} + +let taskList; +let userColors = {}; + +function parseHexColor(hex) { + if (typeof hex !== "string") return null; + const s = hex.trim(); + const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(s); + if (!m) return null; + let h = m[1].toLowerCase(); + if (h.length === 3) { + h = h + .split("") + .map((c) => c + c) + .join(""); + } + const r = parseInt(h.slice(0, 2), 16); + const g = parseInt(h.slice(2, 4), 16); + const b = parseInt(h.slice(4, 6), 16); + return { r, g, b }; +} + +function relativeLuminance({ r, g, b }) { + const toLinear = (v) => { + const s = v / 255; + return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4); + }; + const R = toLinear(r); + const G = toLinear(g); + const B = toLinear(b); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; +} + +async function onTwitchFirstWord(data) { + let userColor = data.data.user.color; // hex colour #FF69B4 + + + + if (userColor != undefined || userColor != 'undefined') { + // update localstorage + // get id: platform-userID + let userId = data.data.user.id; + let key = `twitch-${userId}`; + + localStorage.setItem(`${key}-color`, userColor); + userColors[`${key}-color`] = userColor; + } + + return; +} + +function onDisconnect() { + showConnectionError("Connection Failed: Unable to connect to Streamer.bot"); +} + +function onError(err) { + showConnectionError( + "Connection Failed: " + (err?.message || "Unknown error"), + ); +} + +function showConnectionError(message) { + // Remove existing popup if any + const existing = document.getElementById("connection-error"); + if (existing) existing.remove(); + + const popup = document.createElement("div"); + popup.id = "connection-error"; + popup.textContent = message; + Object.assign(popup.style, { + position: "fixed", + top: "20px", + left: "50%", + transform: "translateX(-50%)", + background: "#e53935", + color: "#fff", + padding: "12px 24px", + borderRadius: "8px", + fontFamily: "'Fredoka', sans-serif", + fontSize: "1.1rem", + fontWeight: "700", + zIndex: "9999", + boxShadow: "0 4px 12px rgba(0,0,0,0.4)", + textAlign: "center", + }); + document.body.appendChild(popup); + + // Auto-dismiss after 5 seconds + setTimeout(() => { + popup.animate([{ opacity: 1 }, { opacity: 0 }], { + duration: 300, + fill: "forwards", + }).onfinish = () => popup.remove(); + }, 5000); +} + +async function refresh() { + const response = await client.getGlobal("rython-task-bot", true); + console.log(response); + + if (response.status !== "ok" || !response.variable?.value) return; + + const users = JSON.parse(response.variable.value); + const sections = transformToSections(users); + + taskList.load(sections); +} + +// LOAD TASK LIST +async function onConnect() { + taskList = new TaskList(".task-panel"); + refresh(); +} + +function transformToSections(users) { + return Object.entries(users).map(([userId, userData]) => ({ + id: userId, + title: userData.Username, + tasks: userData.Tasks.map((task) => ({ + text: task.Name, + done: task.Completed, + focused: task.Focused, + })), + })); +} + +// Update task list action by action +function onCustom(payload) { + const data = payload.data; + if (!data.source && data.source != "rython-task-bot") { + return; + } + if (!taskList) return; + const body = data.body; + const id = data.id; + const username = data.username; + + switch (body.mode) { + case "add": + // body.task; + let taskPayload = { + text: body.task, + done: body.completed, + focused: body.focused, + }; + + let usernameColor = + userColors[id] ?? localStorage.getItem(`${id}-color`); + + if (configs.twitchSettings.autoUserColor && usernameColor != undefined && usernameColor != null) { + taskPayload["color"] = usernameColor; + } + + taskList.addTask(id, taskPayload, username); + break; + case "focus": + taskList.focusTask(id, body.index, usernameColor); + break; + case "edit": + taskList.editTask(id, body.index, body.task, usernameColor); + break; + case "remove": + taskList.removeTask(id, body.index, usernameColor); + break; + case "done": + taskList.doneTask(id, body.index, usernameColor); + break; + case "admindelete": + taskList.removeSection(body.id); + break; + case "clearns": + refresh(); + break; + case "cleardone": + taskList.cleardone(); + break; + case "clearmydone": + taskList.clearmydone(id); + break; + case "clearall": + refresh(); + break; + case "undone": + taskList.undoneTask(id, body.index); + break; + case "unfocus": + taskList.unfocusTask(id); + break; + case "admindelete": + taskList.removeSection(body.id); + break; + default: + break; + } +} diff --git a/horizontal_widget/scripts/tasklist-view.js b/horizontal_widget/scripts/tasklist-view.js new file mode 100644 index 0000000..283a9a0 --- /dev/null +++ b/horizontal_widget/scripts/tasklist-view.js @@ -0,0 +1,580 @@ +// Task list view + +class TaskList { + #data = []; + #firstRender = true; + #pendingRemovals = 0; + + #scroll = { + offset: 0, + contentW: 0, + viewportW: 0, + speed: 50, + raf: null, + lastT: 0, + active: false, + wantStop: false, + }; + + #els = {}; + + #ANIM_DURATION = 400; + #ANIM_EASING = "cubic-bezier(0.22, 1, 0.36, 1)"; + + #parseHexColor(hex) { + if (typeof hex !== "string") return null; + const s = hex.trim(); + const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(s); + if (!m) return null; + let h = m[1].toLowerCase(); + if (h.length === 3) { + h = h + .split("") + .map((c) => c + c) + .join(""); + } + const r = parseInt(h.slice(0, 2), 16); + const g = parseInt(h.slice(2, 4), 16); + const b = parseInt(h.slice(4, 6), 16); + return { r, g, b }; + } + + #relativeLuminance({ r, g, b }) { + const toLinear = (v) => { + const s = v / 255; + return s <= 0.04045 + ? s / 12.92 + : Math.pow((s + 0.055) / 1.055, 2.4); + }; + const R = toLinear(r); + const G = toLinear(g); + const B = toLinear(b); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + } + + constructor(container) { + const el = + typeof container === "string" + ? document.querySelector(container) + : container; + + this.#els = { + track: el.querySelector(".scroll-track"), + content: el.querySelector(".scroll-content"), + viewport: el.querySelector(".scroll-viewport"), + }; + } + + // ── public API ───────────────────────────────────── + + load(sections) { + this.#data = structuredClone(sections); + this.#render(); + return this; + } + + addSection(section) { + this.#data.push(structuredClone(section)); + this.#render(); + return this; + } + + removeSection(id) { + const i = this.#data.findIndex((s) => s.id === id); + if (i === -1) return this; + this.#data.splice(i, 1); + this.#render(); + return this; + } + + updateSection(id, updater) { + const section = this.#data.find((s) => s.id === id); + if (!section) return this; + updater(section); + this.#render(); + return this; + } + + addTask(sectionId, task, sectionTitle) { + if (!this.#data.find((s) => s.id === sectionId)) { + this.addSection({ + id: sectionId, + title: sectionTitle || sectionId, + tasks: [], + }); + } + + return this.updateSection(sectionId, (s) => { + s.tasks.push(structuredClone(task)); + }); + } + + removeTask(sectionId, taskIndex) { + this.updateSection(sectionId, (s) => { + s.tasks.splice(taskIndex, 1); + }); + this.#data = this.#data.filter((s) => s.tasks.length > 0); + this.#render(); + return this; + } + + editTask(sectionId, taskIndex, newText, userColor) { + return this.updateSection(sectionId, (s) => { + if (s.tasks[taskIndex]) { + s.tasks[taskIndex].text = newText; + } + }); + } + + doneTask(sectionId, taskIndex) { + return this.updateSection(sectionId, (s) => { + if (s.tasks[taskIndex]) { + s.tasks[taskIndex].done = true; + s.tasks[taskIndex].focused = false; + } + }); + } + + undoneTask(sectionId, taskIndex) { + return this.updateSection(sectionId, (s) => { + if (s.tasks[taskIndex]) { + s.tasks[taskIndex].done = false; + } + }); + } + + focusTask(sectionId, taskIndex) { + // unfocus any previously focused task + this.unfocusTask(sectionId); + + return this.updateSection(sectionId, (s) => { + if (s.tasks[taskIndex]) { + s.tasks[taskIndex].focused = true; + } + }); + } + + unfocusTask(sectionId) { + return this.updateSection(sectionId, (s) => { + for (let i = 0; i < s.tasks.length; i++) { + s.tasks[i].focused = false; + } + }); + } + + clearmydone(sectionId) { + this.updateSection(sectionId, (s) => { + s.tasks = s.tasks.filter((t) => !t.done); + }); + this.#data = this.#data.filter((s) => s.tasks.length > 0); + this.#render(); + return this; + } + + cleardone() { + this.#data.forEach((s) => { + s.tasks = s.tasks.filter((t) => !t.done); + }); + this.#data = this.#data.filter((s) => s.tasks.length > 0); + this.#render(); + return this; + } + + getData() { + return structuredClone(this.#data); + } + + get sectionCount() { + return this.#data.length; + } + + get taskCount() { + return this.#data.reduce((sum, s) => sum + s.tasks.length, 0); + } + + get doneCount() { + return this.#data.reduce( + (sum, s) => sum + s.tasks.filter((t) => t.done).length, + 0, + ); + } + + destroy() { + this.#forceStop(); + this.#els.content.innerHTML = ""; + this.#data = []; + this.#firstRender = true; + } + + // ── render ───────────────────────────────────────── + + #render() { + if (this.#firstRender) { + this.#data.forEach((s) => + this.#els.content.appendChild(this.#createSectionEl(s)), + ); + this.#firstRender = false; + } else { + this.#patchContainer(this.#els.content, this.#data, true); + } + + if (this.#pendingRemovals === 0) { + this.#syncScroll(); + } + } + + // ── animations ───────────────────────────────────── + + #animateIn(el) { + el.style.overflow = "hidden"; + + const w = el.scrollWidth; + el.style.width = "0px"; + el.style.opacity = "0"; + + requestAnimationFrame(() => { + const anim = el.animate( + [ + { + width: "0px", + opacity: 0, + transform: "translateX(-8px)", + }, + { + width: w + "px", + opacity: 1, + transform: "translateX(0)", + }, + ], + { + duration: this.#ANIM_DURATION, + easing: this.#ANIM_EASING, + fill: "forwards", + }, + ); + + anim.onfinish = () => { + el.style.width = ""; + el.style.opacity = ""; + el.style.overflow = ""; + el.style.transform = ""; + anim.cancel(); + this.#syncScroll(); + }; + }); + } + + #animateRemove(el) { + this.#pendingRemovals++; + const w = el.scrollWidth; + + const anim = el.animate( + [ + { width: w + "px", opacity: 1, transform: "translateX(0)" }, + { width: "0px", opacity: 0, transform: "translateX(-8px)" }, + ], + { + duration: this.#ANIM_DURATION, + easing: this.#ANIM_EASING, + fill: "forwards", + }, + ); + + anim.onfinish = () => { + el.remove(); + this.#pendingRemovals--; + + if (this.#pendingRemovals === 0) { + this.#syncScroll(); + } + }; + } + + #animateStrikethrough(el) { + el.animate( + [ + { opacity: 0.5, transform: "scale(0.98)" }, + { opacity: 1, transform: "scale(1)" }, + ], + { duration: 250, easing: "ease-out" }, + ); + } + + // ── dom helpers ──────────────────────────────────── + + #createTaskEl(task, index) { + const div = document.createElement("div"); + div.className = + "task" + + (task.done ? " done" : "") + + (task.focused ? " focused" : ""); + div.dataset.text = task.text; + const numberSpan = document.createElement("span"); + numberSpan.className = "task-number"; + numberSpan.textContent = `${index + 1}.`; + + const textSpan = document.createElement("span"); + textSpan.textContent = task.text; + + div.replaceChildren(numberSpan, textSpan); + return div; + } + + #createSectionEl(section) { + const div = document.createElement("div"); + div.className = "section"; + div.dataset.key = section.id; + if (section.title) { + const t = document.createElement("div"); + t.className = "section-title"; + t.textContent = section.title; + let color = + section.color ?? localStorage.getItem(`${section.id}-color`); + if ( + configs.twitchSettings.autoUserColor && + color != undefined && + color != "undefined" && + color != null + ) { + t.style.setProperty("--user-color", color); + t.classList.add("has-user-color"); + } + + div.appendChild(t); + } + section.tasks.forEach((task, i) => + div.appendChild(this.#createTaskEl(task, i)), + ); + return div; + } + + // ── patching ─────────────────────────────────────── + + #patchTasks(sectionEl, tasks, animate) { + const existing = [...sectionEl.querySelectorAll(":scope > .task")]; + + tasks.forEach((task, i) => { + if (i < existing.length) { + const el = existing[i]; + const wantClass = + "task" + + (task.done ? " done" : "") + + (task.focused ? " focused" : ""); + if (el.className !== wantClass) { + el.className = wantClass; + if (animate) this.#animateStrikethrough(el); + } + if (el.dataset.text !== task.text) { + el.dataset.text = task.text; + el.querySelector("span:last-child").textContent = task.text; + } + el.querySelector(".task-number").textContent = `${i + 1}.`; + + // Update color if changed + if (task.color != undefined && task.color != "undefined") { + el.style.setProperty("--user-color", task.color); + el.classList.add("has-user-color"); + } else { + el.style.removeProperty("--user-color"); + el.classList.remove("has-user-color"); + } + } else { + const newEl = this.#createTaskEl(task, i); + sectionEl.appendChild(newEl); + if (animate) this.#animateIn(newEl); + } + }); + + for (let i = existing.length - 1; i >= tasks.length; i--) { + if (animate) { + this.#animateRemove(existing[i]); + } else { + existing[i].remove(); + } + } + } + + #patchContainer(container, sections, animate) { + const oldMap = new Map(); + container.querySelectorAll(":scope > .section").forEach((el) => { + oldMap.set(el.dataset.key, el); + }); + + let cursor = container.firstElementChild; + + sections.forEach((section) => { + const key = section.id; + const existing = oldMap.get(key); + + if (existing) { + this.#patchTasks(existing, section.tasks, animate); + if (existing !== cursor) { + container.insertBefore(existing, cursor); + } else { + cursor = cursor.nextElementSibling; + } + oldMap.delete(key); + } else { + const newEl = this.#createSectionEl(section); + container.insertBefore(newEl, cursor); + if (animate) this.#animateIn(newEl); + } + }); + + oldMap.forEach((el) => { + if (animate) { + this.#animateRemove(el); + } else { + el.remove(); + } + }); + } + + // ── scroll ───────────────────────────────────────── + + #tick = (now) => { + const s = this.#scroll; + const dt = (now - s.lastT) / 1000; + s.lastT = now; + + if (dt < 0.2) { + s.contentW = this.#els.content.scrollWidth; + s.offset += s.speed * dt; + + if (s.contentW > 0 && s.offset >= s.contentW) { + s.offset -= s.contentW; + + if (s.wantStop) { + s.wantStop = false; + this.#forceStop(); + return; + } + } + + this.#els.track.style.transform = `translateX(${-s.offset}px)`; + } + + s.raf = requestAnimationFrame(this.#tick); + }; + + #startScroll() { + const s = this.#scroll; + s.wantStop = false; + if (s.active) return; + s.active = true; + s.lastT = performance.now(); + s.raf = requestAnimationFrame(this.#tick); + } + + #requestStop() { + if (!this.#scroll.active) return; + this.#scroll.wantStop = true; + } + + #forceStop() { + const s = this.#scroll; + s.active = false; + s.wantStop = false; + cancelAnimationFrame(s.raf); + s.raf = null; + s.offset = 0; + this.#els.track.style.transform = ""; + + const clone = this.#els.track.querySelector(".scroll-clone"); + if (clone) clone.remove(); + } + + #syncScroll() { + const s = this.#scroll; + s.contentW = this.#els.content.scrollWidth; + s.viewportW = this.#els.viewport.clientWidth; + const needs = s.contentW > s.viewportW; + + let clone = this.#els.track.querySelector(".scroll-clone"); + + if (needs) { + if (!clone) { + clone = this.#els.content.cloneNode(true); + clone.id = ""; + clone.classList.add("scroll-clone"); + this.#els.track.appendChild(clone); + } else { + this.#patchContainer(clone, this.#data, false); + } + if (s.offset >= s.contentW) { + s.offset %= s.contentW; + } + this.#startScroll(); + } else { + if (s.active) { + if (clone) this.#patchContainer(clone, this.#data, false); + this.#requestStop(); + } else { + if (clone) clone.remove(); + } + } + } +} + +// ── usage ────────────────────────────────────────────── + +// const list2 = new TaskList(".task-panel"); + +// list2.load([ +// { +// title: "someone", +// tasks: [ +// { text: "dinner" }, +// { text: "watch bad bunny halftime show" }, +// { text: "tie tf down", done: true }, +// { text: "boy dinner", done: true }, +// { text: "3 hour SOOP" }, +// ], +// }, +// { +// title: "Cape_Codder", +// tasks: [ +// { text: "Part 2", done: true }, +// { text: "Ch 1-2", done: true }, +// ], +// }, +// { +// title: "sunflawer", +// tasks: [ +// { text: "fix walls from home office" }, +// { text: "sand walls zzzsdkjhfsk", done: true }, +// { text: "meal prep" }, +// { text: "buy wrist brace maybe" }, +// ], +// }, +// { +// title: "extra_user1", +// tasks: [ +// { text: "go grocery shopping" }, +// { text: "clean the kitchen", done: true }, +// { text: "respond to emails" }, +// ], +// }, +// ]); + +// demo + +// setTimeout(() => { +// list2.addTask("someone2", { text: "new task just dropped" }); +// }, 1000); + +// setTimeout(() => { +// list2.; +// }, 3000); + +// setTimeout(() => { +// list.toggleTask("sunflawer", 0); +// }, 10000); + +// setTimeout(() => { +// list.removeSection("Cape_Codder"); +// }, 12000); + +// setTimeout(() => { +// list.removeTask("extra_user1", 1); +// }, 14000); diff --git a/horizontal_widget/styles/fonts/Fredoka-Bold.ttf b/horizontal_widget/styles/fonts/Fredoka-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..47a2c2bcfb8516950131e3bc3491781d71708cb7 GIT binary patch literal 49748 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 z zuWQiO1%f|`59f>b_n^jJ;Txa^r2NS>_K6y_(@~F8GVe$~fET3028bi(NW~nndj4?# z*?dO--5F`)iSIN?TB@loyea)cx(|_+Fk>scUad}>&ZtycZ6=*=ZgDj?H`IH*K2=MD zPrBD8h0ALjeYf4>Z>%XVlWfP$H34UNQ2#;ifAwyQ{n>L&2=4|L=GBa-m?}e>?YkvVm~k zd!q8vZ|MUS0Y18achK(emt~WFNn^3<)76z3eXl-KRh8CHHl*qD%^&@UW+zhkM4AE| zL)cGarwSY!fm#tCT}1NWtK*r5`sU`Q#%fg}5l=TY((?|fsWF{MoQ0;){9B`zwCZdo zhu_Q-9n-6Rc$v=c(iklcqa_q)>GE4eq)YVPzTbgT_TBmg77m(C8jH!58(UM`m2(;Fdc8SZ<|s1< zB4%~i4=%74CK0ya0y>4F3(&Z zna4B8?ANsOK)ZC|W6bM)_^#nVpZ|{E&cjsZn)rG!RVeT4Kl(FY((6t89^@Xm#1N|R zN}9$DFhtGMbkS@&raeu*10JGB)eRWGRat#w#j26ZY4yqF^^gR#nueEG!Ll4Ir`0Fd zuR)aSX=Oyc7*XusjtEO?a4bO@%RBphDUUbhdr+SqK8jd29o0Sn(h|odz;QQ9kF!p} zap3R{uoa}!aE{YzJ#Md8a9k6(kd_421SS+~SO>nlV8XdeTUwW$KPftCe9)6Hn_Ov! z$>-L_Yl1aXt81rKI}>rsBxls^jXUnnMs>BhK*xAj+sbeBPCU1-#T;;2qkePP9uAny zYKy6AYHi)D21%=#ql;!TQ7sRpJ--dNdn^tEdKTMJ7KZQAN5GWGwCWFaS=H&Bz)sb+8xBsf9h2yiJ zNw)BJsYCiXeJg2Do)YCf=$cqbr}L2#gd)h0$iHBKOn3RR`9MyJANXZTlZ)h&-n)zJ zDiiMFrvh%XKh>Ii`j@HpxZmsvKJ{%PC5L_bv6RP1eZ%{76a{(W+XLNv=t}tf30LWq z^pDiWGU*spIewu5ZJmv_EI4Duwv)PQZb=d1TAgYrCk?c{Dv>rBJP962C5<|F?3UqO zoiKSa>6Br*-jhhBjQzI?K_ZW7uxH|?PgEA^UOI0vgmOMt!X+<6!OvpBIk3zqlgSW^ zZ>tnqsJzUg` z#%;H|wAc3kk2fDAc>w;F&Id+`p&0pGC43|6AwGacrm8Y(`3y={tgPyI!rXs?<}vS+ zblz;x>*&9Smm^bLS|&T6)BhHz0huWJQ;{VR6)U0{JE5>7pj(c@hI$ygR$_%$E0Rgp zAQ_>H2NfY-H}TvhElrEQHXhgJrp4#<#z$5Kf>rIYczab4S9iq;ZfZbE>m8^apQ6PTHKedi|9ZCoa!h2Wdd_A>-bRon3i8K32VjHIl=3@maSp zO{6bVugyYvXcMUhM}jOBub0p3*)hMNalwvmslk^I!Eoz;`)<;)6}~&6Y(>e5->zC& zF)o`OXHd5;KD&G3?xiiVrtOt4(

!}sx-QuXBO%E{HVb`#JA-M}j_RQe3q8VM3O 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 S8Eu&4@O@_=(1tG{k@!FCs*Pg+ literal 0 HcmV?d00001 diff --git a/horizontal_widget/styles/structure.css b/horizontal_widget/styles/structure.css new file mode 100644 index 0000000..c1a2c1d --- /dev/null +++ b/horizontal_widget/styles/structure.css @@ -0,0 +1,74 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + display: flex; + justify-content: flex-start; + align-items: flex-start; + width: 100vw; + height: 100vh; + min-height: 100vh; + overflow: hidden; + background: rgba(0, 0, 0, 0); +} + +.task-panel { + overflow: hidden; + display: flex; + flex-direction: row; + align-items: stretch; +} + +.panel-header { + display: flex; + justify-content: center; + align-items: center; + text-align: center; + width: var(--header-width); +} + +.scroll-viewport { + flex: 1; + min-width: 0; + overflow: hidden; + position: relative; +} + +.scroll-track { + display: flex; + flex-direction: row; + align-items: center; + width: max-content; + height: 100%; +} + +.scroll-content, +.scroll-clone { + display: flex; + align-items: center; + flex: 0 0 auto; + height: 100%; +} + +@keyframes infiniteScroll { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-50%); + } +} + +.scroll-track.animating { + animation: infiniteScroll linear infinite; +} + +.task { + display: flex; + align-items: center; + flex: 0 0 auto; + white-space: nowrap; +} diff --git a/horizontal_widget/styles/style.css b/horizontal_widget/styles/style.css new file mode 100644 index 0000000..650f1f3 --- /dev/null +++ b/horizontal_widget/styles/style.css @@ -0,0 +1,143 @@ +/* ======================================== + 🎨 CUSTOMIZATION VARIABLES + Change the values below to customize! + ======================================== */ +:root { + /* -- Background & Panel -- */ + --panel-header-background: #141414; /* Header background color */ + --panel-background: #141414c0; /* Body background color */ + --panel-border-radius: 8px; /* Roundness of panel corners */ + --widget-height: 50px; /* Height of the full-width horizontal bar */ + + /* -- Text Colors -- */ + --text-color: #fafafa; /* Main text color */ + --done-task-color: #aaa; /* Color of completed tasks */ + --focused-text-color: #141414; /* Text color when a task is focused */ + + /* -- Focused Task Highlight -- */ + --focused-background: #ffffff; /* Background color of the focused task */ + --focused-border-radius: 4px; /* Roundness of focused task corners */ + --focused-padding: 2px 4px; /* Spacing inside focused task highlight */ + + /* -- Font Sizes -- */ + --title-font-size: 1rem; /* Size of the panel title */ + --section-title-font-size: 0.95rem; /* Size of section headings */ + --header-font-size: 14px; /* Size of the header text */ + --header-subtitle-font-size: 1.5rem; /* Size of the header subtitle */ + --task-font-size: 0.95rem; /* Size of task text */ + + /* -- Borders & Dividers -- */ + --header-border-color: #e0dbd5; /* Line below the header */ + --section-border-color: white; /* Line between sections */ + + /* -- Spacing -- */ + --header-padding: 0 14px; /* Spacing inside the header */ + --header-width: 150px; + --section-padding: 0 14px; /* Spacing inside each section */ + --section-gap: 10px; /* Gap between section title and tasks */ + --task-gap: 6px; /* Gap between task items */ + --task-padding: 0; /* Spacing around each task */ +} + +@font-face { + font-family: "Fredoka"; + src: url("./fonts/Fredoka-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Fredoka"; + src: url("./fonts/Fredoka-Bold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +body { + font-family: "Fredoka", Roboto, sans-serif; + background: rgba(0, 0, 0, 0); +} + +.task-panel { + width: 100vw; + height: min(var(--widget-height), 100vh); + background: var(--panel-background); + border-radius: var(--panel-border-radius); +} + +.panel-header { + padding: var(--header-padding); + font-weight: 700; + font-size: var(--header-font-size); + color: var(--text-color); + background: var(--panel-header-background); + height: 100%; + white-space: nowrap; +} + +.panel-header span:last-child { + font-weight: 600; + color: var(--text-color); + font-size: var(--header-subtitle-font-size); +} + +.section { + display: flex; + align-items: center; + gap: var(--section-gap); + flex: 0 0 auto; + height: 100%; + padding: var(--section-padding); + border-left: 2px solid var(--section-border-color); +} + +.section:last-child { + padding-right: 16px; +} + +.section-title { + flex: 0 0 auto; + font-weight: 700; + font-size: var(--section-title-font-size); + color: var(--text-color); + margin-bottom: 0; + white-space: nowrap; +} + +.task { + gap: var(--task-gap); + padding: var(--task-padding); + font-size: var(--task-font-size); + color: var(--text-color); + line-height: 1.4; + width: auto; +} + +.section-title.has-user-color { + color: var(--user-color); /*auto user color*/ +} + +.task.done, +.task.focused.done { + text-decoration: line-through; + color: var(--done-task-color); +} + +.task.focused:not(.done) { + background: var(--focused-background); + color: var(--focused-text-color); + padding: var(--focused-padding); + border-radius: var(--focused-border-radius); +} + +#title { + font-size: var(--title-font-size); +} + +.task-number { + flex-shrink: 0; + min-width: 16px; + text-align: right; +}