[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: [qwreey] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\npolar: # Replace with a single Polar username\nbuy_me_a_coffee: # Replace with a single Buy Me a Coffee username\nthanks_dev: # Replace with a single thanks.dev username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug---error-report.md",
    "content": "---\nname: Bug & Error report\nabout: Create a report to help us improve\ntitle: \"[bug] \"\nlabels: bug\nassignees: ''\n\n---\n\n<!--\n  Note:\n  0. Don't waste the author's time.\n  As a university student, there is little time left for studying, starting projects,\n  or working to cover insufficient funds. Open source activities outside of vacation periods\n  are almost impossible. (Of course, it is difficult even during vacation periods)\n  So, please understand. Please read all messages and write an issue. **PLEASE**\n\n  1. PLEASE SEARCH YOUR ISSUE FIRST, DO NOT MAKE DUPLICATED ISSUE\n     The author checks all issues in real time because they get notifications on their watch\n\n  2. Attach log file\n     You can print your system log with command `journalctl` if you use systemd based disto.\n     You should mask your personal information, then cut and upload only the parts related to the GNOME shell.\n\n  3. Please clearly state your GNOME Shell version, extension version and distribution.\n     To get distribution information, run this command, `cat /etc/os-release`.\n     To get gnome-shell version, run this command, `gnome-shell --version`.\n     To get extension version, go extension preferences -> about\n\n  4. Make sure all other extensions are turned off and only the 'Quick Settings Tweaks'\n     extension is turned on.\n-->\n\n## Describe the bug\n<!-- A clear and concise description of what the bug is. -->\n\n## To Reproduce\n<!--\n  Steps to reproduce the behavior\n  1. Go to '...'\n  2. Click on '....'\n  3. Scroll down to '....'\n  4. See error\n-->\n\n## Expected behavior\n<!--\n  A clear and concise description of what you expected to happen.\n  Clear this section if not needed\n-->\n\n## Screenshots\n<!--\n  If applicable, add screen recordings and screenshots to help explain your problem.\n  Clear this section if not needed\n-->\n\n## Environment\n\n1. gnome-shell version: (ex) GNOME Shell 47.5\n2. distro information:\n```\n(ex)\nNAME=\"Arch Linux\"\nPRETTY_NAME=\"Arch Linux\"\nID=arch\nBUILD_ID=rolling\n```\n3. Extension version: 2.1 - stable\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\non: [push, pull_request]\n\njobs:\n  build:\n    name: Build extension\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Install dependencies\n        run: |\n          sudo apt update\n          DEBIAN_FRONTEND=noninteractive sudo apt install -y gettext gnome-shell\n      - name: Build extension\n        run: |\n          npm i\n          ./install.sh build\n      - name: Archive current compilation\n        uses: actions/upload-artifact@v4\n        with:\n          name: \"quick-settings-tweaks-${{ github.sha }}\"\n          path: \"target/quick-settings-tweaks@qwreey.shell-extension.zip\"\n"
  },
  {
    "path": ".gitignore",
    "content": "target/\ni\n*.po~\nhost/\ndocker-compose.yml\nnode_modules/\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# Quick Settings Tweaks [<img src=\".github/images/quick-settings-tweaker.png\" width=\"200px\" align=\"right\" alt=\"QuickSettings-Tweaker SkeletonUI\">](https://extensions.gnome.org/extension/5446/quick-settings-tweaker/)\n\n<div align=\"center\">\n\n### Let's tweak Gnome Quick Settings!\n\n[<img src=\"https://raw.githubusercontent.com/andyholmes/gnome-shell-extensions-badge/master/get-it-on-ego.svg?sanitize=true\" alt=\"Get it on GNOME Extensions\" height=\"100\" align=\"middle\">](https://extensions.gnome.org/extension/5446/quick-settings-tweaker/)\n<br>\n<br>\nQuick Settings Tweaker is a Gnome 46+ extension which allows you to customize the new Quick Settings Panel to your liking!\n\n</div>\n<br>\n<br>\n\n## Features\n\n| <p align=\"center\">With this extension, you can...</p> | How it will appear |\n|:-------------------------------|:--------------------:|\n| <p align=\"center\">**Add the Media Controls Widget**</p><p align=\"center\">Control your music and videos directly from the Quick Settings, instead of the Date Menu.<br><br>For a cooler look, you can also get colors from the cover image and create a gradient.</p> | <img src=\".github/images/media-control.png\" width=\"600px\" alt=\"Media controls widget screenshot\"> |\n| <p align=\"center\">**Add the Volume Mixer Widget**</p><p align=\"center\">Adjust application volumes, without opening extra application.<br><br>Place the menu button next to the output slider for a compact and natural layout.</p> | <img src=\".github/images/volume-mixer.png\" width=\"600px\" alt=\"Volume mixer widget screenshot\"> |\n| <p align=\"center\">**Add the Notifications Widget**</p><p align=\"center\">You can check what has been sent to your mailbox or messenger, without missing!</p> | <img src=\".github/images/notifications.png\" width=\"600px\" alt=\"Notifications widget screenshot\"> |\n| <p align=\"center\">**Layout customize**</p><p align=\"center\">Hide, re-order, re-color your panel and Quick Settings layout<br><br>Make it simple and keep organized!</p> | <img src=\".github/images/layout.png\" width=\"600px\" alt=\"Notifications widget screenshot\"> |\n| <p align=\"center\">**Overlay menu layout**</p><p align=\"center\">Your Quick Settings panel is too big?<br><br>Try overlay layout! you can customize background and animation style too.</p> | <img src=\".github/images/overlay.png\" width=\"600px\" alt=\"Notifications widget screenshot\"> |\n\n## Sponsor\n\nYou can promote and support development by [github sponsor!](https://github.com/sponsors/qwreey) You can help keep this project maintained\n\nHere is my sponsors, thank for your support!\n\n[![sponsors](https://readme-contribs.as93.net/sponsors/qwreey?shape=square&margin=16&perRow=15&title=Qwreey's%20Sponsors&textColor=f5acff&backgroundColor=0e001a&fontFamily=cursive&fontSize=14&limit=90&footerText=none&outerBorderRadius=24)](https://github.com/sponsors/qwreey)\n\n## Stars\n\n[![Star History Chart](https://api.star-history.com/svg?repos=qwreey/quick-settings-tweaks&type=Date)](https://star-history.com/#qwreey/quick-settings-tweaks&Date)\n\n## Development\n\n### Building\n\n> Prerequirements: You need to install nodejs, bash, and gnome-shell for compiling extension from source\n\nYou can create development build by executing `TARGET=dev ./install.sh create-release`. make sure run `npm i` first to ensure all build dependencies installed\n\nOr, you can get nightly preview build from [github releases tab](https://github.com/qwreey/quick-settings-tweaks/releases). Build extension from `dev` branch is not encouraged, because the `dev` branch has unchecked bleeding-edge features not guaranteed to work. github-preview build is tested by developer and much stable than building `dev` branch.\n\n### Contribution and Issues\n\nKeep in mind that there may be one or a few developers, but there may be many issues and users. I think you know how to behave with manners without even having to say it.\n\nPlease check github [project board page](https://github.com/users/qwreey/projects/2) for issue priority and progress.\n\n#### Raise an issue\n\nIf you want to raise an issue, First, **you must search your issue first.** duplicated issue will be closed, and disturb developer's time.\n\nSecond, **you must attach a related log files, gnome version and extension version informations.** if you don't provide information much about your issue, it is hard to solve your issue. and to be clear, Please use `[migration]`, `[feature]`, `[bug]` prefix for issue title, It is very useful for searching and organizing issues\n\nAnd last, **you must use well-formed english** You can use a translator or AI to write it, so avoid wasting time by having the developer translate and take notes. This takes up a surprising amount of the developer's time, making analysis very difficult, especially if the logs are mixed in English and other languages.\n\n#### PR and code contribution\n\nIf you want to contribute, **you must pull `dev` branch, Not master branch.** master branch is release branch, because AUR and some user distributions use master branch as build source. **If you create pull-request to master branch, it will be closed.** you should re-open PR to dev branch.\n\n### Testing\n\n![gnome-docker devlopment screenshot](.github/images/dev-preview.png)\n\nYou can test extension with command `./install.sh dev`. You will need tigervnc client and docker in host. Tested in arch linux but it should working on any systemd based platform\n\nYou can re-build extension by log out and close vnc window or send SIGINT to exit dev docker.\n"
  },
  {
    "path": "Todo.md",
    "content": "Scroll view layout for media widget\nTouch enchantments:\n    Notifications: slide to discard\n\nReadme file\nhomepage?\n\n배터리 알약 아이콘\n\nwidgets:\n    sound output:\n        device to hide\n        show device name\n    sound input:\n        always show slider\n        show device name\n        device to hide\n    volume mixer\n        item to hide\n            show hidden item button (temporary)\n        as submenu (like background apps)\n\n키보드로 포커스 가능해야함\n\n더보기 아이콘 sound card 로 바꾸고 싶은데 그런 옵션이 있으면 좋겠음\n\nAdd cover image round clip effect option\n이미지 비율 설정 기능\n\n날씨 로딩중에 라벨 위치\n\n패널 전체 오더링 << 가능했으면 좋겠음.......... 왼쪽 오른쪽 중간 고르기 가능하고\n위젯 오더링\n\n습도계\n시스템 메뉴에 시간 표시\ndatemenu format\n백그라운드 앱스 스타일: 일반, 퀵토글, 시스템레이아웃\n열리는 애니메이션\n미디어 타이틀 움직이도록\n\nshow full title\n    never\n    when hover, move around\n    always, move around\n    when hover, as tooltip\n\n어나더: 자동으로 지우는 알림 리스트 (타이틀 regex)\ndatemenu 왼쪽 레이아웃 오른쪽레이아웃, 메뉴 열지 않기\nmore dimmer\n\noption to hide widget header?\n믹서 디바이스 변경 구현하기\n"
  },
  {
    "path": "dirzsh.zsh",
    "content": "$ID:load() {\n    lib:path-alloc2 \"PATHALLOC_$ID\" ./scripts :\n    alias execute=\"ID=$ID $ID:execute\"\n    alias lg=\"ID=$ID $ID:lg\"\n    alias dbus-docker=\"ID=$ID $ID:dbus-docker\"\n    alias notify=\"ID=$ID $ID:notify\"\n    alias notify-test=\"ID=$ID $ID:notify-test\"\n    alias prefs=\"ID=$ID $ID:prefs\"\n}\n\n$ID:unload() {\n    lib:path-free \"PATHALLOC_$ID\"\n    unalias execute\n    unalias lg\n    unalias dbus-docker\n    unalias notify\n    unalias notify-test\n    unalias prefs\n}\n\n$ID:execute() {\n    if [ -e ./host/vncready ]; then\n        sudo docker compose exec -u gnome gnome-docker env DISPLAY=\":0\" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval \"$1\"\n    else\n        gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval \"$1\"\n    fi\n}\n$ID:dbus-docker() {\n    sudo docker compose exec -u gnome gnome-docker env DISPLAY=\":0\" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus $@\n}\n$ID:lg() {\n     $ID:execute \"Main.createLookingGlass().toggle()\"\n}\n$ID:notify() {\n    if [ -e ./host/vncready ]; then\n        $ID:dbus-docker notify-send $@\n    else\n        notify-send $@\n    fi\n}\n$ID:notify-test() {\n    $ID:notify test testmessage -u normal -t 0\n}\n$ID:prefs() {\n    if [ -e ./host/vncready ]; then\n        $ID:dbus-docker gnome-extensions prefs quick-settings-tweaks@qwreey\n    else\n        gnome-extensions prefs quick-settings-tweaks@qwreey\n    fi\n}\n"
  },
  {
    "path": "docker-compose.example.yml",
    "content": "services:\n  gnome-docker:\n    container_name: gnome-docker\n    hostname: gnome-docker\n    build: ./host/gnome-docker\n\n    environment:\n      VNC_OPTION: -SecurityTypes=None -rfbunixpath /host/vncsocket -rfbport 5900\n      BEFORE_GNOME: \"/extension/install.sh dev-guest\"\n      ROOTMODE: false\n      XVFB_GPU: false\n      XVFB_SCREEN_WIDTH: 1080\n      RDP_OPTION: \"-auth /monitors:0\"\n\n    # Remote\n    ports:\n      # for rdp\n      - 3389:3389\n      # for vnc\n      - 5900:5900\n\n    # For systemd\n    security_opt:\n      - seccomp:unconfined\n      - apparmor:unconfined\n    cgroup: host\n\n    # Mounts\n    volumes:\n      # Systemd requirements\n      - type: tmpfs\n        target: /tmp\n      - type: tmpfs\n        target: /run\n      - /sys/fs/cgroup:/sys/fs/cgroup:ro\n      - /sys/fs/cgroup/system.slice:/sys/fs/cgroup/system.slice:rw\n\n      # Host dir\n      - ./host:/host:rw\n      - ./:/extension\n      - ./host/home:/home/gnome\n"
  },
  {
    "path": "install.sh",
    "content": "#!/usr/bin/env bash\ncd \"$(dirname \"$(readlink -f \"$0\")\")\"\n\nfunction update-po() {\n\tbuild\n\n\techo '' > messages.po\n\t[ \"$?\" != \"0\" ] && echo \"update-po: Unable to create ./messages.po file\" && return 1\n\n\twhich xgettext 2>/dev/null >/dev/null\n\t[ \"$?\" != \"0\" ] && echo \"update-po: xgettext is not installed on this system. please install and try again\" && return 1\n\n\tfind ./target/out -type f \\( -name \"*.ui\" -or -name \"*.js\" \\) | xgettext --from-code utf-8 -j messages.po -f -\n\t[ \"$?\" != \"0\" ] && echo \"update-po: Unable to update messages.po file by xgettext\" && return 1\n\n\tsed -i 's|\"Content\\-Type: text/plain; charset=CHARSET\\\\n\"|\"Content-Type: text/plain; charset=UTF-8\\\\n\"|g' messages.po\n\t[ \"$?\" != \"0\" ] && echo \"update-po: Unable to set charset in messages.po file\" && return 1\n\n\tfind ./po -type f -name \"*.po\" | xargs -i msgmerge {} messages.po -N --no-wrap -U\n\t[ \"$?\" != \"0\" ] && echo \"update-po: Failed to update *.po files (msgmerge error)\" && return 1\n\n\tmv messages.po $(find ./po -type f -name \"*.pot\")\n\t[ \"$?\" != \"0\" ] && echo \"update-po: Unable to move messages.po file (pot file not found)\" && return 1\n\n\treturn 0\n}\n\nfunction fetch-contributors() {\n\tLABELS=$(cat scripts/contributor-labels.json)\n\techo \"[\"\n\tFIRST=\"1\"\n\tcurl -Ls \"https://api.github.com/repos/qwreey/quick-settings-tweaks/contributors?per_page=16&page=1\" | while read line; do\n\t\tif echo $line | grep -oP '^ *{ *$' > /dev/null; then\n\t\t\t[ \"$FIRST\" = \"0\" ] && echo -e \"\\t},\"\n\t\t\tFIRST=\"0\"\n\t\t\techo -e \"\\t{\"\n\t\tfi\n\n\t\tif NAME=$(echo $line | grep -oP '(?<=\"login\": \").*(?=\")'); then\n\t\t\tUSER_LABEL=$(printf \"%s\" \"$LABELS\" | grep -oP \"(?<=\\\"$NAME\\\": \\\").*(?=\\\")\")\n\t\t\techo -e \"\\t\\t\\\"name\\\": \\\"$NAME\\\",\"\n\t\t\techo -e \"\\t\\t\\\"image\\\": \\\"$NAME\\\",\"\n\t\t\techo -en \"\\t\\t\"\n\t\t\techo \"\\\"label\\\": \\\"${USER_LABEL:-ETC}\\\",\"\n\t\t\tcurl -Lso target/contributors/$NAME.png \"https://github.com/$NAME.png?size=38\"\n\t\tfi\n\t\tif HOMEPAGE=$(echo $line | grep -oP '(?<=\"html_url\": \").*(?=\")'); then\n\t\t\techo -e \"\\t\\t\\\"link\\\": \\\"$HOMEPAGE\\\"\"\n\t\tfi\n\tdone\n\techo -e \"\\t}\"\n\techo \"]\"\n}\n\nfunction build() {\n\trm -rf target/out\n\tmkdir -p target/out\n\n\t# Typescript compiling\n\t(\n\t\tnpx tsc --noCheck\n\t\tcp -r target/tsc/* target/out\n\t) &\n\tTSC_PID=$!\n\n\t# Stylesheet compiling\n\t(\n\t\tnpx sass\\\n\t\t\t--no-source-map\\\n\t\t\tsrc/stylesheet.scss:target/out/stylesheet.css\n\t\tsed $'s/^  /\\t/g' -i target/out/stylesheet.css\n\t) &\n\tSASS_PID=$!\n\n\t# Fetch contributors & Copy assets\n\t(\n\t\tif [ ! -e target/contributors ]; then\n\t\t\tmkdir -p target/contributors\n\t\t\tfetch-contributors > target/contributors/data.json\n\t\tfi\n\t\tcp metadata.json target/out\n\t\tcp -r schemas target/out\n\t\tcp -r media target/out\n\t\tcp -r target/contributors target/out/media\n\t) &\n\tCOPYING_PID=$!\n\n\t# Wait for tasks\n\twait $TSC_PID\n\twait $SASS_PID\n\twait $COPYING_PID\n\n\t# Update config metadata\n\tcase \"$TARGET\" in\n\t\tdev )\n\t\t\tsed 's/isDevelopmentBuild: false/isDevelopmentBuild: true/' -i target/out/config.js\n\t\t;;\n\t\tpreview )\n\t\t;;\n\t\trelease )\n\t\t\tsed 's/isReleaseBuild: false/isReleaseBuild: true/' -i target/out/config.js\n\t\t;;\n\t\tgithub-release )\n\t\t\tsed 's/isReleaseBuild: false/isReleaseBuild: true/' -i target/out/config.js\n\t\t\tsed 's/isGithubBuild: false/isGithubBuild: true/' -i target/out/config.js\n\t\t;;\n\t\tgithub-preview )\n\t\t\tsed 's/isGithubBuild: false/isGithubBuild: true/' -i target/out/config.js\n\t\t;;\n\tesac\n\tif [ -z \"$VERSION\" ]; then\n\t\tVERSION=$(git branch --show-current)\n\tfi\n\tsed \"s/version: \\\"unknown\\\"/version: \\\"$VERSION\\\"/\" -i target/out/config.js\n\t[ ! -z \"$BUILD_NUMBER\" ] && sed \"s/buildNumber: 0/buildNumber: $BUILD_NUMBER/\" -i target/out/config.js\n\n\t# Change indents for reducing size of target\n\tnode scripts/reindent.js -- target/out/**/*.js\n\n\t# Pack extension\n\tgnome-extensions pack target/out\\\n\t\t--podir=../../po\\\n\t\t--extra-source=features\\\n\t\t--extra-source=libs\\\n\t\t--extra-source=prefPages\\\n\t\t--extra-source=media\\\n\t\t--extra-source=global.js\\\n\t\t--extra-source=config.js\\\n\t\t--out-dir=target\\\n\t\t--force\n\t[ \"$?\" != \"0\" ] && echo \"Failed to pack extension\" && return 1\n\n\treturn 0\n}\n\nfunction enable() {\n\tgnome-extensions enable quick-settings-tweaks@qwreey\n}\n\nfunction install() {\n\tgnome-extensions install\\\n\t\ttarget/quick-settings-tweaks@qwreey.shell-extension.zip\\\n\t\t--force\n\t[ \"$?\" != \"0\" ] && echo \"Failed to install extension\" && return 1\n\techo \"Extension was installed. logout and login shell, and check extension list.\"\n\n\treturn 0\n}\n\nfunction log() {\n\tjournalctl /usr/bin/gnome-shell -f -q --output cat | grep '\\[EXTENSION QSTweaks\\] '\n}\n\nfunction clear-old-po() {\n\trm ./po/*.po~\n}\n\nfunction compile-preferences() {\n\tglib-compile-schemas --targetdir=target/out/schemas schemas\n\t[ \"$?\" != \"0\" ] && echo \"compile-preferences: glib-compile-schemas command failed\" && return 1\n\n\treturn 0\n}\n\nfunction increase-middle-version() {\n\techo $(( $(cat scripts/version/latest-middle-version) + 1 )) > scripts/version/latest-middle-version\n\techo $(( $(cat scripts/version/latest-build-number) + 1 )) > scripts/version/latest-build-number\n\techo 1 > scripts/version/latest-minor-version\n}\nfunction increase-minor-version() {\n\techo $(( $(cat scripts/version/latest-build-number) + 1 )) > scripts/version/latest-build-number\n\techo $(( $(cat scripts/version/latest-minor-version) + 1 )) > scripts/version/latest-minor-version\n}\n\nfunction get-full-version() {\n\tVERSION_MAJOR=$(cat scripts/version/major-version)\n\tVERSION_MIDDLE=$(cat scripts/version/latest-middle-version)\n\tVERSION_MINOR=$(cat scripts/version/latest-minor-version)\n\tBUILD_NUMBER=$(cat scripts/version/latest-build-number)\n\tVERSION_TAG=\"\"\n\tcase \"$TARGET\" in\n\t\tdev )\n\t\t\tVERSION_TAG=\"-dev$VERSION_MINOR\"\n\t\t;;\n\t\tpreview )\n\t\t\tVERSION_TAG=\"-pre$VERSION_MINOR\"\n\t\t;;\n\t\trelease )\n\t\t\tVERSION_TAG=\"\"\n\t\t;;\n\t\tgithub-release )\n\t\t\tVERSION_TAG=\"\"\n\t\t;;\n\t\tgithub-preview )\n\t\t\tVERSION_TAG=\"-pre$VERSION_MINOR\"\n\t\t;;\n\tesac\n\tVERSION=\"$VERSION_MAJOR.$VERSION_MIDDLE$VERSION_TAG\"\n}\n\nfunction update-metadata-version() {\n\tget-full-version\n\tsed 's| *\"version-name\": *\"[^\"]*\",|  \"version-name\": \"'$VERSION'\",|g' -i metadata.json\n}\n\nfunction create-release() {\n\tget-full-version\n\tupdate-metadata-version\n\tVERSION=$VERSION BUILD_NUMBER=$BUILD_NUMBER build\n\tcp target/quick-settings-tweaks@qwreey.shell-extension.zip target/$VERSION-$TARGET.zip\n}\n\nfunction dev() {\n\tif ! sudo echo > /dev/null; then\n\t\treturn\n\tfi\n\tmkdir -p host\n\t[ -e host/extension-ready ] && rm host/extension-ready\n\tmkfifo host/extension-ready\n\t[ -e host/extension-build ] && rm host/extension-build\n\tmkfifo host/extension-build\n\n\t# Build\n\t(\n\t\tTARGET=\"${TARGET:-dev}\" create-release\n\t\techo > host/extension-ready\n\t) &\n\n\t# Watch Build Request\nread -d '' INNER_BUILDWATCH << EOF\n\tcat host/extension-build > /dev/null\n\twhile true; do\n\t\tcat host/extension-build > /dev/null\n\t\tif [ ! -e host/vncready ]; then\n\t\t\tbreak\n\t\tfi\n\t\tTARGET=\"\\${TARGET:-dev}\" create-release\n\t\techo > host/extension-ready\n\tdone\nEOF\n\tsetsid bash -c \"$INNER_BUILDWATCH\" &\n\tBUILDWATCH_PID=$!\n\n\t[ ! -e ./docker-compose.yml ] && cp ./docker-compose.example.yml ./docker-compose.yml\n\n\tCURTAG=\"\"\n\tif [ -e \"./host/gnome-docker\" ]; then\n\t\tCURTAG=\"$(git -C host/gnome-docker describe --tags --always --abbrev=0 HEAD)\"\n\telse\n\t\tgit clone https://github.com/qwreey/gnome-docker host/gnome-docker --recursive --tags\n\tfi\n\n\tTARTAG=\"$(cat scripts/version/gnome-docker-version)\"\n\tif [[ \"$CURTAG\" != \"$TARTAG\" ]]; then\n\t\tgit -C host/gnome-docker pull origin master --tags\n\t\tgit -C host/gnome-docker submodule update\n\t\tgit -C host/gnome-docker checkout \"$TARTAG\"\n\t\tsudo docker compose -f ./docker-compose.yml build\n\tfi\n\n\tCOMPOSEFILE=\"./docker-compose.yml\" ./host/gnome-docker/test.sh\n\trm host/extension-build host/extension-ready\n\tkill $BUILDWATCH_PID 2> /dev/null\n\twait $BUILDWATCH_PID\n\texit 0\n}\n\nfunction dev-guest() {\n\techo > /host/extension-build\n\tcat /host/extension-ready > /dev/null\n\tinstall\n\tenable\n}\n\nfunction usage() {\n\techo 'Usage: ./install.sh COMMAND'\n\techo 'COMMAND:'\n\techo \"  install             install the extension in the user's home directory\"\n\techo '                      under ~/.local'\n\techo '  build               Creates a zip file of the extension'\n\techo '  update-po           Update po files to match source files'\n\techo '  dev                 Run dev docker'\n\techo '  log                 show extension logs (live)'\n\techo '  clear-old-po        clear *.po~'\n\techo '  enable              enable extension'\n\techo '  install-enable      install and enable'\n\techo '  compile-preferences compile schema file (test)'\n}\n\ncase \"$1\" in\n\t\"install\" )\n\t\tinstall\n\t;;\n\n\t\"install-enable\" )\n\t\tinstall\n\t\tenable\n\t;;\n\n\t\"build\" )\n\t\tbuild\n\t;;\n\n\t\"log\" )\n\t\tlog\n\t;;\n\n\t\"update-po\" )\n\t\tupdate-po\n\t;;\n\n\t\"clear-old-po\" )\n\t\tclear-old-po\n\t;;\n\n\t\"enable\" )\n\t\tenable\n\t;;\n\n\t\"dev\" )\n\t\tdev\n\t;;\n\t\"dev-guest\" )\n\t\tdev-guest\n\t;;\n\t\n\t\"compile-preferences\")\n\t\tcompile-preferences\n\t;;\n\n\t\"increase-minor-version\")\n\t\tincrease-minor-version\n\t;;\n\n\t\"increase-middle-version\")\n\t\tincrease-middle-version\n\t;;\n\n\t\"update-metadata-version\")\n\t\tupdate-metadata-version\n\t;;\n\n\t\"create-release\")\n\t\tcreate-release\n\t;;\n\n\t* )\n\t\tusage\n\t;;\nesac\nexit\n"
  },
  {
    "path": "media/Changelog.md",
    "content": "<!-- markdownlint-disable-file MD025 MD024 MD034 -->\n<!-- Note: -->\n<!-- This file is visible in prefs so if -->\n<!-- it is erased it may cause an error -->\n# 2.3-stable\n<!-- @BuildNumber: 10 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-07-15 00:37:00 KST\" -->\n<!-- @Git: \"7142389\" -->\n\n{{HEADER}}\n\n- Drop gnome 48 support\n- Add support for gnome 49\n- Remove dnd quick toggle (now gnome support it natively)\n- Add 'overlay-menu-overflow-anchor' option for adjust overlay menu box overflowing\n\n## Fix\n\n- VolumeMixer widget\n  - Fix already been disposed warning\n\n# 2.2-stable\n<!-- @BuildNumber: 9 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-07-15 00:37:00 KST\" -->\n<!-- @Git: \"7142389\" -->\n\n{{HEADER}}\n\n- Drop gnome 46, 47 support\n- Add support for gnome 48\n- Remove non-compatible feature\n  - Date Menu\n    - Hide Media Control\n    - Hide Notifications\n\n## Fix\n\n- Weather widget\n  - Fix 'already disposed' warning\n- DND Toggle\n  - Fix missing icon when it's turned off by PR #191\n- Notification\n  - Better padding for Native notifications clear button by PR #184\n- Fix settings names by PR #183\n\n# 2.1-stable\n<!-- @BuildNumber: 8 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-02-15 04:25:00 KST\" -->\n<!-- @Git: \"5428193\" -->\n\n{{HEADER}}\n\n- Layout editor shows only useful items\n  > For example, a DND quick toggle only appears when enabled\n- Migration for gnome 48 (partially)\n  - 'vertical' property migration\n- Fix some typescript type errors\n- Update locales\n- Add github sponsor (replace original one)\n\n## New Features\n\n- Menu animation\n  - Add background brightness option\n- Weather widget\n  - Add show or hide location label option\n  - Add max forecasts option\n  - Add weather interval option\n- System Indicators\n  - Monochrome option for privacy indicators\n\n## Fix\n\n- System Indicators\n  - Fix accent indicators color not match with shell accent color\n- Weather widget\n  - Fix status label style\n- Fix project name\n\n# 2.1-pre7\n<!-- @BuildNumber: 7 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-02-12 4:56:00 KST\" -->\n<!-- @Git: \"dafca5e\" -->\n\n{{HEADER}}\n\n- Improve ordering editors\n- Update locale files\n- Migration for gnome 48 (partially)\n  - Media widget: Lowered GNOME Shell API dependency for backwards compatibility\n\n## New Features\n\n- Quick toggle layout\n  - Add GType name filter option\n  - Now you can hide 'Unsorted items'\n- System indicators layout\n  - Add ordering and hiding option\n  - Add accent screen sharing &amp; recording indicators option\n  - Add accent privacy indicators option\n\n## Fix\n\n- Default value optimization for menu animation\n- Fix broken scrollbar padding\n- Fix mixer description only shows 'Playback Stream'\n- Fix smooth scroll cause scrolling issue on media widget\n- Fix mixer widget menu section initial state\n- Fix #170, some quick toggles are not hiding\n- Fix 'has been already disposed' error on weather widget\n- Fix '(intermediate value).Extension.features is null' error when extension unloading\n\n# 2.1-pre6\n<!-- @BuildNumber: 6 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-02-09 03:57:00 KST\" -->\n<!-- @Git: \"30ad4df\" -->\n\n{{HEADER}}\n\n- Reduce reloading cost\n\n## New Features\n\n- Media widget\n  - Add adjust smooth scroll speed option\n- Overlay menu\n  - Smoother animation\n  - Better animation start offset for flyout style\n- Volume mixer widget\n  - Add show stream icon option\n  - Add attach menu to output slider option\n\n## Fix\n\n- Media widget\n  - Fix 'event.moveStartCoords is undefined' error\n\n# 2.1-pre5\n<!-- @BuildNumber: 5 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-02-08 13:49:00 KST\" -->\n<!-- @Git: \"7acb2a4\" -->\n\n{{HEADER}}\n\n- List the license in more detail\n- Weather feature is now stable\n\n## New Features\n\n- Media widget\n  - Add round clip effect detailed option\n  - Support trackpad and trackpoint smooth scroll\n- Date menu\n  - Add hide left box option\n  - Add hide right box option\n  - Add menu disable option\n  - Add menu button hide option\n- VolumeMixer widget\n  - Migrated from 1.18\n\n## Fix\n\n- Fix 'st_widget_get_theme_node called on the widget which is not in the stage' issue\n\n## Prefs QOL patch\n\n- Add detailed button on some options\n\n# 2.1-pre4\n<!-- @BuildNumber: 4 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-02-03 09:31:00 KST\" -->\n<!-- @Git: \"0f05873\" -->\n\n{{HEADER}}\n\n- Changelog viewer enchantments\n  - Show build number, git hash, and date in detailed view\n\n## New Features\n\n- Media widget\n  - Add gradient background option\n  - Add progress bar style option\n  - Add contorl button opacity option\n  - Implement swipe to switch page\n  - Implement round clip effect to make transition better\n- Weather widget\n  - Add click command option\n- Debugging\n  - Expose features\n\n## Fix\n\n- Fix gnome-shell segfault on dragging media widget\n- Media widget\n  - Fix page indicator click action\n\n## New Licenses\n\n- rounded-window-corners\n  - Auther: yilozt\n  - URL: https://github.com/yilozt/rounded-window-corners\n\n# 2.1-pre3\n<!-- @BuildNumber: 3 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-01-31 20:39:00 KST\" -->\n<!-- @Git: \"0f05873\" -->\n\n{{HEADER}}\n\n- Update repo url in metadata\n\n## New Features\n\n- Option to hide dnd indicator completely\n- Debugging\n  - Use better logging format\n  - Add logging level option\n  - Add extension environment expose option\n- Notifications widget\n  - Add vfade offset option\n  - Add scrollbar visibility option\n\n## Fix\n\n- Fix 'PageIndicators has been already disposed' issue\n- Add more promise catch handlers and source naming for debugging\n- Removed fixStScrollViewScrollbarOverflow, use vscrollbar_policy instead\n\n## Known issues\n\n- Cannot hide keyboard quick toggle\n\n# 2.1-pre2\n<!-- @BuildNumber: 2 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-01-23 00:40:00 KST\" -->\n<!-- @Git: \"1ef912f\" -->\n\n{{HEADER}}\n\n## New Features\n\n- Add quick toggle ordering and hiding\n- Add page indicator on media widget\n- Add DND indicator position option\n- Add save last session state option on unsafe mode quick toggle\n\n## Fix\n\n- Fix changelog text align\n- Fix pref page scroll flickering issue\n- Fix weather widget empty when no location selected issue\n\n## Prefs QOL patch\n\n- Move contributor rows to dialog\n\n# 2.1-pre1\n<!-- @BuildNumber: 1 -->\n<!-- @Includes: [] -->\n<!-- @Date: \"2025-01-22 13:16:00 KST\" -->\n<!-- @Git: \"724eedd\" -->\n\n{{HEADER}}\n\n- **Droped gnome-shell 43 and 44 support COMPLETELY** due to ESM incompatible\n- Using major.middle.minor version system\n- Using girs and typescript, for better development\n- New stable, github-stable, github-preview release channel\n\n## Shell version bump\n\nshell-version >= 45, >= 48\n\n## Prefs QOL patch\n\n- Some space rich option groups are now using bottom sheet layout\n- Add button for reset modified options\n- Organize about section\n  - Add changelogs subpage\n\n## New Features\n\n- Reorder and hide system items\n- Reanimate menu, overlay menu mode\n- Weather widget\n\n## Known issues\n\n- Sometime, the media progress bar displayed even should't be displayed\n- Weather widget shows empty box when region wasn't selected\n"
  },
  {
    "path": "media/dbus.xml",
    "content": "<?xml version=\"1.0\"?>\n<node>\n  <interface name=\"org.freedesktop.DBus.Properties\">\n    <method name=\"Get\">\n      <arg type=\"s\" name=\"interface_name\" direction=\"in\"/>\n      <arg type=\"s\" name=\"property_name\" direction=\"in\"/>\n      <arg type=\"v\" name=\"value\" direction=\"out\"/>\n    </method>\n  </interface>\n  <interface name=\"org.mpris.MediaPlayer2.Player\">\n    <method name=\"SetPosition\">\n      <arg type=\"o\" name=\"TrackId\" direction=\"in\"/>\n      <arg type=\"x\" name=\"Position\" direction=\"in\"/>\n    </method>\n    <method name=\"PlayPause\"/>\n    <method name=\"Next\"/>\n    <method name=\"Previous\"/>\n    <property name=\"CanGoNext\" type=\"b\" access=\"read\"/>\n    <property name=\"CanGoPrevious\" type=\"b\" access=\"read\"/>\n    <property name=\"CanPlay\" type=\"b\" access=\"read\"/>\n    <property name=\"CanSeek\" type=\"b\" access=\"read\"/>\n    <property name=\"Metadata\" type=\"a{sv}\" access=\"read\"/>\n    <property name=\"PlaybackStatus\" type=\"s\" access=\"read\"/>\n  </interface>\n  <interface name=\"org.mpris.MediaPlayer2\">\n    <method name=\"Raise\"/>\n    <property name=\"CanRaise\" type=\"b\" access=\"read\"/>\n    <property name=\"DesktopEntry\" type=\"s\" access=\"read\"/>\n    <property name=\"Identity\" type=\"s\" access=\"read\"/>\n  </interface>\n</node>\n"
  },
  {
    "path": "media/licenses.json",
    "content": "[\n\t{\n\t\t\"licenseUri\": \"https://github.com/qwreey/quick-settings-tweaks/blob/master/LICENSE\",\n\t\t\"name\": \"quick-settings-tweaks\",\n\t\t\"author\": \"qwreey\",\n\t\t\"url\": \"https://github.com/qwreey/quick-settings-tweaks\",\n\t\t\"licenseSummary\": \"LGPL v3.0\"\n\t},\n\t{\n\t\t\"licenseUri\": \"https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/COPYING\",\n\t\t\"name\": \"gnome-shell\",\n\t\t\"author\": \"gnome\",\n\t\t\"url\": \"https://gitlab.gnome.org/GNOME/gnome-shell\",\n\t\t\"licenseSummary\": \"GPL v2\"\n\t},\n\t{\n\t\t\"licenseUri\": \"https://github.com/microsoft/TypeScript/blob/main/LICENSE.txt\",\n\t\t\"name\": \"TypeScript\",\n\t\t\"author\": \"microsoft\",\n\t\t\"url\": \"https://www.typescriptlang.org\",\n\t\t\"description\": \"Typescript compiler\",\n\t\t\"licenseSummary\": \"Apache License 2.0\"\n\t},\n\t{\n\t\t\"licenseUri\": \"https://github.com/gjsify/gnome-shell/blob/main/LICENSE\",\n\t\t\"name\": \"girs\",\n\t\t\"author\": \"gisify\",\n\t\t\"url\": \"https://github.com/gjsify/gnome-shell\",\n\t\t\"description\": \"Gnome shell typescript types\",\n\t\t\"licenseSummary\": \"MIT License\"\n\t},\n\t{\n\t\t\"licenseUri\": \"https://github.com/sass/dart-sass/blob/main/LICENSE\",\n\t\t\"name\": \"sass\",\n\t\t\"url\": \"https://sass-lang.com/\",\n\t\t\"description\": \"Stylesheet pre-processor\",\n\t\t\"licenseSummary\": \"MIT License\"\n\t},\n\t{\n\t\t\"name\": \"gnome-volume-mixer\",\n\t\t\"author\": \"mymindstorm\",\n\t\t\"url\": \"https://github.com/mymindstorm/gnome-volume-mixer\",\n\t\t\"licenseUri\": \"https://github.com/mymindstorm/gnome-volume-mixer/blob/master/LICENSE\",\n\t\t\"description\": \"Volume mixer widget\",\n\t\t\"affectedFiles\": [\n\t\t\t\"features/widget/volumeMixer.ts\"\n\t\t],\n\t\t\"licenseSummary\": \"MIT License\"\n\t},\n\t{\n\t\t\"licenseUri\": \"https://github.com/yilozt/rounded-window-corners/blob/main/LICENSE\",\n\t\t\"name\": \"rounded-window-corners\",\n\t\t\"author\": \"yilozt\",\n\t\t\"url\": \"https://github.com/yilozt/rounded-window-corners\",\n\t\t\"affectedFiles\": [\n\t\t\t\"media/rounded_corners.frag\",\n\t\t\t\"libs/roundClip.ts\"\n\t\t],\n\t\t\"description\": \"Round clip shader\"\n\t}\n]\n"
  },
  {
    "path": "media/rounded_corners.frag",
    "content": "// This shader is copied from Mutter project:\n// https://gitlab.gnome.org/GNOME/mutter/-/blob/main/src/compositor/meta-background-content.c\n//\n// With a litte change to make it works well with windows\n\n// The uniforms variables for controls\nuniform vec4  bounds;           // x, y: top left; z, w: bottom right\nuniform float clip_radius;\nuniform vec4  inner_bounds;\nuniform float inner_clip_radius;\nuniform vec2  pixel_step;\nuniform float border_width;\nuniform vec4  border_color;\nuniform float exponent;\n\n\nfloat circle_bounds(vec2 p, vec2 center, float clip_radius) {\n  vec2 delta = p - vec2(center.x, center.y);\n  float dist_squared = dot(delta, delta);\n\n  // Fully outside the circle\n  float outer_radius = clip_radius + 0.5;\n  if(dist_squared >= (outer_radius * outer_radius))\n    return 0.0;\n\n  // Fully inside the circle\n  float inner_radius = clip_radius - 0.5;\n  if(dist_squared <= (inner_radius * inner_radius))\n    return 1.0;\n\n  // Only pixels on the edge of the curve need expensive antialiasing\n  return outer_radius - sqrt(dist_squared);\n}\n\nfloat squircle_bounds(vec2 p, vec2 center, float clip_radius, float exponent) {\n  vec2 delta = abs(p - center);\n\n  float pow_dx = pow(delta.x, exponent);\n  float pow_dy = pow(delta.y, exponent);\n  \n  float dist = pow(pow_dx + pow_dy, 1.0 / exponent);\n\n  return clamp(clip_radius - dist + 0.5, 0.0, 1.0);\n}\n\nfloat rounded_rect_coverage(vec2 p, vec4 bounds, float clip_radius, float exponent) {\n  // Outside the bounds\n  if(p.x < bounds.x || p.x > bounds.z || p.y < bounds.y || p.y > bounds.w) {\n    return 0.0;\n  }\n  \n  vec2 center;\n  \n  float center_left = bounds.x + clip_radius;\n  float center_right = bounds.z - clip_radius;\n\n  if(p.x < center_left)\n    center.x = center_left;\n  else if(p.x > center_right)\n    center.x = center_right;\n  else\n    return 1.0; // The vast majority of pixels exit early here\n\n  float center_top = bounds.y + clip_radius;\n  float center_bottom = bounds.w - clip_radius;\n\n  if(p.y < center_top)\n      center.y = center_top;\n  else if(p.y > center_bottom)\n    center.y = center_bottom;\n  else\n    return 1.0;\n  \n  if(exponent <= 2.0) {\n    return circle_bounds(p, center, clip_radius);\n  } else {\n    return squircle_bounds(p, center, clip_radius, exponent);\n  }\n}\n\nvoid main() {\n  vec2 texture_coord = cogl_tex_coord0_in.xy / pixel_step;\n\n  float outer_alpha = rounded_rect_coverage(texture_coord, bounds, clip_radius, exponent);\n\n  if(border_width > 0.9 || border_width < -0.9) {\n    float inner_alpha = rounded_rect_coverage(texture_coord, inner_bounds, inner_clip_radius, exponent);\n    float border_alpha = clamp(abs(outer_alpha - inner_alpha), 0.0, 1.0);\n    if (border_width > 0.0) {\n      // Clip corners of window first\n      cogl_color_out *= outer_alpha;\n      // Then mix Rounded window and border\n      cogl_color_out = mix(cogl_color_out, vec4(border_color.rgb, 1.0), border_alpha * border_color.a);\n    } else {\n      // Fill an rounded rectangle with border color first\n      vec4 border_rect = vec4(border_color.rgb, 1.0) * inner_alpha * border_color.a;\n      // Then mix rounded window and border, rounded window is smaller than border_rect\n      cogl_color_out = mix(border_rect, cogl_color_out, outer_alpha);\n    }\n  } else {\n    cogl_color_out *= outer_alpha;\n  }\n}"
  },
  {
    "path": "metadata.json",
    "content": "{\n  \"name\": \"Quick Settings Tweaks\",\n  \"uuid\": \"quick-settings-tweaks@qwreey\",\n  \"description\": \"Let's tweak gnome's quick settings! You can add Media Controls, Notifications, Volume Mixer on quick settings and remove useless buttons!\",\n  \"shell-version\": [\"48\", \"49\"],\n  \"url\": \"https://github.com/qwreey/quick-settings-tweaks\",\n  \"settings-schema\": \"org.gnome.shell.extensions.quick-settings-tweaks\",\n  \"gettext-domain\": \"quick-settings-tweaks\",\n  \"version-name\": \"2.2-pre1\",\n  \"donations\": {\n    \"github\": \"qwreey\"\n  }\n}\n"
  },
  {
    "path": "old/features/volumeMixer.ts",
    "content": "import { featureReloader } from \"../libs/utility.js\"\nimport { VolumeMixer } from \"../libs/volumeMixerHandler.js\"\nimport { Global } from \"../global.js\"\n\nexport class VolumeMixerFeature {\n\tload() {\n\t\tlet settings = Global.Settings\n\n\t\t// setup reloader\n\t\tfeatureReloader.enableWithSettingKeys(this, [\n\t\t\t\"volume-mixer-enabled\",\n\t\t\t\"volume-mixer-position\",\n\t\t\t\"volume-mixer-filtered-apps\",\n\t\t\t\"volume-mixer-show-description\",\n\t\t\t\"volume-mixer-show-icon\",\n\t\t\t\"volume-mixer-filter-mode\",\n\t\t\t\"volume-mixer-use-regex\",\n\t\t\t\"volume-mixer-check-description\"\n\t\t])\n\n\t\t// check is feature enabled\n\t\tif (!Global.Settings.get_boolean(\"volume-mixer-enabled\")) return\n\n\t\t// Make volume mixer\n\t\tthis.volumeMixer = new VolumeMixer({\n\t\t\t'volume-mixer-filtered-apps': settings.get_strv(\"volume-mixer-filtered-apps\"),\n\t\t\t'volume-mixer-filter-mode': settings.get_string(\"volume-mixer-filter-mode\"),\n\t\t\t'volume-mixer-show-description': settings.get_boolean(\"volume-mixer-show-description\"),\n\t\t\t'volume-mixer-show-icon': settings.get_boolean(\"volume-mixer-show-icon\"),\n\t\t\t'volume-mixer-check-description': settings.get_boolean(\"volume-mixer-check-description\"),\n\t\t\t'volume-mixer-use-regex': settings.get_boolean(\"volume-mixer-use-regex\")\n\t\t})\n\n\t\t// Insert volume mixer into Quick Settings\n\t\tGlobal.QuickSettingsMenu.addItem(this.volumeMixer.actor, 2)\n\t\tif (Global.Settings.get_string(\"volume-mixer-position\") === \"top\") {\n\t\t\tGlobal.GetStreamSlider(({ InputStreamSlider }) => {\n\t\t\t\tGlobal.QuickSettingsMenu._grid.set_child_above_sibling(\n\t\t\t\t\tthis.volumeMixer.actor,\n\t\t\t\t\tInputStreamSlider\n\t\t\t\t)\n\t\t\t})\n\t\t}\n\t}\n\n\tunload() {\n\t\t// disable feature reloader\n\t\tfeatureReloader.disable(this)\n\t\tif (this.volumeMixer) this.volumeMixer.destroy()\n\t\tthis.volumeMixer = null\n\t}\n}\n"
  },
  {
    "path": "old/inputOutput.ts",
    "content": "import { Global } from \"./global.js\"\nimport St from \"gi://St\"\nimport * as Volume from \"resource:///org/gnome/shell/ui/status/volume.js\"\nimport * as PopupMenu from \"resource:///org/gnome/shell/ui/popupMenu.js\"\nimport { FeatureBase, type SettingLoader } from \"./libs/shell/feature.js\"\nimport { logger } from \"./libs/shared/logger.js\"\nexport class SoundTweakFeature extends FeatureBase {\n\t// #region settings\n\toutputShowSelected: boolean\n\tinputShowSelected: boolean\n\tinputAlwaysShow: boolean\n\toutputHide: {name: string}[]\n\tinputHide: {name: string}[]\n\tloadSettings(loader: SettingLoader): void {\n\t\tthis.outputShowSelected = loader.loadBoolean(\"sound-output-show-selected\")\n\t\tthis.inputShowSelected = loader.loadBoolean(\"sound-input-show-selected\")\n\t\tthis.inputAlwaysShow = loader.loadBoolean(\"sound-input-always-show\")\n\t\tthis.outputHide = loader.loadValue(\"sound-output-hide\")\n\t\tthis.inputHide = loader.loadValue(\"sound-input-hide\")\n\t}\n\t// #endregion settings\n\n\tonLoad() {\n\t\tif (this.outputShowSelected) {\n\t\t\tconst label = this.maid.destroyJob(new St.Label({\n\t\t\t\tstyle_class: \"QSTWEAKS-volume-mixer-label\"\n\t\t\t}))\n\t\t\tGlobal.QuickSettingsMenu.addItem(label, 2)\n\t\t\tGlobal.GetStreamSlider().then(({ OutputStreamSlider }) => {\n\t\t\t\tGlobal.QuickSettingsGrid.set_child_below_sibling(label, OutputStreamSlider)\n\t\t\t}).catch(logger.error)\n\t\t}\n\t}\n\tonUnload(): void {}\n}\n\n\tunload() {\n\t\t// disable feature reloader\n\t\tfeatureReloader.disable(this)\n\n\t\tif (this._inputListener) {\n\t\t\tthis._detachInputLabel()\n\t\t\tVolume.getMixerControl().disconnect(this._inputListener)\n\t\t\tthis._inputListener = null\n\t\t}\n\t\tif (this._inputVisibilityListener) {\n\t\t\tlet inputVisibilityListener = this._inputVisibilityListener\n\t\t\tthis._inputVisibilityListener = null\n\t\t\tGlobal.GetStreamSlider(({ InputStreamSlider }) => {\n\t\t\t\tInputStreamSlider.disconnect(inputVisibilityListener)\n\t\t\t\tInputStreamSlider.visible = InputStreamSlider._shouldBeVisible()\n\t\t\t})\n\t\t}\n\t\tif (this._outputListener) {\n\t\t\tthis._detachOutputLabel()\n\t\t\tVolume.getMixerControl().disconnect(this._outputListener)\n\t\t\tthis._outputListener = null\n\t\t}\n\t}\n\n\t// =========================================== Ouput ===========================================\n\t_setupOutputChangedListener() {\n\t\tthis._attachOutputLabel()\n\t\tthis._outputListener = Volume.getMixerControl().connect('active-output-update', (c, id) => this._onOutputDeviceChanged(id))\n\t}\n\n\t_onOutputDeviceChanged(deviceId) {\n\t\tconst device = Volume.getMixerControl().lookup_output_id(deviceId)\n\t\tthis.outputLabel.text = this._getDeviceName(device)\n\t}\n\n\t_attachOutputLabel() {\n\t\tthis.outputLabel = new St.Label()\n\t\tthis.outputLabel.style_class = \"QSTWEAKS-volume-mixer-label\"\n\t\tGlobal.QuickSettingsMenu.addItem(this.outputLabel, 2)\n\t\tthis.outputLabel.visible = Global.Settings.get_boolean(\"output-show-selected\")\n\t\tGlobal.GetStreamSlider(({ OutputStreamSlider }) => {\n\t\t\tGlobal.QuickSettingsGrid.set_child_below_sibling(this.outputLabel, OutputStreamSlider)\n\t\t\tthis.outputLabel.text = this._findActiveDevice(OutputStreamSlider)\n\t\t})\n\t}\n\n\t_detachOutputLabel() {\n\t\tif (this.outputLabel && this.outputLabel.get_parent()) {\n\t\t\tthis.outputLabel.get_parent().remove_child(this.outputLabel)\n\t\t\tthis.outputLabel = null\n\t\t}\n\t}\n\n\t// =========================================== Input ===========================================\n\t_setupInputChangedListener() {\n\t\tthis._attachInputLabel()\n\t\tthis._inputListener = Volume.getMixerControl().connect('active-input-update', (c, id) => this._onInputDeviceChanged(id))\n\t}\n\n\t_attachInputLabel() {\n\t\tthis.inputLabel = new St.Label()\n\t\tthis.inputLabel.style_class = \"QSTWEAKS-volume-mixer-label\"\n\t\tGlobal.QuickSettingsMenu.addItem(this.inputLabel, 2)\n\t\tGlobal.GetStreamSlider(({ InputStreamSlider }) => {\n\t\t\tGlobal.QuickSettingsGrid.set_child_below_sibling(this.inputLabel, InputStreamSlider)\n\t\t\tthis.inputLabel.text = this._findActiveDevice(InputStreamSlider)\n\t\t})\n\t\tthis._setInputLabelVisibility()\n\t}\n\n\t_onInputDeviceChanged(deviceId) {\n\t\tconst device = Volume.getMixerControl().lookup_input_id(deviceId)\n\t\tthis.inputLabel.text = this._getDeviceName(device)\n\t}\n\n\t_detachInputLabel() {\n\t\tif (this.inputLabel && this.inputLabel.get_parent()) {\n\t\t\tthis.inputLabel.get_parent().remove_child(this.inputLabel)\n\t\t\tthis.inputLabel = null\n\t\t}\n\t}\n\n\t// =========================================== Input Visbility ===========================================\n\t_setupInputVisibilityObserver() {\n\t\tGlobal.GetStreamSlider(({ InputStreamSlider }) => {\n\t\t\tthis._inputVisibilityListener = InputStreamSlider.connect(\"notify::visible\", () => this._onInputStreamSliderSynced())\n\t\t\tthis._onInputStreamSliderSynced()\n\t\t})\n\t}\n\n\t_onInputStreamSliderSynced() {\n\t\tthis._setInputStreamSliderVisibility()\n\t\tif (this._inputListener) {\n\t\t\tthis._setInputLabelVisibility()\n\t\t}\n\t}\n\n\t_setInputStreamSliderVisibility() {\n\t\tGlobal.GetStreamSlider(({ InputStreamSlider }) => {\n\t\t\tInputStreamSlider.visible = InputStreamSlider._shouldBeVisible() || Global.Settings.get_boolean(\"input-always-show\")\n\t\t})\n\t}\n\n\n\t_setInputLabelVisibility() {\n\t\tGlobal.GetStreamSlider(({ InputStreamSlider }) => {\n\t\t\tthis.inputLabel.visible = InputStreamSlider.visible && Global.Settings.get_boolean(\"input-show-selected\")\n\t\t})\n\t}\n\n\n\t// =========================================== Utils ===========================================\n\t_findActiveDevice(sliderObject) {\n\t\t// find the current selected input and grab the input text from that\n\t\tlet menuChildren = sliderObject.menu.box.get_children()[1].get_children()\n\t\tfor (let index = 0; index < menuChildren.length; index++) {\n\t\t\tlet item = menuChildren[index]\n\t\t\tif (item._ornament == PopupMenu.Ornament.CHECK) {\n\t\t\t\treturn item.label.text\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t_getDeviceName(device) {\n\t\tif (!device)\n\t\t\treturn\n\n\t\tconst { description, origin } = device\n\t\tconst name = origin\n\t\t\t? `${description} – ${origin}`\n\t\t\t: description\n\n\t\treturn name\n\t}\n}\n"
  },
  {
    "path": "old/layoutCustomize.ts",
    "content": "import St from \"gi://St\"\nimport { Global } from \"../global.js\"\nimport { FeatureBase, type SettingLoader } from \"../libs/feature.js\"\nimport { QuickMenuToggle } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\n\nexport class LayoutCustomize extends FeatureBase {\n\t_scroll: St.ScrollView\n\t_sections: St.BoxLayout\n\n\t// #region settings\n\toverride loadSettings(loader: SettingLoader): void {\n\t}\n\t// #endregion settings\n\n\tonChild(actor: QuickMenuToggle) {\n\t\tactor.get_parent().remove_child(actor)\n\t\tthis._sections.add_child(actor)\n\t}\n\tcheckChildren() {\n\t\tfor (const item of Global.QuickSettingsGrid.get_children()) {\n\t\t\tif (item instanceof QuickMenuToggle) this.onChild(item)\n\t\t}\n\t}\n\n\tupdate() {\n\t\t\n\t}\n\n\toverride onLoad(): void {\n\t\tGlobal.QuickSettingsBox.vertical = false\n\t\t// Global.QuickSettingsBox.add_child(\n\t\t// \tnew St.Button({height: 100, width: 100, style: \"background-color:red;\"})\n\t\t// )\n\n\t\tthis.maid.connectJob(\n\t\t\tGlobal.QuickSettingsBox, \"notify::mapped\", ()=>{\n\t\t\t\tif (Global.QuickSettingsBox.mapped) this.update()\n\t\t\t}\n\t\t)\n\t}\n\toverride onUnload(): void {\n\t\tGlobal.QuickSettingsBox.vertical = true\n\t}\n}\n"
  },
  {
    "path": "old/libs/streamSlider.ts",
    "content": "import GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport GLib from \"gi://GLib\"\nimport Gvc from \"gi://Gvc\"\n\nimport { QuickSlider } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport * as PopupMenu from \"resource:///org/gnome/shell/ui/popupMenu.js\"\n\nconst ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent'\n\nclass StreamSlider extends QuickSlider {\n\t_init(control) {\n\t\tsuper._init()\n\n\t\tthis._connections = []  // ADDED BY QWREEY\n\t\tthis._control = control\n\n\t\tthis._inDrag = false\n\t\tthis._notifyVolumeChangeId = 0\n\n\t\tthis._soundSettings = new Gio.Settings({\n\t\t\tschema_id: 'org.gnome.desktop.sound',\n\t\t})\n\n\t\t// MODED BY QWREEY\n\t\tthis._connections.push([\n\t\t\tthis._soundSettings,\n\t\t\tthis._soundSettings.connect(`changed::${ALLOW_AMPLIFIED_VOLUME_KEY}`,\n\t\t\t\t() => this._amplifySettingsChanged())\n\t\t])\n\t\tthis._amplifySettingsChanged()\n\n\t\tthis._sliderChangedId = this.slider.connect('notify::value',\n\t\t\t() => this._sliderChanged())\n\t\tthis._connections.push([ // ADDED BY QWREEY\n\t\t\tthis.slider, this._sliderChangedId\n\t\t])\n\t\tthis._connections.push([ // MODED BY QWREEY\n\t\t\tthis.slider,\n\t\t\tthis.slider.connect('drag-begin', () => (this._inDrag = true))\n\t\t])\n\t\tthis._connections.push([ // MODED BY QWREEY\n\t\t\tthis.slider,\n\t\t\tthis.slider.connect('drag-end', () => {\n\t\t\t\tthis._inDrag = false\n\t\t\t\tthis._notifyVolumeChange()\n\t\t\t})\n\t\t])\n\n\t\tthis._deviceItems = new Map()\n\n\t\tthis._deviceSection = new PopupMenu.PopupMenuSection()\n\t\tthis.menu.addMenuItem(this._deviceSection)\n\n\t\tthis.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem())\n\t\tthis.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop')\n\n\t\tthis._stream = null\n\t\tthis._volumeCancellable = null\n\t\tthis._icons = []\n\n\t\tthis._sync()\n\t\tthis._connections.push([ // ADDED BY QWREEY\n\t\t\tthis,\n\t\t\tthis.connect('destroy', this._destroy.bind(this))\n\t\t])\n\t}\n\n\tget stream() {\n\t\treturn this._stream\n\t}\n\n\tset stream(stream) {\n\t\tthis._stream?.disconnectObject(this)\n\n\t\tthis._stream = stream\n\n\t\tif (this._stream) {\n\t\t\tthis._connectStream(this._stream)\n\t\t\tthis._updateVolume()\n\t\t} else {\n\t\t\tthis.emit('stream-updated')\n\t\t}\n\n\t\tthis._sync()\n\t}\n\n\t_connectStream(stream) {\n\t\tstream.connectObject(\n\t\t\t'notify::is-muted', this._updateVolume.bind(this),\n\t\t\t'notify::volume', this._updateVolume.bind(this), this)\n\t}\n\n\t_lookupDevice(_id) {\n\t\tthrow new GObject.NotImplementedError(\n\t\t\t`_lookupDevice in ${this.constructor.name}`)\n\t}\n\n\t_activateDevice(_device) {\n\t\tthrow new GObject.NotImplementedError(\n\t\t\t`_activateDevice in ${this.constructor.name}`)\n\t}\n\n\t_addDevice(id) {\n\t\tif (this._deviceItems.has(id))\n\t\t\treturn\n\n\t\tconst device = this._lookupDevice(id)\n\t\tif (!device)\n\t\t\treturn\n\n\t\tconst { description, origin } = device\n\t\tconst name = origin\n\t\t\t? `${description} – ${origin}`\n\t\t\t: description\n\t\tconst item = new PopupMenu.PopupImageMenuItem(name, device.get_gicon())\n\t\tthis._connections.push([\n\t\t\titem,\n\t\t\titem.connect('activate', () => this._activateDevice(device))\n\t\t])\n\n\t\tthis._deviceSection.addMenuItem(item)\n\t\tthis._deviceItems.set(id, item)\n\n\t\tthis._sync()\n\t}\n\n\t_removeDevice(id) {\n\t\tthis._deviceItems.get(id)?.destroy()\n\t\tif (this._deviceItems.delete(id))\n\t\t\tthis._sync()\n\t}\n\n\t_setActiveDevice(activeId) {\n\t\tfor (const [id, item] of this._deviceItems) {\n\t\t\titem.setOrnament(id === activeId\n\t\t\t\t? PopupMenu.Ornament.CHECK\n\t\t\t\t: PopupMenu.Ornament.NONE)\n\t\t}\n\t}\n\n\t_shouldBeVisible() {\n\t\treturn this._stream != null\n\t}\n\n\t_sync() {\n\t\tthis.visible = this._shouldBeVisible()\n\t\tthis.menuEnabled = this._deviceItems.size > 1\n\t}\n\n\t_sliderChanged() {\n\t\tif (!this._stream)\n\t\t\treturn\n\n\t\tlet value = this.slider.value\n\t\tlet volume = value * this._control.get_vol_max_norm()\n\t\tlet prevMuted = this._stream.is_muted\n\t\tlet prevVolume = this._stream.volume\n\t\tif (volume < 1) {\n\t\t\tthis._stream.volume = 0\n\t\t\tif (!prevMuted)\n\t\t\t\tthis._stream.change_is_muted(true)\n\t\t} else {\n\t\t\tthis._stream.volume = volume\n\t\t\tif (prevMuted)\n\t\t\t\tthis._stream.change_is_muted(false)\n\t\t}\n\t\tthis._stream.push_volume()\n\n\t\tlet volumeChanged = this._stream.volume !== prevVolume\n\t\tif (volumeChanged && !this._notifyVolumeChangeId && !this._inDrag) {\n\t\t\tthis._notifyVolumeChangeId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 30, () => {\n\t\t\t\tthis._notifyVolumeChange()\n\t\t\t\tthis._notifyVolumeChangeId = 0\n\t\t\t\treturn GLib.SOURCE_REMOVE\n\t\t\t})\n\t\t\tGLib.Source.set_name_by_id(this._notifyVolumeChangeId,\n\t\t\t\t'[gnome-shell] this._notifyVolumeChangeId')\n\t\t}\n\t}\n\n\t_notifyVolumeChange() {\n\t\tif (this._volumeCancellable)\n\t\t\tthis._volumeCancellable.cancel()\n\t\tthis._volumeCancellable = null\n\n\t\tif (this._stream.state === Gvc.MixerStreamState.RUNNING)\n\t\t\treturn // feedback not necessary while playing\n\n\t\tthis._volumeCancellable = new Gio.Cancellable()\n\t\tlet player = global.display.get_sound_player()\n\t\tplayer.play_from_theme('audio-volume-change',\n\t\t\t_('Volume changed'), this._volumeCancellable)\n\t}\n\n\t_changeSlider(value) {\n\t\tthis.slider.block_signal_handler(this._sliderChangedId)\n\t\tthis.slider.value = value\n\t\tthis.slider.unblock_signal_handler(this._sliderChangedId)\n\t}\n\n\t_updateVolume() {\n\t\tlet muted = this._stream.is_muted\n\t\tthis._changeSlider(muted\n\t\t\t? 0 : this._stream.volume / this._control.get_vol_max_norm())\n\t\tthis.emit('stream-updated')\n\t}\n\n\t_amplifySettingsChanged() {\n\t\tthis._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY)\n\n\t\tthis.slider.maximum_value = this._allowAmplified\n\t\t\t? this.getMaxLevel() : 1\n\n\t\tif (this._stream)\n\t\t\tthis._updateVolume()\n\t}\n\n\tgetIcon() {\n\t\tif (!this._stream)\n\t\t\treturn null\n\n\t\tlet volume = this._stream.volume\n\t\tlet n\n\t\tif (this._stream.is_muted || volume <= 0) {\n\t\t\tn = 0\n\t\t} else {\n\t\t\tn = Math.ceil(3 * volume / this._control.get_vol_max_norm())\n\t\t\tn = Math.clamp(n, 1, this._icons.length - 1)\n\t\t}\n\t\treturn this._icons[n]\n\t}\n\n\tgetLevel() {\n\t\tif (!this._stream)\n\t\t\treturn null\n\n\t\treturn this._stream.volume / this._control.get_vol_max_norm()\n\t}\n\n\tgetMaxLevel() {\n\t\tlet maxVolume = this._control.get_vol_max_norm()\n\t\tif (this._allowAmplified)\n\t\t\tmaxVolume = this._control.get_vol_max_amplified()\n\n\t\treturn maxVolume / this._control.get_vol_max_norm()\n\t}\n\n\t// ADDED BY QWREEY\n\t_destroy() {\n\t\tGLib.Source.remove(this._notifyVolumeChangeId)\n\t\tfor (const item of this._connections) {\n\t\t\titem[0].disconnect(item[1])\n\t\t}\n\t\tthis._connections = null\n\t}\n}\nGObject.registerClass({\n\tSignals: {\n\t\t'stream-updated': {},\n\t},\n}, StreamSlider)\n"
  },
  {
    "path": "old/libs/volumeMixerHandlerNotImpled.ts",
    "content": "/*\n * This code is partially licensed under the gnome-volume-mixer license.\n * For more details, please check the license page in the about tab of the extension settings.\n*/\nimport St from \"gi://St\"\nimport Gvc from \"gi://Gvc\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport GLib from \"gi://GLib\"\nimport { QuickSlider } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport * as PopupMenu from \"resource:///org/gnome/shell/ui/popupMenu.js\"\nimport * as Volume from \"resource:///org/gnome/shell/ui/status/volume.js\"\nimport Maid from \"./libs/maid.js\"\n\nconst ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent'\n\n// 디바이스 변경 구현하기\n// 루프는 오직 컨테이너가 보이는 상태에서만 작동해야함\nclass StreamSlider extends QuickSlider {\n\t_init(control: Gvc.MixerControl, stream: Gvc.MixerStream) {\n\t\t// ...\n\t\tthis._maid.connectJob(this.slider, \"drag-begin\", () => { this._inDrag = true })\n\t\tthis._maid.connectJob(this.slider, \"drag-end\", () => { this._inDrag = false })\n\n\t\t// this._deviceItems = new Map()\n\n\t\t// this._deviceSection = new PopupMenu.PopupMenuSection()\n\t\t// this.menu.addMenuItem(this._deviceSection)\n\n\t\tthis.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem())\n\t\tthis.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop')\n\t\t// ...\n\t}\n\n\t// ...\n\t_connectStream(stream: Gvc.MixerStream) {\n\t}\n\t// ...\n\n\t// _lookupDevice(_id) {\n\t// \tthrow new GObject.NotImplementedError(\n\t// \t\t`_lookupDevice in ${this.constructor.name}`)\n\t// }\n\n\t// _activateDevice(_device) {\n\t// \tthrow new GObject.NotImplementedError(\n\t// \t\t`_activateDevice in ${this.constructor.name}`)\n\t// }\n\n\t// _addDevice(id) {\n\t// \tif (this._deviceItems.has(id))\n\t// \t\treturn\n\n\t// \tconst device = this._lookupDevice(id)\n\t// \tif (!device)\n\t// \t\treturn\n\n\t// \tconst { description, origin } = device\n\t// \tconst name = origin\n\t// \t\t? `${description} – ${origin}`\n\t// \t\t: description\n\t// \tconst item = new PopupMenu.PopupImageMenuItem(name, device.get_gicon())\n\t// \tthis._connections.push([\n\t// \t\titem,\n\t// \t\titem.connect('activate', () => this._activateDevice(device))\n\t// \t])\n\n\t// \tthis._deviceSection.addMenuItem(item)\n\t// \tthis._deviceItems.set(id, item)\n\n\t// \tthis._sync()\n\t// }\n\n\t// _removeDevice(id) {\n\t// \tthis._deviceItems.get(id)?.destroy()\n\t// \tif (this._deviceItems.delete(id))\n\t// \t\tthis._sync()\n\t// }\n\n\t// _setActiveDevice(activeId) {\n\t// \tfor (const [id, item] of this._deviceItems) {\n\t// \t\titem.setOrnament(id === activeId\n\t// \t\t\t? PopupMenu.Ornament.CHECK\n\t// \t\t\t: PopupMenu.Ornament.NONE)\n\t// \t}\n\t// }\n\n\t// ...\n\t_shouldBeVisible() {\n\t\treturn this._stream != null\n\t}\n\n\t// not used\n\tgetIcon() {\n\t\tif (!this._stream)\n\t\t\treturn null\n\n\t\tlet volume = this._stream.volume\n\t\tlet n\n\t\tif (this._stream.is_muted || volume <= 0) {\n\t\t\tn = 0\n\t\t} else {\n\t\t\tn = Math.ceil(3 * volume / this._control.get_vol_max_norm())\n\t\t\tn = Math.clamp(n, 1, this._icons.length - 1)\n\t\t}\n\t\treturn this._icons[n]\n\t}\n}\n"
  },
  {
    "path": "old/menus.ts",
    "content": "// Sound output menu\n// Sound input menu\n// Bluetooth\n// Wifi\n// VPN\n// Power mode (detailed?)\n// Wired\n// Hide item from...\n"
  },
  {
    "path": "old/other.ts",
    "content": "import Adw from \"gi://Adw\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport Config from \"../config.js\"\nimport type QstExtensionPreferences from \"../prefs.js\"\nimport {\n\tGroup,\n\tSwitchRow,\n\tfixPageScrollIssue,\n} from \"../libs/prefComponents.js\"\n\nexport const OtherPage = GObject.registerClass({\n\tGTypeName: Config.baseGTypeName+\"OtherPage\",\n}, class OtherPage extends Adw.PreferencesPage {\n\tconstructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {\n\t\tsuper({\n\t\t\tname: \"Other\",\n\t\t\ttitle: _(\"Other\"),\n\t\t\ticonName: \"preferences-system-symbolic\",\n\t\t})\n\t\tfixPageScrollIssue(this)\n\t}\n})\n"
  },
  {
    "path": "old/panel.ts",
    "content": ""
  },
  {
    "path": "old/prefsPages/volumeMixer.ts",
    "content": "import Adw from \"gi://Adw\"\nimport Gtk from \"gi://Gtk\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\n\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\n\nimport {\n\tbaseGTypeName,\n\tSwitchRow,\n\tmakeDropdown\n} from \"../libs/prefComponents.js\"\n\nexport const VolumeMixerAddFilterDialog = GObject.registerClass({\n\tGTypeName: baseGTypeName+'VolumeMixerAddFilterDialog',\n}, class VolumeMixerAddFilterDialog extends Gtk.Dialog {\n\tappNameEntry\n\tfilterListData\n\n\tconstructor(callingWidget, filterListData) {\n\t\tsuper({\n\t\t\tuse_header_bar: true,\n\t\t\ttransient_for: callingWidget.get_root(),\n\t\t\tdestroy_with_parent: true,\n\t\t\tmodal: true,\n\t\t\tresizable: false,\n\t\t\ttitle: _(\"Add Application to filtering\")\n\t\t})\n\n\t\tthis.filterListData = filterListData\n\n\t\tconst addButton = this.add_button(_(\"Add\"), Gtk.ResponseType.OK)\n\t\taddButton.get_style_context().add_class('suggested-action')\n\t\taddButton.sensitive = false\n\t\tthis.add_button(_(\"Cancel\"), Gtk.ResponseType.CANCEL)\n\n\t\tconst dialogContent = this.get_content_area()\n\t\tdialogContent.margin_top = 20\n\t\tdialogContent.margin_bottom = 20\n\t\tdialogContent.margin_end = 20\n\t\tdialogContent.margin_start = 20\n\n\t\tconst appNameLabel = new Gtk.Label({\n\t\t\tlabel: _(\"Application name\"),\n\t\t\thalign: Gtk.Align.START,\n\t\t\tmargin_bottom: 10\n\t\t})\n\t\tdialogContent.append(appNameLabel)\n\n\t\tthis.appNameEntry = new Gtk.Entry()\n\t\tthis.appNameEntry.connect('activate', () => {\n\t\t\tif (this.checkInputValid()) {\n\t\t\t\tthis.response(Gtk.ResponseType.OK)\n\t\t\t}\n\t\t})\n\t\tdialogContent.append(this.appNameEntry)\n\n\t\tthis.appNameEntry.connect(\"changed\", () => {\n\t\t\taddButton.sensitive = this.checkInputValid()\n\t\t})\n\t}\n\n\tcheckInputValid() {\n\t\tif (this.appNameEntry.text.length === 0) {\n\t\t\treturn false\n\t\t} else if (this.filterListData.indexOf(this.appNameEntry.text) !== -1) {\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn true\n\t\t}\n\t}\n})\n\nexport const FilterMode = GObject.registerClass({\n\tProperties: {\n\t\t'name': GObject.ParamSpec.string(\n\t\t\t'name', 'name', 'name',\n\t\t\tGObject.ParamFlags.READWRITE,\n\t\t\tnull),\n\t\t'value': GObject.ParamSpec.string(\n\t\t\t'value', 'value', 'value',\n\t\t\tGObject.ParamFlags.READWRITE,\n\t\t\tnull),\n\t},\n}, class FilterMode extends GObject.Object {\n\t_init(name, value) {\n\t\tsuper._init({ name, value })\n\t}\n})\n\nexport const volumeMixerPage = GObject.registerClass({\n\tGTypeName: baseGTypeName+'volumeMixerPage',\n}, class volumeMixerPage extends Adw.PreferencesPage {\n\tconstructor(settings) {\n\t\t// group config\n\t\tsuper({\n\t\t\tname: 'volumeMixer',\n\t\t\ttitle: _('Volume Mixer'),\n\t\t\ticonName: 'audio-volume-high-symbolic',\n\t\t})\n\n\t\tthis.settings = settings\n\t\tthis.filterListData = this.settings.get_strv(\"volume-mixer-filtered-apps\")\n\n\t\tconst generalGroup = new Adw.PreferencesGroup({\n\t\t\ttitle: _(\"General\"),\n\t\t\tdescription: _(\"Enchant input/output slider\")\n\t\t})\n\t\tSwitchRow({\n\t\t\tparent: generalGroup,\n\t\t\ttitle: _(\"Show current audio output selection\"),\n\t\t\tvalue: settings.get_boolean(\"output-show-selected\"),\n\t\t\tsubtitle: _(\"Always show the current audio output selection above the volume slider\"),\n\t\t\tbind: \"output-show-selected]\n\t\t})\n\t\tSwitchRow({\n\t\t\tparent: generalGroup,\n\t\t\ttitle: _(\"Show current audio input selection\"),\n\t\t\tvalue: settings.get_boolean(\"input-show-selected\"),\n\t\t\tsubtitle: _(\"Always show the current audio input selection above the volume slider\"),\n\t\t\tbind: \"input-show-selected]\n\t\t})\n\t\tSwitchRow({\n\t\t\tparent: generalGroup,\n\t\t\ttitle: _(\"Always show input\"),\n\t\t\tvalue: settings.get_boolean(\"input-always-show\"),\n\t\t\tsubtitle: _(\"Always show the audio input volume slider, even when there is no audio input stream.\"),\n\t\t\tbind: \"input-always-show]\n\t\t})\n\t\tthis.add(generalGroup)\n\n\t\t// volumeMixerGroup\n\t\tconst volumeMixerGroup = new Adw.PreferencesGroup({\n\t\t\ttitle: _(\"Add volume mixer (PulseAudio, Pipewire)\"),\n\t\t\tdescription: _(\"Turn on to make the volume mixer visible\\nForked from https://github.com/mymindstorm/gnome-volume-mixer\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\ttitle: \"\",\n\t\t\t\tvalue: settings.get_boolean(\"volume-mixer-enabled\"),\n\t\t\t\tbind: \"volume-mixer-enabled\",\n\t\t\t})\n\t\t})\n\t\tmakeDropdown({ // move to bottom\n\t\t\tparent: volumeMixerGroup,\n\t\t\ttitle: _(\"Position\"),\n\t\t\tsubtitle: _(\"Set volume mixer position\"),\n\t\t\tvalue: this.settings.get_string('volume-mixer-position'),\n\t\t\ttype: \"string\",\n\t\t\tbind: [this.settings, 'volume-mixer-position'],\n\t\t\titems: [\n\t\t\t\t{name: _(\"Top (Below Output/Input slider)\"), value: \"top\"},\n\t\t\t\t{name: _(\"Bottom\"), value: \"bottom\"},\n\t\t\t],\n\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t})\n\t\tSwitchRow({ // show-description\n\t\t\ttitle: _('Show stream Description'),\n\t\t\tsubtitle: _('Show audio stream description above the slider'),\n\t\t\tvalue: this.settings.get_boolean('volume-mixer-show-description'),\n\t\t\tparent: volumeMixerGroup,\n\t\t\tbind: [this.settings, 'volume-mixer-show-description'],\n\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t})\n\t\tSwitchRow({ // show-icon\n\t\t\ttitle: _('Show stream Icon'),\n\t\t\tsubtitle: _('Show application icon in front of the slider'),\n\t\t\tvalue: this.settings.get_boolean('volume-mixer-show-icon'),\n\t\t\tparent: volumeMixerGroup,\n\t\t\tbind: [this.settings, 'volume-mixer-show-icon'],\n\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t})\n\t\tthis.add(volumeMixerGroup)\n\n\t\t// Application filter settings group\n\t\tconst filterGroup = new Adw.PreferencesGroup({\n\t\t\ttitle: \"\",\n\t\t\tdescription: _('Filter applications shown in the volume mixer.'),\n\t\t})\n\t\tthis.add(filterGroup)\n\n\t\t// filter-mode\n\t\tmakeDropdown({\n\t\t\tparent: filterGroup,\n\t\t\ttitle: _(\"Filter Mode\"),\n\t\t\tvalue: this.settings.get_string('volume-mixer-filter-mode'),\n\t\t\ttype: \"string\",\n\t\t\tbind: [this.settings, 'volume-mixer-filter-mode'],\n\t\t\titems: [\n\t\t\t\t{name: _(\"Blacklist\"), value: \"block\"},\n\t\t\t\t{name: _(\"Whitelist\"), value: \"allow\"},\n\t\t\t],\n\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t})\n\t\tSwitchRow({\n\t\t\tparent: filterGroup,\n\t\t\ttitle: _('Using Javascript Regex'),\n\t\t\tsubtitle: _('Use Javascript RegExp for filtering app name or description'),\n\t\t\tvalue: this.settings.get_boolean('volume-mixer-use-regex'),\n\t\t\tbind: [this.settings, 'volume-mixer-use-regex'],\n\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t})\n\t\tSwitchRow({\n\t\t\tparent: filterGroup,\n\t\t\ttitle: _(\"Check Stream Description\"),\n\t\t\tsubtitle: _(\"Check Description also\"),\n\t\t\tvalue: this.settings.get_boolean('volume-mixer-check-description'),\n\t\t\tbind: [this.settings, 'volume-mixer-check-description'],\n\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t})\n\n\t\t// group to act as spacer for filter list\n\t\tthis.filteredAppsGroup = new Adw.PreferencesGroup()\n\t\tsettings.bind(\n\t\t\t\"volume-mixer-enabled\",\n\t\t\tthis.filteredAppsGroup,'sensitive',\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tthis.filteredAppsGroup.sensitive = settings.get_boolean(\"volume-mixer-enabled\")\n\t\tthis.add(this.filteredAppsGroup)\n\n\t\t// List of filtered apps\n\t\tfor (const filteredAppName of this.filterListData) {\n\t\t\tthis.filteredAppsGroup.add(this.buildFilterListRow(filteredAppName))\n\t\t}\n\n\t\t// Add filter entry button\n\t\tthis.createAddFilteredAppButtonRow()\n\n\t\t// TODO: modes\n\t\t// - group by application\n\t\t// - group by application but as a dropdown with streams\n\t\t// - show all streams\n\t\t// TODO: go thru github issues\n\t\t// popularity: page 26, 5th from the top\n\t\t// TODO: style\n\t}\n\n\tcreateAddFilteredAppButtonRow() {\n\t\t// I wanted to use Adw.PrefrencesRow, but you can't get the 'row-activated' signal unless it's part of a Gtk.ListBox.\n\t\t// Adw.PrefrencesGroup doesn't extend Gtk.ListBox.\n\t\t// TODO: Learn a less hacky to do this. I'm currently too new to GTK to know the best practice.\n\t\tthis.addFilteredAppButtonRow = new Adw.ActionRow()\n\t\tconst addIcon = Gtk.Image.new_from_icon_name(\"list-add\")\n\t\taddIcon.height_request = 40\n\t\tthis.addFilteredAppButtonRow.set_child(addIcon)\n\t\tthis.filteredAppsGroup.add(this.addFilteredAppButtonRow)\n\t\t// It won't send 'activated' signal w/o this being set.\n\t\tthis.addFilteredAppButtonRow.activatable_widget = addIcon\n\t\tthis.addFilteredAppButtonRow.connect('activated', (callingWidget) => {\n\t\t\tthis.showFilteredAppDialog(callingWidget, this.filterListData)\n\t\t})\n\t}\n\n\tbuildFilterListRow(filteredAppName) {\n\t\tconst filterListRow = new Adw.PreferencesRow({\n\t\t\ttitle: filteredAppName,\n\t\t\tactivatable: false,\n\t\t})\n\n\t\t// Make box for custom row\n\t\tconst filterListBox = new Gtk.Box({\n\t\t\tmargin_bottom:6,\n\t\t\tmargin_top: 6,\n\t\t\tmargin_end: 15,\n\t\t\tmargin_start: 15\n\t\t})\n\n\t\t// Add title\n\t\tconst filterListLabel = Gtk.Label.new(filterListRow.title)\n\t\tfilterListLabel.hexpand = true\n\t\tfilterListLabel.halign = Gtk.Align.START\n\t\tfilterListBox.append(filterListLabel)\n\n\t\t// Add remove button\n\t\tconst filterListButton = new Gtk.Button({\n\t\t\thalign: Gtk.Align.END\n\t\t})\n\n\t\t// Add icon to remove button\n\t\tconst filterListImage = Gtk.Image.new_from_icon_name(\"user-trash-symbolic\")\n\t\tfilterListButton.set_child(filterListImage)\n\n\t\t// Tie action to remove button\n\t\tfilterListButton.connect(\"clicked\", (_button) => this.removeFilteredApp(filteredAppName, filterListRow))\n\n\t\tfilterListBox.append(filterListButton)\n\t\tfilterListRow.set_child(filterListBox)\n\n\t\treturn filterListRow\n\t}\n\n\tremoveFilteredApp(filteredAppName, filterListRow) {\n\t\tthis.filterListData.splice(this.filterListData.indexOf(filteredAppName), 1)\n\t\tthis.settings.set_strv(\"volume-mixer-filtered-apps\", this.filterListData)\n\t\tthis.filteredAppsGroup.remove(filterListRow)\n\t}\n\n\taddFilteredApp(filteredAppName) {\n\t\tthis.filterListData.push(filteredAppName)\n\t\tthis.settings.set_strv(\"volume-mixer-filtered-apps\", this.filterListData)\n\t\tthis.filteredAppsGroup.remove(this.addFilteredAppButtonRow)\n\t\tthis.filteredAppsGroup.add(this.buildFilterListRow(filteredAppName))\n\t\tthis.filteredAppsGroup.add(this.addFilteredAppButtonRow)\n\t}\n\n\tshowFilteredAppDialog(callingWidget, filterListData) {\n\t\tconst dialog = new VolumeMixerAddFilterDialog(callingWidget, filterListData)\n\t\tdialog.connect('response', (_dialog, response) => {\n\t\t\tif (response === Gtk.ResponseType.OK) {\n\t\t\t\tthis.addFilteredApp(dialog.appNameEntry.text)\n\t\t\t}\n\t\t\tdialog.close()\n\t\t\tdialog.destroy()\n\t\t})\n\t\tdialog.show()\n\t}\n})\n"
  },
  {
    "path": "old/sidebarPrefs.ts",
    "content": "import Gtk from \"gi://Gtk\"\nimport Gdk from \"gi://Gdk\"\nimport Gio from \"gi://Gio\"\nimport Adw from \"gi://Adw\"\nimport { ExtensionPreferences } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport { WidgetsPage } from \"./prefPages/widgets.js\"\nimport { TogglesPage } from \"./prefPages/toggles.js\"\nimport { OtherPage } from \"./prefPages/other.js\"\nimport { AboutPage } from \"./prefPages/about.js\"\nimport { MenuPage } from \"./prefPages/menu.js\"\nimport { ContributorsRow, LicenseRow, Row, Group } from \"./libs/prefComponents.js\"\nimport Config from \"./config.js\"\n\nvar pageList = [\n\tWidgetsPage,\n\tTogglesPage,\n\tMenuPage,\n\tOtherPage,\n\tAboutPage,\n]\n\nexport default class QstExtensionPreferences extends ExtensionPreferences {\n\tappendIconPath(path: string) {\n\t\tconst iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default())\n\t\tif (!iconTheme.get_search_path().includes(path))\n\t\t\ticonTheme.add_search_path(path)\n\t}\n\n\treadExtensionFile(path: string) {\n\t\tconst decoder = new TextDecoder()\n\t\tconst file = Gio.File.new_for_path(`${this.path}/${path}`)\n\t\tconst content = file.load_contents(null)[1]\n\t\treturn decoder.decode(content)\n\t}\n\n\tgetContributorRows(): ContributorsRow.Contributor[][] {\n\t\tconst contributors = JSON.parse(\n\t\t\tthis.readExtensionFile(\"media/contributors/data.json\")\n\t\t) as ContributorsRow.Contributor[]\n\t\tif (!contributors.length) return []\n\t\tconst rows: ContributorsRow.Contributor[][] = [[]]\n\t\tcontributors.reduce((currentRow: ContributorsRow.Contributor[], obj: ContributorsRow.Contributor)=>{\n\t\t\tif (currentRow.length >= 4) rows.push(currentRow = [])\n\t\t\tcurrentRow.push(obj)\n\t\t\treturn currentRow\n\t\t}, rows[0])\n\t\treturn rows\n\t}\n\n\tgetLicenses(): LicenseRow.License[] {\n\t\tconst licenses = JSON.parse(\n\t\t\tthis.readExtensionFile(\"media/licenses.json\")\n\t\t) as LicenseRow.License[]\n\t\tfor (const item of licenses) {\n\t\t\tif (item.file) {\n\t\t\t\titem.content = async () => this.readExtensionFile(item.file)\n\t\t\t}\n\t\t}\n\t\treturn licenses\n\t}\n\n\tgetVersionString(): string {\n\t\tlet version = Config.version.toUpperCase().replace(/-.*?$/, \"\")\n\t\tif (this.metadata.version) {\n\t\t\tversion += \".\" + this.metadata.version\n\t\t}\n\t\tversion += \"   —   \"\n\t\tif (Config.isReleaseBuild) {\n\t\t\tversion += _(\"Stable\") \n\t\t} else if (Config.isDevelopmentBuild) {\n\t\t\tversion += _(\"Development\")\n\t\t} else {\n\t\t\tversion += _(\"Preview\")\n\t\t}\n\t\tif (Config.isGithubBuild) {\n\t\t\tversion += \"  \" + _(\"(Github Release)\")\n\t\t} else if (!this.metadata.version) {\n\t\t\tversion += \"  \" + _(\"(Built from source)\")\n\t\t}\n\t\treturn version\n\t}\n\n\tgetChangelog(): string {\n\t\treturn this.readExtensionFile(\"media/Changelog.md\")\n\t}\n\n\tasync fillPreferencesWindow(window: Adw.PreferencesWindow) {\n\t\tlet settings = this.getSettings()\n\n\t\t// Register icon path\n\t\tthis.appendIconPath(this.path + \"/media\")\n\t\tthis.appendIconPath(this.path + \"/media/contributors\")\n\n\t\t// Set window options\n\t\twindow.set_search_enabled(true)\n\t\twindow.set_default_size(720, 640)\n\n\t\t// Create sidebar area\n\t\tconst sidebar = new Adw.NavigationPage({\n\t\t\ttitle: this.metadata.name,\n\t\t\twidth_request: 196,\n\t\t})\n\t\tconst sidebarToolbar = new Adw.ToolbarView()\n\t\tconst sidebarHeader = new Adw.HeaderBar()\n\t\tsidebarToolbar.add_top_bar(sidebarHeader)\n\t\tsidebar.set_child(sidebarToolbar)\n\t\tconst sidebarPage = new Adw.PreferencesPage()\n\t\tsidebarToolbar.set_content(sidebarPage)\n\t\t\n\t\t// Create content area\n\t\tconst content = new Adw.NavigationPage({\n\t\t\ttitle: \"undefined\"\n\t\t})\n\t\tconst contentToolbar = new Adw.ToolbarView()\n\t\tconst contentHeader = new Adw.HeaderBar()\n\t\tcontentToolbar.add_top_bar(contentHeader)\n\t\tcontent.set_child(contentToolbar)\n\n\t\t// Create navigation\n\t\tconst navigation = new Adw.NavigationSplitView({\n\t\t\tvexpand: true,\n\t\t\thexpand: true,\n\t\t})\n\t\tnavigation.set_show_content(true)\n\t\tnavigation.set_sidebar(sidebar)\n\t\tnavigation.set_content(content)\n\t\twindow.set_content(navigation)\n\t\twindow.add(new Adw.PreferencesPage())\n\n\t\tconst open = (page: Adw.PreferencesPage) => {\n\t\t\tcontentToolbar.content = page\n\t\t\tcontent.title = page.title\n\t\t}\n\t\tconst sidebarGroup = Group({\n\t\t\tparent: sidebarPage,\n\t\t})\n\t\tfor (const PageClass of pageList) {\n\t\t\tconst page = new PageClass(settings, this, window)\n\t\t\tconst row = Row({\n\t\t\t\tparent: sidebarGroup,\n\t\t\t\ttitle: page.title,\n\t\t\t\ticon: page.iconName,\n\t\t\t\tnoLinkIcon: true,\n\t\t\t\taction: ()=>{\n\t\t\t\t\topen(page)\n\t\t\t\t}\n\t\t\t})\n\t\t\tif (!contentToolbar.content) open(page)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "old/widgetManager.ts",
    "content": "import St from \"gi://St\"\nimport { Global } from \"../global.js\"\nimport Maid from \"./maid.js\"\n\nexport class WidgetManager {\n    _scroll: St.ScrollView\n    _sections: St.BoxLayout\n    _maid: Maid\n    _boxes: St.BoxLayout[]\n\n    update() {\n        this._boxes[]\n    }\n\n    load(): void {\n        this._maid = new Maid()\n        Global.QuickSettingsBox.vertical = false\n\n        this._maid.connectJob(\n            Global.Settings,\n            \"changed::layout\",\n            this.update.bind(this)\n        )\n\n        this._maid.connectJob(\n            Global.QuickSettingsBox, \"notify::mapped\", ()=>{\n                if (Global.QuickSettingsBox.mapped) this.update()\n            }\n        )\n    }\n    unload(): void {\n        this._maid.destroy()\n        Global.QuickSettingsBox.vertical = true\n    }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"quick-settings-tweaks\",\n  \"description\": \"A TypeScript GNOME Extension\",\n  \"version\": \"0.0.0\",\n  \"author\": {\n    \"email\": \"me@qwreey.moe\",\n    \"name\": \"qwreey\",\n    \"url\": \"https://github.com/qwreey\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"license\": \"LGPL-3.0-or-later\",\n  \"homepage\": \"https://github.com/qwreey/quick-settings-tweaks#readme\",\n  \"private\": true,\n  \"bugs\": {\n    \"url\": \"https://github.com/qwreey/quick-settings-tweaks/issues\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/qwreey/quick-settings-tweaks.git\"\n  },\n  \"devDependencies\": {\n    \"sass\": \"^1.83.4\",\n    \"typescript\": \"^5.7.3\"\n  },\n  \"dependencies\": {\n    \"@girs/gjs\": \"^4.0.0-beta.38\",\n    \"@girs/gnome-shell\": \"^49.0.1\"\n  }\n}\n"
  },
  {
    "path": "po/ca.po",
    "content": "# AUTHORS\n# jcatfor https://github.com/jcatfor, 2023.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"Language: ca\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"\"\n\n# Quick settings notifications title text\n# Notifications title\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"Notificacions\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"\"\n\n# Unsafe mode\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"Mode no segur\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"\"\n"
  },
  {
    "path": "po/cs.po",
    "content": "# AUTHORS\n# ondra05 https://github.com/ondra05, 2023.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"Language: en\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"\"\n\n# Quick settings notifications title text\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"Upozornění\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"\"\n"
  },
  {
    "path": "po/de.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: quick-settings-tweaker\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:32+0000\\n\"\n\"PO-Revision-Date: 2025-07-16 23:47+0200\\n\"\n\"Last-Translator: Andreas Rohr <github@andreas-rohr.de>\\n\"\n\"Language-Team: German\\n\"\n\"Language: de\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin-Project: quick-settings-tweaker\\n\"\n\"X-Crowdin-Project-ID: 809722\\n\"\n\"X-Crowdin-Language: de\\n\"\n\"X-Crowdin-File: quick-settings-tweaks@qwreey.pot\\n\"\n\"X-Crowdin-File-ID: 4\\n\"\n\"X-Generator: Poedit 3.6\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"Details\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"Diese Funktion wurde als experimentell markiert\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"Auf Standard zurücksetzen\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"Standard-Theme\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"Homepage\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"Lizenz\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"Laden ...\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"Betroffene Dateien\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"Changelog\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"(Aktuell)\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"> **Datum:** %s\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"> **Git Hash:** %s\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"> **Build Nummer:** %d\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"Padding\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"Oben\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"Unten\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"Links\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"Rechts\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"Stabil\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"Entwicklung\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"Vorschau\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"(Github Release)\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"(Aus Quelle gebaut)\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"Keine Benachrichtigungen\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"Löschen\"\n\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"Benachrichtigungen\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"Nicht stören\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"Unbekannter Titel\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"Medien\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"Lautstärke geändert\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"Lautstärkemixer öffnen\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"Lautstärkemixer\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"Wetter\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"Standort wurde nicht festgelegt\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"Unsicherer Modus\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"Handle-Radius\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"Setze dies auf 0, um den Standard-Radius zu verwenden\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"Handle Farbe\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"Slider-Stil\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"Schmal\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"Vorgabe\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"Hintergrundfarbe\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"Aktive Hintergrundfarbe\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"Widgets\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"Medien-Widget\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"Einschalten, um das Medien-Widget in den Schnelleinstellungen sichtbar zu machen\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"Kompakter Modus\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\"Verkleinern Sie das Widget „Mediensteuerung“\\\\n\\n\"\n\"Passen Sie die Größe der Benachrichtigungsnachricht an\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"Deckkraft der Steuertasten\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"Setze dies auf 255, um undurchsichtig zu machen und 0 um transparent zu machen\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"Nächste Schaltfläche anzeigen\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"Nächste Control-Taste neben der Beschreibung hinzufügen\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"Vorherige Schaltfläche anzeigen\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"Vorherige Control-Taste neben der Beschreibung hinzufügen\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"Pause-Button anzeigen\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"Füge Control-Taste neben der Beschreibung hinzu\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"Fortschrittsleiste anzeigen\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"Fortschrittsleiste unter Beschreibung hinzufügen\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"Farbverlauf Hintergrund\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\"Hintergrund des Farbverlaufs des Covers\\n\"\n\"kann die Leistung leicht beeinflussen\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"Hintergrundfarbe Basis\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"Linksseitige Transparenz anpassen. Auf 1000 setzen, um undurchsichtig zu machen\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"Linke Hintergrundfarbenmischung anpassen. Setze diese auf 1000 um, die extrahierte Farbe anzuzeigen\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"Rechtsseitige Transparenz einstellen, auf 1000 setzen, um undurchsichtig zu machen\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"Anpassung der rechten Seite des Hintergrundfarbenmix auf 1000 setzen, um die extrahierte Farbe anzuzeigen\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"Clip-Effekt runden\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"Benutze den runden Clip-Effekt, um den Übergang natürlicher zu machen\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"Polsteranpassung\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"Passen Sie Clip-Effekt an, bearbeiten Sie diese, wenn Ihr Theme einen anderen Rand oder Polster hat\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"Schatten entfernen\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Schatten von Medien-Nachricht entfernen\\n\"\n\"Benutzen, wenn Ihr Theme unnötige Schatten erstellt\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"Glatte Scrollgeschwindigkeit\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"Trackpad und Trackpoint-Scrollgeschwindigkeit anpassen, negative Zahl für Invert-Richtung\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"Benachrichtigungs-Widget\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"Einschalten, um das Benachrichtigungs-Widget in den Schnelleinstellungen sichtbar zu machen\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"Benachrichtigungen verkleinern\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"Maximale Höhe\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"Legen Sie die maximale Höhe des Benachrichtigungs-Widgets fest, Standard ist %d. Setzen Sie dies auf 0, um die maximale Höhe zu deaktivieren\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"Ausblenden Offset\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"Setze die Position des Ausblendeffekts ein. Setze dies auf 0, um den Ausblendeffekt zu deaktivieren. Standard ist 46\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"Auto-Verstecken\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"Das Benachrichtigungs-Widget ausblenden, wenn keine Benachrichtigungen vorhanden sind\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"Native Steuerelemente verwenden\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"Benutze DND-Schalter und Löschen-Taste\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Schatten aus der Benachrichtigungsnachricht entfernen\\n\"\n\"Benutzen, wenn Ihr Template unnötige Schatten erstellt\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"Scrollbar anzeigen\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"Scrollbar in der Nachrichtenliste anzeigen\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"Wetter-Widget\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"Einschalten, um das Wetter-Widget in den Schnelleinstellungen sichtbar zu machen\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"Wetter-Widget verkleinern\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Schatten vom Wetter-Widget entfernen\\n\"\n\"Verwenden Sie diese Option, wenn Ihr Design unnötige Schatten erzeugt\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"Klick Befehl\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"Standort anzeigen\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"Standortbezeichnung im Kopfbereich anzeigen\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"Prognoseintervall\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"Vorhersageintervall in Stunde anpassen\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"Maximale Vorhersagen\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"Maximale Vorhersagen anpassen\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"Lautstärkeregler Widget\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"Einschalten, um das Lautstärkeregler Widget in den Schnelleinstellungen sichtbar zu machen\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"Text der Beschriftung\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"Label über Slider-Textquelle wählen\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"Beides\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"Titel\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"Beschreibung\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"Keine\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"Deckkraft des Labels\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"Deckkraft des Labels anpassen.\\n\"\n\"Setze dies auf 255, um undurchsichtig zu machen, und 0 um transparent zu machen\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"Legen Sie die maximale Höhe des Volume Mixer Widgets fest, Standard ist %d. Setzen Sie dies auf 0, um die maximale Höhe zu deaktivieren\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"Scrollbar in der Mixer-Liste anzeigen\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"Stream-Symbol anzeigen\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"Stream-Symbol über Mixer-Schieberegler anzeigen\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"An Ausgaberegler anhängen\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"Lautstärkeregler an den Ausgaberegler anhängen. Benutzen, wenn Sie ein kompaktes Layout bevorzugen\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"Menüsymbol\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"Über\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"Allgemeine Erweiterungsinformationen\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"Changelogs\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"Änderungshistorie für diese Erweiterung anzeigen\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"Codelizenz\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"Mitwirkende\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"Die Ersteller dieser Erweiterung\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"Mehr Mitwirkende\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"Mehr Mitwirkende auf Github ansehen\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"Link\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"Externe Links zu dieser Erweiterung\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"Spenden über GitHub Sponsoren\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"Entwicklung unterstützen!\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"Bewerten und kommentieren Sie die Erweiterung!\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"Github Repository\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\"Das Hinzufügen eines Sterns zum Repository hilft mir sehr!\\n\"\n\"Wenn Sie einen Fehler in dieser Erweiterung finden, können Sie mir das Problem melden!\\n\"\n\"Oder Sie können einen PR mit tollen Funktionen erstellen!\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"Übersetzung zu dieser Erweiterung hinzufügen!\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"Debug\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"Debug-Optionen\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"Umgebung freigeben\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"Erweiterungsumgebung globalThis.qst anzeigen\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"Layout-Rahmen anzeigen\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"Layout-Ränder in Schnelleinstellungen anzeigen\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"Log-Level\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"keine\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"fehlerhaft\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"Info\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"Debug\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"Toggles\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"DND Quick Toggle\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"Aktivieren, um den DND-Schnellschalter in den Schnelleinstellungen hinzuzufügen\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"DND-Indikatorposition\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"DND-Indikatorposition festlegen\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"System Tray\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"Datumsmenü-Taste\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"Unsicherer Modus Schnellwechsel\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"Einschalten, um den unsicheren Schnelleinstellungen hinzuzufügen\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"Letzten Sitzungsstatus speichern\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"Aktivieren, um den unsicheren Status der letzten Sitzung zu speichern\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"Erweiterter Animationsstil\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"Öffne Dauer\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"Animationsdauer in Mikrosekunden öffnen\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"Dauer schließen\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"Dauer der Animation in Mikrosekunden schließen\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"Deckkraft des Gitters\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"Deckkraft des Gitters anpassen.\\n\"\n\"Auf 255 setzen, um Deckkraft zu erzeugen, und 0 um transparent zu machen\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"Hintergrundunschärfe-Radius\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\"Hintergrundunschärfe-Radius anpassen.\\n\"\n\"Setze dies auf 0, um Unschärfe-Effekt zu deaktivieren\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"Hintergrundhelligkeit\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\"Hintergrundhelligkeit anpassen.\\n\"\n\"Setze dies auf 1000 um, den Helligkeitskontroll-Effekt zu deaktivieren.\\n\"\n\"Wirkt sich nicht auf Gnome-Shells Standard-Dim-Effekt aus.\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"Hintergrundtransparenz\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"Deckkraft des Hintergrunds anpassen.\\n\"\n\"Setze dies auf 255, um undurchsichtig zu machen, und 0 um transparent zu machen\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"Hintergrund X Skala\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"Hintergrund x Skalierung anpassen, 1000 bedeutet 1,0 Skala\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"Hintergrund Y-Skala\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"Hintergrund y Skalierung anpassen, 1000 bedeutet 1,0 Skala\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"Overlay Mode\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"Schalt-, Power- und Sound-Menüs als Overlay anzeigen\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"Overlay-Breite\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\"Überlagerungsmenü Breite\\n\"\n\"Auf 0 setzen, um Anpassung zu deaktivieren\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"Dauer der Overlay-Animation\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\"Angepasste Menü-Animationsdauer in Mikrosekunden\\n\"\n\"Setze dies auf 0, um benutzerdefinierte Animation zu deaktivieren\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"Animationsstil überlagern\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"Animationsstil des Menüs öffnen\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"Flyout\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"Dialog\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"Animation\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\"Menüanimation beim Öffnen und Schließen des Menüs\\n\"\n\"hinzufügen, um das beste Gefühl zu erhalten, aktivieren Sie den Overlay-Modus\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"Schnelligkeit, Unschärfe, Skalierung und Deckkraft anpassen\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"Das Element nicht gefunden\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"Keine Änderungen\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"Das gleiche Element existiert bereits\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"Objekte von %s\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"Speichern\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"Editor umschalten\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"Diese Option erfordert ein vollständiges Nachladen von Gnome-Shell\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"Verstecken\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"Mein Artikel #%d\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"Neues Element\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"Reihenfolge und Verstecken\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"Freundlicher Name\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"Titel Regex (Javascript Regex)\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"Name des Konstrukteurs\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"GType Name\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"Dies ist der Kommentar zur einfachen Identifizierung in der Einstellungsliste. Er hat keine Auswirkung auf das Verhalten der Erweiterung\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"Name des Javascript-Konstruktors\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"GObject gtype Name. Sie können diesen Wert erhalten, indem Sie GObject.type_name_from_instance aufrufen\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"Tastaturbeleuchtung\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"Unbestellte Artikel\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"Remote-Zugangs-Applet\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"Kamera\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"Volume Input\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"Standort\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"Donnerblitz\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"Netzwerk\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"Lautstärke-Ausgabe\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"System (Groß)\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"Desktop-Abstand\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"Laptop-Spacer\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"Aufnahme-Button\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"Einstellungen-Schaltfläche\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"Sperren-Taste\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"Herunterfahren-Schaltfläche\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"Akku-Taste\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"Layout\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"Schnellwechsel-Layout\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"Schnellschaltlayout anpassen\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"Schnellschalter neu anordnen und ausblenden\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"Systemindikatoren\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"Layout und Stil der Systemindikatoren anpassen\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"Display-Sharing-Indikator\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"Shell-Akzentfarbe für Bildschirmfreigabe verwenden\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"Display-Aufnahme-Indikator\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"Shell-Akzentfarbe für Bildschirmaufzeichnung verwenden\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"Stil der Datenschutzindikatoren\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"Verwenden Sie monochrome oder Shell-Akzentfarbe in Privatsachen Indikatoren\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"Akzent\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"Monochrom\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"Systemindikatoren anpassen\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"Systemindikatoren neu anordnen und verstecken\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"Layout der Systemelemente\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"Layout der Systemelemente anpassen\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"Layoutbox ausblenden\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"Alle Buttons und Layout-Box ausblenden\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"Systemelemente neu anordnen und verstecken\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"Datumsmenü\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"Datumsmenü-Layout anpassen\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"Linkskiste ausblenden\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"Verstecke das linke Feld des Datumsmenüs, welches Benachrichtigungen und Medienkontrolle enthält\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"Verstecke rechte Box\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"Verstecke das rechte Feld des Datumsmenüs, welches Kalender, Weltzeit und Wetter enthält\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"Menü deaktivieren\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"Datumsmenü nicht öffnen, wenn der Datumsmenü-Button angeklickt wurde\"\n\n#~ msgid \"Height\"\n#~ msgstr \"Höhe\"\n\n#~ msgid \"Set this to 0 to use default height\"\n#~ msgstr \"Auf 0 setzen, um die Standardhöhe zu verwenden\"\n\n#~ msgid \"Start opaque\"\n#~ msgstr \"Starte Deckkraft\"\n\n#~ msgid \"End opaque\"\n#~ msgstr \"Undurchsichtig beenden\"\n\n#~ msgid \"Hide Notifications\"\n#~ msgstr \"Benachrichtigungen ausblenden\"\n\n#~ msgid \"Hide notifications on the date menu\"\n#~ msgstr \"Benachrichtigungen im Datumsmenü ausblenden\"\n\n#~ msgid \"Hide Media Control\"\n#~ msgstr \"Mediensteuerung ausblenden\"\n\n#~ msgid \"Hide media control on the date menu\"\n#~ msgstr \"Mediensteuerung im Datumsmenü ausblenden\"\n"
  },
  {
    "path": "po/en.po",
    "content": "# AUTHORS\n# qwreey75 (aka qwreey) https://github.com/qwreey75/, 2023.\n# DodoLeDev https://github.com/DodoLeDev, 2023\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"Language: en\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"Top\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"Bottom\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"No Notifications\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"Clear\"\n\n# Quick settings notifications title text\n# Notifications title\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"Notifications\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"Do Not Disturb\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"Volume changed\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"Volume Mixer\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"\"\n\n# Unsafe mode\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"Unsafe Mode\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"Max height\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"Hide the Notifications widget when have no notifications\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"Use native controls\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"Use native dnd switch and clear button\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"About\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"The creators of this extension\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"Support development!\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"Rate and comment the extension!\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"Github Repository\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"DND Quick Toggle\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"Unsafe Mode Quick Toggle\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"\"\n\n#~ msgid \"Donate via patreon\"\n#~ msgstr \"Donate via patreon\"\n\n#~ msgid \"Set maximum height of the Notifications widget. default is 292\"\n#~ msgstr \"Set maximum height of the Notifications widget. default is 292\"\n\n#~ msgid \"Other\"\n#~ msgstr \"Other\"\n\n#~ msgid \"\"\n#~ \"Hide notifications on date menu.\\n\"\n#~ \"*this option removes media control on date menu too*\"\n#~ msgstr \"\"\n#~ \"Hide notifications on date menu.\\n\"\n#~ \"*this option removes media control on date menu too*\"\n\n#~ msgid \"Hide media control on date menu.\"\n#~ msgstr \"Hide media control on date menu.\"\n\n#~ msgid \"Sound Settings\"\n#~ msgstr \"Sound Settings\"\n\n#~ msgid \"Notification Widget\"\n#~ msgstr \"Notification Widget\"\n\n#~ msgid \"Turn on to make the notification widget visible on the Quick Settings panel\"\n#~ msgstr \"Turn on to make the notification widget visible on the Quick Settings panel\"\n\n#~ msgid \"Links\"\n#~ msgstr \"Links\"\n\n#~ msgid \"Contributor\"\n#~ msgstr \"Contributor\"\n\n#~ msgid \"Add Application to filtering\"\n#~ msgstr \"Add Application to filtering\"\n\n#~ msgid \"Add\"\n#~ msgstr \"Add\"\n\n#~ msgid \"Cancel\"\n#~ msgstr \"Cancel\"\n\n#~ msgid \"Application name\"\n#~ msgstr \"Application name\"\n\n#~ msgid \"General\"\n#~ msgstr \"General\"\n\n#~ msgid \"Enchant input/output slider\"\n#~ msgstr \"Enchant input/output slider\"\n\n#~ msgid \"Show current audio output selection\"\n#~ msgstr \"Show current audio output selection\"\n\n#~ msgid \"Always show the current audio output selection above the volume slider\"\n#~ msgstr \"Always show the current audio output selection above the volume slider\"\n\n#~ msgid \"Show current audio input selection\"\n#~ msgstr \"Show current audio input selection\"\n\n#~ msgid \"Always show the current audio input selection above the volume slider\"\n#~ msgstr \"Always show the current audio input selection above the volume slider\"\n\n#~ msgid \"Always show input\"\n#~ msgstr \"Always show input\"\n\n#~ msgid \"Always show the audio input volume slider, even when there is no audio input stream.\"\n#~ msgstr \"Always show the audio input volume slider, even when there is no audio input stream.\"\n\n#~ msgid \"Add volume mixer (PulseAudio, Pipewire)\"\n#~ msgstr \"Add volume mixer (PulseAudio, Pipewire)\"\n\n#~ msgid \"\"\n#~ \"Turn on to make the volume mixer visible\\n\"\n#~ \"Forked from https://github.com/mymindstorm/gnome-volume-mixer\"\n#~ msgstr \"Turn on to make the volume mixer visible. Forked from https://github.com/mymindstorm/gnome-volume-mixer\"\n\n#~ msgid \"Position\"\n#~ msgstr \"Position\"\n\n#~ msgid \"Set volume mixer position\"\n#~ msgstr \"Set volume mixer position\"\n\n#~ msgid \"Top (Below Output/Input slider)\"\n#~ msgstr \"Top (Below Output/Input slider)\"\n\n#~ msgid \"Show stream Description\"\n#~ msgstr \"Show stream Description\"\n\n#~ msgid \"Show audio stream description above the slider\"\n#~ msgstr \"Show audio stream description above the slider\"\n\n#~ msgid \"Show stream Icon\"\n#~ msgstr \"Show stream Icon\"\n\n#~ msgid \"Show application icon in front of the slider\"\n#~ msgstr \"Show application icon in front of the slider\"\n\n#~ msgid \"Filter applications shown in the volume mixer.\"\n#~ msgstr \"Filter applications shown in the volume mixer.\"\n\n#~ msgid \"Filter Mode\"\n#~ msgstr \"Filter Mode\"\n\n#~ msgid \"Blacklist\"\n#~ msgstr \"Blacklist\"\n\n#~ msgid \"Whitelist\"\n#~ msgstr \"Whitelist\"\n\n#~ msgid \"Using Javascript Regex\"\n#~ msgstr \"Using Javascript Regex\"\n\n#~ msgid \"Use Javascript RegExp for filtering app name or description\"\n#~ msgstr \"Use Javascript RegExp for filtering app name or description\"\n\n#~ msgid \"Check Stream Description\"\n#~ msgstr \"Check Stream Description\"\n\n#~ msgid \"Check Description also\"\n#~ msgstr \"Check Description also\"\n\n#~ msgid \"Add more buttons\"\n#~ msgstr \"Add more buttons\"\n\n#~ msgid \"Turn on the buttons you want to add on Quick Settings\"\n#~ msgstr \"Turn on the buttons you want to add on Quick Settings\"\n\n#~ msgid \"Turn on to make the DND quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"Turn on to make the DND quick toggle visible on the Quick Settings panel\"\n\n#~ msgid \"Turn on to make the unsafe quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"Turn on to make the unsafe quick toggle visible on the Quick Settings panel\"\n\n#~ msgid \"This extension is distributed with license GPL 3+\"\n#~ msgstr \"This extension is distributed with license GPL 3+\"\n\n#~ msgid \"excludes Third-party. Third party codes follow their license\"\n#~ msgstr \"excludes Third-party. Third party codes follow their license\"\n\n#~ msgid \"Extension Version\"\n#~ msgstr \"Extension Version\"\n\n#~ msgid \"Unknown (Built from source)\"\n#~ msgstr \"Unknown (Built from source)\"\n\n#~ msgid \"Third party LICENSE\"\n#~ msgstr \"Third party LICENSE\"\n\n#~ msgid \"LICENSE OF CODES WHICH USED ON THIS EXTENSION\"\n#~ msgstr \"LICENSE OF CODES WHICH USED ON THIS EXTENSION\"\n\n#~ msgid \"Media Controls widget\"\n#~ msgstr \"Media Controls widget\"\n\n#~ msgid \"Turn on to make the Media Control widget visible on the Quick Settings panel\"\n#~ msgstr \"Turn on to make the Media Control widget visible on the Quick Settings panel\"\n\n#~ msgid \"Compact Mode\"\n#~ msgstr \"Compact Mode\"\n\n#~ msgid \"Auto Hide\"\n#~ msgstr \"Auto Hide\"\n\n#~ msgid \"Quick Toggles\"\n#~ msgstr \"Quick Toggles\"\n\n#~ msgid \"Fix Weather Widget Overflow\"\n#~ msgstr \"Fix Weather Widget Overflow\"\n\n#~ msgid \"Fix overflow visual bug of weather widget in datemenu\"\n#~ msgstr \"Fix overflow visual bug of weather widget in datemenu\"\n\n#~ msgid \"Remove Notifications On Date Menu\"\n#~ msgstr \"Remove Notifications On Date Menu\"\n\n#~ msgid \"Remove Media Control On Date Menu\"\n#~ msgstr \"Remove Media Control On Date Menu\"\n\n#~ msgid \"Do not adjust the border radius of contents.\"\n#~ msgstr \"Do not adjust the border radius of contents.\"\n\n#~ msgid \"Don't adjust the border of messages and media controls.\"\n#~ msgstr \"Don't adjust the border of messages and media controls.\"\n\n#~ msgid \"Do not remove the shadow of contents.\"\n#~ msgstr \"Do not remove the shadow of contents.\"\n\n#~ msgid \"Don't remove the shadow of messages and media controls.\"\n#~ msgstr \"Don't remove the shadow of messages and media controls.\"\n\n#~ msgid \"Set Notifications widget position\"\n#~ msgstr \"Set Notifications widget position\"\n\n#~ msgid \"Buttons to remove\"\n#~ msgstr \"Buttons to remove\"\n\n#~ msgid \"Turn on the buttons you want to remove from Quick Settings\"\n#~ msgstr \"Turn on the buttons you want to remove from Quick Settings\"\n\n#~ msgid \"Remove chosen buttons from quick panel\"\n#~ msgstr \"Remove chosen buttons from quick panel\"\n\n#~ msgid \"Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n#~ msgstr \"Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n\n#~ msgid \"This feature is unstable sometime\"\n#~ msgstr \"This feature is unstable sometime\"\n\n#~ msgid \"\"\n#~ \"When lock/unlock with gnome-screensaver, unexpected behavior occurs\\n\"\n#~ \"Please do not report issue about known issue, Almost duplicated\\n\"\n#~ \"Known issue:\\n\"\n#~ \"  button doesn't remove after lockscreen\\n\"\n#~ \"  modal get bigger after lockscreen\"\n#~ msgstr \"\"\n#~ \"When lock/unlock with gnome-screensaver, unexpected behavior occurs\\n\"\n#~ \"Please do not report issue about known issue, Almost duplicated\\n\"\n#~ \"Known issue:\\n\"\n#~ \"  button doesn't remove after lockscreen\\n\"\n#~ \"  modal get bigger after lockscreen\"\n\n#~ msgid \"Please turn off if some bug occurred\"\n#~ msgstr \"Please turn off if some bug occurred\"\n\n#~ msgid \"Unknown\"\n#~ msgstr \"Unknown\"\n\n#~ msgid \"\"\n#~ \"Do not separate Quick Settings and Notifications widgets, \\byou should enable this option because separated panels can make many visual bugs\\n\"\n#~ \"(such as margin or padding not matching with the theme)\"\n#~ msgstr \"\"\n#~ \"Do not separate Quick Settings and Notifications widgets, \\byou should enable this option because separated panels can make many visual bugs\\n\"\n#~ \"(such as margin or padding not matching with the theme)\"\n\n#~ msgid \"Information\"\n#~ msgstr \"Information\"\n\n#~ msgid \"Version\"\n#~ msgstr \"Version\"\n\n#~ msgid \"\"\n#~ \"Forked from https://github.com/mymindstorm/gnome-volume-mixer\\n\"\n#~ \"This feature works well with both PulseAudio and Pipewire protocols\"\n#~ msgstr \"\"\n#~ \"Forked from https://github.com/mymindstorm/gnome-volume-mixer\\n\"\n#~ \"This feature works well with both PulseAudio and Pipewire protocols\"\n\n#~ msgid \"Visible\"\n#~ msgstr \"Visible\"\n\n#~ msgid \"Turn on to make the volume mixer visible\"\n#~ msgstr \"Turn on to make the volume mixer visible\"\n\n#~ msgid \"Application Filtering\"\n#~ msgstr \"Application Filtering\"\n\n#~ msgid \"Input/Output\"\n#~ msgstr \"Input/Output\"\n\n#~ msgid \"Add notifications widget\"\n#~ msgstr \"Add notifications widget\"\n\n#~ msgid \"\"\n#~ \"Reference from https://github.com/Aylur/gnome-extensions\\n\"\n#~ \"Source code of that is not used on this extension\"\n#~ msgstr \"\"\n#~ \"Reference from https://github.com/Aylur/gnome-extensions\\n\"\n#~ \"Source code of that is not used on this extension\"\n\n#~ msgid \"Media Controls\"\n#~ msgstr \"Media Controls\"\n\n#~ msgid \"Add Media Controls widget\"\n#~ msgstr \"Add Media Controls widget\"\n"
  },
  {
    "path": "po/ja.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: ja\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"\"\n"
  },
  {
    "path": "po/ko.po",
    "content": "# AUTHORS\n# qwreey75 (aka qwreey) https://github.com/qwreey75/, 2023.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"PO-Revision-Date: 2025-07-15 12:36+0000\\n\"\n\"Last-Translator: Qwreey <qwreey75@gmail.com>\\n\"\n\"Language-Team: Korean <https://weblate.paring.moe/projects/gs-quick-settings-tweaks/gs-extension/ko/>\\n\"\n\"Language: ko\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.10.2\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"자세히\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"이 기능은 실험적입니다\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"기본값으로 재설정\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"테마 기본값\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"홈페이지\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"라이선스\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"로드중 ...\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"영향받은 파일들\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"변경사항\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"(현재)\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"> **날짜:** %s\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"> **깃 해시:** %s\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"> **빌드 넘버:** %d\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"여백\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"상단\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"하단\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"좌\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"우\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"안정 빌드\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"개발 빌드\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"프리뷰 빌드\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"(깃허브 릴리즈)\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"(소스에서 빌드됨)\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"알림이 없습니다\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"모두 읽음\"\n\n# Quick settings notifications title text\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"알림\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"방해 금지 모드\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"알 수 없는 제목\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"미디어\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"볼륨 변경됨\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"볼륨 믹서 열기\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"볼륨 믹서\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"날씨\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"위치가 지정되지 않았습니다\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"위험 모드\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"핸들 반지름\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"0 으로 설정하여 기본 반지름을 사용합니다\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"핸들 색깔\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"슬라이더 스타일\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"슬림\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"기본\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"배경 색깔\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"활성화된 배경 색깔\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"위젯\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"미디어 위젯\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"퀵 패널에 미디어 위젯을 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"레이아웃 축소\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\"미디어 컨트롤 위젯을 작게 만듭니다\\n\"\n\"알림 메시지와 비슷한 크기로 조정됩니다\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"컨트롤 버튼 투명도\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"255로 설정해 불투명하게, 0으로 설정해 투명하게 만듭니다\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"다음 버튼 보이기\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"다음 버튼을 설명 옆에 추가합니다\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"이전 버튼 보이기\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"이전 버튼을 설명 옆에 추가합니다\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"멈춤 버튼 보이기\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"멈춤 버튼을 설명 옆에 추가합니다\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"재생 바 보이기\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"미디어 설명 아래에 재생 바를 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"그라데이션 배경\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\"커버 이미지로부터 추출된 색으로 배경에 그라데이션을 줍니다\\n\"\n\"성능에 영향을 미칠 수 있습니다\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"기반 배경 색깔\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"왼쪽 구석의 투명도를 설정합니다, 1000 으로 설정하여 완전히 불투명하게 만듭니다\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"왼쪽 구석의 배경 믹싱을 조절합니다, 1000 으로 설정하여 추출된 색을 그대로 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"오른쪽 구석의 투명도를 설정합니다, 1000 으로 설정하여 완전히 불투명하게 만듭니다\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"오른쪽 구석의 배경 믹싱을 조절합니다, 1000 으로 설정하여 추출된 색을 그대로 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"둥글게 자르기 효과\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"둥글게 자르는 효과를 사용해 트랜지션을 더욱 자연스럽게 만듭니다\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"여백 조절\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"자르는 효과의 여백을 조절합니다, 테마가 다른 여백을 가지고 있다면 여백을 조절하세요\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"그림자 제거\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"미디어 메시지에서 그림자를 지웁니다\\n\"\n\"사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"부드러운 스크롤 속도\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"트랙패드 또는 트랙포인트 스크롤 속도를 조절합니다, 음수 값을 사용해 방향을 뒤집을 수 있습니다\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"알림 위젯\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"퀵 패널에 알림 위젯을 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"알림을 작게 만듭니다\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"최대 높이\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"알림 위젯의 최대 높이를 지정합니다. 기본값은 %d 입니다. 0 으로 설정하여 높이 제한을 해제합니다\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"페이드 아웃 오프셋\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"페이드 아웃 효과가 시작되는 위치를 지정합니다. 0 으로 설정하여 페이드 아웃 효과를 비활성화합니다. 기본값은 46 입니다\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"자동 숨김\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"표시할 알림이 없으면 알림 위젯을 자동으로 숨깁니다\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"네이티브 컨트롤 사용\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"\\\"방해 금지 스위치\\\"와 \\\"알림 모두 읽기 버튼\\\"에 그놈의 기본 컨트롤을 사용합니다\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"알림 메시지에서 그림자를 지웁니다\\n\"\n\"사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"스크롤바 보이기\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"스크롤바를 메시지 목록에 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"날씨 위젯\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"퀵 패널에 날씨 위젯을 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"날씨 위젯을 작게 만듭니다\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"날씨 위젯에서 그림자를 지웁니다\\n\"\n\"사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"클릭 커맨드\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"위치 보이기\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"위치 라벨을 해더에 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"예보 간격\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"예보 간격을 시간 단위로 조절합니다\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"최대 예보 수\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"최대 예보 수를 조절합니다\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"볼륨 믹서 위젯\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"퀵 패널에 볼륨 믹서 위젯을 보여줍니다\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"둘 다\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"제목\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"설명\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"스트림 아이콘 보이기\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"출력 슬라이더에 메뉴 부착\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"출력 슬라이더에 볼륨 믹서를 여는 메뉴 버튼을 부착합니다. 만약 간결한 레이아웃을 원하는 경우 사용하세요\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"메뉴 아이콘\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"정보\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"일반적인 확장 정보들\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"변경 사항들\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"확장 프로그램의 변경 기록들을 봅니다\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"코드의 라이선스\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"기여자들\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"이 확장 프로그램을 만든 이들\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"더 많은 기여자들\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"깃허브에서 더 많은 기여자들을 봅니다\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"링크\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"익스텐션과 관련된 외부 링크\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"개발을 지원해주세요!\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"확장 프로그램을 평가해주세요!\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"Github 저장소\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\"저장소에 Star를 남겨주신다면 제게 큰 도움이 됩니다!\\n\"\n\"버그를 찾은 경우, Issue 를 남겨 저희가 알 수 있게 해주세요!\\n\"\n\"환상적인 기능을 만들어 PR 을 남기는 것도 환영입니다!\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"확장 번역에 기여해주세요!\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"디버깅\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"확장 디버깅 옵션\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"환경 노출\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"익스텐션 환경을 globalThis.qst 에 노출시킵니다\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"레이아웃 보더 보이기\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"퀵 패널의 레이아웃 보더들을 보여줍니다\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"로그 수준\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"안함\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"오류\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"정보\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"디버깅\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"토글\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"방해 금지 모드 퀵 토글\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"활성화하여 방해 금지 퀵 토글을 퀵 패널에 추가합니다\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"방해 금지 인디케이터 위치\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"방해 금지 인디케이터의 위치를 설정합니다\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"시스템 트레이\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"날짜 메뉴 버튼\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"위험 모드 퀵 토글\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"활성화하여 위험모드 퀵 토글을 퀵 패널에 추가합니다\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"이전 세션 상태를 저장하기\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"활성화하여 세션 위험모드 상태를 저장합니다\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"애니메이션 스타일\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"여는 애니메이션 시간\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"여는 애니메이션의 재생 시간입니다. 마이크로초 단위를 사용합니다\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"닫는 애니메이션 시간\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"닫는 애니메이션의 재생 시간입니다. 마이크로초 단위를 사용합니다\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"토글 그리드 투명도\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"배경 흐림 반경\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\"배경 흐림 처리의 정도를 조절합니다\\n\"\n\"0으로 설정하면 블러 효과가 비활성화됩니다\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"배경 밝기\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\"배경 밝기를 조절합니다.\\n\"\n\"1000 으로 설정하여 밝기 조절을 비활성화합니다.\\n\"\n\"그놈 셸의 기본 dim 효과에는 영향을 미치지 않습니다\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"배경 투명도\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"배경 X축 스케일\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"배경의 가로 스케일을 조절합니다. 1000 은 1.0 (100%) 을 의미합니다\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"배경 Y축 스케일\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"배경의 세로 스케일을 조절합니다, 1000 은 1.0 (100%) 를 의미합니다\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"메뉴\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"오버레이 모드\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"토글, 전원, 사운드 메뉴를 오버레이로 보여줍니다\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"오버레이 너비\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\"오버레이 메뉴의 너비를 조절합니다\\n\"\n\"0으로 설정하면 조절이 비활성화됩니다\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"오버레이 애니메이션 시간\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\"커스텀 메뉴 오픈 애니메이션의 시간입니다. 마이크로초 단위를 사용합니다\\n\"\n\"0으로 설정하면 커스텀 애니메이션 효과가 비활성화됩니다\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"오버레이 애니메이션 스타일\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"메뉴 여는 애니메이션 조정\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"플라이아웃\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"대화 상자\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"애니메이션\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\"토글 메뉴를 여닫을 때 애니메이션을 줍니다\\n\"\n\"극적인 효과를 위해서는 오버레이 모드와 같이 사용하세요\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"속도, 흐림 효과, 스케일, 투명도를 조절합니다\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"변경사항 없음\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"이미 같은 아이템이 존재합니다\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"%s 의 세부사항\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"저장\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"토글 편집기\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"이 옵션은 그놈 셸의 완전한 재시작이 필요합니다\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"숨김\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"내 아이템 %d\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"새로운 아이템\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"정렬과 숨김\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"표시용 이름\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"제목 정규표현식 (자바스크립트 정규표현식)\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"생성자 이름\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"GType 이름\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"목록에서 쉽게 구분하기 위한 주석입니다. 확장의 기능에는 아무런 영향을 미치지 않습니다\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"자바스크립트 생성자 이름\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"GObject 의 gtype 이름. GObject.type_name_from_instance 를 호출하여 확인할 수 있습니다\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"키보드 백라이트\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"정렬되지 않은 아이템들\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"원격 접근 애플릿\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"카메라\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"입력 볼륨\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"위치\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"썬더볼트\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"네트워크\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"출력 볼륨\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"시스템 (베터리)\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"데스크톱 여백\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"랩톱 여백\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"캡처 버튼\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"설정 버튼\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"잠금 버튼\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"종료 버튼\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"배터리 버튼\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"레이아웃\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"퀵 토글 레이아웃\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"퀵 토글 레이아웃을 조절합니다\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"퀵 토글을 정렬하거나 숨깁니다\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"시스템 인디케이터\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"시스템 인디케이터의 레이아웃과 스타일을 조절합니다\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"강조 색상 화면 공유 인디케이터\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"셸의 강조 색상을 화면 공유 인디케이터에 배경으로 사용합니다\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"강조 색상 화면 녹화 인디케이터\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"셸의 강조 색상을 화면 녹화 인디케이터에 배경으로 사용합니다\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"프라이버시 인디케이터 스타일\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"단색 또는 셸의 강조 색상을 프라이버시 인디케이터에 아이콘 색으로 사용합니다\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"강조 색상\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"단색\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"시스템 인디케이터 조절\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"시스템 인디케이터를 정렬하거나 숨깁니다\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"시스템 아이템 레이아웃\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"시스템 요소의 레이아웃을 조정합니다\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"레이아웃 상자 숨기기\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"모든 버튼과 레이아웃 박스를 숨깁니다\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"시스템 아이템을 정렬하거나 숨깁니다\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"달력 메뉴\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"달력 메뉴의 레이아웃을 조절합니다\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"왼쪽 상자 숨기기\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"날짜 메뉴의 알림과 미디어 컨트롤이 있는 왼쪽 레이아웃을 숨깁니다\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"오른쪽 상자 숨기기\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"날짜 메뉴의 칼렌더와 세계 시간, 날씨가 있는 오른쪽 레이아웃을 숨깁니다\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"메뉴 비활성화\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"날짜 메뉴 버튼을 눌렀을 때 날짜 메뉴가 열림을 비활성화합니다\"\n\n#~ msgid \"Height\"\n#~ msgstr \"높이\"\n\n#~ msgid \"Set this to 0 to use default height\"\n#~ msgstr \"0 으로 설정하여 기본 높이를 사용합니다\"\n\n#~ msgid \"Start opaque\"\n#~ msgstr \"시작 불투명도\"\n\n#~ msgid \"End opaque\"\n#~ msgstr \"끝 불투명도\"\n\n#~ msgid \"Hide Notifications\"\n#~ msgstr \"알림 숨김\"\n\n#~ msgid \"Hide notifications on the date menu\"\n#~ msgstr \"알림을 날짜 메뉴에서 숨깁니다\"\n\n#~ msgid \"Hide Media Control\"\n#~ msgstr \"미디어 컨트롤 숨김\"\n\n#~ msgid \"Hide media control on the date menu\"\n#~ msgstr \"미디어 컨트롤을 날짜 메뉴에서 숨깁니다\"\n\n#~ msgid \"Donate via patreon\"\n#~ msgstr \"Patreon으로 후원\"\n\n#~ msgid \"\"\n#~ \"Use gradient background extracted from cover image\\n\"\n#~ \"May affect performance\"\n#~ msgstr \"커버 이미지로부터 추출된 색으로 배경에 그라데이션을 줍니다성능에 영향을 미칠 수 있습니다\"\n\n#~ msgid \"Set maximum height of the Notifications widget. default is 292\"\n#~ msgstr \"알림 위젯의 최대 높이(px)를 설정합니다. 기본값은 292입니다\"\n\n#~ msgid \"Other\"\n#~ msgstr \"기타\"\n\n#~ msgid \"\"\n#~ \"Hide notifications on date menu.\\n\"\n#~ \"*this option removes media control on date menu too*\"\n#~ msgstr \"\"\n#~ \"달력 메뉴에서 알림 항목을 제거합니다.\\n\"\n#~ \"*이 옵션은 달력 메뉴에서 미디어 컨트롤 영역도 같이 제거합니다*\"\n\n#~ msgid \"Hide media control on date menu.\"\n#~ msgstr \"달력 메뉴에서 미디어 컨트롤 항목을 제거합니다.\"\n\n#~ msgid \"\"\n#~ \"Adjust grid content opacity.\\n\"\n#~ \"Set this to 255 to opaque, and 0 to transparent\"\n#~ msgstr \"\"\n#~ \"토글 그리드 콘텐츠의 투명도를 조절합니다\\n\"\n#~ \"255로 하면 완전히 불투명해지고, 0으로 하면 완전히 투명해집니다\"\n\n#~ msgid \"\"\n#~ \"Adjust background opacity.\\n\"\n#~ \"Set this to 255 to opaque, and 0 to transparent\"\n#~ msgstr \"\"\n#~ \"배경 투명도를 조절합니다\\n\"\n#~ \"255로 하면 완전히 불투명해지고, 0으로 하면 완전히 투명해집니다\"\n\n#~ msgid \"Sound Settings\"\n#~ msgstr \"소리 설정\"\n\n#~ msgid \"Notification Widget\"\n#~ msgstr \"알림 위젯\"\n\n#~ msgid \"Turn on to make the notification widget visible on the Quick Settings panel\"\n#~ msgstr \"퀵 패널에 알림 위젯을 보여줍니다\"\n\n#~ msgid \"Links\"\n#~ msgstr \"링크\"\n\n#~ msgid \"Contributor\"\n#~ msgstr \"기여자\"\n\n#~ msgid \"System Items\"\n#~ msgstr \"시스템 요소\"\n\n#~ msgid \"Hide layout\"\n#~ msgstr \"레이아웃 숨김\"\n\n#~ msgid \"Add Application to filtering\"\n#~ msgstr \"필터링할 애플리케이션 추가\"\n\n#~ msgid \"Add\"\n#~ msgstr \"추가\"\n\n#~ msgid \"Cancel\"\n#~ msgstr \"취소\"\n\n#~ msgid \"Application name\"\n#~ msgstr \"애플리케이션 이름\"\n\n#~ msgid \"General\"\n#~ msgstr \"일반\"\n\n#~ msgid \"Enchant input/output slider\"\n#~ msgstr \"입력/출력 슬라이더를 강화합니다\"\n\n#~ msgid \"Show current audio output selection\"\n#~ msgstr \"오디오 출력 장치 표시\"\n\n#~ msgid \"Always show the current audio output selection above the volume slider\"\n#~ msgstr \"항상 사용 중인 오디오 출력 장치를 볼륨 슬라이더 위에 보여줍니다\"\n\n#~ msgid \"Show current audio input selection\"\n#~ msgstr \"오디오 입력 장치 표시\"\n\n#~ msgid \"Always show the current audio input selection above the volume slider\"\n#~ msgstr \"항상 사용 중인 오디오 입력 장치를 볼륨 슬라이더 위에 보여줍니다\"\n\n#~ msgid \"Always show input\"\n#~ msgstr \"항상 입력 볼륨 바 표시\"\n\n#~ msgid \"Always show the audio input volume slider, even when there is no audio input stream.\"\n#~ msgstr \"오디오 입력 스트림이 없더라도 항상 오디오 입력 볼륨 슬라이더를 보여줍니다.\"\n\n#~ msgid \"Add volume mixer (PulseAudio, Pipewire)\"\n#~ msgstr \"볼륨 믹서 추가 (PulseAudio, Pipewire)\"\n\n#~ msgid \"\"\n#~ \"Turn on to make the volume mixer visible\\n\"\n#~ \"Forked from https://github.com/mymindstorm/gnome-volume-mixer\"\n#~ msgstr \"\"\n#~ \"볼륨 믹서를 활성화합니다\\n\"\n#~ \"https://github.com/mymindstorm/gnome-volume-mixer 에서 포크된 기능입니다\"\n\n#~ msgid \"Position\"\n#~ msgstr \"위치\"\n\n#~ msgid \"Set volume mixer position\"\n#~ msgstr \"볼륨 믹서의 위치를 선택합니다\"\n\n#~ msgid \"Top (Below Output/Input slider)\"\n#~ msgstr \"상단 (입력/출력 슬라이더 밑에 표시됩니다)\"\n\n#~ msgid \"Show stream Description\"\n#~ msgstr \"스트림 설명 표시\"\n\n#~ msgid \"Show audio stream description above the slider\"\n#~ msgstr \"오디오 스트림의 설명을 슬라이더 아래에 표시합니다\"\n\n#~ msgid \"Show stream Icon\"\n#~ msgstr \"스트림 아이콘 표시\"\n\n#~ msgid \"Show application icon in front of the slider\"\n#~ msgstr \"애플리케이션 아이콘을 슬라이더 앞에 추가합니다\"\n\n#~ msgid \"Filter applications shown in the volume mixer.\"\n#~ msgstr \"볼륨 믹서에 보일 애플리케이션을 필터링합니다.\"\n\n#~ msgid \"Filter Mode\"\n#~ msgstr \"필터 모드\"\n\n#~ msgid \"Blacklist\"\n#~ msgstr \"블랙리스트\"\n\n#~ msgid \"Whitelist\"\n#~ msgstr \"화이트리스트\"\n\n#~ msgid \"Using Javascript Regex\"\n#~ msgstr \"정규 표현식 사용\"\n\n#~ msgid \"Use Javascript RegExp for filtering app name or description\"\n#~ msgstr \"자바스크립트의 정규 표현식을 사용해 애플리케이션 이름 혹은 설명을 필터링합니다\"\n\n#~ msgid \"Check Stream Description\"\n#~ msgstr \"스트림 설명도 확인\"\n\n#~ msgid \"Check Description also\"\n#~ msgstr \"스트림의 설명도 필터링에 사용합니다\"\n\n#~ msgid \"Add more buttons\"\n#~ msgstr \"버튼 추가\"\n\n#~ msgid \"Turn on the buttons you want to add on Quick Settings\"\n#~ msgstr \"퀵 패널에 추가하려는 버튼을 체크하세요\"\n\n#~ msgid \"Turn on to make the DND quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"방해 금지 모드 퀵 토글을 퀵 패널에 보여줍니다\"\n\n#~ msgid \"Turn on to make the unsafe quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"위험 모드 퀵 토글을 퀵 패널에 보여줍니다\"\n\n#~ msgid \"This extension is distributed with license GPL 3+\"\n#~ msgstr \"이 확장 프로그램은 GPL 3+ 라이선스 아래 배포됩니다\"\n\n#~ msgid \"excludes Third-party. Third party codes follow their license\"\n#~ msgstr \"서드파티는 제외합니다. 서드파티 코드는 각각 원본 코드의 라이선스를 따릅니다\"\n\n#~ msgid \"Extension Version\"\n#~ msgstr \"확장프로그램 버전\"\n\n#~ msgid \"Unknown (Built from source)\"\n#~ msgstr \"알 수 없음 (소스에서 직접 빌드됨)\"\n\n#~ msgid \"Third party LICENSE\"\n#~ msgstr \"서드파티 라이선스\"\n\n#~ msgid \"LICENSE OF CODES WHICH USED ON THIS EXTENSION\"\n#~ msgstr \"*이 확장 프로그램에 포함되어있는 일부 코드의 라이선스입니다*\"\n\n#~ msgid \"Media Controls widget\"\n#~ msgstr \"미디어 컨트롤 위젯\"\n\n#~ msgid \"Turn on to make the Media Control widget visible on the Quick Settings panel\"\n#~ msgstr \"미디어 위젯을 퀵패널에 추가합니다\"\n\n#~ msgid \"Compact Mode\"\n#~ msgstr \"깔끔한 모드\"\n\n#~ msgid \"Auto Hide\"\n#~ msgstr \"자동 숨기기\"\n\n#~ msgid \"Quick Toggles\"\n#~ msgstr \"퀵 토글\"\n\n#~ msgid \"Fix Weather Widget Overflow\"\n#~ msgstr \"날씨 위젯 오버플로우 고치기\"\n\n#~ msgid \"Fix overflow visual bug of weather widget in datemenu\"\n#~ msgstr \"날짜 메뉴의 날씨 위젯이 흘러 넘쳐 보이는 비쥬얼 버그를 고칩니다\"\n\n#~ msgid \"Remove Notifications On Date Menu\"\n#~ msgstr \"날짜 메뉴 알림 제거\"\n\n#~ msgid \"Remove Media Control On Date Menu\"\n#~ msgstr \"날짜 메뉴 미디어 컨트롤 제거\"\n\n#~ msgid \"Do not adjust the border radius of contents.\"\n#~ msgstr \"콘텐츠의 가장자리 둥글기 정도를 조정하지 않기\"\n\n#~ msgid \"Don't adjust the border of messages and media controls.\"\n#~ msgstr \"메시지와 미디어 컨트롤의 가장자리 둥글기 정도를 조정하지 않습니다\"\n\n#~ msgid \"Do not remove the shadow of contents.\"\n#~ msgstr \"콘텐츠의 그림자 지우지 않기\"\n\n#~ msgid \"Don't remove the shadow of messages and media controls.\"\n#~ msgstr \"메시지와 미디어 컨트롤의 그림자를 지우지 않습니다\"\n\n#~ msgid \"Set Notifications widget position\"\n#~ msgstr \"알림 위젯의 위치\"\n\n#~ msgid \"Buttons to remove\"\n#~ msgstr \"지울 버튼\"\n\n#~ msgid \"Turn on the buttons you want to remove from Quick Settings\"\n#~ msgstr \"퀵패널에서 지우고 싶은 버튼을 채크하세요\"\n\n#~ msgid \"Remove chosen buttons from quick panel\"\n#~ msgstr \"선택한 버튼들이 퀵패널에서 제거됩니다\"\n\n#~ msgid \"Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n#~ msgstr \"나의 익스텐션 https://github.com/qwreey75/gnome-quick-settings-button-remover 에서 포크되었습니다\"\n\n#~ msgid \"This feature is unstable sometime\"\n#~ msgstr \"이 기능은 때때로 불안정합니다\"\n\n#~ msgid \"\"\n#~ \"When lock/unlock with gnome-screensaver, unexpected behavior occurs\\n\"\n#~ \"Please do not report issue about known issue, Almost duplicated\\n\"\n#~ \"Known issue:\\n\"\n#~ \"  button doesn't remove after lockscreen\\n\"\n#~ \"  modal get bigger after lockscreen\"\n#~ msgstr \"\"\n#~ \"그놈 화면 보호기를 켜고 끌 때, 예상하지 않은 동작이 발생합니다\\n\"\n#~ \"알려진 이슈를 보고하지 마세요. 대부분 버그 리포트가 존재합니다\\n\"\n#~ \"알려진 이슈:\\n\"\n#~ \"  버튼이 화면 보호기가 작동한 후 지워지지 않습니다\\n\"\n#~ \"  패널이 화면 보호기가 작동한 후 더 크게 보입니다\"\n\n#~ msgid \"Please turn off if some bug occurred\"\n#~ msgstr \"문제가 발생하면 끄십시오\"\n\n#~ msgid \"Unknown\"\n#~ msgstr \"알 수 없음\"\n\n#~ msgid \"Information\"\n#~ msgstr \"정보\"\n\n#~ msgid \"Version\"\n#~ msgstr \"버전\"\n\n#~ msgid \"\"\n#~ \"Forked from https://github.com/mymindstorm/gnome-volume-mixer\\n\"\n#~ \"This feature works well with both PulseAudio and Pipewire protocols\"\n#~ msgstr \"\"\n#~ \"https://github.com/mymindstorm/gnome-volume-mixer 에서 포크된 기능입니다\\n\"\n#~ \"이 기능은 PulseAudio 와 Pipewire 프로토콜에서 모두 잘 작동합니다\"\n\n#~ msgid \"Visible\"\n#~ msgstr \"보이기\"\n\n#~ msgid \"Turn on to make the volume mixer visible\"\n#~ msgstr \"볼륨 믹서를 보이게 합니다\"\n\n#~ msgid \"Application Filtering\"\n#~ msgstr \"애플리케이션 필터링\"\n\n#~ msgid \"Input/Output\"\n#~ msgstr \"입력/출력\"\n\n#~ msgid \"Add notifications widget\"\n#~ msgstr \"알림 위젯을 추가합니다\"\n\n#~ msgid \"\"\n#~ \"Reference from https://github.com/Aylur/gnome-extensions\\n\"\n#~ \"Source code of that is not used on this extension\"\n#~ msgstr \"\"\n#~ \"https://github.com/Aylur/gnome-extensions 에서 영감받았습니다\\n\"\n#~ \"해당 저장소의 소스코드 자체는 이 확장프로그램에 사용되지 않았습니다\"\n\n#~ msgid \"Media Controls\"\n#~ msgstr \"미디어 컨트롤\"\n\n#~ msgid \"Add Media Controls widget\"\n#~ msgstr \"미디어 컨트롤 위젯 추가\"\n"
  },
  {
    "path": "po/pl.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n# Adam Lewicki <a.lewicki95@gmail.com>, 2025.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"PO-Revision-Date: 2025-03-13 13:35+0100\\n\"\n\"Last-Translator: \\n\"\n\"Language-Team: \\n\"\n\"Language: po\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.4.4\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"Szczegóły\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"Funkcja eksperymentalna\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"Przywróć ustawienia domyślne\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"Domyślnie dla motywu\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"Strona główna\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"Licencje\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"Ładowanie...\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"Uwzględnione pliki\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"Dziennik zmian\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"(Aktualnie)\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"> **Data:** %s\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"> **Git Hash:** %s\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"> **Komplikacja:** %d\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"Wypełnienie\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"U góry\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"Na dole\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"Po lewej\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"Po prawej\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"Stabilna\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"Rozwojowa\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"Podgląd\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"(Wydanie GitHub)\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"(Skompilowane ze źródła)\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"Brak powiadomień\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"Wyczyść\"\n\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"Powiadomienia\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"Nie przeszkadzać\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"Nieznany tytuł\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"Media\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"Zmieniono głośność\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"Otwórz poziomy głośności\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"Poziomy głośności\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"Pogoda\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"Nie ustawiono lokalizacji\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"Tryb niezabezpieczony\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"Promień przytwierdzenia\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"0 - domyślny prommień\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"Kolor przytwierdzenia\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"Styl suwaka\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"Wąski\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"Domyślny\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"Kolor tła\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"Aktywny kolor tła\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"Widżety\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"Media\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"Pokazuj widżet na panelu szybkich ustawień\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"Tryb kompaktowy\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\"Mały widźet mediów\\n\"\n\"Uczyń go bardziej podobnym do komunikatu powiadomienia\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"Przezroczystość przycików sterowania\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"255 - nieprzezroczyste, 0 - przezroczyste\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"Przycisk dalej\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"Dodaj przycisk 'Dalej' obok opisu\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"Przycisk wstecz\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"Dodaj przycisk 'Wstecz' obok opisu\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"Przycisk wstrzymaj\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"Dodaj przycisk 'Wstrzymaj' obok opisu\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"Pasek postępu\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"Dodaj pasek postępu pod opisem\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"Gradient tła\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\"Użyj gradientu tła z okładki\\n\"\n\"Może wpłynąć na wydajność\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"Kolor tła\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"Dostosuj przezroczystość po lewej stronie. 1000 oznacza brak przezroczystości\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"Dostosuj mieszanie koloru po lewej stronie. 1000 oznacza kolor pobrany\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"Dostosuj przezroczystość po prawej stronie. 1000 oznacza brak przezroczystości\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"Dostosuj mieszanie koloru po prawej stronie. 1000 oznacza kolor pobrany\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"Zaokrąglenie\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"Użyj zaokrąglenia, aby efekt był bardziej naturalny\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"Dostosowywanie wypełnienia\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"Dostosuj efekt wypełnienia, jeśli Twój motyw ma inny margines wypełnieia\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"Usuń cień\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Usuń cień z powiadomień mediów\\n\"\n\"Użyj, jeśli motyw tworzy niepotrzebne cienie\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"Kontrla prędkości przewijania\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"Dostosuj prędkość przewijania panelu dotykowego lub rolki. Wartość ujemna odwraca kierunek\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"Powiadomienia\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"Pokazuj widżet na panelu szybkich ustawień\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"Zmniejsz powiadomienia\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"Maksymalna wysokość\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"Ustaw maksymalną wysokość powiadomienia, domyślnie %d. Wartość 0 - wyłącza\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"Odstęp zanikania\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"Ostaw początek pozycji zanikania. 0 - wyłączenie efektu, domyślnie 46\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"Automatyczne ukrywanie\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"Ukryj widźet powiadomień, jeśli ich nie ma\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"Użyj wbudowanej kontroli\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"Użyj wbudowanego przycisku Nie przeszkadzać i przycisku Wyczyść\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Usuń cień z powiadomień\\n\"\n\"Użyj, jeśli motyw tworzy nieporzebne cienie\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"Pokaż pasek przewijania\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"Pokaż pasek przewijania\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"Pogoda\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"Pokazuj widźet w panelu szybkich ustawień\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"Zmienjsz widźet pogody\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Usuń cień z powiadomień\\n\"\n\"Użyj, jeśli motyw tworzy nieporzebne cienie\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"Polecenie kliknięcia\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"Pokaż lokalizację\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"Pokaż lokalizację w nagłówku\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"Odstęp aktualizacji prognozy\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"Dostisuj odstęp aktualiacji prognozy\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"Ilość dni\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"Maksymalna ilość dni\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"Poziomy głośności\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"Pokazuj widźet w panelu szubkich ustawień\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"Etykieta\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"Wybierz etykietę pod żródłem treści suwaka\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"Oba\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"Tytuł\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"Opis\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"Brak\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"Przezroczystość\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"Dostosuj przezroczystość etykiety.\\n\"\n\"255 - nieprzezroczyste, 0 - przezroczyste\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"Ustaw maksymalną wysokość widźetu, domyslnie %d. Wartość 0 - wyłącza\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"Pasek przewijania\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"Ikona strumienia\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"Pokaż ikone strumienia nad suwakiem\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"Załącz do suwaka wyjścia\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"Załącz poziomy głośności do suwaka wyjścia. Uzywaj, jeśli wolisz tryb kompaktowy\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"Ikona menu\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"O programie\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"Podstawowe informacje o rozszerzeniu\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"Dziennik zmian\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"Wyświetl historię zmian tego rozszerzenia\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"Licencja\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"Współtwórcy\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"Twórcy tego rozszerzenia\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"Więcej współtwórców\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"Więcej na GitHub\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"Odnośnik\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"Odnośniki zewnętrzne\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"Dotacje za pomoca sponsorów GitHub\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"Wspomóż twórców!\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"Oceń i skomentuj rozszerzenie!\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"Repozytorium GitHub\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\"Dodanie gwiazdki w repozytorium bardzo mi pomaga!\\n\"\n\"Jeśli znalazłeś błąd tego rozszerzenia, możesz zgłosić go, aby powiadomić nas o nim!\\n\"\n\"Lub możesz stworzyć PR ze wspaniałymi funkcjami!\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"Dodaj tłumaczenie do tego rozszerzenia!\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"Debuguj\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"Opcje\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"Wystaw środowisko\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"Wystaw środowisko na globalThis.qst\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"Granice układu\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"Pokaż granice ukladu panela szybkich ustawień\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"Poziom dziennika zdarzeń\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"brak\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"błąd\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"info\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"debug\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"Przełączniki\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"Nie przeszkadzać\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"Włącz przycisk w ustalonej pozycji\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"Pozycja\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"Ustaw pozycję\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"Panel szybkich ustawień\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"Menu daty\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"Tryb niezabezpieczony\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"Włącz przycisk w panelu szybkich ustawień\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"Pamiętaj stan\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"Włącz zapamiętywanie ostatniego stanu\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"Dostosowywanie\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"Czas\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"Czas otwarcia w mikrosekundach\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"Zamknięcie\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"Czas zamkniecia w mikrosekundach\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"Przezroczystość\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"Dostosuj przezroczystość zawartości siatki.\\n\"\n\"255 - nieprzeroczyste, 0 - przezroczyste\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"Rozmycie\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\"Dostsuj rozmycie tła.\\n\"\n\"0 - bez rozycia tła\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"Jasność\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\"1000 - wyłącza zarządzanie jasnością.\\n\"\n\"nie wpływa na domyślny efekt powłoki GNOME.\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"Przezroczystość\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"Dostosuj przezroczystość tła.\\n\"\n\"255 - nieprzeroczyste, 0 - przezroczyste\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"Skalowanie w osi X\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"Dostosuj skalowanie w osi X, 1000 oznaza skalę 1.0\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"Skalowanie w osi Y\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"Dostosuj skalowanie w osi Y, 1000 oznaza skalę 1.0\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"Tryb nakładania\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"Nakładaj na przełączniki, zasilanie oraz wyjścia audio dodatkowe menu\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"Szerokość\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\"Dostosuj szerokość dodatkowego menu\\n\"\n\"0 - wyłącza\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"Czas animacji\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\"Czas otwarcia animacji w mikrosekundach\\n\"\n\"0 - wyłącza\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"Styl\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"Rodzaj animacji\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"Wylatywanie\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"Okno\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"Animacja\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\"Dodaj animację do otwierania oraz zamykania menu\\n\"\n\"Włącz tryb nakładania, dla lepszego efektu\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"Dostosuj pręszkość, rozycie, skalowanie oraz przezroczystość\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"NIe znaleziono elementu\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"Brak zmian\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"Taki element już istnieje\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"Właściwości %s\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"Zapisz\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"Edytor przełącznika\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"Opcja wymaga przeładowania powłoki GNOME\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"Ukryj\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"Mój element #%d\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"Nowy element\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"Ukrywanie i kolejność\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"Nazwa przełącznika\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"Tytuł Regex (JavaScript Regex)\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"Nazwa\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"Nazwa GType\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"To jest komentarz do łatwej identyfikacji na liście ustawień. Nie ma on wpływu na zachowanie rozszerzenia\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"Nazwa konstruktora JavaScript\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"Nazwa typu GObject. Możesz uzyskać tę wartość, wywołując GObject.type_name_from_instance\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"Podświetlenie klawiatury\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"Elementy bez kolejności\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"Aplet dostępu zdalnego\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"Aparat\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"Wejście audio\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"Lokalizacja\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"Thunderbolt\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"Sieć\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"Wyjscie audio\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"System (bateria)\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"Pusta przestrzeń pulpitu\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"Pusta przestrzeń laptopa\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"Przechwytywanie\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"Ustawienia\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"Zablokuj\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"Wyłącz\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"Bateria\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"Układ\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"Układ przełączników\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"Dostosuj układ przełączników\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"Zmień kolejność i ukryj\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"Wskaźniki systemowe\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"Dostosuj układ oraz styl wskaźników systemowych\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"Udostępnianie\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"Użyj koloru powłoki\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"Nagrywanie ekranu\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"Użyj koloru powłoki\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"Prywatność\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"Użyj koloru powłoki\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"Kolor akcentu\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"Monochromatyczny\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"Dostosuj wskaźniki systemowe\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"Zmień i ukryj wskaźniki systemowe\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"Elementy systemowe\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"Dostosuj układ elementów systemowych\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"Elementy systemowe\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"Ukryj wszystkie przyciski\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"Zmień kolejność i ukryj elementy\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"Data\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"Dostosuj układ menu daty\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"Lewy panel\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"Ukryj lewy panel, który zawiera powiadomienia oraz sterownie mediami\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"Prawy panel\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"Ukryj prawy panel. który zawiera kalendarz, zegar światowy oraz pogodę\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"Wyłącz menu\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"Nie otwieraj menu po jego kliknięciu\"\n\n#~ msgid \"Height\"\n#~ msgstr \"Wysokość\"\n\n#~ msgid \"Set this to 0 to use default height\"\n#~ msgstr \"0 - domyślna wysokość\"\n\n#~ msgid \"Start opaque\"\n#~ msgstr \"Wyłącz przezroczystość\"\n\n#~ msgid \"End opaque\"\n#~ msgstr \"Włącz przezroczystość\"\n\n#~ msgid \"Hide Notifications\"\n#~ msgstr \"Przestrzeń powiadomień\"\n\n#~ msgid \"Hide notifications on the date menu\"\n#~ msgstr \"Ukryj przestrzeń powiadomień\"\n\n#~ msgid \"Hide Media Control\"\n#~ msgstr \"Sterowanie mediami\"\n\n#~ msgid \"Hide media control on the date menu\"\n#~ msgstr \"Ukryj sterowanie mediami\"\n"
  },
  {
    "path": "po/pt.po",
    "content": "# AUTHORS\n# DanGLES3 https://github.com/DanGLES3, 2023.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"PO-Revision-Date: 2025-03-09 17:10+0000\\n\"\n\"Last-Translator: Duarte Souto Assunção <duarte.s.assuncao.3@gmail.com>\\n\"\n\"Language-Team: Portuguese <https://weblate.paring.moe/projects/gs-quick-settings-tweaks/gs-extension/pt/>\\n\"\n\"Language: pt\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 5.10.2\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"Detalhes\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"Esta funcionalidade é experimental\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"Redefinir para o padrão\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"Tema padrão\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"Página principal\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"Licença\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"A carregar...\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"Ficheiros afetados\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"Mudança\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"Atual\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"> **Data:** %s\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"Superior\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"Inferior\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"Esquerda\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"Direita\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"Estável\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"Desenvolvimento\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"Pré-visualização\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"Nenhuma notificação\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"Limpar\"\n\n# Quick settings notifications title text\n# Notifications title\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"Notificações\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"Não Perturbe\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"Título desconhecido\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"Mídia\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"Volume alterado\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"Abrir mixer de volume\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"Mixer de Volume\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"Clima\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"Localização não foi definida\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"Modo Inseguro\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"Coloque a 0 para usar o raio padrão\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"Estilo do slider\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"Magro\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"Padrão\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"Cor de fundo\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"Cor de fundo ativa\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"Widgets\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"Widget de Mídia\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"Ligue para visualizar o widget de mídia no Painel de Definições Rápidas\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"Modo compacto\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\"Deixar o widget de Controles de Mídia menor\\n\"\n\"Deixá-lo com tamanho similar a uma mensagem de notificação\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"Opacidade do botão de controlo\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"Coloque a 255 para opaco ou 0 para transparente\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"Mostrar o próximo botão\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"Adicionar o próximo botão de controle a seguir à descrição\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"Mostrar botão anterior\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"Mostrar botão de pausa\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"Mostrar barra de progresso\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"Adicionar barra de progresso abaixo da descrição\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"Fundo degradê\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\"Usar fundo degradê extraído da imagem de capa\\n\"\n\"Pode afetar a preformance ligeiramente\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"Cor de fundo base\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"Ajustar transparência do lado esquerdo, Coloque a 1000 para opaco\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"Efeito de clip redondo\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"Usar efeito de clip redondo para fazer transição mais natural\"\n\n#: target/out/prefPages/widgets.js:234\n#, fuzzy\nmsgid \"Padding adjustment\"\nmsgstr \"Ajuste de padding\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"Remover sombra\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Remover sobra da mensagem de mídia\\n\"\n\"Use se o seu tema cria sombras desnecessárias\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"Velocidade de scroll suave\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"Widget de notificação\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"Fazer notificações mais pequenas\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"Altura máxima\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"Esconder automáticamente\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"Ocultar o widget de Notificações quando não houver nenhuma notificação\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"Usar controles nativos\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"Usar interruptor do Não Perturbe e botão Limpar nativos\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Remover sombra da mensagem de notificação\\n\"\n\"Use se o seu tema cria sombras desnecessárias\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"Mostrar barra de scroll\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"Mostrar barra de scroll na lista de mensagens\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"Widget de Clima\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"Ligue para fazer o widget de clima visível no Painel de Definições Rápidas\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"Fazer widget de clima mais pequeno\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"Remover sombra do widget de clima\\n\"\n\"Use se o seu tema cria sombras desnecessárias\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"Comando de clique\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"Mostrar localização\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"Mostrar a etiqueta de localização no título\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"Intervalo de previsão\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"Ajustar intervalo de previsão em hora\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"Máximas previsões\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"Ajustar máximas previsões\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"Widget de mixer de volume\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"Etiqueta de texto\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"Ambos\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"Título\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"Descrição\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"Nenhum\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"Opacidade de etiqueta\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"Ajustar opacidade de etiqueta\\n\"\n\"Coloque a 255 para opaco ou 0 para transparente\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"Mostrar barra de scroll na lista do mixer\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"Mostrar ícone de stream\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"Mostar ícone de stream acima dos sliders do mixer\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"Afixar ao slider de saída\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"Ícone de menu\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"Sobre\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"Informações de extensão comuns\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"Mudanças\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"Ver o histórico de mudanças desta extensão\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"Licença de códigos\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"Contribuidores\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"Os criadores desta extensão\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"Mais contribuições\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"Ver mais contruibuições no github\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"Link\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"Links externos sobre esta extensão\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"Doar via github sponsors\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"Apoie o desenvolvimento!\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"Classifique e comente sobre a extensão!\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"Repositório do GitHub\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\"Dar uma estrela no repositório me ajuda muito!\\n\"\n\"Por favor, se encontrar um problema com esta extensão, pode criar um relato de problema para me avisar disso!\\n\"\n\"Ou pode criar um PR com funcionalidades incríveis!\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"Adicione uma tradução para esta extensão!\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"Debug\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"Opções de debug da extensão\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"Expor ambiente\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"Expor ambiente de extensão para globalThis.qst\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"Mostar borda do esquema\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"Mostrar esquema de bordas nas Definições Rápidas\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"Nível de log\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"nenhum\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"erro\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"informação\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"debug\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"Botões\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"Botão Rápido do Não Perturbe\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"Ligue para adicionar o botão rápido de Não Perturbe no Painel de Definições Rápidas\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"Indicador de posição do Não Perturbe\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"Definir posição do indicador de Não Perturbe\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"Tray de Sistema\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"Botão do Menu da Data\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"Quick Toggle do Modo Inseguro\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"Salvar o estado da última sessão\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"Estilo de animação avançado\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"Duração de abertura\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"Fechar Duração\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"Opacidade do Conteúdo da Grelha\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"Raio do blur de fundo\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"Brilho do fundo\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"Opacidade do Fundo\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"Escala X do fundo\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"Escala Y do fundo\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"Diálogo\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"Animação\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"Ajustar velocidade, blur, escala e opacidade\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"O ítem não encontrado\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"Nenhuma mudança\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"Este ítem já existe\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"Propriedades de %s\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"Salvar\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"Ligar editor\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"Esconder\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"Meu item #%d\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"Novo item\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"Nome amigável\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"Regex de Título (Regex de Javascript)\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"Nome do construtor\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"Nome do construtor de Javascript\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"Luz de teclado\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"Câmera\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"Entrada de volume\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"Localização\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"Thunderbolt\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"Rede\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"Saída de volume\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"Sistema (Bateria)\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"Botão de captura\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"Botão de definições\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"Botão de bloqueio\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"Botão de desligar\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"Botão de bateria\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"Esquema\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"Esquema de Botões Rápidos\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"Indicadores de sistema\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"Usar cor de destaque da shell no indicador de partilha de ecrã\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"Indicador de gravação no ecrã destaque\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"Usar cor de destaque de shell no indicador de gravação de ecrã\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"Estilo de indicadores de privacidade\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"Destaque\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"Ajustar indicadores de sistema\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"Reordenar e esconder indicadores de sistema\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"Esquema de itens de sistema\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"Ajustar esquema de itens de sistema\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"Esconder caixa de esquema\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"Esconder todos os botões e caixa de esquema\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"Reordenar e esconder itens de sistema\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"Menu de Data\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"Ajustar esquema do Menu de Data\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"Esconder caixa da esquerda\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"Esconder caixa da esquerda do menu de data, que contém notificações e controlo de mídia\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"Esconder caixa da direita\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"Esconder caixa da direita do menu de data, que contém calendário, relógio mundial e clima\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"Desabilitar menu\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"Não abrir menu de data quando for clicado\"\n\n#~ msgid \"Height\"\n#~ msgstr \"Altura\"\n\n#~ msgid \"Set this to 0 to use default height\"\n#~ msgstr \"Coloque a 0 para usar a altura padrão\"\n\n#~ msgid \"Start opaque\"\n#~ msgstr \"Começar opaco\"\n\n#~ msgid \"End opaque\"\n#~ msgstr \"Terminar opaco\"\n\n#~ msgid \"Hide Notifications\"\n#~ msgstr \"Esconder Notificações\"\n\n#~ msgid \"Hide notifications on the date menu\"\n#~ msgstr \"Esconder notificações no menu de data\"\n\n#~ msgid \"Hide Media Control\"\n#~ msgstr \"Esconder controle de mídia\"\n\n#~ msgid \"Hide media control on the date menu\"\n#~ msgstr \"Esconder controle de mídia no menu de data\"\n\n#~ msgid \"Donate via patreon\"\n#~ msgstr \"Doar pelo Patreon\"\n\n#~ msgid \"Set maximum height of the Notifications widget. default is 292\"\n#~ msgstr \"Defina a altura máxima do widget de Notificações. O padrão é 292\"\n\n#~ msgid \"Other\"\n#~ msgstr \"Outros\"\n\n#~ msgid \"\"\n#~ \"Hide notifications on date menu.\\n\"\n#~ \"*this option removes media control on date menu too*\"\n#~ msgstr \"\"\n#~ \"Ocultar notificações no menu de data.\\n\"\n#~ \"*esta opção também remove os controles de mídia no menu de data*\"\n\n#~ msgid \"Hide media control on date menu.\"\n#~ msgstr \"Ocultar controles de mídia no menu de data.\"\n\n#~ msgid \"Sound Settings\"\n#~ msgstr \"Configurações de som\"\n\n#~ msgid \"Notification Widget\"\n#~ msgstr \"Widget de notificação\"\n\n#~ msgid \"Turn on to make the notification widget visible on the Quick Settings panel\"\n#~ msgstr \"Ative para deixar o widget de notificação visível no painel de Configurações Rápidas\"\n\n#~ msgid \"Links\"\n#~ msgstr \"Links\"\n\n#~ msgid \"Contributor\"\n#~ msgstr \"Colaborador\"\n\n#~ msgid \"Add Application to filtering\"\n#~ msgstr \"Adicionar aplicativo ao filtro\"\n\n#~ msgid \"Add\"\n#~ msgstr \"Adicionar\"\n\n#~ msgid \"Cancel\"\n#~ msgstr \"Cancelar\"\n\n#~ msgid \"Application name\"\n#~ msgstr \"Nome do aplicativo\"\n\n#~ msgid \"General\"\n#~ msgstr \"Geral\"\n\n#~ msgid \"Enchant input/output slider\"\n#~ msgstr \"Personalize o slider de entrada/saída\"\n\n#~ msgid \"Show current audio output selection\"\n#~ msgstr \"Mostrar saída de áudio atual\"\n\n#~ msgid \"Always show the current audio output selection above the volume slider\"\n#~ msgstr \"Sempre mostrar a saída de áudio atualmente selecionada acima do slider de volume\"\n\n#~ msgid \"Show current audio input selection\"\n#~ msgstr \"Mostrar entrada de áudio atual\"\n\n#~ msgid \"Always show the current audio input selection above the volume slider\"\n#~ msgstr \"Sempre mostrar a entrada de áudio atualmente selecionada acima do slider de volume\"\n\n#~ msgid \"Always show input\"\n#~ msgstr \"Sempre mostrar entrada\"\n\n#~ msgid \"Always show the audio input volume slider, even when there is no audio input stream.\"\n#~ msgstr \"Sempre mostrar o slider de volume da entrada de áudio, mesmo quando não houver fluxo de entrada de áudio.\"\n\n#~ msgid \"Add volume mixer (PulseAudio, Pipewire)\"\n#~ msgstr \"Adicionar mixer de volume (PulseAudio, PipeWire)\"\n\n#~ msgid \"\"\n#~ \"Turn on to make the volume mixer visible\\n\"\n#~ \"Forked from https://github.com/mymindstorm/gnome-volume-mixer\"\n#~ msgstr \"\"\n#~ \"Ative para tornar visível o mixer de volume\\n\"\n#~ \"Uma ramificação de https://github.com/mymindstorm/gnome-volume-mixer\"\n\n#~ msgid \"Position\"\n#~ msgstr \"Posição\"\n\n#~ msgid \"Set volume mixer position\"\n#~ msgstr \"Definir posição do mixer de volume\"\n\n#~ msgid \"Top (Below Output/Input slider)\"\n#~ msgstr \"Superior (sob o slider de saída/entrada)\"\n\n#~ msgid \"Show stream Description\"\n#~ msgstr \"Mostrar descrição do fluxo\"\n\n#~ msgid \"Show audio stream description above the slider\"\n#~ msgstr \"Mostrar descrição do fluxo de áudio acima do slider\"\n\n#~ msgid \"Show stream Icon\"\n#~ msgstr \"Mostrar ícone do fluxo\"\n\n#~ msgid \"Show application icon in front of the slider\"\n#~ msgstr \"Mostrar ícone do aplicativo na frente do slider\"\n\n#~ msgid \"Filter applications shown in the volume mixer.\"\n#~ msgstr \"Filtrar aplicativos mostrados no mixer de volume.\"\n\n#~ msgid \"Filter Mode\"\n#~ msgstr \"Modo de Filtragem\"\n\n#~ msgid \"Blacklist\"\n#~ msgstr \"Lista negra\"\n\n#~ msgid \"Whitelist\"\n#~ msgstr \"Lista branca\"\n\n#~ msgid \"Using Javascript Regex\"\n#~ msgstr \"Usar Regex do Javascript\"\n\n#~ msgid \"Use Javascript RegExp for filtering app name or description\"\n#~ msgstr \"Usar RegExp do Javascript para filtrar nomes ou descrições de aplicativos\"\n\n#~ msgid \"Check Stream Description\"\n#~ msgstr \"Conferir descrição do fluxo\"\n\n#~ msgid \"Check Description also\"\n#~ msgstr \"Conferir também a descrição\"\n\n#~ msgid \"Add more buttons\"\n#~ msgstr \"Adicionar botões\"\n\n#~ msgid \"Turn on the buttons you want to add on Quick Settings\"\n#~ msgstr \"Ative os botões que você deseja adicionar às Configurações Rápidas\"\n\n#~ msgid \"Turn on to make the DND quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"Ative para deixar o Quick Toggle do Não Perturbe visível no painel de Configurações Rápidas\"\n\n#~ msgid \"Turn on to make the unsafe quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"Ative para deixar o Quick Toggle do Modo Inseguro visível no painel de Configurações Rápidas\"\n\n#~ msgid \"This extension is distributed with license GPL 3+\"\n#~ msgstr \"Esta extensão é distribuída sob a licença GPL 3+\"\n\n#~ msgid \"excludes Third-party. Third party codes follow their license\"\n#~ msgstr \"Exclui terceiros. Código de terceiros segue suas próprias licenças\"\n\n#~ msgid \"Extension Version\"\n#~ msgstr \"Versão da extensão\"\n\n#~ msgid \"Unknown (Built from source)\"\n#~ msgstr \"Desconhecida (compilada do código-fonte)\"\n\n#~ msgid \"Third party LICENSE\"\n#~ msgstr \"Licenças de Terceiros\"\n\n#~ msgid \"LICENSE OF CODES WHICH USED ON THIS EXTENSION\"\n#~ msgstr \"Licenças de códigos que foram utilizados nesta extensão\"\n\n#~ msgid \"Media Controls widget\"\n#~ msgstr \"Widget de controles de mídia\"\n\n#~ msgid \"Turn on to make the Media Control widget visible on the Quick Settings panel\"\n#~ msgstr \"Ative para deixar o widget de Controles de Mídia visível no painel de Configurações Rápidas\"\n\n#~ msgid \"Compact Mode\"\n#~ msgstr \"Modo compacto\"\n\n#~ msgid \"Auto Hide\"\n#~ msgstr \"Ocultar automaticamente\"\n\n#~ msgid \"Quick Toggles\"\n#~ msgstr \"Quick Toggles\"\n\n#~ msgid \"Fix Weather Widget Overflow\"\n#~ msgstr \"Corrigir transbordamento do widget de Meteorologia\"\n\n#~ msgid \"Fix overflow visual bug of weather widget in datemenu\"\n#~ msgstr \"Corrigir problema visual de transbordamento do widget de Meteorologia no menu de data\"\n\n#~ msgid \"Remove Notifications On Date Menu\"\n#~ msgstr \"Remover notificações no menu de data\"\n\n#~ msgid \"Remove Media Control On Date Menu\"\n#~ msgstr \"Remover controles de mídia no menu de data\"\n\n#~ msgid \"Do not adjust the border radius of contents.\"\n#~ msgstr \"Não ajustar o raio de curvatura das bordas dos conteúdos.\"\n\n#~ msgid \"Don't adjust the border of messages and media controls.\"\n#~ msgstr \"Não ajustar as bordas das mensagens e dos controles de mídia.\"\n\n#~ msgid \"Do not remove the shadow of contents.\"\n#~ msgstr \"Não remover as sombras dos conteúdos.\"\n\n#~ msgid \"Don't remove the shadow of messages and media controls.\"\n#~ msgstr \"Não remover as sombras das mensagens e dos controles de mídia.\"\n\n#~ msgid \"Set Notifications widget position\"\n#~ msgstr \"Definir posição do widget de Notificações\"\n\n#~ msgid \"Buttons to remove\"\n#~ msgstr \"Remover botões\"\n\n#~ msgid \"Turn on the buttons you want to remove from Quick Settings\"\n#~ msgstr \"Ative os botões que você deseja remover das Configurações Rápidas\"\n\n#~ msgid \"Remove chosen buttons from quick panel\"\n#~ msgstr \"Remover botões escolhidos do painel de Configurações Rápidas\"\n\n#~ msgid \"Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n#~ msgstr \"Uma ramificação da minha extensão https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n\n#~ msgid \"This feature is unstable sometime\"\n#~ msgstr \"Esta funcionalidade às vezes pode ser instável\"\n\n#~ msgid \"\"\n#~ \"When lock/unlock with gnome-screensaver, unexpected behavior occurs\\n\"\n#~ \"Please do not report issue about known issue, Almost duplicated\\n\"\n#~ \"Known issue:\\n\"\n#~ \"  button doesn't remove after lockscreen\\n\"\n#~ \"  modal get bigger after lockscreen\"\n#~ msgstr \"\"\n#~ \"Ao bloquear/desbloquear com o gnome-screensaver, um comportamento inesperado ocorre\\n\"\n#~ \"Favor não criar um relato de problema sobre um problema já conhecido, quase duplicado\\n\"\n#~ \"Problemas conhecidos:\\n\"\n#~ \"  botão não é removido após a tela de bloqueio\\n\"\n#~ \"  modal fica maior após a tela de bloqueio\"\n\n#~ msgid \"Please turn off if some bug occurred\"\n#~ msgstr \"Favor desativar se algum problema ocorrer\"\n\n#~ msgid \"Unknown\"\n#~ msgstr \"Desconhecido\"\n\n#~ msgid \"\"\n#~ \"Do not separate Quick Settings and Notifications widgets, \\byou should enable this option because separated panels can make many visual bugs\\n\"\n#~ \"(such as margin or padding not matching with the theme)\"\n#~ msgstr \"\"\n#~ \"Não separar os widgets de Configurações Rápidas e de Notificações \\\\bvocê deve ativar esta opção porque painéis separados podem gerar vários problemas visuais\\n\"\n#~ \"(como margens e espaçamentos não corresponderem ao tema)\"\n"
  },
  {
    "path": "po/quick-settings-tweaks@qwreey.pot",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"\"\n\"Adjust left side background color mixing, Set this to 1000 to show extracted \"\n\"color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"\"\n\"Adjust right side background color mixing, Set this to 1000 to show \"\n\"extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"\"\n\"Adjust clip effect padding, edit this if your theme has a different margin \"\n\"or padding\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"\"\n\"Adjust trackpad and trackpoint scroll speed, negative number for invert \"\n\"direction\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"\"\n\"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"\"\n\"Set maximum height of the Notifications widget, default is %d. Set this to 0 \"\n\"to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"\"\n\"Set position of the fade out effect begins. Set this to 0 to disable fade \"\n\"out effect. default is 46\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"\"\n\"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"\"\n\"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 \"\n\"to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"\"\n\"Attach volume mixer menu button to output slider. Use if you prefer compact \"\n\"layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me \"\n\"know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"\"\n\"This is the comment for easy identification in the settings list. It has no \"\n\"effect on the behavior of the extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"\"\n\"GObject gtype name. You can get this value by calling \"\n\"GObject.type_name_from_instance\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"\"\n\"Hide the left box of the date menu, which contains notifications and media \"\n\"control\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"\"\n\"Hide the right box of the date menu, which contains calendar, world clock \"\n\"and weather\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"\"\n"
  },
  {
    "path": "po/ru.po",
    "content": "# AUTHORS\n# David Lapshin https://github.com/daudix-UFO, 2023.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"PO-Revision-Date: 2024-01-31 13:38+0000\\n\"\n\"Last-Translator: \\\"Droid.SUGI\\\" <droid.sugi@gmail.com>\\n\"\n\"Language-Team: Russian <http://weblate.paring.moe/projects/gs-quick-settings-tweaks/gs-extension/ru/>\\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 5.2.1\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"Верх\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"Низ\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"Нет уведомлений\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"Очистить\"\n\n# Quick settings notifications title text\n# Notifications title\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"Уведомления\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"Не беспокоить\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"Громкость изменена\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"Микшер громкости\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"Небезопасный режим\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\"Сделать виджет управлением медиа меньше\\n\"\n\"Сделать его размер более схожим на уведомление\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"Максимальная высота\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"Прятать виджет уведомлений когда нет уведомлений\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"Использовать нативное управление\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"Использовать встроенные кнопки Не Беспокоить и очистки\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"О расширении\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"Создатели этого расширения\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"Поддержите разработку!\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"Оцените и прокомментируйте расширение!\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"Репозиторий Github\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\"Добавление звездочки в репозиторий нам очень помогает!\\n\"\n\"Пожалуйста, если вы нашли ошибку в этом расширении, создайте проблему, чтобы мы знали об этом!\\n\"\n\"Или вы можете создать PR с новыми функциями!\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"Добавьте перевод в это расширение!\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"Кнопка переключения DND\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"Кнопка переключения небезопасного режима\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"\"\n\n#~ msgid \"Donate via patreon\"\n#~ msgstr \"Пожертвование через patreon\"\n\n#~ msgid \"Other\"\n#~ msgstr \"Другое\"\n\n#~ msgid \"\"\n#~ \"Hide notifications on date menu.\\n\"\n#~ \"*this option removes media control on date menu too*\"\n#~ msgstr \"\"\n#~ \"Скрыть уведомления в меню даты.\\n\"\n#~ \"*эта опция также удаляет управление мультимедиа в меню даты*\"\n\n#~ msgid \"Hide media control on date menu.\"\n#~ msgstr \"Скрыть управление мультимедиа в меню даты.\"\n\n#~ msgid \"Links\"\n#~ msgstr \"Ссылки\"\n\n#~ msgid \"Contributor\"\n#~ msgstr \"Участники\"\n\n#~ msgid \"Add Application to filtering\"\n#~ msgstr \"Добавить приложение в фильтрацию\"\n\n#~ msgid \"Add\"\n#~ msgstr \"Добавить\"\n\n#~ msgid \"Cancel\"\n#~ msgstr \"Отменить\"\n\n#~ msgid \"Application name\"\n#~ msgstr \"Название приложения\"\n\n#~ msgid \"General\"\n#~ msgstr \"Общие\"\n\n#~ msgid \"Enchant input/output slider\"\n#~ msgstr \"Расширенный ползунок ввода/вывода\"\n\n#~ msgid \"Add more buttons\"\n#~ msgstr \"Добавить больше кнопок\"\n\n#~ msgid \"Turn on the buttons you want to add on Quick Settings\"\n#~ msgstr \"Включите кнопки, которые вы хотите добавить в быстрые настройки\"\n\n#~ msgid \"Turn on to make the DND quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"Включите, чтобы сделать кнопку DND видимой на панели быстрых настроек\"\n\n#~ msgid \"Turn on to make the unsafe quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"Включите, чтобы сделать кнопку небезопасного режима видимой на панели быстрых настроек\"\n\n#~ msgid \"This extension is distributed with license GPL 3+\"\n#~ msgstr \"Это расширение распространяется под лицензией GPL 3+\"\n\n#~ msgid \"excludes Third-party. Third party codes follow their license\"\n#~ msgstr \"исключая сторонние разработки. Сторонние разработки следуют своей лицензии\"\n\n#~ msgid \"Extension Version\"\n#~ msgstr \"Версия расширения\"\n\n#~ msgid \"Unknown (Built from source)\"\n#~ msgstr \"Неизвестно (создано из исходного кода)\"\n\n#~ msgid \"Third party LICENSE\"\n#~ msgstr \"ЛИЦЕНЗИЯ третьей стороны\"\n\n#~ msgid \"LICENSE OF CODES WHICH USED ON THIS EXTENSION\"\n#~ msgstr \"ЛИЦЕНЗИИ НА РАЗРАБОТКИ, КОТОРЫЕ ИСПОЛЬЗОВАЛИСЬ В ЭТОМ РАСШИРЕНИИ\"\n\n#~ msgid \"Quick Toggles\"\n#~ msgstr \"Быстрые настройки\"\n\n#~ msgid \"Fix Weather Widget Overflow\"\n#~ msgstr \"Исправление переполнения виджета погоды\"\n\n#~ msgid \"Fix overflow visual bug of weather widget in datemenu\"\n#~ msgstr \"Исправление визуальной ошибки переполнения виджета погоды в меню даты\"\n\n#~ msgid \"Remove Notifications On Date Menu\"\n#~ msgstr \"Удалить уведомления в меню даты\"\n\n#~ msgid \"Remove Media Control On Date Menu\"\n#~ msgstr \"Удалить управление мультимедиа в меню даты\"\n\n#~ msgid \"Do not adjust the border radius of contents.\"\n#~ msgstr \"Не изменяйте радиус границы контента.\"\n\n#~ msgid \"Don't adjust the border of messages and media controls.\"\n#~ msgstr \"Не меняйте границы сообщений и элементов управления мультимедиа.\"\n\n#~ msgid \"Do not remove the shadow of contents.\"\n#~ msgstr \"Не удаляйте тень контента.\"\n\n#~ msgid \"Don't remove the shadow of messages and media controls.\"\n#~ msgstr \"Не удаляйте тень сообщений и элементов управления мультимедиа.\"\n\n#~ msgid \"Buttons to remove\"\n#~ msgstr \"Удаление кнопок\"\n\n#~ msgid \"Turn on the buttons you want to remove from Quick Settings\"\n#~ msgstr \"Включите кнопки, которые вы хотите удалить из быстрых настроек\"\n\n#~ msgid \"Remove chosen buttons from quick panel\"\n#~ msgstr \"Удалить выбранные кнопки с панели быстрого доступа\"\n\n#~ msgid \"Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n#~ msgstr \"Форкнуто с расширения https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n\n#~ msgid \"This feature is unstable sometime\"\n#~ msgstr \"Иногда эта функция работает нестабильно\"\n\n#~ msgid \"\"\n#~ \"When lock/unlock with gnome-screensaver, unexpected behavior occurs\\n\"\n#~ \"Please do not report issue about known issue, Almost duplicated\\n\"\n#~ \"Known issue:\\n\"\n#~ \"  button doesn't remove after lockscreen\\n\"\n#~ \"  modal get bigger after lockscreen\"\n#~ msgstr \"\"\n#~ \"При блокировке/разблокировке с помощью gnome-screensaver происходит неожиданное поведение\\n\"\n#~ \"Пожалуйста, не сообщайте об известной проблеме, часто дублируется\\n\"\n#~ \"Известная проблема:\\n\"\n#~ \"  кнопка не убирается после блокировки экрана\\n\"\n#~ \"  модальное окно становится больше после блокировки экрана\"\n\n#~ msgid \"Please turn off if some bug occurred\"\n#~ msgstr \"Пожалуйста, отключите, если произошла какая-то ошибка\"\n\n#~ msgid \"Unknown\"\n#~ msgstr \"Неизвестно\"\n\n#~ msgid \" (invisible by system)\"\n#~ msgstr \" (невидимые системой)\"\n\n#~ msgid \"Show current audio output selection\"\n#~ msgstr \"Показывать текущий аудиовыход\"\n\n#~ msgid \"Always show the current audio output selection above the volume slider\"\n#~ msgstr \"Всегда показывать текущий выбор аудиовыхода над ползунком громкости\"\n\n#~ msgid \"Show current audio input selection\"\n#~ msgstr \"Показывать текущий выбор аудиовхода\"\n\n#~ msgid \"Always show the current audio input selection above the volume slider\"\n#~ msgstr \"Всегда показывать текущий выбор аудиовхода над ползунком громкости\"\n\n#~ msgid \"Always show input\"\n#~ msgstr \"Всегда показывать ввод\"\n\n#~ msgid \"Always show the audio input volume slider, even when there is no audio input stream.\"\n#~ msgstr \"Всегда показывать аудиовход над ползунком громкости, даже когда нету потока аудиовхода.\"\n\n#~ msgid \"Add volume mixer (PulseAudio, Pipewire)\"\n#~ msgstr \"Добавить микшер громкости (PulseAudio, Pipewire)\"\n\n#~ msgid \"\"\n#~ \"Turn on to make the volume mixer visible\\n\"\n#~ \"Forked from https://github.com/mymindstorm/gnome-volume-mixer\"\n#~ msgstr \"\"\n#~ \"Включить чтобы микшер громкости был видимым\\n\"\n#~ \"Ответвление с https://github.com/mymindstorm/gnome-volume-mixer\"\n\n#~ msgid \"Position\"\n#~ msgstr \"Позиция\"\n\n#~ msgid \"Set volume mixer position\"\n#~ msgstr \"Установить позицию микшера громкости\"\n\n#~ msgid \"Top (Below Output/Input slider)\"\n#~ msgstr \"Верх (Снизу от ползунка выхода/входа)\"\n\n#~ msgid \"Show stream Description\"\n#~ msgstr \"Показывать описание потока\"\n\n#~ msgid \"Show audio stream description above the slider\"\n#~ msgstr \"Показывать описание аудиопотока надо ползунком\"\n\n#~ msgid \"Show stream Icon\"\n#~ msgstr \"Показывать иконку потока\"\n\n#~ msgid \"Show application icon in front of the slider\"\n#~ msgstr \"Показывать иконку приложения в начале ползунка\"\n\n#~ msgid \"Filter applications shown in the volume mixer.\"\n#~ msgstr \"Фильтровать приложения показанные в микшере громкости.\"\n\n#~ msgid \"Filter Mode\"\n#~ msgstr \"Режим фильтра\"\n\n#~ msgid \"Blacklist\"\n#~ msgstr \"Чёрный Список\"\n\n#~ msgid \"Whitelist\"\n#~ msgstr \"Белый Список\"\n\n#~ msgid \"Using Javascript Regex\"\n#~ msgstr \"Используя JavaScript Regex\"\n\n#~ msgid \"Use Javascript RegExp for filtering app name or description\"\n#~ msgstr \"Использовать JavaScript RegExp для фильтрации названия приложения или описания\"\n\n#~ msgid \"Check Stream Description\"\n#~ msgstr \"Проверять описание потока\"\n\n#~ msgid \"Check Description also\"\n#~ msgstr \"Также проверять описание\"\n\n#~ msgid \"Noti&Media\"\n#~ msgstr \"Увед&Медиа\"\n\n#~ msgid \"Media Controls widget\"\n#~ msgstr \"Виджет управлением медиа\"\n\n#~ msgid \"Turn on to make the Media Control widget visible on the Quick Settings panel\"\n#~ msgstr \"Включите чтобы сделать виджет управлением медиа видимым на панели быстрых настроек\"\n\n#~ msgid \"Compact Mode\"\n#~ msgstr \"Компакт Режим\"\n\n#~ msgid \"Notification Widget\"\n#~ msgstr \"Виджет уведомления\"\n\n#~ msgid \"Turn on to make the notification widget visible on the Quick Settings panel\"\n#~ msgstr \"Включите чтобы сделать виджет уведомления видимым на панели быстрых настроек\"\n\n#~ msgid \"Set maximum height of the Notifications widget. default is 292\"\n#~ msgstr \"Установить максимальную высоту виджета уведомлений. По умолчанию 292\"\n\n#~ msgid \"Set Notifications widget position\"\n#~ msgstr \"Установить позицию виджета уведмолений\"\n\n#~ msgid \"Attach to QS panel\"\n#~ msgstr \"Прикрепить к панели QS\"\n\n#~ msgid \"Auto Hide\"\n#~ msgstr \"Прятать автоматически\"\n\n#~ msgid \"Sound Settings\"\n#~ msgstr \"Настройки звука\"\n"
  },
  {
    "path": "po/ta.po",
    "content": "#Killersparrow1\n\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"PO-Revision-Date: 2025-11-01 09:55+IST\\n\"\n\"Last-Translator: LeoDas <https://github.com/Killersparrow1>\\n\"\n\"Language-Team: Tamil\\n\"\n\"Language: ta\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"விவரங்கள்\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"இந்தச் செயல்பாடு சோதனைக்குரியதாகக் குறிக்கப்பட்டுள்ளது\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"இயல்புநிலைக்கு மீட்டமை\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"கருப்பொருள் இயல்புநிலை\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"முகப்புப் பக்கம்\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"உரிமம்\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"ஏற்றுகிறது...\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"பாதிக்கப்பட்ட கோப்புகள்\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"மாற்றப் பதிவு\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"(தற்போதைய)\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"> **தேதி:** %s\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"> **Git குறியீடு:** %s\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"> **உருவாக்க எண்:** %d\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"உட்புற இடைவெளி\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"மேல்\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"கீழ்\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"இடம்\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"வலம்\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"நிலையான\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"வளர்ச்சி நிலை\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"முன்னோட்டம்\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"(கிட்ஹப் வெளியீடு)\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"(மூலக் குறியீட்டில் இருந்து கட்டப்பட்டது)\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"அறிவிப்புகள் இல்லை\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"அழி\"\n\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"அறிவிப்புகள்\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"தொந்தரவு செய்யாதீர்\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"அறியப்படாத தலைப்பு\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"ஊடகம்\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"ஒலி அளவு மாற்றப்பட்டது\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"ஒலி அலவன் பெட்டியைத் திற\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"ஒலி அலவன் பெட்டி\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"வானிலை\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"இடம் அமைக்கப்படவில்லை\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"பாதுகாப்பற்ற முறை\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"கைப்பிடி ஆரம்\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"இயல்புநிலை ஆரத்தைப் பயன்படுத்த இதை 0 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"கைப்பிடி வண்ணம்\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"சறுக்குபட்டியின் நடை\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"ஒல்லி\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"இயல்புநிலை\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"பின்புல வண்ணம்\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"செயலில் உள்ள பின்புல வண்ணம்\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"தடிமன்\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"இயல்புநிலை தடிமன் பயன்படுத்த இதை 0 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"சிறுசாளரங்கள்\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"ஊடக சிறுசாளரம்\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"விரைவு அமைப்புகள் பலகத்தில் ஊடகச் சிறுசாளரத்தைக் காண இதை இயக்கு\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"அடக்கு முறை\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\"ஊடகக் கட்டுப்பாட்டுச் சிறுசாளரத்தை சிறியதாக்குக\\n\"\n\"அறிவிப்புச் செய்தியின் அளவிற்கு ஒத்ததாக மாற்றுக\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"கட்டுப்பாட்டு பொத்தான்களின் ஒளிபுகாமை\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"அடுத்த பொத்தானைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"விளக்கத்திற்கு அருகில் அடுத்த கட்டுப்பாட்டு பொத்தானைச் சேர்\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"முந்தைய பொத்தானைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"விளக்கத்திற்கு அருகில் முந்தைய கட்டுப்பாட்டு பொத்தானைச் சேர்\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"இடைநிறுத்த பொத்தானைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"விளக்கத்திற்கு அருகில் இடைநிறுத்த கட்டுப்பாட்டு பொத்தானைச் சேர்\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"முன்னேற்றப் பட்டியைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"விளக்கத்தின் கீழ் முன்னேற்றப் பட்டியைச் சேர்\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"சாய்வு பின்புலம்\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\"அட்டைப் படத்திலிருந்து எடுக்கப்பட்ட சாய்வு பின்புலத்தைப் பயன்படுத்துக\\n\"\n\"செயல்திறனை லேசாகப் பாதிக்கலாம்\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"அடிப்படை பின்புல வண்ணம்\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"தொடங்கும் ஒளிபுகாமை\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"இடது பக்க வெளிப்படைத்தன்மையைச் சரிசெய், ஒளிபுகா செய்ய இதை 1000 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"தொடக்க வண்ணம்\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"\"\n\"Adjust left side background color mixing, Set this to 1000 to show extracted \"\n\"color\"\nmsgstr \"\"\n\"இடது பக்க பின்புல வண்ணக் கலவையைச் சரிசெய், எடுக்கப்பட்ட வண்ணத்தைக் காட்ட இதை 1000 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"முடியும் ஒளிபுகாமை\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"வலது பக்க வெளிப்படைத்தன்மையைச் சரிசெய், ஒளிபுகா செய்ய இதை 1000 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"முடிவு வண்ணம்\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"\"\n\"Adjust right side background color mixing, Set this to 1000 to show \"\n\"extracted color\"\nmsgstr \"\"\n\"வலது பக்க பின்புல வண்ணக் கலவையைச் சரிசெய், எடுக்கப்பட்ட வண்ணத்தைக் காட்ட இதை 1000 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"வட்ட வடிவ கிளிப் விளைவு\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"மாற்றத்தை இயல்பானதாக மாற்ற வட்ட வடிவ கிளிப் விளைவைப் பயன்படுத்துக\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"உட்புற இடைவெளி சரிசெய்தல்\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"\"\n\"Adjust clip effect padding, edit this if your theme has a different margin \"\n\"or padding\"\nmsgstr \"\"\n\"கிளிப் விளைவின் உட்புற இடைவெளியைச் சரிசெய், உங்கள் கருப்பொருளில் வேறுபட்ட விளிம்பு அல்லது உட்புற இடைவெளி இருந்தால் இதைத் திருத்து\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"நிழலை நீக்குக\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"ஊடகச் செய்தியிலிருந்து நிழலை நீக்குக\\n\"\n\"உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"மென்மையான சுருள் வேகம்\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"\"\n\"Adjust trackpad and trackpoint scroll speed, negative number for invert \"\n\"direction\"\nmsgstr \"\"\n\"டிராக்பேட் மற்றும் டிராக்பாயிண்ட் சுருள் வேகத்தைச் சரிசெய், தலைகீழ் திசைக்கு எதிர்மறை எண்ணைப் பயன்படுத்து\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"அறிவிப்புச் சிறுசாளரம்\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"\"\n\"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"விரைவு அமைப்புகள் பலகத்தில் அறிவிப்புச் சிறுசாளரத்தைக் காண இதை இயக்கு\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"அறிவிப்புகளை சிறியதாக்குக\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"அதிகபட்ச உயரம்\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"\"\n\"Set maximum height of the Notifications widget, default is %d. Set this to 0 \"\n\"to disable max height\"\nmsgstr \"\"\n\"அறிவிப்புச் சிறுசாளரத்தின் அதிகபட்ச உயரத்தை அமை, இயல்புநிலை %d. அதிகபட்ச உயரத்தை முடக்க இதை 0 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"மறைந்து போகும் ஆஃப்செட்\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"\"\n\"Set position of the fade out effect begins. Set this to 0 to disable fade \"\n\"out effect. default is 46\"\nmsgstr \"\"\n\"மறைந்து போகும் விளைவு தொடங்கும் நிலையை அமை. மறைந்து போகும் விளைவை முடக்க இதை 0 ஆக அமைக்கவும். இயல்புநிலை 46\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"தானாக மறை\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"அறிவிப்புகள் இல்லாதபோது அறிவிப்புச் சிறுசாளரத்தை மறை\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"சொந்தக் கட்டுப்பாடுகளைப் பயன்படுத்துக\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"சொந்தமான DND மாற்றி மற்றும் அழி பொத்தானைப் பயன்படுத்துக\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"அறிவிப்புச் செய்தியிலிருந்து நிழலை நீக்குக\\n\"\n\"உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"சுருள் பட்டியைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"செய்தி பட்டியலில் சுருள் பட்டியைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"வானிலை சிறுசாளரம்\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"விரைவு அமைப்புகள் பலகத்தில் வானிலைச் சிறுசாளரத்தைக் காண இதை இயக்கு\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"வானிலைச் சிறுசாளரத்தை சிறியதாக்குக\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\"வானிலைச் சிறுசாளரத்திலிருந்து நிழலை நீக்குக\\n\"\n\"உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"கிளிக் கட்டளை\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"இடத்தைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"தலைப்பில் இருப்பிட லேபிளைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"முன்னறிவிப்பு இடைவெளி\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"மணிநேரத்தில் முன்னறிவிப்பு இடைவெளியைச் சரிசெய்\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"அதிகபட்ச முன்னறிவிப்புகள்\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"அதிகபட்ச முன்னறிவிப்புகளைச் சரிசெய்\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"ஒலி அலவன் பெட்டி சிறுசாளரம்\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"\"\n\"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"விரைவு அமைப்புகள் பலகத்தில் ஒலி அலவன் பெட்டி சிறுசாளரத்தைக் காண இதை இயக்கு\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"லேபிள் உரை\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"சறுக்குபட்டியின் மேல் உள்ள லேபிள் உரை மூலத்தைத் தேர்ந்தெடு\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"இரண்டும்\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"தலைப்பு\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"விளக்கம்\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"ஏதுமில்லை\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"லேபிள் ஒளிபுகாமை\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"லேபிள் ஒளிபுகாமையைச் சரிசெய்.\\n\"\n\"ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"\"\n\"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 \"\n\"to disable max height\"\nmsgstr \"\"\n\"ஒலி அலவன் பெட்டி சிறுசாளரத்தின் அதிகபட்ச உயரத்தை அமை, இயல்புநிலை %d. அதிகபட்ச உயரத்தை முடக்க இதை 0 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"அலவன் பட்டியலில் சுருள் பட்டியைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"ஓடை ஐகானைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"அலவன் சறுக்குபட்டியின் மேலே ஓடை ஐகானைக் காட்டு\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"வெளியீட்டு சறுக்குபட்டியுடன் இணை\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"\"\n\"Attach volume mixer menu button to output slider. Use if you prefer compact \"\n\"layout\"\nmsgstr \"\"\n\"ஒலி அலவன் பெட்டியின் பட்டி பொத்தானை வெளியீட்டு சறுக்குபட்டியுடன் இணை. நீங்கள் அடக்கமான அமைப்பை விரும்பினால் பயன்படுத்துக\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"பட்டி ஐகான்\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"பற்றி\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"பொதுவான நீட்டிப்புத் தகவல்கள்\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"மாற்றப் பதிவுகள்\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"இந்த நீட்டிப்பின் மாற்ற வரலாற்றைக் காண்க\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"குறியீடுகளின் உரிமம்\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"பங்களிப்பாளர்கள்\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"இந்த நீட்டிப்பை உருவாக்கியவர்கள்\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"மேலும் பங்களிப்பாளர்கள்\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"கிட்ஹப்பில் மேலும் பங்களிப்பாளர்களைக் காண்க\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"இணைப்பு\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"இந்த நீட்டிப்பு குறித்த வெளி இணைப்புகள்\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"கிட்ஹப் ஸ்பான்சர்கள் மூலம் நன்கொடை அளி\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"வளர்ச்சிக்கு ஆதரவளி!\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"நீட்டிப்பை மதிப்பிட்டு கருத்துத் தெரிவிக்கவும்!\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"கிட்ஹப் களஞ்சியம்\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me \"\n\"know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\"களஞ்சியத்திற்கு நட்சத்திரம் சேர்ப்பது எனக்கு மிகவும் உதவுகிறது!\\n\"\n\"இந்த நீட்டிப்பில் ஏதேனும் பிழையைக் கண்டால், எனக்குத் தெரியப்படுத்த ஒரு சிக்கலை உருவாக்கலாம்!\\n\"\n\"அல்லது, நீங்கள் அற்புதமான அம்சங்களுடன் ஒரு PR ஐ உருவாக்கலாம்!\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"இந்த நீட்டிப்புக்கு மொழிபெயர்ப்பைச் சேர்!\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"பிழைநீக்கம்\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"நீட்டிப்பு பிழைநீக்க விருப்பங்கள்\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"சூழலை வெளிப்படுத்து\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"நீட்டிப்புச் சூழலை globalThis.qst க்கு வெளிப்படுத்து\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"அமைவு எல்லையைக் காட்டு\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"விரைவு அமைப்புகளில் அமைவு எல்லைகளைக் காட்டு\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"பதிவு நிலை\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"ஏதுமில்லை\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"பிழை\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"தகவல்\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"பிழைநீக்கு\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"நிலைமாற்றிகள்\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"DND விரைவு நிலைமாற்றி\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"விரைவு அமைப்புகள் பலகத்தில் DND விரைவு நிலைமாற்றியைச் சேர்க்க இதை இயக்கு\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"DND குறிக்காட்டியின் நிலை\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"DND குறிக்காட்டியின் நிலையை அமை\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"கணினி தட்டு\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"தேதி பட்டி பொத்தான்\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"பாதுகாப்பற்ற முறை விரைவு நிலைமாற்றி\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"விரைவு அமைப்புகள் பலகத்தில் பாதுகாப்பற்ற முறை விரைவு நிலைமாற்றியைச் சேர்க்க இதை இயக்கு\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"கடைசி அமர்வு நிலையைச் சேமி\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"கடைசி அமர்வின் பாதுகாப்பற்ற நிலையைச் சேமிக்க இதை இயக்கு\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"மேம்பட்ட அசைவூட்ட நடை\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"திறக்கும் நேரம்\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"திறக்கும் அசைவூட்டத்தின் நேரம் மைக்ரோ விநாடிகளில்\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"மூடும் நேரம்\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"மூடும் அசைவூட்டத்தின் நேரம் மைக்ரோ விநாடிகளில்\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"கட்டத்தின் உள்ளடக்கம் ஒளிபுகாமை\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"கட்டத்தின் உள்ளடக்கம் ஒளிபுகாமையைச் சரிசெய்.\\n\"\n\"ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"பின்புல மங்கல் ஆரம்\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\"பின்புல மங்கல் ஆரத்தைச் சரிசெய்.\\n\"\n\"மங்கல் விளைவை முடக்க இதை 0 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"பின்புல வெளிச்சம்\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\"பின்புல வெளிச்சத்தைச் சரிசெய்.\\n\"\n\"வெளிச்சக் கட்டுப்பாட்டு விளைவை முடக்க இதை 1000 ஆக அமைக்கவும்.\\n\"\n\"gnome-shell இன் இயல்புநிலை மங்கலான விளைவைப் பாதிக்காது.\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"பின்புல ஒளிபுகாமை\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\"பின்புல ஒளிபுகாமையைச் சரிசெய்.\\n\"\n\"ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"பின்புல X அளவு\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"பின்புல X அளவைச் சரிசெய், 1000 என்பது 1.0 அளவைக் குறிக்கிறது\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"பின்புல Y அளவு\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"பின்புல Y அளவைச் சரிசெய், 1000 என்பது 1.0 அளவைக் குறிக்கிறது\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"பட்டி\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"மேல்மூடு முறை\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"நிலைமாற்றி, பவர் மற்றும் ஒலி பட்டிகளை மேல்மூடாகக் காட்டு\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"மேல்மூடு அகலம்\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\"மேல்மூடு பட்டி அகலத்தைச் சரிசெய்\\n\"\n\"சரிசெய்வதை முடக்க இதை 0 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"மேல்மூடு அசைவூட்ட நேரம்\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\"தனிப்பயன் பட்டி திறக்கும் அசைவூட்ட நேரம் மைக்ரோ விநாடிகளில்\\n\"\n\"தனிப்பயன் அசைவூட்டத்தை முடக்க இதை 0 ஆக அமைக்கவும்\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"மேல்மூடு அசைவூட்ட நடை\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"தனிப்பயன் பட்டி திறக்கும் அசைவூட்ட நடை\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"பறந்து செல்லல்\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"உரையாடல்\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"அசைவூட்டம்\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\"நிலைமாற்றி பட்டி திறக்கும் மற்றும் மூடும்போது பட்டி அசைவூட்டத்தைச் சேர்\\n\"\n\"சிறந்த உணர்வைப் பெற, மேல்மூடு முறையை இயக்கு\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"வேகம், மங்கல், அளவு மற்றும் ஒளிபுகாமையைச் சரிசெய்\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"பொருள் காணப்படவில்லை\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"மாற்றங்கள் இல்லை\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"அதே பொருள் ஏற்கனவே உள்ளது\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"%s இன் பண்புகள்\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"சேமி\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"நிலைமாற்றி திருத்தி\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"இந்த விருப்பத்திற்கு முழுமையான gnome-shell மறுஏற்றம் தேவை\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"மறை\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"எனது பொருள் #%d\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"புதிய பொருள்\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"வரிசைப்படுத்துதல் மற்றும் மறைத்தல்\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"பயனர் பெயர்\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"தலைப்பு ரெஜெக்ஸ் (ஜாஸ்வா ஸ்கிரிப்ட் ரெஜெக்ஸ்)\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"கட்டுநர் பெயர்\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"Gவகை பெயர்\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"\"\n\"This is the comment for easy identification in the settings list. It has no \"\n\"effect on the behavior of the extension\"\nmsgstr \"\"\n\"இது அமைப்புகள் பட்டியலில் எளிதாக அடையாளம் காணும் கருத்து. இது நீட்டிப்பின் செயல்பாட்டில் எந்த விளைவையும் ஏற்படுத்தாது\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"ஜாஸ்வா ஸ்கிரிப்ட் கட்டுநர் பெயர்\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"\"\n\"GObject gtype name. You can get this value by calling \"\n\"GObject.type_name_from_instance\"\nmsgstr \"\"\n\"GObject gtype பெயர். GObject.type_name_from_instance ஐ அழைப்பதன் மூலம் இந்த மதிப்பை நீங்கள் பெறலாம்\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"விசைப்பலகை பின்புற ஒளி\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"வரிசைப்படுத்தப்படாத பொருள்கள்\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"தொலைநிலை அணுகல் ஆப்லெட்\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"புகைப்படக் கருவி\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"ஒலி உள்ளீடு\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"இருப்பிடம்\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"தண்டர்போல்ட்\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"பிணையம்\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"ஒலி வெளியீடு\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"கணினி (மின்கலம்)\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"மேசை இடைவெளி\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"மடிக்கணினி இடைவெளி\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"பிடிப்பு பொத்தான்\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"அமைப்புகள் பொத்தான்\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"பூட்டு பொத்தான்\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"செயல்தவிர்ப்பு பொத்தான்\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"மின்கல பொத்தான்\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"அமைப்பு\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"விரைவு நிலைமாற்றிகள் அமைப்பு\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"விரைவு நிலைமாற்றிகளின் அமைப்பைச் சரிசெய்\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"விரைவு நிலைமாற்றிகளை மறுவரிசைப்படுத்தி மறை\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"கணினி குறிக்காட்டிகள்\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"கணினி குறிக்காட்டிகளின் அமைப்பையும் நடையையும் சரிசெய்\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"திரைப் பகிர்வு குறிக்காட்டிக்கு உச்சரிப்பைச் சேர்\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"திரைப் பகிர்வு குறிக்காட்டியில் ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"திரைப் பதிவு குறிக்காட்டிக்கு உச்சரிப்பைச் சேர்\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"திரைப் பதிவு குறிக்காட்டியில் ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"தனியுரிமைக் குறிக்காட்டிகளின் நடை\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"தனியுரிமைக் குறிக்காட்டிகளில் ஒரே வண்ண அல்லது ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"உச்சரிப்பு\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"ஒரே வண்ணம்\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"கணினி குறிக்காட்டிகளைச் சரிசெய்\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"கணினி குறிக்காட்டிகளை மறுவரிசைப்படுத்தி மறை\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"கணினிப் பொருட்களின் அமைப்பு\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"கணினிப் பொருட்களின் அமைப்பைச் சரிசெய்\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"அமைவு பெட்டியை மறை\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"அனைத்து பொத்தான்கள் மற்றும் அமைவு பெட்டியை மறை\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"கணினிப் பொருட்களை மறுவரிசைப்படுத்தி மறை\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"தேதி பட்டி\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"தேதி பட்டியில் அமைப்பைச் சரிசெய்\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"இடது பெட்டியை மறை\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"\"\n\"Hide the left box of the date menu, which contains notifications and media \"\n\"control\"\nmsgstr \"\"\n\"தேதி பட்டியின் இடது பெட்டியை மறை, அதில் அறிவிப்புகள் மற்றும் ஊடகக் கட்டுப்பாடு உள்ளன\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"வலது பெட்டியை மறை\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"\"\n\"Hide the right box of the date menu, which contains calendar, world clock \"\n\"and weather\"\nmsgstr \"\"\n\"தேதி பட்டியின் வலது பெட்டியை மறை, அதில் நாள்காட்டி, உலக கடிகாரம் மற்றும் வானிலை உள்ளன\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"பட்டியை முடக்கு\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"தேதி பட்டி பொத்தானைக் கிளிக் செய்யும்போது தேதி பட்டியைத் திறக்க வேண்டாம்\"\n"
  },
  {
    "path": "po/zh_Hans.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-07-20 15:34+0000\\n\"\n\"PO-Revision-Date: 2024-02-06 23:38+0000\\n\"\n\"Last-Translator: mechtifs <mechtifs@gmail.com>\\n\"\n\"Language-Team: Chinese (Simplified) <http://weblate.paring.moe/projects/gs-quick-settings-tweaks/gs-extension/zh_Hans/>\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.2.1\\n\"\n\n#: target/out/libs/prefs/components.js:57\nmsgid \"Details\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:144\nmsgid \"This feature marked as experimental\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:274\nmsgid \"Reset to default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:512\nmsgid \"Theme default\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:853\nmsgid \"Homepage\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:859\n#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49\n#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56\nmsgid \"License\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:860\nmsgid \"Loading ...\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:869\nmsgid \"Affected Files\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:924\nmsgid \"Changelog\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:938\nmsgid \"(Current)\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:969\n#, javascript-format\nmsgid \"> **Date:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:970\n#, javascript-format\nmsgid \"> **Git Hash:** %s\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:971\n#, javascript-format\nmsgid \"> **Build Number:** %d\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1034\nmsgid \"Padding\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1038\nmsgid \"Top\"\nmsgstr \"顶端\"\n\n#: target/out/libs/prefs/components.js:1049\nmsgid \"Bottom\"\nmsgstr \"底部\"\n\n#: target/out/libs/prefs/components.js:1060\nmsgid \"Left\"\nmsgstr \"\"\n\n#: target/out/libs/prefs/components.js:1071\nmsgid \"Right\"\nmsgstr \"\"\n\n#: target/out/prefs.js:60\nmsgid \"Stable\"\nmsgstr \"\"\n\n#: target/out/prefs.js:63\nmsgid \"Development\"\nmsgstr \"\"\n\n#: target/out/prefs.js:66\nmsgid \"Preview\"\nmsgstr \"\"\n\n#: target/out/prefs.js:69\nmsgid \"(Github Release)\"\nmsgstr \"\"\n\n#: target/out/prefs.js:72\nmsgid \"(Built from source)\"\nmsgstr \"\"\n\n#: target/out/features/widget/notifications.js:26\nmsgid \"No Notifications\"\nmsgstr \"无通知\"\n\n#: target/out/features/widget/notifications.js:58\n#: target/out/features/widget/notifications.js:122\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: target/out/features/widget/notifications.js:76\nmsgid \"Notifications\"\nmsgstr \"通知\"\n\n#: target/out/features/widget/notifications.js:105\n#: target/out/features/toggle/dndQuickToggle.js:10\n#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485\nmsgid \"Do Not Disturb\"\nmsgstr \"免打扰\"\n\n#: target/out/features/widget/media.js:118\nmsgid \"Unknown title\"\nmsgstr \"\"\n\n#: target/out/features/widget/media.js:888\nmsgid \"Media\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:105\nmsgid \"Volume changed\"\nmsgstr \"音量改变\"\n\n#: target/out/features/widget/volumeMixer.js:463\nmsgid \"Open volumx mixer\"\nmsgstr \"\"\n\n#: target/out/features/widget/volumeMixer.js:480\nmsgid \"Volume Mixer\"\nmsgstr \"音量混合器\"\n\n#: target/out/features/widget/weather.js:73\nmsgid \"Weather\"\nmsgstr \"\"\n\n#: target/out/features/widget/weather.js:192\nmsgid \"Location has not been set\"\nmsgstr \"\"\n\n#: target/out/features/toggle/unsafeQuickToggle.js:11\n#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496\nmsgid \"Unsafe Mode\"\nmsgstr \"不安全模式\"\n\n#: target/out/prefPages/widgets.js:11\nmsgid \"Handle radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:12\nmsgid \"Set this to 0 to use default radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:18\nmsgid \"Handle color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:36\nmsgid \"Slider style\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:39\nmsgid \"Slim\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766\nmsgid \"Default\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173\nmsgid \"Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:55\nmsgid \"Active Background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:62\nmsgid \"Thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:66\nmsgid \"Set this to 0 to use default thickness\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:76\nmsgid \"Widgets\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136\n#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224\nmsgid \"Media Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:88\nmsgid \"Turn on to make the media widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280\n#: target/out/prefPages/widgets.js:343\nmsgid \"Compact mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:93\nmsgid \"\"\n\"Make Media Controls widget smaller\\n\"\n\"Make it more similar in size to the notification message\"\nmsgstr \"\"\n\"使音频控制组件变小\\n\"\n\"使其与通知组件大小相近\"\n\n#: target/out/prefPages/widgets.js:99\nmsgid \"Control buttons opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:100\nmsgid \"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:108\nmsgid \"Show next button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:109\nmsgid \"Add next contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:115\nmsgid \"Show previous button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:116\nmsgid \"Add previous contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:122\nmsgid \"Show pause button\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:123\nmsgid \"Add pause contorl button next to description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138\nmsgid \"Show progress bar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139\nmsgid \"Add progress bar under description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164\nmsgid \"Gradient background\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169\nmsgid \"\"\n\"Use gradient background extracted from cover image\\n\"\n\"May affect performance slightly\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:174\nmsgid \"Base background color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:182\nmsgid \"Start opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:183\nmsgid \"Adjust left side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:190\nmsgid \"Start color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:191\nmsgid \"Adjust left side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:198\nmsgid \"End opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:199\nmsgid \"Adjust right side transparency, Set this to 1000 to make opaque\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:206\nmsgid \"End color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:207\nmsgid \"Adjust right side background color mixing, Set this to 1000 to show extracted color\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226\nmsgid \"Round clip effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231\nmsgid \"Use round clip effect to make transition more natural\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:234\nmsgid \"Padding adjustment\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:236\nmsgid \"Adjust clip effect padding, edit this if your theme has a different margin or padding\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318\n#: target/out/prefPages/widgets.js:350\nmsgid \"Remove shadow\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:254\nmsgid \"\"\n\"Remove shadow from media message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:260\nmsgid \"Smooth scroll speed\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:261\nmsgid \"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:271\nmsgid \"Notifications Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:276\nmsgid \"Turn on to make the notifications widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:281\nmsgid \"Make notifications smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418\nmsgid \"Max height\"\nmsgstr \"最大高度\"\n\n#: target/out/prefPages/widgets.js:288\n#, javascript-format\nmsgid \"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441\nmsgid \"Fade out offset\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442\nmsgid \"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:304\nmsgid \"Auto hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:305\nmsgid \"Hide the Notifications widget when have no notifications\"\nmsgstr \"当没有通知时，隐藏通知组件\"\n\n#: target/out/prefPages/widgets.js:311\nmsgid \"Use native controls\"\nmsgstr \"使用原始风格控制\"\n\n#: target/out/prefPages/widgets.js:312\nmsgid \"Use native dnd switch and clear button\"\nmsgstr \"使用原始风格免打扰控制开关及清除按钮\"\n\n#: target/out/prefPages/widgets.js:319\nmsgid \"\"\n\"Remove shadow from notification message\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427\nmsgid \"Show scrollbar\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:326\nmsgid \"Show scrollbar on message list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:334\nmsgid \"Weather Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:339\nmsgid \"Turn on to make the weather widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:344\nmsgid \"Make weather widget smaller\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:351\nmsgid \"\"\n\"Remove shadow from weather widget\\n\"\n\"Use if your theme creates unnecessary shadows\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:357\nmsgid \"Click command\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:363\nmsgid \"Show location\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:364\nmsgid \"Show the location label on header\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:373\nmsgid \"Forecast interval\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:374\nmsgid \"Adjust forecast interval in hour\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:381\nmsgid \"Max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:382\nmsgid \"Adjust max forecasts\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456\nmsgid \"Volume mixer Widget\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:393\nmsgid \"Turn on to make the volume mixer widget visible on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:397\nmsgid \"Label text\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:398\nmsgid \"Choose label above slider text source\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:400\nmsgid \"Both\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:401\nmsgid \"Title\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:402\nmsgid \"Description\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:403\nmsgid \"None\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:411\nmsgid \"Label opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:412\nmsgid \"\"\n\"Adjust label opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:419\n#, javascript-format\nmsgid \"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:428\nmsgid \"Show scrollbar on mixer list\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:434\nmsgid \"Show stream icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:435\nmsgid \"Show stream icon above mixer sliders\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458\nmsgid \"Attach to output slider\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459\nmsgid \"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/widgets.js:468\nmsgid \"Menu icon\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32\nmsgid \"About\"\nmsgstr \"关于\"\n\n#: target/out/prefPages/about.js:33\nmsgid \"Common extension informations\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40\nmsgid \"Changelogs\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41\nmsgid \"View the change history for this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57\nmsgid \"License of codes\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65\n#: target/out/prefPages/about.js:69\nmsgid \"Contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70\nmsgid \"The creators of this extension\"\nmsgstr \"本拓展的主要开发者\"\n\n#: target/out/prefPages/about.js:74\nmsgid \"More contributors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:75\nmsgid \"See more contributors on github\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:85\nmsgid \"Link\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:86\nmsgid \"External links about this extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:90\nmsgid \"Donate via github sponsors\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:91\nmsgid \"Support development!\"\nmsgstr \"支持开发工作！\"\n\n#: target/out/prefPages/about.js:97\nmsgid \"Rate and comment the extension!\"\nmsgstr \"对本拓展进行评分及评论！\"\n\n#: target/out/prefPages/about.js:102\nmsgid \"Github Repository\"\nmsgstr \"GitHub 代码仓库\"\n\n#: target/out/prefPages/about.js:103\nmsgid \"\"\n\"Add Star on Repository is helping me a lot!\\n\"\n\"Please, if you found bug from this extension, you can make issue to make me know that!\\n\"\n\"Or, you can create PR with wonderful features!\"\nmsgstr \"\"\n\"欢迎为本代码仓库添加星标！\\n\"\n\"如果你在使用本拓展的过程中发现任何问题，你可以提交 Issue 来让我了解详情！\\n\"\n\"或者，你也可以提交 PR 来增加更多的功能！\"\n\n#: target/out/prefPages/about.js:109\nmsgid \"Add translation to this extension!\"\nmsgstr \"将本拓展翻译为其他语言！\"\n\n#: target/out/prefPages/about.js:115\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:116\nmsgid \"Extension debugging options\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:120\nmsgid \"Expose environment\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:121\nmsgid \"Expose extension environment to globalThis.qst\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:126\nmsgid \"Show layout border\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:127\nmsgid \"Show layout borders on Quick Settings\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:132\nmsgid \"Log level\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:135\nmsgid \"none\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:136\nmsgid \"error\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:137\nmsgid \"info\"\nmsgstr \"\"\n\n#: target/out/prefPages/about.js:138\nmsgid \"debug\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:12\nmsgid \"Toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:19\nmsgid \"DND Quick Toggle\"\nmsgstr \"免打扰快捷开关\"\n\n#: target/out/prefPages/toggles.js:20\nmsgid \"Turn on to add the DND quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:28\nmsgid \"DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:29\nmsgid \"Set DND indicator position\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:33\nmsgid \"System Tray\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:34\nmsgid \"Date Menu Button\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:41\nmsgid \"Unsafe Mode Quick Toggle\"\nmsgstr \"不安全模式快捷开关\"\n\n#: target/out/prefPages/toggles.js:42\nmsgid \"Turn on to add the unsafe quick toggle on the Quick Settings panel\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:50\nmsgid \"Save last session state\"\nmsgstr \"\"\n\n#: target/out/prefPages/toggles.js:51\nmsgid \"Turn on to save last session unsafe state\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141\nmsgid \"Advanced animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:13\nmsgid \"Open Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:14\nmsgid \"Open animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:21\nmsgid \"Close Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:22\nmsgid \"Close animation duration in microseconds\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:29\nmsgid \"Grid Content Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:30\nmsgid \"\"\n\"Adjust grid content opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:37\nmsgid \"Background Blur Radius\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:38\nmsgid \"\"\n\"Adjust background blur radius.\\n\"\n\"Set this to 0 to disable blur effect\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:45\nmsgid \"Background Brightness\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:46\nmsgid \"\"\n\"Adjust background brightness.\\n\"\n\"Set this to 1000 to disable brightness control effect.\\n\"\n\"Not impacts on gnome-shell's default dim effect.\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:53\nmsgid \"Background Opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:54\nmsgid \"\"\n\"Adjust background opacity.\\n\"\n\"Set this to 255 to make opaque, and 0 to make transparent\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:61\nmsgid \"Background X Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:62\nmsgid \"Adjust background x scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:69\nmsgid \"Background Y Scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:70\nmsgid \"Adjust background y scale, 1000 means 1.0 scale\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:84\nmsgid \"Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:91\nmsgid \"Overlay Mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:92\nmsgid \"Display toggle, power, and sound menus as overlay\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:101\nmsgid \"Overlay Width\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:102\nmsgid \"\"\n\"Adjust overlay menu width\\n\"\n\"Set this to 0 to disable adjusting\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:109\nmsgid \"Overlay Animation Duration\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:110\nmsgid \"\"\n\"Custom menu open animation duration in microseconds\\n\"\n\"Set this to 0 to disable custom animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:117\nmsgid \"Overlay Animation Style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:118\nmsgid \"Custom menu open animation style\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:120\nmsgid \"Flyout\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:121\nmsgid \"Dialog\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143\nmsgid \"Animation\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:131\nmsgid \"\"\n\"Add menu animation on toggle menu opening and closing\\n\"\n\"To get the best feel, turn on overlay mode\"\nmsgstr \"\"\n\n#: target/out/prefPages/menu.js:142\nmsgid \"Adjust speed, blur, scale, and opacity\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:25\nmsgid \"The item not found\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:28\nmsgid \"No changes\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:31\nmsgid \"The same item already exists\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:40\n#, javascript-format\nmsgid \"Properties of %s\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:47\nmsgid \"Save\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:64\nmsgid \"Toggle editor\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:84\nmsgid \"This option requires full gnome-shell reloading\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278\n#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:232\n#, javascript-format\nmsgid \"My item #%d\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:250\nmsgid \"New Item\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610\n#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787\n#: target/out/prefPages/layout.js:813\nmsgid \"Ordering and Hiding\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432\nmsgid \"Friendly Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:283\nmsgid \"Title Regex (Javascript Regex)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442\nmsgid \"Constructor Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448\nmsgid \"GType Name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456\nmsgid \"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461\nmsgid \"Javascript constructor name\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466\nmsgid \"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:342\nmsgid \"Keyboard Backlight\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538\nmsgid \"Unordered items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:486\nmsgid \"Remote Access Applet\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:487\nmsgid \"Camera\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:488\nmsgid \"Volume Input\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:489\nmsgid \"Location\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:490\nmsgid \"Thunderbolt\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:492\nmsgid \"Network\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:495\nmsgid \"Volume Output\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:497\nmsgid \"System (Battery)\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:618\nmsgid \"Desktop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:629\nmsgid \"Laptop Spacer\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:641\nmsgid \"Capture button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:647\nmsgid \"Settings button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:653\nmsgid \"Lock button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:659\nmsgid \"Shutdown button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:665\nmsgid \"Battery button\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:711\nmsgid \"Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:718\nmsgid \"Quick Toggles Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734\nmsgid \"Adjust quick toggles layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:738\nmsgid \"Reorder and hide quick toggles\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:745\nmsgid \"System Indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:746\nmsgid \"Adjust system indicators layout and style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:751\nmsgid \"Accent screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:752\nmsgid \"Use shell accent color on screen sharing indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:757\nmsgid \"Accent screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:758\nmsgid \"Use shell accent color on screen recording indicator\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:763\nmsgid \"Privacy indicators style\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:764\nmsgid \"Use monochrome or shell accent color on privarcy indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:767\nmsgid \"Accent\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:768\nmsgid \"Monochrome\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:777\nmsgid \"Adjust system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:788\nmsgid \"Reorder and hide system indicators\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:795\nmsgid \"System Items Layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815\nmsgid \"Adjust system items layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:804\nmsgid \"Hide layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:805\nmsgid \"Hide all buttons and layout box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:814\nmsgid \"Reorder and hide system items\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:823\nmsgid \"Date Menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:824\nmsgid \"Adjust Date Menu layout\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:828\nmsgid \"Hide left box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:829\nmsgid \"Hide the left box of the date menu, which contains notifications and media control\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:834\nmsgid \"Hide right box\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:835\nmsgid \"Hide the right box of the date menu, which contains calendar, world clock and weather\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:840\nmsgid \"Disable menu\"\nmsgstr \"\"\n\n#: target/out/prefPages/layout.js:841\nmsgid \"Do not open date menu when the date menu button clicked\"\nmsgstr \"\"\n\n#~ msgid \"Donate via patreon\"\n#~ msgstr \"在 Patreon 上捐赠\"\n\n#~ msgid \"Set maximum height of the Notifications widget. default is 292\"\n#~ msgstr \"设置通知组件的最大高度。默认为 292\"\n\n#~ msgid \"Other\"\n#~ msgstr \"其他\"\n\n#~ msgid \"\"\n#~ \"Hide notifications on date menu.\\n\"\n#~ \"*this option removes media control on date menu too*\"\n#~ msgstr \"\"\n#~ \"隐藏日期菜单中的通知组件。\\n\"\n#~ \"*此选项也会移除日期菜单中的音乐控制组件*\"\n\n#~ msgid \"Hide media control on date menu.\"\n#~ msgstr \"隐藏日期菜单中的音乐组件。\"\n\n#~ msgid \"Sound Settings\"\n#~ msgstr \"声音设置\"\n\n#~ msgid \"Notification Widget\"\n#~ msgstr \"通知组件\"\n\n#~ msgid \"Turn on to make the notification widget visible on the Quick Settings panel\"\n#~ msgstr \"启用以令通知组件在快捷控制面板中可见\"\n\n#~ msgid \"Links\"\n#~ msgstr \"链接\"\n\n#~ msgid \"Contributor\"\n#~ msgstr \"贡献者\"\n\n#~ msgid \"Add Application to filtering\"\n#~ msgstr \"添加应用至过滤\"\n\n#~ msgid \"Add\"\n#~ msgstr \"添加\"\n\n#~ msgid \"Cancel\"\n#~ msgstr \"取消\"\n\n#~ msgid \"Application name\"\n#~ msgstr \"应用名称\"\n\n#~ msgid \"General\"\n#~ msgstr \"通用\"\n\n#~ msgid \"Enchant input/output slider\"\n#~ msgstr \"显示输入/输出滑动控制条\"\n\n#~ msgid \"Show current audio output selection\"\n#~ msgstr \"显示当前音频输出选择\"\n\n#~ msgid \"Always show the current audio output selection above the volume slider\"\n#~ msgstr \"总是在音量滑动控制条上方显示当前音频输出选择\"\n\n#~ msgid \"Show current audio input selection\"\n#~ msgstr \"显示当前音频输入选择\"\n\n#~ msgid \"Always show the current audio input selection above the volume slider\"\n#~ msgstr \"总是在音量控制条上方显示当前音频输入选择\"\n\n#~ msgid \"Always show input\"\n#~ msgstr \"总是显示输入\"\n\n#~ msgid \"Always show the audio input volume slider, even when there is no audio input stream.\"\n#~ msgstr \"即使在没有音频输入流的情况下，总是显示音频输入音量滑动控制条。\"\n\n#~ msgid \"Add volume mixer (PulseAudio, Pipewire)\"\n#~ msgstr \"添加音量混合器（PulseAudio、Pipewire）\"\n\n#~ msgid \"\"\n#~ \"Turn on to make the volume mixer visible\\n\"\n#~ \"Forked from https://github.com/mymindstorm/gnome-volume-mixer\"\n#~ msgstr \"\"\n#~ \"启用以令音量混合器可见\\n\"\n#~ \"Fork 自 https://github.com/mymindstorm/gnome-volume-mixer\"\n\n#~ msgid \"Position\"\n#~ msgstr \"位置\"\n\n#~ msgid \"Set volume mixer position\"\n#~ msgstr \"设置音量混合器位置\"\n\n#~ msgid \"Top (Below Output/Input slider)\"\n#~ msgstr \"顶端（位于输入/输出滑动控制条底部）\"\n\n#~ msgid \"Show stream Description\"\n#~ msgstr \"显示音频流描述\"\n\n#~ msgid \"Show audio stream description above the slider\"\n#~ msgstr \"在滑动控制条上方显示音频流描述\"\n\n#~ msgid \"Show stream Icon\"\n#~ msgstr \"显示音频流图标\"\n\n#~ msgid \"Show application icon in front of the slider\"\n#~ msgstr \"在滑动控制条前显示应用图标\"\n\n#~ msgid \"Filter applications shown in the volume mixer.\"\n#~ msgstr \"过滤音量混合器中可见的应用。\"\n\n#~ msgid \"Filter Mode\"\n#~ msgstr \"过滤模式\"\n\n#~ msgid \"Blacklist\"\n#~ msgstr \"黑名单\"\n\n#~ msgid \"Whitelist\"\n#~ msgstr \"白名单\"\n\n#~ msgid \"Using Javascript Regex\"\n#~ msgstr \"使用 JavaScript 正则表达式\"\n\n#~ msgid \"Use Javascript RegExp for filtering app name or description\"\n#~ msgstr \"使用 JavaScript 正则表达式以过滤应用名称或描述\"\n\n#~ msgid \"Check Stream Description\"\n#~ msgstr \"检查音频流描述\"\n\n#~ msgid \"Check Description also\"\n#~ msgstr \"同时检查描述\"\n\n#~ msgid \"Add more buttons\"\n#~ msgstr \"增加更多按钮\"\n\n#~ msgid \"Turn on the buttons you want to add on Quick Settings\"\n#~ msgstr \"启用需添加至快捷控制面板的按钮\"\n\n#~ msgid \"Turn on to make the DND quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"开启以令免打扰快捷开关在快捷控制面板中可见\"\n\n#~ msgid \"Turn on to make the unsafe quick toggle visible on the Quick Settings panel\"\n#~ msgstr \"开启以令不安全模式快捷开关在快捷控制面板中可见\"\n\n#~ msgid \"This extension is distributed with license GPL 3+\"\n#~ msgstr \"此拓展以 GPL 3+ 协议进行分发\"\n\n#~ msgid \"excludes Third-party. Third party codes follow their license\"\n#~ msgstr \"除第三方外。第三方代码遵循其协议\"\n\n#~ msgid \"Extension Version\"\n#~ msgstr \"拓展版本\"\n\n#~ msgid \"Unknown (Built from source)\"\n#~ msgstr \"未知（编译自源代码）\"\n\n#~ msgid \"Third party LICENSE\"\n#~ msgstr \"第三方协议\"\n\n#~ msgid \"LICENSE OF CODES WHICH USED ON THIS EXTENSION\"\n#~ msgstr \"本拓展使用的代码协议\"\n\n#~ msgid \"Media Controls widget\"\n#~ msgstr \"音频控制组件\"\n\n#~ msgid \"Turn on to make the Media Control widget visible on the Quick Settings panel\"\n#~ msgstr \"启用以令音频控制组件在快捷控制面板中可见\"\n\n#~ msgid \"Compact Mode\"\n#~ msgstr \"紧凑模式\"\n\n#~ msgid \"Auto Hide\"\n#~ msgstr \"自动隐藏\"\n\n#~ msgid \"Quick Toggles\"\n#~ msgstr \"快捷开关\"\n\n#~ msgid \"Fix Weather Widget Overflow\"\n#~ msgstr \"修复天气组件溢出\"\n\n#~ msgid \"Fix overflow visual bug of weather widget in datemenu\"\n#~ msgstr \"修复天气组件在日期菜单中的视觉溢出问题\"\n\n#~ msgid \"Remove Notifications On Date Menu\"\n#~ msgstr \"移除日期菜单中的通知组件\"\n\n#~ msgid \"Remove Media Control On Date Menu\"\n#~ msgstr \"移除日期菜单中的音乐控制组件\"\n\n#~ msgid \"Do not adjust the border radius of contents.\"\n#~ msgstr \"不要调整组件的边框圆角弧度。\"\n\n#~ msgid \"Don't adjust the border of messages and media controls.\"\n#~ msgstr \"不要调整通知与音乐控制组件的边框。\"\n\n#~ msgid \"Do not remove the shadow of contents.\"\n#~ msgstr \"不要移除组件的阴影。\"\n\n#~ msgid \"Don't remove the shadow of messages and media controls.\"\n#~ msgstr \"不要移除通知与音乐控制组件的阴影。\"\n\n#~ msgid \"Set Notifications widget position\"\n#~ msgstr \"设置通知组件位置\"\n\n#~ msgid \"Buttons to remove\"\n#~ msgstr \"欲移除的按钮\"\n\n#~ msgid \"Turn on the buttons you want to remove from Quick Settings\"\n#~ msgstr \"启用欲从快捷控制面板中移除的按钮\"\n\n#~ msgid \"Remove chosen buttons from quick panel\"\n#~ msgstr \"从快捷控制面板中移除所选按钮\"\n\n#~ msgid \"Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n#~ msgstr \"Fork 此拓展 https://github.com/qwreey75/gnome-quick-settings-button-remover\"\n\n#~ msgid \"This feature is unstable sometime\"\n#~ msgstr \"此功能可能不稳定\"\n\n#~ msgid \"\"\n#~ \"When lock/unlock with gnome-screensaver, unexpected behavior occurs\\n\"\n#~ \"Please do not report issue about known issue, Almost duplicated\\n\"\n#~ \"Known issue:\\n\"\n#~ \"  button doesn't remove after lockscreen\\n\"\n#~ \"  modal get bigger after lockscreen\"\n#~ msgstr \"\"\n#~ \"当 gnome-screensaver 启用或解锁时，会产生不可预期的行为\\n\"\n#~ \"请不要报告已知或几乎重复的问题\\n\"\n#~ \"已知问题：\\n\"\n#~ \"  按钮在解锁后不移除\\n\"\n#~ \"  组件在解锁后变大\"\n\n#~ msgid \"Please turn off if some bug occurred\"\n#~ msgstr \"如果发生了一些问题，请关闭计算机\"\n\n#~ msgid \"Unknown\"\n#~ msgstr \"未知\"\n\n#~ msgid \"\"\n#~ \"Do not separate Quick Settings and Notifications widgets, \\byou should enable this option because separated panels can make many visual bugs\\n\"\n#~ \"(such as margin or padding not matching with the theme)\"\n#~ msgstr \"\"\n#~ \"不要分离快捷控制面板与通知组件，\\\\b建议启用此选项，因为分离面板可能造成许多视觉问题\\n\"\n#~ \"（例如边框距离与主题样式不匹配）\"\n"
  },
  {
    "path": "schemas/org.gnome.shell.extensions.quick-settings-tweaks.gschema.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schemalist>\n  <schema id=\"org.gnome.shell.extensions.quick-settings-tweaks\" path=\"/org/gnome/shell/extensions/quick-settings-tweaks/\">\n    <!-- #region Debug -->\n    <key name=\"debug-expose\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"debug-show-layout-border\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"debug-log-level\" type=\"i\">\n      <default>0</default>\n    </key>\n    <!-- #endregion Debug -->\n\n    <!-- #region Notifications Widget -->\n    <key name=\"notifications-enabled\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"notifications-show-header\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"notifications-use-native-controls\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"notifications-compact\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"notifications-autohide\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"notifications-max-height\" type=\"i\">\n      <default>292</default>\n    </key>\n    <key name=\"notifications-fade-offset\" type=\"i\">\n      <default>46</default>\n    </key>\n    <key name=\"notifications-remove-shadow\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"notifications-show-scrollbar\" type=\"b\">\n      <default>true</default>\n    </key>\n    <!-- #endregion Notifications Widget -->\n\n    <!-- #region Media Widget -->\n    <key name=\"media-enabled\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-contorl-show-next-button\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-contorl-show-prev-button\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-contorl-show-pause-button\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-show-header\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-compact\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-contorl-opacity\" type=\"i\">\n      <default>230</default>\n    </key>\n    <key name=\"media-round-clip-enabled\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-round-clip-padding-adjustment-enabled\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"media-round-clip-padding-adjustment-value\" type=\"ai\">\n      <default>[ 0, 0, 0, 0 ]</default>\n    </key>\n    <key name=\"media-progress-enabled\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-progress-style\" type=\"s\">\n      <default>'slim'</default>\n      <choices>\n        <choice value='default'/>\n        <choice value='slim'/>\n      </choices>\n    </key>\n    <key name=\"media-progress-handle-color\" type=\"ai\">\n      <default>[]</default>\n    </key>\n    <key name=\"media-progress-handle-radius\" type=\"i\">\n      <default>0</default>\n    </key>\n    <key name=\"media-progress-background-color\" type=\"ai\">\n      <default>[]</default>\n    </key>\n    <key name=\"media-progress-active-background-color\" type=\"ai\">\n      <default>[]</default>\n    </key>\n    <key name=\"media-progress-height\" type=\"i\">\n      <default>0</default>\n    </key>\n    <key name=\"media-remove-shadow\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-gradient-enabled\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"media-gradient-background-color\" type=\"ai\">\n      <default>[127,127,127]</default>\n    </key>\n    <key name=\"media-gradient-start-opaque\" type=\"i\">\n      <default>340</default>\n    </key>\n    <key name=\"media-gradient-start-mix\" type=\"i\">\n      <default>820</default>\n    </key>\n    <key name=\"media-gradient-end-opaque\" type=\"i\">\n      <default>160</default>\n    </key>\n    <key name=\"media-gradient-end-mix\" type=\"i\">\n      <default>180</default>\n    </key>\n    <key name=\"media-smooth-scroll-speed\" type=\"i\">\n      <default>16</default>\n    </key>\n    <!-- use paged layout type=b -->\n    <!-- #endregion Media Widget -->\n\n    <!-- #region Weather Widget -->\n    <key name=\"weather-show-header\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"weather-enabled\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"weather-remove-shadow\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"weather-compact\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"weather-click-command\" type=\"s\">\n      <default>''</default>\n    </key>\n    <key name=\"weather-show-location\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"weather-max-forecasts\" type=\"i\">\n      <default>5</default>\n    </key>\n    <key name=\"weather-interval-hour\" type=\"i\">\n      <default>1</default>\n    </key>\n    <!-- #endregion Weather Widget -->\n\n    <!-- #region Volume Mixer Widget -->\n    <key name=\"volume-mixer-enabled\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"volume-mixer-only-playing\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"volume-mixer-label-text\" type=\"s\">\n      <default>\"both\"</default>\n      <choices>\n        <choice value='title'/>\n        <choice value='description'/>\n        <choice value='both'/>\n        <choice value='none'/>\n      </choices>\n    </key>\n    <key name=\"volume-mixer-label-opacity\" type=\"i\">\n      <default>220</default>\n    </key>\n    <key name=\"volume-mixer-show-scrollbar\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"volume-mixer-show-header\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"volume-mixer-max-height\" type=\"i\">\n      <default>0</default>\n    </key>\n    <key name=\"volume-mixer-fade-offset\" type=\"i\">\n      <default>46</default>\n    </key>\n    <key name=\"volume-mixer-ignore\" type=\"aa{sv}\">\n      <!-- Not implemented -->\n      <default><![CDATA[\n        [\n        ]\n      ]]></default>\n      <description><![CDATA[\n[{\n  'name': <string>,\n  'nameRegex': <string>,\n  'description': <string>,\n  'descriptionRegex': <string>,\n  'applicationId': <string>,\n  'applicationIdRegex': <string>\n}]\n      ]]></description>\n    </key>\n    <key name=\"volume-mixer-order\" type=\"aa{sv}\">\n      <!-- Not implemented -->\n      <description><![CDATA[\n[{\n  'name': <string>,\n  'nameRegex': <string>,\n  'description': <string>,\n  'descriptionRegex': <string>,\n  'applicationId': <string>,\n  'applicationIdRegex': <string>\n}]\n      ]]></description>\n      <default><![CDATA[\n        [\n        ]\n      ]]></default>\n    </key>\n    <key name=\"volume-mixer-group-by\" type=\"aa{sv}\">\n      <!-- Not implemented -->\n      <default><![CDATA[\n        [\n        ]\n      ]]></default>\n      <description><![CDATA[\n[{\n  'name': <string>,\n  'nameRegex': <string>,\n  'description': <string>,\n  'descriptionRegex': <string>,\n  'applicationId': <string>,\n  'applicationIdRegex': <string>\n}]\n      ]]></description>\n    </key>\n    <key name=\"volume-mixer-ignore-mode\" type=\"s\">\n      <choices>\n        <choice value='block'/>\n        <choice value='allow'/>\n      </choices>\n      <default>'block'</default>\n    </key>\n    <key name=\"volume-mixer-show-icon\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"volume-mixer-menu-icon\" type=\"s\">\n      <default>'open-menu-symbolic'</default>\n    </key>\n    <key name=\"volume-mixer-menu-enabled\" type=\"b\">\n      <default>true</default>\n    </key>\n    <!-- #endregion Volume Mixer Widget -->\n\n    <!-- #region Date Menu Layout -->\n    <key name=\"datemenu-hide-left-box\" type=\"b\">\n      <default>true</default>\n    </key>\n    <key name=\"datemenu-hide-right-box\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"datemenu-disable-menu\" type=\"b\">\n      <default>false</default>\n    </key>\n    <!-- #endregion Date Menu Layout -->\n\n    <!-- #region System Items Layout -->\n    <key name=\"system-items-layout-enabled\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-items-layout-hide\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-items-layout-hide-screenshot\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-items-layout-hide-settings\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-items-layout-hide-lock\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-items-layout-hide-shutdown\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-items-layout-hide-battery\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-items-layout-order\" type=\"as\">\n      <default>['battery', 'laptopSpacer', 'screenshot', 'settings', 'desktopSpacer', 'lock', 'shutdown']</default>\n    </key>\n    <!-- #endregion System Items Layout -->\n\n    <!-- #region System Indicator Layout -->\n    <key name=\"system-indicator-privacy-indicator-style\" type=\"s\">\n      <default>'default'</default>\n      <choices>\n        <choice value='default'/>\n        <choice value='monochrome'/>\n        <choice value='accent'/>\n      </choices>\n    </key>\n    <key name=\"system-indicator-screen-sharing-indicator-use-accent\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-indicator-screen-recording-indicator-use-accent\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-indicator-layout-enabled\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"system-indicator-layout-order\" type=\"aa{sv}\">\n      <default><![CDATA[\n        [\n          { 'nonOrdered': <true>, 'hide': <false> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_toggle_dndQuickToggle_DndIndicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_remoteAccess_RemoteAccessApplet'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_camera_Indicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_volume_InputIndicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_location_Indicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_thunderbolt_Indicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_nightLight_Indicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_network_Indicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_bluetooth_Indicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_rfkill_Indicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_volume_OutputIndicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_ui_panel_UnsafeModeIndicator'> },\n          { 'hide': <false>, 'isSystem': <true>, 'gtypeName': <'Gjs_status_system_Indicator'> }\n        ]\n      ]]></default>\n      <description><![CDATA[\n[{\n  gtypeName: <string>,\n  constructorName: <string>,\n  friendlyName: <string>,\n  nonOrdered: <boolean>,\n  isSystem: <boolean>,\n  hide: <boolean>\n}]\n      ]]></description>\n    </key>\n    <!-- #endregion System Indicator Layout -->\n\n    <!-- #region Input Output -->\n    <key name=\"output-show-selected\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"input-show-selected\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"input-always-show\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"input-menu-icon\" type=\"s\">\n      <default>'open-menu-symbolic'</default>\n    </key>\n    <key name=\"output-menu-icon\" type=\"s\">\n      <default>'open-menu-symbolic'</default>\n    </key>\n    <!-- #endregion Input Output -->\n\n    <!-- #region Quick Toggle Layout -->\n    <key name=\"toggles-layout-enabled\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"toggles-layout-order\" type=\"aa{sv}\">\n      <default><![CDATA[\n        [\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'NMWiredToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'NMWirelessToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'NMModemToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'NMBluetoothToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'NMVpnToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'BluetoothToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'PowerProfilesToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'NightLightToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'DarkModeToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'DoNotDisturbToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'KeyboardBrightnessToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'RfkillToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'RotationToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'DndQuickToggle'> },\n          { 'hide': <false>, 'isSystem': <true>, 'constructorName': <'UnsafeQuickToggle'> },\n          { 'nonOrdered': <true>, 'hide': <false> }\n        ]\n      ]]></default>\n      <description><![CDATA[\n[{\n  gtypeName: <string>,\n  constructorName: <string>,\n  titleRegex: <string>,\n  friendlyName: <string>,\n  nonOrdered: <boolean>,\n  isSystem: <boolean>,\n  hide: <boolean>\n}]\n      ]]></description>\n    </key>\n    <!-- #endregion Quick Toggle Layout -->\n\n    <!-- #region Unsafe Mode Quick Toggle -->\n    <key name=\"unsafe-quick-toggle-enabled\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"unsafe-quick-toggle-last-state\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"unsafe-quick-toggle-save-last-state\" type=\"b\">\n      <default>true</default>\n    </key>\n    <!-- #endregion Unsafe Mode Quick Toggle -->\n\n    <!-- #region Menu Animation -->\n    <key name=\"menu-animation-enabled\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"menu-animation-background-blur-radius\" type=\"i\">\n      <default>4</default>\n    </key>\n    <key name=\"menu-animation-background-brightness\" type=\"i\">\n      <default>900</default>\n    </key>\n    <key name=\"menu-animation-background-opacity\" type=\"i\">\n      <default>220</default>\n    </key>\n    <key name=\"menu-animation-grid-content-opacity\" type=\"i\">\n      <default>100</default>\n    </key>\n    <key name=\"menu-animation-background-scale-x\" type=\"i\">\n      <default>920</default>\n    </key>\n    <key name=\"menu-animation-background-scale-y\" type=\"i\">\n      <default>920</default>\n    </key>\n    <key name=\"menu-animation-open-duration\" type=\"i\">\n      <default>380</default>\n    </key>\n    <key name=\"menu-animation-close-duration\" type=\"i\">\n      <default>380</default>\n    </key>\n    <!-- #endregion Menu Animation -->\n\n    <!-- #region Overlay Menu -->\n    <key name=\"overlay-menu-enabled\" type=\"b\">\n      <default>false</default>\n    </key>\n    <key name=\"overlay-menu-width\" type=\"i\">\n      <default>380</default>\n    </key>\n    <key name=\"overlay-menu-animate-duration\" type=\"i\">\n      <default>360</default>\n    </key>\n    <key name=\"overlay-menu-animate-style\" type=\"s\">\n      <choices>\n        <choice value='flyout'/>\n        <choice value='dialog'/>\n      </choices>\n      <default>'dialog'</default>\n    </key>\n    <key name=\"layout\" type=\"a{sai}\">\n      <default>\n        {\n          'weather-widget': [0, 0],\n          'notifications-widget': [0, 0],\n          'media-widget': [0, 0],\n          'mixer-widget': [0, 0]\n        }\n      </default>\n    </key>\n    <key name=\"overlay-menu-overflow-anchor\" type=\"s\">\n      <choices>\n        <choice value='top'/>\n        <choice value='center'/>\n        <choice value='bottom'/>\n      </choices>\n      <default>'top'</default>\n    </key>\n    <!-- #endregion Overlay Menu -->\n  </schema>\n</schemalist>\n"
  },
  {
    "path": "scripts/contributor-labels.json",
    "content": "{\n  \"qwreey\": \"Owner\",\n  \"DaPigGuy\": \"Gnome 45 Port\",\n  \"Leleat\": \"Style &amp; Code\\nimprove\",\n  \"kgdn\": \"Gnome 45 Port\",\n  \"DodoLeDev\": \"Readme &amp; Code\\nimprove\",\n  \"andia89\": \"Code improve\",\n  \"DanGLES3\": \"Portuguese\\ntranslation\",\n  \"jcatfor\": \"Catalan\\ntranslation\",\n  \"ondra05\": \"Czech\\ntranslation\",\n  \"daudix\": \"Russian\\ntranslation\",\n  \"JohnOberhauser\": \"Audio\\nInput/Output\",\n  \"314eter\": \"Bug fix\\nCode improve\",\n  \"Tuba2\": \"Portuguese\\ntranslation\",\n  \"mechtifs\": \"Chinese Simplified\\ntranslation\",\n  \"MrXvnov\": \"Russian\\ntranslation\",\n  \"ryzendew\": \"Gnome 47 Port\",\n  \"prapooskur\": \"Gnome 46 Port\",\n  \"alewicki95\": \"Polish\\ntranslation\",\n  \"nulta\": \"Korean\\ntranslation\"\n}\n"
  },
  {
    "path": "scripts/reindent.js",
    "content": "import { promises as fs } from \"fs\"\nfunction getItems() {\n\tlet allowed = false\n\tconst items = process.argv.filter(item => {\n\t\tif (allowed) return true\n\t\tif (item == \"--\") allowed = true\n\t\treturn false\n\t})\n\treturn items\n}\nasync function main() {\n\tawait Promise.all(getItems().map(item =>\n\t\tfs.readFile(`./${item}`, { encoding: \"utf-8\" })\n\t\t.then(content =>\n\t\t\tcontent.replaceAll(/[^\\n]*/g,\n\t\t\t\tsubstr => substr.replace(\n\t\t\t\t\t/^ */,\n\t\t\t\t\tindent => \"\\t\".repeat(Math.floor(indent.length / 4))\n\t\t\t\t)\n\t\t\t))\n\t\t.then(fs.writeFile.bind(fs, item))\n\t))\n}\nmain()\n"
  },
  {
    "path": "scripts/version/gnome-docker-version",
    "content": "1.0.3"
  },
  {
    "path": "scripts/version/latest-build-number",
    "content": "9\n"
  },
  {
    "path": "scripts/version/latest-middle-version",
    "content": "2\n"
  },
  {
    "path": "scripts/version/latest-minor-version",
    "content": "1\n"
  },
  {
    "path": "scripts/version/major-version",
    "content": "2"
  },
  {
    "path": "src/ambient.d.ts",
    "content": "// Provide missing types\n\ndeclare global {\n\texport interface EasingParams {\n\t\trepeatCount?: number\n\t\tautoReverse?: boolean\n\t\tanimationRequired?: boolean\n\t\tduration?: number\n\t\tdelay?: number\n\t\tmode?: Clutter.AnimationMode | any\n\t}\n\texport type EasingParamsWithProps = EasingParams & { [key: string]: any }\n}\n\ndeclare module \"gi://GWeather\" {\n\timport GObject from \"gi://GObject\"\n\tclass Info extends GObject.Object {\n\t\tstatic store_cache(): void\n\t\tconstructor(location: Location)\n\t\tabort(): void\n\t\tget_apparent(): string\n\t\t/// Get the application ID of the application fetching the weather\n\t\t/** @returns { string } the application ID */\n\t\tget_application_id(): string\n\t\t/// Some weather services require the application showing the data to include an attribution text, possibly including links to the service website.\n\t\t/// This must be shown prominently toghether with the data.\n\t\t/** @returns { string } the required attribution text, in Pango markup form, or null if not required */\n\t\tget_attribution(): string\n\t\tget_conditions(): string\n\t\t/// Get the contact information of the application fetching the weather.\n\t\t/** @returns { string } the contact information */\n\t\tget_contact_info(): string\n\t\tget_dew(): string\n\t\t/// Gets the bitmask of enabled GWeather.Provider weather providers.\n\t\tget_enabled_providers(): Provider\n\t\t/**\n\t\t * @returns {Info[]}\n\t\t * list of GWeatherInfo* objects for the forecast.\n\t\t * The list is owned by the 'info' object thus is alive as long as the 'info'.\n\t\t * The 'update' property is the date/time when the forecast info is used for.\n\t\t*/\n\t\tget_forecast_list(): Info[]\n\t\tget_humidity(): string\n\t\tget_icon_name(): string\n\t\tget_location(): Location\n\t\tget_location_name(): string\n\t\tget_pressure(): string\n\t\tget_sky(): string\n\t\tget_sunrise(): string\n\t\tget_sunset(): string\n\t\tget_symbolic_icon_name(): string\n\t\tget_temp(): string\n\t\tget_temp_max(): string\n\t\tget_temp_min(): string\n\t\tget_temp_summary(): string\n\t\tget_upcoming_moonphases(phases: number): boolean\n\t\tget_update(): string\n\t\t/** @param { TemperatureUnit } unit the desired unit, as a GWeather.TemperatureUnit */\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise\n\t\t *\n\t\t * value - the apparent temperature\n\t\t*/\n\t\tget_value_apparent(unit: TemperatureUnit): [boolean, number]\n\t\t/// Fills out phenomenon and qualifier with current weather conditions.\n\t\t/**\n\t\t * @returns {[boolean, GWeather.ConditionPhenomenon, GWeather.ConditionQualifier]}\n\t\t * ok - TRUE is out arguments are valid, FALSE otherwise.\n\t\t *\n\t\t * phenomenon - a location for a GWeather.ConditionPhenomenon.\n\t\t *\n\t\t * qualifier - a location for a GWeather.ConditionQualifier.\n\t\t*/\n\t\tget_value_conditions(): [boolean, ConditionPhenomenon, ConditionQualifier]\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - the dew point\n\t\t*/\n\t\tget_value_dew(unit: TemperatureUnit): [boolean, number]\n\t\t/**\n\t\t * @returns {[boolean, MoonPhase, MoonLatitude]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - the current moon phase\n\t\t *\n\t\t * lat - the moon declension\n\t\t*/\n\t\tget_value_moonphase(): [boolean, MoonPhase, MoonLatitude]\n\t\t/** @param {PressureUnit} unit the desired unit, as a GWeather.PressureUnit */\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE if value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - forecasted pressure, expressed in unit\n\t\t*/\n\t\tget_value_pressure(unit): [boolean, number]\n\t\t/**\n\t\t * @returns {[boolean, Sky]}\n\t\t * ok - TRUE is sky is valid, FALSE otherwise.\n\t\t *\n\t\t * sky - a location for a GWeather.Sky.\n\t\t*/\n\t\tget_value_sky(): [boolean, Sky]\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - the time of sunrise\n\t\t*/\n\t\tget_value_sunrise(): [boolean, number]\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - the time of sunset\n\t\t*/\n\t\tget_value_sunset(): [boolean, number]\n\t\t/** @param {TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - the temperature value\n\t\t*/\n\t\tget_value_temp(unit: TemperatureUnit): [boolean, number]\n\t\t/** @param {GWeather.TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - the maximum temperature value\n\t\t*/\n\t\tget_value_temp_max(unit: TemperatureUnit): [boolean, number]\n\t\t/** @param {GWeather.TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - the minimum temperature value\n\t\t*/\n\t\tget_value_temp_min(unit: TemperatureUnit): [boolean, number]\n\t\t/// Note that value may be 0 if this has not yet been updated.\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE is value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - the time this was last updated\n\t\t*/\n\t\tget_value_update(): [boolean, number]\n\t\t/** @param {GWeather.DistanceUnit} unit the desired unit, as a GWeather.DistanceUnit */\n\t\t/**\n\t\t * @returns {[boolean, number]}\n\t\t * ok - TRUE if value is valid, FALSE otherwise.\n\t\t *\n\t\t * value - forecasted visibility, expressed in unit\n\t\t*/\n\t\tget_value_visibility(unit: DistanceUnit): [boolean, number]\n\t\t/** @param {GWeather.SpeedUnit} unit the desired unit, as a GWeather.SpeedUnit */\n\t\t/**\n\t\t * @returns {[boolean, number, GWeather.WindDirection]}\n\t\t * ok - TRUE if speed and direction are valid, FALSE otherwise.\n\t\t *\n\t\t * speed - forecasted wind speed\n\t\t *\n\t\t * direction - forecasted wind direction\n\t\t*/\n\t\tget_value_wind(unit: SpeedUnit): [boolean, number, WindDirection]\n\t\tget_visibility(): string\n\t\t/** @returns {string} a summary for current weather conditions. */\n\t\tget_weather_summary(): string\n\t\tget_wind(): string\n\t\t/**\n\t\t * @returns {boolean}\n\t\t * Whether it is daytime (that is, if the sun is visible) or not at the location and the point of time referred by this.\n\t\t *\n\t\t * This is mostly equivalent to comparing the return value of GWeather.Info.get_value_sunrise and GWeather.Info.get_value_sunset, but it accounts also for midnight sun and polar night, for locations within the Artic and Antartic circles.\n\t\t*/\n\t\tis_daytime(): boolean\n\t\tis_valid(): boolean\n\t\tnetwork_error(): boolean\n\t\tnext_sun_event(): number\n\t\t/// Sets the application ID of the application fetching the weather.\n\t\t/// It is a requirement for using any of the online weather providers.\n\t\t///\n\t\t/// If the application uses Gio.Application, then the application ID will be automatically filled in.\n\t\t/** @param {string} application_id the application ID to set\n\t\tset_application_id(application_id: string): void\n\n\t\t/// Sets the contact information for the application fetching the weather.\n\t\t/// It is a requirement for using any of the online weather providers as it allows API providers to contact application developers in case of terms of use breaches.\n\t\t///\n\t\t/// The contact information should be an email address, or the full URL to an online contact form which weather providers can use to contact the application developer. Avoid using bug tracker URLs which require creating accounts.\n\t\t/** @param {string} contact_info the contact information for the application */\n\t\tset_contact_info(contact_info: string): void\n\n\t\t/// Sets the enabled providers for fetching the weather.\n\t\t/// Note that it is up to the application developer to make sure that the terms of use for each service are respected.\n\t\t///\n\t\t/// Online providers will not be enabled if the application ID is not set to a valid value.\n\t\t/** @param {GWeather.Provider} providers a bitmask of GWeather.Provider */\n\t\tset_enabled_providers(providers: Provider): void\n\n\t\t/// Changes the location of the weather report.\n\t\t///\n\t\t/// Note that this will clear any forecast or current conditions, and you must call [method@GWeather.Info.update] to obtain the new data.\n\t\t/** @param {GWeather.Location} location a location for which weather is desired */\n\t\tset_location(location: Location): void\n\n\t\t/// Requests a reload of weather conditions and forecast data from enabled network services.\n\t\t/// This call does no synchronous IO: rather, the result is delivered by emitting the GWeather.Info.updated signal.\n\t\t/// Note that if no network services are enabled, the signal will not be emitted. See GWeather.Info.enabled-providers for details.\n\t\tupdate(): void\n\t}\n\t/// A GWeatherLocation represents a \"location\" of some type known to libgweather; anything from a single weather station to the entire world.\n\t///\n\t/// See [enum@GWeather.LocationLevel] for information about how the hierarchy of locations works.\n\tclass Location extends GObject.Object {\n\t\t// TODO\n\t}\n\t/// The current or forecasted significant phenomenon.\n\tenum ConditionPhenomenon {\n\t\tDRIZZLE,\n\t\tDUST,\n\t\tDUST_WHIRLS,\n\t\tDUSTSTORM,\n\t\tFOG,\n\t\tFUNNEL_CLOUD,\n\t\tHAIL,\n\t\tHAZE,\n\t\tICE_CRYSTALS,\n\t\tICE_PELLETS,\n\t\tINVALID,\n\t\tLAST,\n\t\tMIST,\n\t\tNONE,\n\t\tRAIN,\n\t\tSAND,\n\t\tSANDSTORM,\n\t\tSMALL_HAIL,\n\t\tSMOKE,\n\t\tSNOW,\n\t\tSNOW_GRAINS,\n\t\tSPRAY,\n\t\tSQUALL,\n\t\tTORNADO,\n\t\tUNKNOWN_PRECIPITATION,\n\t\tVOLCANIC_ASH,\n\t}\n\t/// An additional modifier applied to a GWeather.ConditionPhenomenon to describe the current or forecasted weather conditions.\n\t///\n\t/// The exact meaning of each qualifier is described at http://www.weather.com/glossary/ and http://www.crh.noaa.gov/arx/wx.tbl.php\n\tenum ConditionQualifier {\n\t\tBLOWING,\n\t\tDRIFTING,\n\t\tFREEZING,\n\t\tHEAVY,\n\t\tINVALID,\n\t\tLAST,\n\t\tLIGHT,\n\t\tMODERATE,\n\t\tNONE,\n\t\tPARTIAL,\n\t\tPATCHES,\n\t\tSHALLOW,\n\t\tSHOWERS,\n\t\tTHUNDERSTORM,\n\t\tVICINITY,\n\t}\n\tenum DistanceUnit {\n\t\tDEFAULT,\n\t\tINVALID,\n\t\tKM,\n\t\tMETERS,\n\t\tMILES,\n\t}\n\t/// The size/scope of a particular [class@GWeather.Location].\n\t///\n\t/// Locations form a hierarchy, with a GWEATHER_LOCATION_WORLD location at the top, divided into regions or countries, and so on.\n\t///\n\t/// Countries may or may not be divided into \"adm1\"s, and \"adm1\"s may or may not be divided into \"adm2\"s.\n\t/// A city will have at least one, and possibly several, weather stations inside it.\n\t/// Weather stations will never appear outside of cities.\n\t///\n\t/// Building a database with [func@GWeather.Location.get_world] will never create detached instances, but deserializing might.\n\tenum LocationLevel {\n\t\tADM1,\n\t\tCITY,\n\t\tCOUNTRY,\n\t\tDETACHED,\n\t\tNAMED_TIMEZONE,\n\t\tREGION,\n\t\tWEATHER_STATION,\n\t\tWORLD,\n\t}\n\tnamespace LocationLevel {\n\t\t/// Returns the location level as a string, useful for debugging purposes.\n\t\t/** @param {GWeather.LocationLevel} level a GWeather.LocationLevel */\n\t\t/** @returns {string} a string */\n\t\texport function to_string(level: LocationLevel): string\n\t}\n\t/// The measure unit to use for atmospheric pressure values, when retrieved by GWeather.Info.get_value_pressure.\n\tenum PressureUnit {\n\t\tATM,\n\t\tDEFAULT,\n\t\tHPA,\n\t\tINCH_HG,\n\t\tINVALID,\n\t\tKPA,\n\t\tMB,\n\t\tMM_HG,\n\t}\n\tenum Provider {\n\t\tALL,\n\t\tIWIN,\n\t\tMET_NO,\n\t\tMETAR,\n\t\tNONE,\n\t\tNWS,\n\t\tOWM,\n\t}\n\t/// The sky and cloud visibility.\n\t/// In general it is discouraged to use this value directly to compute the forecast icon: applications should instead use GWeather.Info.get_icon_name or GWeather.Info.get_symbolic_icon_name.\n\tenum Sky {\n\t\tBROKEN,\n\t\tCLEAR,\n\t\tFEW,\n\t\tINVALID,\n\t\tLAST,\n\t\tOVERCAST,\n\t\tSCATTERED,\n\t}\n\tnamespace Sky {\n\t\texport function to_string(sky: Sky): string\n\t\texport function to_string_full(sky: Sky, options: {[key: string]: any}): string\n\t}\n\n\t/// The measure unit to use for wind speed values, when retrieved by GWeather.Info.get_value_wind.\n\tenum SpeedUnit {\n\t\tBFT,\n\t\tDEFAULT,\n\t\tINVALID,\n\t\tKNOTS,\n\t\tKPH,\n\t\tMPH,\n\t\tMS,\n\t}\n\tnamespace SpeedUnit {\n\t\t/** @param {GWeather.SpeedUnit} unit a speed unit, or GWeather.SpeedUnit.DEFAULT */\n\t\texport function to_string(unit: SpeedUnit): string\n\t}\n\n\t/// The measure unit to use for temperature values, when retrieved by the GWeather.Info.get_value_temp family of functions.\n\tenum TemperatureUnit {\n\t\tCENTIGRADE,\n\t\tDEFAULT,\n\t\tFAHRENHEIT,\n\t\tINVALID,\n\t\tKELVIN,\n\t}\n\tnamespace TemperatureUnit {\n        /** @param {GWeather.TemperatureUnit} unit a tempeature unit, or GWeather.TemperatureUnit.DEFAULT */\n\t\texport function to_real(unit: TemperatureUnit): TemperatureUnit\n\t}\n\n\t/// The direction of the prevailing wind.\n\t/// Composite values such as north-north-east indicate a direction between the two component value (north and north-east).\n\tenum WindDirection {\n\t\tE,\n\t\tENE,\n\t\tESE,\n\t\tINVALID,\n\t\tLAST,\n\t\tN,\n\t\tNE,\n\t\tNNE,\n\t\tNNW,\n\t\tNW,\n\t\tS,\n\t\tSE,\n\t\tSSE,\n\t\tSSW,\n\t\tSW,\n\t\tVARIABLE,\n\t\tW,\n\t\tWNW,\n\t\tWSW,\n\t}\n\tnamespace WindDirection {\n\t\texport function to_string(wind: WindDirection): string\n\t\texport function to_string_full(wind: WindDirection, options: {[key: string]: any}): string\n\t}\n}\n\ndeclare module \"resource:///org/gnome/shell/ui/pageIndicators.js\" {\n\timport St from \"gi://St\"\n\timport Clutter from \"gi://Clutter\"\n\texport class PageIndicators extends St.BoxLayout {\n\t\tconstructor(orientation: Clutter.Orientation)\n\t\tconnect(id: string, callback: (...args: any[]) => any): number;\n\t\tconnect_after(id: string, callback: (...args: any[]) => any): number;\n\t\tconnect(sigName: 'page-activated', callback: ($obj: PageIndicators, page: number) => void): number\n\t\tconnect_after(sigName: 'page-activated', callback: ($obj: PageIndicators, page: number) => void): number\n\t\tsetReactive(reactive: boolean): void\n\t\tsetNPages(nPages: number): void\n\t\tsetCurrentPosition(currentPosition: number): void\n\t\treadonly nPages: number\n\t}\n}\n\ndeclare module \"resource:///org/gnome/shell/misc/weather.js\" {\n\timport Signals from \"resource:///org/gnome/shell/misc/signals.js\"\n\timport GWeather from \"gi://GWeather\"\n\texport class WeatherClient extends Signals.EventEmitter {\n\t\treadonly available: boolean\n\t\treadonly loading: boolean\n\t\treadonly hasLocation: boolean\n\t\treadonly info: GWeather.Info\n\t\tactivateApp(): void\n\t\tupdate(): void\n\t}\n}\n"
  },
  {
    "path": "src/config.ts",
    "content": "export default {\n    isDevelopmentBuild: false,\n    isReleaseBuild: false,\n    isGithubBuild: false,\n    version: \"unknown\",\n    buildNumber: 0,\n    baseGTypeName: \"quick-settings-tweaks_\",\n    loggerPrefix: \"[quick-settings-tweaks]\",\n}\n"
  },
  {
    "path": "src/extension.ts",
    "content": "/**\n * Viewer Note:\n * stylesheet and javascript files are compiled from scss and typescript. \n * To modify this extension, please check original source-codes from repository\n * https://github.com/qwreey/quick-settings-tweaks\n*/\nimport { Extension } from \"resource:///org/gnome/shell/extensions/extension.js\"\nimport Logger from \"./libs/shared/logger.js\"\nimport Global from \"./global.js\"\nimport Config from \"./config.js\"\nimport { type FeatureBase } from \"./libs/shell/feature.js\"\nimport { UnsafeQuickToggleFeature } from \"./features/toggle/unsafeQuickToggle.js\"\nimport { MediaWidgetFeature } from \"./features/widget/media.js\"\nimport { WeatherWidgetFeature } from \"./features/widget/weather.js\"\nimport { NotificationsWidgetFeature } from \"./features/widget/notifications.js\"\nimport { TogglesLayoutFeature } from \"./features/layout/toggles.js\"\nimport { SystemItemsLayoutFeature } from \"./features/layout/systemItems.js\"\nimport { DateMenuLayoutFeature } from \"./features/layout/dateMenu.js\"\nimport { OverlayMenu } from \"./features/overlayMenu.js\"\nimport { MenuAnimation } from \"./features/menuAnimation.js\"\nimport { DebugFeature } from \"./features/debug.js\"\nimport { VolumeMixerWidgetFeature } from \"./features/widget/volumeMixer.js\"\nimport { SystemIndicatorLayoutFeature } from \"./features/layout/systemIndicator.js\"\n\nexport default class QstExtension extends Extension {\n\tprivate features: FeatureBase[]\n\tprivate debug: DebugFeature\n\n\tdisable() {\n\t\tLogger(`Extension ${this.metadata.name} deactivation started`)\n\t\tlet start = +Date.now()\n\n\t\t// Unload debug feature\n\t\tthis.debug.unload()\n\t\tthis.debug = null\n\n\t\t// Unload features\n\t\tfor (const feature of this.features) {\n\t\t\tLogger(`Unload feature '${feature.constructor.name}'`)\n\t\t\tfeature.unload()\n\t\t}\n\t\tthis.features = null // Null-out all features, loaded objects, arrays should be GC'd\n\n\t\t// Unload global context\n\t\tGlobal.unload()\n\n\t\tLogger(\"Diabled. \" + (+new Date() - start) + \"ms taken\")\n\t}\n\n\tenable() {\n\t\t// Load global context\n\t\tGlobal.load(this)\n\n\t\t// Create features\n\t\tthis.features = [\n\t\t\tnew UnsafeQuickToggleFeature(),\n\t\t\t// new InputOutputFeature(),\n\t\t\tnew NotificationsWidgetFeature(),\n\t\t\tnew MediaWidgetFeature(),\n\t\t\tnew VolumeMixerWidgetFeature(),\n\t\t\tnew DateMenuLayoutFeature(),\n\t\t\tnew WeatherWidgetFeature(),\n\t\t\tnew OverlayMenu(),\n\t\t\tnew MenuAnimation(),\n\t\t\tnew SystemItemsLayoutFeature(),\n\t\t\tnew TogglesLayoutFeature(),\n\t\t\tnew SystemIndicatorLayoutFeature(),\n\t\t]\n\n\t\t// Load debug feature\n\t\tthis.debug = new DebugFeature()\n\t\tthis.debug.load()\n\t\tLogger(`Extension activation started, version: ${Config.version}`)\n\n\t\t// Load features\n\t\tLogger.debug(\"Initializing features ...\")\n\t\tlet start = +Date.now()\n\t\tfor (const feature of this.features) {\n\t\t\tLogger.debug(()=>`Loading feature '${feature.constructor.name}'`)\n\t\t\tfeature.load()\n\t\t}\n\t\tLogger(`Extension Loaded, ${+Date.now() - start}ms taken`)\n\t}\n}\n"
  },
  {
    "path": "src/features/debug.ts",
    "content": "import { FeatureBase, type SettingLoader } from \"../libs/shell/feature.js\"\nimport Global from \"../global.js\"\nimport Logger from \"../libs/shared/logger.js\"\nimport Config from \"../config.js\"\n\nexport class DebugFeature extends FeatureBase {\n\tdisableDebugMessage = true\n\n\t// #region settings\n\texpose: boolean\n\tshowLayoutBorder: boolean\n\tlogLevel: number\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.expose = loader.loadBoolean(\"debug-expose\")\n\t\tthis.showLayoutBorder = loader.loadBoolean(\"debug-show-layout-border\")\n\t\tthis.logLevel = loader.loadInt(\"debug-log-level\")\n\t}\n\t// #endregion settings\n\n\toverride onLoad() {\n\t\tLogger.setHeader(Config.loggerPrefix)\n\t\tLogger.setLogLevel(this.logLevel)\n\t\tLogger.debug(()=>`Logger initialized, LogLevel: ${this.logLevel}`)\n\t\tif (this.expose) {\n\t\t\tglobalThis.qst = Global\n\t\t\tfor (const feature of (Global.Extension as any).features) {\n\t\t\t\tGlobal[feature.constructor.name] = feature\n\t\t\t}\n\t\t\tthis.maid.functionJob(()=>{\n\t\t\t\tfor (const feature of (Global.Extension as any).features) {\n\t\t\t\t\tdelete Global[feature.constructor.name]\n\t\t\t\t}\n\t\t\t\tdelete globalThis.qst\n\t\t\t})\n\t\t\tLogger.debug(\"Extension environment expose enabled\")\n\t\t}\n\t\tif (this.showLayoutBorder) {\n\t\t\t// @ts-ignore Box pointer is private\n\t\t\tGlobal.QuickSettingsMenu._boxPointer.style_class += \" QSTWEAKS-debug-show-layout\"\n\t\t\tthis.maid.functionJob(()=>{\n\t\t\t\t// @ts-ignore Box pointer is private\n\t\t\t\tGlobal.QuickSettingsMenu._boxPointer.style_class =\n\t\t\t\t// @ts-ignore Box pointer is private\n\t\t\t\tGlobal.QuickSettingsMenu._boxPointer.style_class.replace(/ QSTWEAKS-debug-show-layout/, \"\")\n\t\t\t})\n\t\t\tLogger.debug(\"Show layout border enabled\")\n\t\t}\n\t}\n\toverride onUnload(): void {}\n}\n"
  },
  {
    "path": "src/features/layout/dateMenu.ts",
    "content": "import { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport { StyleClass } from \"../../libs/shared/styleClass.js\"\nimport Global from \"../../global.js\"\nimport Logger from \"../../libs/shared/logger.js\"\n\nexport class DateMenuLayoutFeature extends FeatureBase {\n\t// #region settings\n\thideMediaControl: boolean\n\thideNotifications: boolean\n\thideLeftBox: boolean\n\thideRightBox: boolean\n\tdisableMenu: boolean\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.hideLeftBox = loader.loadBoolean(\"datemenu-hide-left-box\")\n\t\tthis.hideRightBox = loader.loadBoolean(\"datemenu-hide-right-box\")\n\t\tthis.disableMenu = loader.loadBoolean(\"datemenu-disable-menu\")\n\t}\n\t// #endregion settings\n\n\toverride onLoad() {\n\t\tconst style = new StyleClass((Global.DateMenuBox as any).style_class)\n\n\t\t// Hide left box from date menu\n\t\tif (this.hideLeftBox) {\n\t\t\tconst leftBox = Global.DateMenuHolder.get_first_child()\n\t\t\tif (leftBox) {\n\t\t\t\tthis.maid.hideJob(\n\t\t\t\t\tleftBox,\n\t\t\t\t\t()=>true\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tLogger.error(\"Failed to get date menu left box\")\n\t\t\t}\n\t\t\tstyle.add(\"QSTWEAKS-hide-left-box\")\n\t\t}\n\n\t\t// Hide right box from date menu\n\t\tif (this.hideRightBox) {\n\t\t\tconst rightBox = Global.DateMenuHolder.get_last_child()\n\t\t\tif (rightBox) {\n\t\t\t\tthis.maid.hideJob(\n\t\t\t\t\trightBox,\n\t\t\t\t\t()=>true\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tLogger.error(\"Failed to get date menu right box\")\n\t\t\t}\n\t\t\tstyle.add(\"QSTWEAKS-hide-right-box\")\n\t\t}\n\n\t\t// Disable menu open action\n\t\tif (this.disableMenu) {\n\t\t\tGlobal.DateMenu.reactive = false\n\t\t\tthis.maid.functionJob(()=>{\n\t\t\t\tGlobal.DateMenu.reactive = true\n\t\t\t})\n\t\t}\n\n\t\t// Modify style class\n\t\tif (style.modified) {\n\t\t\t(Global.DateMenuBox as any).style_class = style.stringify()\n\t\t}\n\t}\n\toverride onUnload(): void {\n\t\t// Remove modified styles\n\t\tconst style = new StyleClass((Global.DateMenuBox as any).style_class)\n\t\t\t.remove(\"QSTWEAKS-hide-right-box\")\n\t\t\t.remove(\"QSTWEAKS-hide-left-box\")\n\t\tif (style.modified) {\n\t\t\t(Global.DateMenuBox as any).style_class = style.stringify()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/features/layout/sound.ts",
    "content": "import { FeatureBase, SettingLoader } from \"../../libs/shell/feature.js\"\nimport GObject from \"gi://GObject\"\n\n// TODO: migration from qst 1.8\nexport class SoundLayoutFeature extends FeatureBase {\n\t// #region settings\n\t\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthrow GObject.NotImplementedError\n\t}\n\t// #endregion settings\n\n\toverride onLoad(): void {\n\t\tthrow GObject.NotImplementedError\n\t}\n\toverride onUnload(): void {\n\t\tthrow GObject.NotImplementedError\n\t}\n}\n"
  },
  {
    "path": "src/features/layout/systemIndicator.ts",
    "content": "import * as Main from \"resource:///org/gnome/shell/ui/main.js\"\nimport { SystemIndicator } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport { SystemIndicatorTracker } from \"../../libs/shell/quickSettingsUtils.js\"\nimport { SystemIndicatorOrderItem } from \"../../libs/types/systemIndicatorOrderItem.js\"\nimport { StyleClass } from \"../../libs/shared/styleClass.js\"\nimport Maid from \"../../libs/shared/maid.js\"\nimport Global from \"../../global.js\"\n\nexport class SystemIndicatorLayoutFeature extends FeatureBase {\n\t// #region settings\n\torderEnabled: boolean\n\torder: SystemIndicatorOrderItem[]\n\tunordered: SystemIndicatorOrderItem\n\tprivacyIndicatorStyle: \"default\" | \"monochrome\" | \"accent\"\n\taccentScreenSharingIndicator: boolean\n\taccentScreenRecordingIndicator: boolean\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.orderEnabled = loader.loadBoolean(\"system-indicator-layout-enabled\")\n\t\tthis.order = loader.loadValue(\"system-indicator-layout-order\")\n\t\tthis.unordered = this.order.find(item => item.nonOrdered)\n\t\tthis.privacyIndicatorStyle = loader.loadString(\"system-indicator-privacy-indicator-style\") as SystemIndicatorLayoutFeature[\"privacyIndicatorStyle\"]\n\t\tthis.accentScreenSharingIndicator = loader.loadBoolean(\"system-indicator-screen-sharing-indicator-use-accent\")\n\t\tthis.accentScreenRecordingIndicator = loader.loadBoolean(\"system-indicator-screen-recording-indicator-use-accent\")\n\t}\n\t// #endregion settings\n\n\tonIndicatorCreated(maid: Maid, indicator: SystemIndicator): void {\n\t\tconst rule: SystemIndicatorOrderItem =\n\t\t\tthis.order.find(item => SystemIndicatorOrderItem.indicatorMatch(item, indicator))\n\t\t\t?? this.unordered\n\t\tif (rule.hide) maid.hideJob(indicator)\n\t}\n\tonUpdate(): void {\n\t\tconst children = Global.Indicators.get_children()\n\t\tconst head: SystemIndicator[] = []\n\t\tconst middle: SystemIndicator[] = children.filter(child => child instanceof SystemIndicator) as any\n\t\tconst tail: SystemIndicator[] = []\n\t\tlet overNonOrdered: boolean = false\n\t\tfor (const item of this.order) {\n\t\t\tif (item.nonOrdered) {\n\t\t\t\toverNonOrdered = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst middleIndex = middle.findIndex(toggle => SystemIndicatorOrderItem.indicatorMatch(item, toggle))\n\t\t\tif (middleIndex == -1) continue\n\t\t\tconst toggle = middle[middleIndex]\n\t\t\tmiddle.splice(middleIndex, 1);\n\t\t\t(overNonOrdered ? tail : head).push(toggle)\n\t\t}\n\t\tlet last: SystemIndicator|null = null\n\t\tfor (const item of [head, middle, tail].flat()) {\n\t\t\tif (last) Global.Indicators.set_child_above_sibling(item, last)\n\t\t\tlast = item\n\t\t}\n\t}\n\n\ttracker: SystemIndicatorTracker\n\toverride onLoad(): void {\n\t\t// Colored privacy indicator\n\t\tconst privacyIndicatorStyle = new StyleClass(Global.Indicators.style_class)\n\t\tif (this.privacyIndicatorStyle == \"accent\") {\n\t\t\tprivacyIndicatorStyle.add(\"QSTWEAKS-privacy-indicator-use-accent\")\n\t\t} else if (this.privacyIndicatorStyle == \"monochrome\") {\n\t\t\tprivacyIndicatorStyle.add(\"QSTWEAKS-privacy-indicator-use-monochrome\")\n\t\t}\n\t\tif (privacyIndicatorStyle.modified) {\n\t\t\tGlobal.Indicators.style_class = privacyIndicatorStyle.stringify()\n\t\t\tthis.maid.functionJob(()=>{\n\t\t\t\tGlobal.Indicators.style_class =\n\t\t\t\t\tnew StyleClass(Global.Indicators.style_class)\n\t\t\t\t\t.remove(\"QSTWEAKS-privacy-indicator-use-accent\")\n\t\t\t\t\t.remove(\"QSTWEAKS-privacy-indicator-use-monochrome\")\n\t\t\t\t\t.stringify()\n\t\t\t})\n\t\t}\n\n\t\t// Colored screen sharing indicator\n\t\tif (this.accentScreenSharingIndicator) {\n\t\t\tMain.panel.statusArea[\"screenSharing\"].style_class =\n\t\t\t\tnew StyleClass(Main.panel.statusArea[\"screenSharing\"].style_class)\n\t\t\t\t.add(\"QSTWEAKS-screen-sharing-indicator-use-accent\")\n\t\t\t\t.stringify()\n\t\t\tthis.maid.functionJob(()=>{\n\t\t\t\tMain.panel.statusArea[\"screenSharing\"].style_class =\n\t\t\t\t\tnew StyleClass(Main.panel.statusArea[\"screenSharing\"].style_class)\n\t\t\t\t\t.remove(\"QSTWEAKS-screen-sharing-indicator-use-accent\")\n\t\t\t\t\t.stringify()\n\t\t\t})\n\t\t}\n\n\t\t// Colored screen recording indicator\n\t\tif (this.accentScreenRecordingIndicator) {\n\t\t\tMain.panel.statusArea[\"screenRecording\"].style_class =\n\t\t\t\tnew StyleClass(Main.panel.statusArea[\"screenRecording\"].style_class)\n\t\t\t\t.add(\"QSTWEAKS-screen-recording-indicator-use-accent\")\n\t\t\t\t.stringify()\n\t\t\tthis.maid.functionJob(()=>{\n\t\t\t\tMain.panel.statusArea[\"screenRecording\"].style_class =\n\t\t\t\t\tnew StyleClass(Main.panel.statusArea[\"screenRecording\"].style_class)\n\t\t\t\t\t.remove(\"QSTWEAKS-screen-recording-indicator-use-accent\")\n\t\t\t\t\t.stringify()\n\t\t\t})\n\t\t}\n\n\t\t// Ordering\n\t\tif (!this.orderEnabled) return\n\t\tthis.tracker = new SystemIndicatorTracker()\n\t\tthis.tracker.onIndicatorCreated = this.onIndicatorCreated.bind(this)\n\t\tthis.tracker.onUpdate = this.onUpdate.bind(this)\n\t\tthis.tracker.load()\n\t}\n\toverride onUnload(): void {\n\t\tconst tracker = this.tracker\n\t\tif (tracker) {\n\t\t\tthis.tracker = null\n\t\t\ttracker.unload()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/features/layout/systemItems.ts",
    "content": "import Clutter from \"gi://Clutter\"\nimport { type PowerToggle } from \"resource:///org/gnome/shell/ui/status/system.js\"\nimport { type QuickSettingsItem } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport { type SystemItem } from \"resource:///org/gnome/shell/ui/status/system.js\"\nimport { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport Logger from \"../../libs/shared/logger.js\"\nimport Global from \"../../global.js\"\n\nexport class SystemItemsLayoutFeature extends FeatureBase {\n\t// #region settings\n\thideScreenshot: boolean\n\thideSettings: boolean\n\thideLock: boolean\n\thideShutdown: boolean\n\thideBattery: boolean\n\thideLayout: boolean\n\tenabled: boolean\n\torder: string[]\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.hideScreenshot = loader.loadBoolean(\"system-items-layout-hide-screenshot\")\n\t\tthis.hideSettings = loader.loadBoolean(\"system-items-layout-hide-settings\")\n\t\tthis.hideLock = loader.loadBoolean(\"system-items-layout-hide-lock\")\n\t\tthis.hideShutdown = loader.loadBoolean(\"system-items-layout-hide-shutdown\")\n\t\tthis.hideBattery = loader.loadBoolean(\"system-items-layout-hide-battery\")\n\t\tthis.hideLayout = loader.loadBoolean(\"system-items-layout-hide\")\n\t\tthis.enabled = loader.loadBoolean(\"system-items-layout-enabled\")\n\t\tthis.order = loader.loadStrv(\"system-items-layout-order\")\n\t}\n\t// #endregion settings\n\n\tasync getItmes(): Promise<{\n\t\tscreenshot: QuickSettingsItem,\n\t\tsettings: QuickSettingsItem,\n\t\tlock: QuickSettingsItem,\n\t\tshutdown: QuickSettingsItem,\n\t\tbattery: PowerToggle,\n\t\tbox: SystemItem,\n\t\tlaptopSpacer: Clutter.Actor,\n\t\tdesktopSpacer: Clutter.Actor,\n\t}> {\n\t\tconst systemItem = await Global.QuickSettingsSystemItem\n\t\tconst children = systemItem.child.get_children()\n\t\tlet screenshotItem: QuickSettingsItem\n\t\tlet settingsItem: QuickSettingsItem\n\t\tlet lockItem: QuickSettingsItem\n\t\tlet shutdownItem: QuickSettingsItem\n\t\tfor (const child of children) {\n\t\t\tif (child.constructor.name == \"ScreenshotItem\") {\n\t\t\t\tscreenshotItem = child as QuickSettingsItem\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (child.constructor.name == \"SettingsItem\") {\n\t\t\t\tsettingsItem = child as QuickSettingsItem\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (child.constructor.name == \"LockItem\") {\n\t\t\t\tlockItem = child as QuickSettingsItem\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (child.constructor.name == \"ShutdownItem\") {\n\t\t\t\tshutdownItem = child as QuickSettingsItem\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tscreenshot: screenshotItem,\n\t\t\tsettings: settingsItem,\n\t\t\tlock: lockItem,\n\t\t\tshutdown: shutdownItem,\n\t\t\tbattery: systemItem.powerToggle,\n\t\t\tlaptopSpacer: (systemItem as any)._laptopSpacer,\n\t\t\tdesktopSpacer: (systemItem as any)._desktopSpacer,\n\t\t\tbox: systemItem\n\t\t}\n\t}\n\n\toverride onLoad() {\n\t\tif (!this.enabled) return\n\t\tthis.getItmes().then(items => {\n\t\t\tif (this.hideLayout) {\n\t\t\t\tthis.maid.hideJob(items.box, ()=>true)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.hideBattery) {\n\t\t\t\tthis.maid.hideJob(items.battery, ()=>{\n\t\t\t\t\t(items.battery as any)._sync()\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.hideScreenshot) {\n\t\t\t\tthis.maid.hideJob(items.screenshot, ()=>true)\n\t\t\t}\n\t\t\tif (this.hideLock) {\n\t\t\t\tthis.maid.hideJob(items.lock, ()=>true)\n\t\t\t}\n\t\t\tif (this.hideShutdown) {\n\t\t\t\tthis.maid.hideJob(items.shutdown, ()=>true)\n\t\t\t}\n\t\t\tif (this.hideSettings) {\n\t\t\t\tthis.maid.hideJob(items.settings, ()=>true)\n\t\t\t}\n\t\t\tlet last: any\n\t\t\tfor (const [index, item] of this.order.entries()) {\n\t\t\t\tconst current = items[item]\n\t\t\t\tif (index) items.box.child.set_child_above_sibling(current, last)\n\t\t\t\tlast = current\n\t\t\t}\n\t\t}).catch(Logger.error)\n\t}\n\toverride onUnload(): void {}\n}\n"
  },
  {
    "path": "src/features/layout/toggles.ts",
    "content": "import {\n\tQuickToggle,\n\tQuickMenuToggle,\n} from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport { QuickSettingsToggleTracker } from \"../../libs/shell/quickSettingsUtils.js\"\nimport { ToggleOrderItem } from \"../../libs/types/toggleOrderItem.js\"\nimport Maid from \"../../libs/shared/maid.js\"\nimport Global from \"../../global.js\"\n\nexport class TogglesLayoutFeature extends FeatureBase {\n\t// #region settings\n\tenabled: boolean\n\torder: ToggleOrderItem[]\n\tunordered: ToggleOrderItem\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.enabled = loader.loadBoolean(\"toggles-layout-enabled\")\n\t\tthis.order = loader.loadValue(\"toggles-layout-order\")\n\t\tfor (const orderItem of this.order) {\n\t\t\tif (orderItem.titleRegex) {\n\t\t\t\torderItem.cachedTitleRegex = new RegExp(orderItem.titleRegex)\n\t\t\t}\n\t\t\tif (orderItem.nonOrdered) {\n\t\t\t\tthis.unordered = orderItem\n\t\t\t}\n\t\t}\n\t}\n\t// #endregion settings\n\n\tonToggleCreated(maid: Maid, toggle: QuickToggle|QuickMenuToggle): void {\n\t\tconst rule: ToggleOrderItem =\n\t\t\tthis.order.find(item => ToggleOrderItem.toggleMatch(item, toggle))\n\t\t\t?? this.unordered\n\t\tif (rule.hide) maid.hideJob(toggle)\n\t}\n\tonUpdate(): void {\n\t\tconst children = Global.QuickSettingsGrid.get_children()\n\t\tconst head: QuickToggle[] = []\n\t\tconst middle: QuickToggle[] = children.filter(child =>\n\t\t\t(\n\t\t\t\t(child instanceof QuickMenuToggle)\n\t\t\t\t|| (child instanceof QuickToggle)\n\t\t\t)\n\t\t\t&& child.constructor.name != \"BackgroundAppsToggle\"\n\t\t) as any\n\t\tconst tail: QuickToggle[] = []\n\t\tlet overNonOrdered: boolean = false\n\t\tfor (const item of this.order) {\n\t\t\tif (item.nonOrdered) {\n\t\t\t\toverNonOrdered = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst middleIndex = middle.findIndex(toggle => ToggleOrderItem.toggleMatch(item, toggle))\n\t\t\tif (middleIndex == -1) continue\n\t\t\tconst toggle = middle[middleIndex]\n\t\t\tmiddle.splice(middleIndex, 1);\n\t\t\t(overNonOrdered ? tail : head).push(toggle)\n\t\t}\n\t\tlet last: QuickToggle|null = null\n\t\tfor (const item of [head, middle, tail].flat()) {\n\t\t\tif (last) Global.QuickSettingsGrid.set_child_above_sibling(item, last)\n\t\t\tlast = item\n\t\t}\n\t}\n\n\ttracker: QuickSettingsToggleTracker\n\toverride onLoad(): void {\n\t\tif (!this.enabled) return\n\t\tthis.tracker = new QuickSettingsToggleTracker()\n\t\tthis.tracker.onToggleCreated = this.onToggleCreated.bind(this)\n\t\tthis.tracker.onUpdate = this.onUpdate.bind(this)\n\t\tthis.tracker.load()\n\t}\n\toverride onUnload(): void {\n\t\tconst tracker = this.tracker\n\t\tif (tracker) {\n\t\t\tthis.tracker = null\n\t\t\ttracker.unload()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/features/menuAnimation.ts",
    "content": "import Clutter from \"gi://Clutter\"\nimport Shell from \"gi://Shell\"\nimport { type QuickSettingsMenu } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport { FeatureBase, type SettingLoader } from \"../libs/shell/feature.js\"\nimport { QuickSettingsMenuTracker } from \"../libs/shell/quickSettingsUtils.js\"\nimport Global from \"../global.js\"\nimport Maid from \"../libs/shared/maid.js\"\n\nexport class MenuAnimation extends FeatureBase {\n\t// #region settings\n\tenabled: boolean\n\tbackgroundBlurRadius: number\n\tbakgroundBrightness: number\n\tbackgroundOpacity: number\n\tbackgroundScaleX: number\n\tbackgroundScaleY: number\n\tgridContentOpacity: number\n\topenDuration: number\n\tcloseDuration: number\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.enabled = loader.loadBoolean(\"menu-animation-enabled\")\n\t\tthis.backgroundBlurRadius = loader.loadInt(\"menu-animation-background-blur-radius\")\n\t\tthis.bakgroundBrightness = loader.loadInt(\"menu-animation-background-brightness\") / 1000\n\t\tthis.backgroundOpacity = loader.loadInt(\"menu-animation-background-opacity\")\n\t\tthis.backgroundScaleX = loader.loadInt(\"menu-animation-background-scale-x\") / 1000\n\t\tthis.backgroundScaleY = loader.loadInt(\"menu-animation-background-scale-y\") / 1000\n\t\tthis.openDuration = loader.loadInt(\"menu-animation-open-duration\")\n\t\tthis.closeDuration = loader.loadInt(\"menu-animation-close-duration\")\n\t\tthis.gridContentOpacity = loader.loadInt(\"menu-animation-grid-content-opacity\")\n\t}\n\t// #endregion settings\n\n\tonOpen(_maid: Maid, _menu: QuickSettingsMenu, isOpen: boolean) {\n\t\tif (this.blur) this.blur.enabled = isOpen\n\t\tif (isOpen) {\n\t\t\tGlobal.QuickSettingsBox.set_pivot_point(0.5, 0.5)\n\t\t\tGlobal.QuickSettingsBox.ease({\n\t\t\t\tduration: this.openDuration,\n\t\t\t\tmode: Clutter.AnimationMode.EASE_OUT_QUINT,\n\t\t\t\tscaleX: this.backgroundScaleX,\n\t\t\t\tscaleY: this.backgroundScaleY,\n\t\t\t\topacity: this.backgroundOpacity,\n\t\t\t})\n\t\t\tGlobal.QuickSettingsGrid.ease({\n\t\t\t\tduration: this.openDuration,\n\t\t\t\tmode: Clutter.AnimationMode.EASE_OUT_QUINT,\n\t\t\t\topacity: this.gridContentOpacity,\n\t\t\t})\n\t\t} else {\n\t\t\tGlobal.QuickSettingsBox.ease({\n\t\t\t\tduration: this.closeDuration,\n\t\t\t\tmode: Clutter.AnimationMode.EASE_OUT_QUINT,\n\t\t\t\tscaleX: 1,\n\t\t\t\tscaleY: 1,\n\t\t\t\topacity: 255,\n\t\t\t\tonComplete: ()=>{\n\t\t\t\t\tGlobal.QuickSettingsBox.set_pivot_point(0, 0)\n\t\t\t\t}\n\t\t\t})\n\t\t\tGlobal.QuickSettingsGrid.ease({\n\t\t\t\tduration: this.openDuration,\n\t\t\t\tmode: Clutter.AnimationMode.EASE_OUT_QUINT,\n\t\t\t\topacity: 255,\n\t\t\t})\n\t\t}\n\t}\n\n\tblur: Shell.BlurEffect\n\ttracker: QuickSettingsMenuTracker\n\toverride onLoad(): void {\n\t\tif (!this.enabled) return\n\n\t\tif (this.backgroundBlurRadius) {\n\t\t\tthis.blur = new Shell.BlurEffect({\n\t\t\t\tenabled: false,\n\t\t\t\tmode: Shell.BlurMode.ACTOR,\n\t\t\t\tradius: this.backgroundBlurRadius,\n\t\t\t\tbrightness: this.bakgroundBrightness,\n\t\t\t})\n\t\t\t// @ts-ignore Box pointer is private\n\t\t\tGlobal.QuickSettingsMenu._boxPointer.add_effect_with_name(\"blur\", this.blur)\n\t\t}\n\n\t\tthis.tracker = new QuickSettingsMenuTracker()\n\t\tthis.tracker.onMenuOpen = this.onOpen.bind(this)\n\t\tthis.tracker.load()\n\t}\n\toverride onUnload(): void {\n\t\tconst tracker = this.tracker\n\t\tif (!tracker) return\n\t\tthis.tracker = null\n\t\ttracker.unload()\n\t\tif (this.blur) {\n\t\t\t// @ts-ignore Box pointer is private\n\t\t\tGlobal.QuickSettingsMenu._boxPointer.remove_effect(this.blur)\n\t\t\tthis.blur = null\n\t\t}\n\t\tGlobal.QuickSettingsBox.remove_all_transitions()\n\t\tGlobal.QuickSettingsBox.scaleX = 1\n\t\tGlobal.QuickSettingsBox.scaleY = 1\n\t\tGlobal.QuickSettingsBox.opacity = 255\n\t\tGlobal.QuickSettingsBox.set_pivot_point(0, 0)\n\t}\n}\n"
  },
  {
    "path": "src/features/overlayMenu.ts",
    "content": "import Clutter from \"gi://Clutter\"\nimport { QuickSlider, type QuickSettingsMenu } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport { FeatureBase, type SettingLoader } from \"../libs/shell/feature.js\"\nimport { QuickSettingsMenuTracker } from \"../libs/shell/quickSettingsUtils.js\"\nimport * as AdvAni from \"../libs/shell/advani.js\"\nimport Global from \"../global.js\"\nimport Maid from \"../libs/shared/maid.js\"\n\nexport class OverlayMenu extends FeatureBase {\n\t// #region settings\n\tenabled: boolean\n\twidth: number\n\tduration: number\n\tanimationStyle: string\n\toverflowAnchor: string\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.enabled = loader.loadBoolean(\"overlay-menu-enabled\")\n\t\tthis.width = loader.loadInt(\"overlay-menu-width\")\n\t\tthis.duration = loader.loadInt(\"overlay-menu-animate-duration\")\n\t\tthis.animationStyle = loader.loadString(\"overlay-menu-animate-style\")\n\t\tthis.overflowAnchor = loader.loadString(\"overlay-menu-overflow-anchor\")\n\t}\n\t// #endregion settings\n\n\tgetCoords(menu: QuickSettingsMenu): {\n\t\touterHeight: number,\n\t\ttargetHeight: number,\n\t\ttargetWidth: number,\n\t\tsourceX: number,\n\t\tsourceY: number,\n\t\tsourceHeight: number,\n\t\tsourceWidth: number,\n\t\toffsetY: number,\n\t\toffsetX: number,\n\t} {\n\t\tmenu.actor.height = -1\n\t\tlet [outerHeight] = menu.actor.get_preferred_height(-1)\n\t\tconst targetWidth = menu.actor.width - menu.box.marginLeft - menu.box.marginRight\n\t\tconst targetHeight = outerHeight - menu.box.marginTop\n\t\tlet offsetY: number\n\t\tif (Global.QuickSettingsBox.height < targetHeight && this.overflowAnchor != \"center\") {\n\t\t\tif (this.overflowAnchor == \"top\") {\n\t\t\t\toffsetY = 0\n\t\t\t} else {\n\t\t\t\toffsetY = Global.QuickSettingsBox.height - targetHeight\n\t\t\t}\n\t\t} else {\n\t\t\toffsetY = Math.floor((Global.QuickSettingsBox.height - targetHeight) / 2)\n\t\t}\n\t\tconst isSlider = menu.sourceActor instanceof QuickSlider\n\t\tconst sourceHeight = Math.floor(menu.sourceActor.height + 0.5)\n\t\tconst sourceBaseWidth = Math.floor(menu.sourceActor.width + 0.5)\n\t\tconst sourceWidth = isSlider ? sourceHeight : sourceBaseWidth\n\t\tconst sourceBaseX = Math.floor(Global.QuickSettingsGrid.x + menu.sourceActor.x + 0.5)\n\t\tconst sourceY = Math.floor(Global.QuickSettingsGrid.y + menu.sourceActor.y + 0.5)\n\t\tconst sourceX = sourceBaseX + (isSlider ? (sourceBaseWidth - sourceWidth) : 0)\n\t\tconst offsetX = Math.floor((Global.QuickSettingsBox.width - targetWidth) / 2)\n\t\treturn {\n\t\t\touterHeight,\n\t\t\ttargetHeight,\n\t\t\ttargetWidth,\n\t\t\tsourceX,\n\t\t\tsourceY,\n\t\t\tsourceHeight,\n\t\t\tsourceWidth,\n\t\t\toffsetY,\n\t\t\toffsetX,\n\t\t}\n\t}\n\n\tonOpen(_maid: Maid, menu: QuickSettingsMenu, isOpen: boolean) {\n\t\tif (!isOpen || !this.duration) menu.actor.set_easing_duration(0)\n\t\telse menu.actor.remove_all_transitions()\n\t\tif (!isOpen) return\n\n\t\tconst coords = this.getCoords(menu)\n\t\tthis.yconstraint.offset = coords.offsetY\n\n\t\tif (this.duration) {\n\t\t\tmenu.box.opacity = 0\n\t\t\tmenu.box.ease({\n\t\t\t\topacity: 255,\n\t\t\t\tduration: Math.floor(this.duration / 3),\n\t\t\t})\n\t\t\tif (this.animationStyle == \"flyout\") {\n\t\t\t\tmenu.box.translation_x = Math.floor(coords.sourceX - coords.offsetX + menu.box.marginLeft)\n\t\t\t\tmenu.box.translation_y = Math.floor(coords.sourceY - coords.offsetY + menu.box.marginTop)\n\t\t\t\tmenu.box.scale_x = coords.sourceWidth / coords.targetWidth\n\t\t\t\tmenu.box.scale_y = coords.sourceHeight / coords.targetHeight\n\t\t\t\tAdvAni.ease(menu.box, {\n\t\t\t\t\ttranslation_x: 0,\n\t\t\t\t\ttranslation_y: 0,\n\t\t\t\t\tscale_x: 1,\n\t\t\t\t\tscale_y: 1,\n\t\t\t\t\tmode: AdvAni.AdvAnimationMode.LowBackover,\n\t\t\t\t\t// mode: Clutter.AnimationMode.EASE_OUT_EXPO,\n\t\t\t\t\tduration: this.duration,\n\t\t\t\t})\n\t\t\t} else if (this.animationStyle == \"dialog\") {\n\t\t\t\tmenu.box.translation_x = 0.2*coords.targetWidth*.5\n\t\t\t\tmenu.box.translation_y = 0.2*coords.targetHeight*.5\n\t\t\t\tmenu.box.scale_x = 0.8\n\t\t\t\tmenu.box.scale_y = 0.8\n\t\t\t\tAdvAni.ease(menu.box, {\n\t\t\t\t\ttranslation_x: 0,\n\t\t\t\t\ttranslation_y: 0,\n\t\t\t\t\tscale_x: 1,\n\t\t\t\t\tscale_y: 1,\n\t\t\t\t\tmode: AdvAni.AdvAnimationMode.MiddleBackover,\n\t\t\t\t\t// mode: Clutter.AnimationMode.EASE_OUT_EXPO,\n\t\t\t\t\tduration: this.duration,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tonMenuCreated(maid: Maid, menu: QuickSettingsMenu) {\n\t\tmenu.actor.get_constraints()[0].enabled = false\n\t\tif (this.width) {\n\t\t\tmenu.actor.width = this.width\n\t\t\tmenu.actor.x_expand = false\n\t\t}\n\t\tmaid.connectJob(menu.box, \"notify::height\", ()=>{\n\t\t\tif (!menu.isOpen) return\n\t\t\tconst coords = this.getCoords(menu)\n\t\t\tthis.yconstraint.offset = coords.offsetY\n\t\t})\n\t}\n\n\ttracker: QuickSettingsMenuTracker\n\tyconstraint: Clutter.BindConstraint\n\toverride reload(changedKey?: string): void {\n\t\tif (changedKey == \"overlay-menu-animate-duration\") return\n\t\tif (changedKey == \"overlay-menu-animate-style\") return\n\t\tif (changedKey == \"overlay-menu-overflow-anchor\") return\n\t\tsuper.reload(changedKey)\n\t}\n\toverride onLoad(): void {\n\t\tif (!this.enabled) return\n\n\t\t// Offset handle\n\t\tthis.yconstraint = new Clutter.BindConstraint({\n\t\t\tcoordinate: Clutter.BindCoordinate.Y,\n\t\t\t// @ts-ignore Box pointer is private\n\t\t\tsource: Global.QuickSettingsMenu._boxPointer,\n\t\t})\n\n\t\t// Disable Y sync (overlay y offset)\n\t\t// @ts-ignore Overlay is private field\n\t\tGlobal.QuickSettingsMenu._overlay.get_constraints()[0].enabled = false\n\t\t// @ts-ignore Overlay is private field\n\t\tGlobal.QuickSettingsMenu._overlay.add_constraint(this.yconstraint)\n\n\t\t// Disable Placeholder height sync (grid height increase)\n\t\t// @ts-ignore Overlay is private field\n\t\tGlobal.QuickSettingsGrid.layout_manager._overlay.get_constraints()[0].enabled = false\n\n\t\tthis.tracker = new QuickSettingsMenuTracker()\n\t\tthis.tracker.onMenuCreated = this.onMenuCreated.bind(this)\n\t\tthis.tracker.onMenuOpen = this.onOpen.bind(this)\n\t\tthis.tracker.load()\n\t}\n\toverride onUnload(): void {\n\t\tconst tracker = this.tracker\n\t\tif (!tracker) return\n\t\tthis.tracker = null\n\t\tfor (const menu of tracker.items) {\n\t\t\tmenu.actor.x_expand = true\n\t\t\tmenu.actor.get_constraints()[0].enabled = true\n\t\t}\n\t\ttracker.unload()\n\t\t// @ts-ignore Overlay is private field\n\t\tGlobal.QuickSettingsMenu._overlay.get_constraints()[0].enabled = true\n\t\t// @ts-ignore Overlay is private field\n\t\tGlobal.QuickSettingsGrid.layout_manager._overlay.get_constraints()[0].enabled = true\n\t\t// @ts-ignore Overlay is private field\n\t\tGlobal.QuickSettingsMenu._overlay.remove_constraint(this.yconstraint)\n\t}\n}\n"
  },
  {
    "path": "src/features/toggle/unsafeQuickToggle.ts",
    "content": "import GObject from \"gi://GObject\"\nimport { gettext as _ } from \"resource:///org/gnome/shell/extensions/extension.js\"\nimport { QuickToggle, SystemIndicator } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport Global from \"../../global.js\"\n\n// #region UnsafeQuickToggle\nclass UnsafeQuickToggle extends QuickToggle {\n\t_onUpdate: (value: boolean)=>void\n\tconstructor(onUpdate: UnsafeQuickToggle[\"_onUpdate\"]) { super(onUpdate as any) }\n\t_init(onUpdate: any) {\n\t\tsuper._init({\n\t\t\ttitle: _(\"Unsafe Mode\"),\n\t\t\ticonName: \"channel-insecure-symbolic\",\n\t\t})\n\t\tthis._onUpdate = onUpdate\n\n\t\t// bind click\n\t\tthis.connect(\"clicked\", this._toggleMode.bind(this))\n\n\t\t// Fetch global context\n\t\tthis._sync()\n\t}\n\n\t_updateIcon() {\n\t\tthis.iconName = this.checked ? \"channel-insecure-symbolic\" : \"channel-secure-symbolic\"\n\t}\n\n\t// Toggle context\n\t_toggleMode() {\n\t\tthis.checked = !global.context.unsafe_mode\n\t\tglobal.context.unsafe_mode = this.checked\n\t\tthis._updateIcon()\n\t\tthis._onUpdate(this.checked)\n\t}\n\n\t// Sync context\n\t_sync() {\n\t\tthis.checked = global.context.unsafe_mode\n\t\tthis._updateIcon()\n\t}\n}\nGObject.registerClass(UnsafeQuickToggle)\n// #endregion UnsafeQuickToggle\n\n// #region UnsafeIndicator\nclass UnsafeIndicator extends SystemIndicator {\n\tconstructor(onUpdate: UnsafeQuickToggle[\"_onUpdate\"]) { super(onUpdate as any) }\n\t// @ts-ignore\n\t_init(onUpdate: any) {\n\t\tsuper._init()\n\t\tthis.quickSettingsItems.push(new UnsafeQuickToggle(onUpdate))\n\t}\n\tdestroy() {\n\t\tthis.quickSettingsItems.forEach(item => item.destroy())\n\t\tsuper.destroy()\n\t}\n}\nGObject.registerClass(UnsafeIndicator)\nexport { UnsafeIndicator }\n// #endregion UnsafeIndicator\n\n// #region UnsafeQuickToggleFeature\nexport class UnsafeQuickToggleFeature extends FeatureBase {\n\t// #region settings\n\tenabled: boolean\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.enabled = loader.loadBoolean(\"unsafe-quick-toggle-enabled\")\n\t}\n\t// #endregion settings\n\n\tindicator: UnsafeIndicator\n\toverride onLoad(): void {\n\t\tif (!this.enabled) return\n\n\t\t// Load last state\n\t\tif (Global.Settings.get_boolean(\"unsafe-quick-toggle-save-last-state\")) {\n\t\t\tglobal.context.unsafe_mode = Global.Settings.get_boolean(\"unsafe-quick-toggle-last-state\")\n\t\t}\n\n\t\t// Add Unsafe Quick Toggle\n\t\tthis.maid.destroyJob(\n\t\t\tthis.indicator = new UnsafeIndicator(\n\t\t\t\t(state) => Global.Settings.set_boolean(\"unsafe-quick-toggle-last-state\", state)\n\t\t\t)\n\t\t)\n\t\t// @ts-expect-error Missing addExternalIndicator method (QuickSettings is private class)\n\t\tGlobal.QuickSettings.addExternalIndicator(this.indicator)\n\t}\n\toverride onUnload(): void {\n\t\tglobal.context.unsafe_mode = false\n\t\tthis.indicator = null\n\t}\n}\n// #endregion UnsafeQuickToggleFeature\n"
  },
  {
    "path": "src/features/widget/media.ts",
    "content": "import St from \"gi://St\"\nimport Clutter from \"gi://Clutter\"\nimport GObject from \"gi://GObject\"\nimport GLib from \"gi://GLib\"\nimport Gio from \"gi://Gio\"\nimport GdkPixbuf from \"gi://GdkPixbuf\"\nimport Shell from \"gi://Shell\"\n// @ts-expect-error idk why\nimport Soup from \"gi://Soup\"\nimport * as Main from \"resource:///org/gnome/shell/ui/main.js\"\nimport * as MessageList from \"resource:///org/gnome/shell/ui/messageList.js\"\nimport { loadInterfaceXML } from \"resource:///org/gnome/shell/misc/fileUtils.js\"\nimport { Slider } from \"resource:///org/gnome/shell/ui/slider.js\"\nimport { PageIndicators } from \"resource:///org/gnome/shell/ui/pageIndicators.js\"\nimport { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport { Rgb } from \"../../libs/shared/colors.js\"\nimport { getImageMeanColor } from \"../../libs/shared/imageUtils.js\"\nimport { lerp } from \"../../libs/shared/jsUtils.js\"\nimport { Drag, Scroll } from \"../../libs/shell/gesture.js\"\nimport { RoundClipEffect } from \"../../libs/shell/effects.js\"\nimport { StyledSlider } from \"../../libs/shell/styler.js\"\nimport Global from \"../../global.js\"\nimport Logger from \"../../libs/shared/logger.js\"\n\n// #region Player\nclass Player extends GObject.Object {\n\tprivate _playerProxy: Gio.DBusProxy\n\tprivate _propertiesProxy: Gio.DBusProxy\n\tprivate _mprisProxy: Gio.DBusProxy\n\n\tsource: MessageList.Source\n\tcanPlay: boolean\n\tcanSeek: boolean\n\n\tconstructor(busName: string) {\n\t\tsuper()\n\t\tthis._busName = busName\n\t\tthis.source = new MessageList.Source()\n\n\t\t// Create properties proxy for Position\n\t\tconst propertiesIface = Global.GetDbusInterface(\"media/dbus.xml\",\"org.freedesktop.DBus.Properties\")\n\t\tconst propertiesPromise = Gio.DBusProxy.new(\n\t\t\tGio.DBus.session,\n\t\t\tGio.DBusProxyFlags.NONE,\n\t\t\tpropertiesIface,\n\t\t\tbusName,\n\t\t\t\"/org/mpris/MediaPlayer2\",\n\t\t\tpropertiesIface.name,\n\t\t\tnull,\n\t\t)\n\t\t// @ts-expect-error Missing promise type support\n\t\t.then((proxy: Gio.DbusProxy) => this._propertiesProxy = proxy)\n\t\t.catch(Logger.error)\n\n\t\t// Create proxy for seeking\n\t\tconst playerIface = Global.GetDbusInterface(\"media/dbus.xml\",\"org.mpris.MediaPlayer2.Player\")\n\t\tconst playerPromise = Gio.DBusProxy.new(\n\t\t\tGio.DBus.session,\n\t\t\tGio.DBusProxyFlags.NONE,\n\t\t\tplayerIface,\n\t\t\tbusName,\n\t\t\t\"/org/mpris/MediaPlayer2\",\n\t\t\tplayerIface.name,\n\t\t\tnull,\n\t\t)\n\t\t// @ts-expect-error Missing promise type support\n\t\t.then((proxy: Gio.DbusProxy) => this._playerProxy = proxy)\n\t\t.catch(Logger.error)\n\n\t\t// Create proxy for mpris\n\t\tconst mprisIface = Global.GetDbusInterface(\"media/dbus.xml\",\"org.mpris.MediaPlayer2\")\n\t\tconst mprisPromise = Gio.DBusProxy.new(\n\t\t\tGio.DBus.session,\n\t\t\tGio.DBusProxyFlags.NONE,\n\t\t\tmprisIface,\n\t\t\tbusName,\n\t\t\t\"/org/mpris/MediaPlayer2\",\n\t\t\tmprisIface.name,\n\t\t\tnull,\n\t\t)\n\t\t// @ts-expect-error Missing promise type support\n\t\t.then((proxy: Gio.DbusProxy) => this._mprisProxy = proxy)\n\t\t.catch(Logger.error)\n\n\t\t// Waitting for proxies\n\t\tPromise.all([\n\t\t\tplayerPromise,\n\t\t\tpropertiesPromise,\n\t\t\tmprisPromise\n\t\t])\n\t\t.then(this._ready.bind(this))\n\t\t.catch(Logger.error)\n\t}\n\n\t// Position\n\tget position(): Promise<number|null> {\n\t\treturn this._propertiesProxy.GetAsync(\n\t\t\t\"org.mpris.MediaPlayer2.Player\",\n\t\t\t\"Position\"\n\t\t).then((result: any) => {\n\t\t\treturn result[0].get_int64()\n\t\t}).catch(()=> null)\n\t}\n\tset position(value: number) {\n\t\tthis._playerProxy.SetPositionAsync(\n\t\t\tthis._trackId,\n\t\t\tMath.min(this._length, Math.max(1, value))\n\t\t).catch(Logger.error)\n\t}\n\n\t// States\n\tprivate _busName: string\n\tprivate _trackId: string\n\tprivate _length: number | null\n\tprivate _trackArtists: string[] | null\n\tprivate _trackTitle: string | null\n\tprivate _trackCoverUrl: string | null\n\tprivate _app: Shell.App | null\n\tget busName(): string {\n\t\treturn this._busName\n\t}\n\tget trackId(): string {\n\t\treturn this._trackId\n\t}\n\tget length(): number|null {\n\t\treturn this._length\n\t}\n\tget trackArtists(): string[] | null {\n\t\treturn this._trackArtists\n\t}\n\tget trackTitle(): string | null {\n\t\treturn this._trackTitle\n\t}\n\tget trackCoverUrl(): string | null {\n\t\treturn this._trackCoverUrl\n\t}\n\tget app(): Shell.App | null {\n\t\treturn this._app\n\t}\n\tget canGoNext(): boolean | null {\n\t\treturn this._playerProxy.CanGoNext\n\t}\n\tget canGoPrevious(): boolean | null {\n\t\treturn this._playerProxy.CanGoPrevious\n\t}\n\tget status(): string | null {\n\t\treturn this._playerProxy.PlaybackStatus\n\t}\n\n\t// Update states\n\t_parseMetadata(metadata: any) {\n\t\tif (!metadata) {\n\t\t\tthis._trackId = null\n\t\t\tthis._length = null\n\t\t\tthis._trackArtists = null\n\t\t\tthis._trackCoverUrl = null\n\t\t\treturn\n\t\t}\n\n\t\tthis._trackId = metadata[\"mpris:trackid\"]?.get_string()[0] ?? null\n\t\t\n\t\tthis._length = metadata[\"mpris:length\"]?.deepUnpack() ?? null\n\n\t\t// Get trak artists\n\t\tthis._trackArtists = metadata['xesam:artist']?.deepUnpack()\n\t\tif (typeof this._trackArtists === \"string\") {\n\t\t\tthis._trackArtists = [this._trackArtists]\n\t\t} else if (\n\t\t\t!Array.isArray(this._trackArtists)\n\t\t\t|| !this._trackArtists.every(artist => typeof artist === 'string')\n\t\t) {\n\t\t\tthis._trackArtists = [(_)('Unknown artist')]\n\t\t}\n\n\t\t// Get track title\n\t\tthis._trackTitle = metadata['xesam:title']?.deepUnpack()\n\t\tif (typeof this._trackTitle !== 'string') {\n\t\t\tthis._trackTitle = _('Unknown title')\n\t\t}\n\n\t\t// Get track cover\n\t\tthis._trackCoverUrl = metadata['mpris:artUrl']?.deepUnpack()\n\t\tif (typeof this._trackCoverUrl !== 'string') {\n\t\t\tthis._trackCoverUrl = null\n\t\t}\n\n\t\t// Update desktop entry\n\t\tif (this._mprisProxy.DesktopEntry) {\n\t\t\tthis._app = Shell.AppSystem.get_default().lookup_app(\n\t\t\t\tthis._mprisProxy.DesktopEntry + \".desktop\"\n\t\t\t)\n\t\t} else {\n\t\t\tthis._app = null\n\t\t}\n\n\t\t// Update source\n\t\tthis.source.set({\n\t\t\ttitle: this._app?.get_name() ?? this._mprisProxy.Identity,\n\t\t\ticon: this._app?.get_icon() ?? null,\n\t\t})\n\n\t\t// Update can play\n\t\tthis.canPlay = !!this._playerProxy.CanPlay\n\t\tthis.canSeek = this._playerProxy.CanSeek\n\t}\n\t_update() {\n\t\ttry {\n\t\t\tconst metadata = (this as any)._playerProxy.Metadata\n\t\t\tthis._parseMetadata(metadata)\n\t\t} catch {}\n\t\tthis.emit(\"changed\")\n\t}\n\n\t// Methods\n\tprevious() {\n\t\tthis._playerProxy.PreviousAsync()\n\t\t\t.catch(Logger.error)\n\t}\n\tnext() {\n\t\tthis._playerProxy.NextAsync()\n\t\t\t.catch(Logger.error)\n\t}\n\tplayPause() {\n\t\tthis._playerProxy.PlayPauseAsync()\n\t\t\t.catch(Logger.error)\n\t}\n\traise() {\n\t\tif (this._app) {\n\t\t\tthis._app.activate()\n\t\t} else if (this._mprisProxy.CanRaise) {\n\t\t\tthis._mprisProxy.RaiseAsync().catch(logError)\n\t\t}\n\t}\n\tisPlaying(): boolean {\n\t\treturn this.status === \"Playing\"\n\t}\n\n\t// Proxy handling\n\t_ready() {\n\t\t// Connect mpris proxy\n\t\tthis._mprisProxy.connectObject('notify::g-name-owner',\n\t\t\t() => {\n\t\t\t\tif (!this._mprisProxy.g_name_owner) this._close()\n\t\t\t},\n\t\t\tthis\n\t\t)\n\t\tif (!this._mprisProxy.g_name_owner) this._close()\n\n\t\t// Connect player proxy\n\t\tthis._playerProxy.connectObject(\n\t\t\t'g-properties-changed',\n\t\t\tthis._update.bind(this),\n\t\t\tthis\n\t\t)\n\n\t\tthis._update()\n\t}\n\t_close() {\n\t\tthis._mprisProxy.disconnectObject(this)\n\t\tthis._playerProxy.disconnectObject(this)\n\t\tthis._mprisProxy = null\n\t\tthis._playerProxy = null\n\t\tthis._propertiesProxy = null\n\t}\n}\nGObject.registerClass({\n\tProperties: {\n\t\t\"can-play\": GObject.ParamSpec.boolean(\n\t\t\t\"can-play\", null, null,\n\t\t\tGObject.ParamFlags.READWRITE,\n\t\t\tfalse\n\t\t),\n\t\t\"can-seek\": GObject.ParamSpec.boolean(\n\t\t\t\"can-seek\", null, null,\n\t\t\tGObject.ParamFlags.READWRITE,\n\t\t\tfalse\n\t\t),\n\t},\n\tSignals: {\n\t\t\"changed\": {},\n\t},\n}, Player)\n// #endregion Player\n\n// #region Source\n// Copied from gnome source; for backward compatibility\n// https://github.com/GNOME/gnome-shell/blob/ef4af961bfb39911ae09cb95e1e57d374c70fe1d/js/ui/mpris.js#L189\nconst DBusIface = loadInterfaceXML(\"org.freedesktop.DBus\")\nconst DBusProxy = Gio.DBusProxy.makeProxyWrapper(DBusIface)\nconst MPRIS_PLAYER_PREFIX = \"org.mpris.MediaPlayer2.\"\nclass Source extends GObject.Object {\n\t_players: Map<string, Player>\n\t_proxy: Gio.DBusProxy\n\n\t_init() {\n\t\tsuper._init()\n\t\tthis._players = new Map()\n\t}\n\n\tstart() {\n\t\t// @ts-expect-error Type error (DBusProxy is not a class)\n\t\tthis._proxy = new DBusProxy(Gio.DBus.session,\n\t\t\t'org.freedesktop.DBus',\n\t\t\t'/org/freedesktop/DBus',\n\t\t\tthis._onProxyReady.bind(this)\n\t\t)\n\t}\n\n\tget players(): Player[] {\n\t\treturn [...this._players.values()]\n\t}\n\n\tprivate _addPlayer(busName: string) {\n\t\tif (this._players.has(busName)) return\n\t\tconst player = new Player(busName)\n\t\tthis._players.set(busName, player)\n\n\t\tplayer.connectObject(\"notify::can-play\",\n\t\t\t() => {\n\t\t\t\tthis.emit(\n\t\t\t\t\tplayer.canPlay ? \"player-added\" : \"player-removed\",\n\t\t\t\t\tplayer\n\t\t\t\t)\n\t\t\t},\n\t\t\tthis\n\t\t)\n\t}\n\n\tprivate async _onProxyReady() {\n\t\tconst [names]: [string[]] = await this._proxy.ListNamesAsync()\n\t\tfor (const name of names) {\n\t\t\tif (!name.startsWith(MPRIS_PLAYER_PREFIX)) continue\n\t\t\tthis._addPlayer(name)\n\t\t}\n\n\t\t// @ts-expect-error\n\t\tthis._proxy.connectSignal(\n\t\t\t'NameOwnerChanged',\n\t\t\tthis._onNameOwnerChanged.bind(this)\n\t\t)\n\t}\n\n\tprivate _onNameOwnerChanged(proxy: any, sender: any, [name, oldOwner, newOwner]: any[]) {\n\t\tif (!name.startsWith(MPRIS_PLAYER_PREFIX)) return\n\t\tif (oldOwner) {\n\t\t\tconst player = this._players.get(name)\n\t\t\tif (player) {\n\t\t\t\tthis._players.delete(name)\n\t\t\t\tplayer.disconnectObject(this)\n\t\t\t\tthis.emit('player-removed', player)\n\t\t\t}\n\t\t}\n\t\tif (newOwner) this._addPlayer(name)\n\t}\n}\nGObject.registerClass({\n\tSignals: {\n\t\t\"player-added\": {param_types: [Player as any]},\n\t\t\"player-removed\": {param_types: [Player as any]},\n\t},\n}, Source)\n// #endregion\n\n// #region ProgressControl\nclass ProgressControl extends St.BoxLayout {\n\t_positionLabel: St.Label\n\t_lengthLabel: St.Label\n\t_slider: Slider\n\t_player: Player\n\t_positionTracker: number|null\n\t_dragging: boolean\n\t_shown: boolean\n\t_options: ProgressControl.Options\n\n\tconstructor(player: Player, options: ProgressControl.Options) {\n\t\tsuper(player as any, options as any)\n\t}\n\t_init(player: Player, options: ProgressControl.Options): void {\n\t\tthis._player = player\n\t\tthis._positionTracker = null\n\t\tthis._dragging = false\n\t\tthis._shown = false\n\t\tthis._options = options\n\n\t\tsuper._init({\n\t\t\tx_expand: true,\n\t\t\tstyle_class: \"QSTWEAKS-progress-control\",\n\t\t})\n\n\t\tthis._createLabels()\n\t\tthis._createSlider()\n\n\t\tthis.add_child(this._positionLabel)\n\t\tthis.add_child(this._slider)\n\t\tthis.add_child(this._lengthLabel)\n\n\t\tthis.connect(\"notify::mapped\", this._updateTracker.bind(this))\n\t\tthis.connect(\"destroy\", this._dropTracker.bind(this))\n\t\tthis._player.connectObject(\"changed\", () => this._updateStatus(), this)\n\t}\n\n\t// Create position, length label\n\t_createLabels() {\n\t\tthis._positionLabel = new St.Label({\n\t\t\ty_expand: true,\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t\tstyle_class: \"QSTWEAKS-position-label\",\n\t\t})\n\t\tthis._lengthLabel = new St.Label({\n\t\t\ty_expand: true,\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t\tstyle_class: \"QSTWEAKS-length-label\",\n\t\t})\n\t}\n\n\t// Create slider and connect drag event\n\t_createSlider() {\n\t\tconst oldSlider = this._slider\n\t\tconst slider = this._slider ??= new Slider(0)\n\n\t\t// Update style\n\t\tslider.style = StyledSlider.getStyle(this._options.sliderStyle)\n\t\tif (oldSlider) return\n\n\t\t// Process Dragging\n\t\tslider.connectObject(\"drag-begin\", () => {\n\t\t\tthis._dragging = true\n\t\t\treturn Clutter.EVENT_PROPAGATE\n\t\t}, this)\n\t\tslider.connectObject(\"drag-end\", () => {\n\t\t\tthis._player.position = (Math.floor(slider.value) * 1000000)\n\t\t\tthis._dragging = false\n\t\t\treturn Clutter.EVENT_PROPAGATE\n\t\t}, this)\n\t\tslider.connectObject(\"scroll-event\", () => {\n\t\t\treturn Clutter.EVENT_STOP\n\t\t}, this)\n\t\tslider.connectObject(\"notify::value\", () => {\n\t\t\tif (this._dragging) this._updatePosition(Math.floor(slider.value) * 1000000)\n\t\t}, this)\n\t}\n\n\t// Show / Hide by playing status\n\t_updateStatus(noAnimate?: boolean) {\n\t\tif (!this.mapped) return\n\t\tthis._shown = this._player.isPlaying()\n\t\tif (this._shown) this._trackPosition()\n\t\tconst previousHeight = this.height\n\t\tthis.height = -1\n\t\tconst height = this._shown ? this.get_preferred_height(-1)[0] : 0\n\t\tthis.height = previousHeight\n\t\tconst opacity = this._shown ? 255 : 0\n\t\tif (noAnimate) {\n\t\t\tthis.remove_all_transitions()\n\t\t\tthis.height = height\n\t\t\tthis.opacity = opacity\n\t\t\treturn\n\t\t}\n\t\tif (this._shown) {\n\t\t\tthis.ease({\n\t\t\t\theight,\n\t\t\t\tduration: 150,\n\t\t\t\tonComplete: ()=>{\n\t\t\t\t\tthis.ease({\n\t\t\t\t\t\topacity,\n\t\t\t\t\t\tduration: 150,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tthis.ease({\n\t\t\t\topacity,\n\t\t\t\tduration: 200,\n\t\t\t\tonComplete: ()=>{\n\t\t\t\t\tthis.ease({\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tduration: 150,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\t// Update slider and label\n\t_updatePosition(current: number) {\n\t\tconst currentSeconds = Math.floor(current / 1000000)\n\t\tconst lengthSeconds = Math.floor(this._player.length / 1000000)\n\t\tthis._positionLabel.text = this._formatSeconds(currentSeconds)\n\t\tthis._lengthLabel.text = this._formatSeconds(lengthSeconds)\n\t\tthis._slider.overdriveStart = this._slider.maximumValue = lengthSeconds\n\t\tthis._slider.value = currentSeconds\n\t}\n\n\t// Use polling to update position when only shown\n\t_trackPosition() {\n\t\tthis._slider.reactive = this._player.canSeek\n\t\tif (this._shown && !this._dragging) {\n\t\t\tthis._player.position\n\t\t\t\t.then(this._updatePosition.bind(this))\n\t\t\t\t.catch(Logger.error)\n\t\t}\n\t\treturn GLib.SOURCE_CONTINUE\n\t}\n\t_dropTracker() {\n\t\tif (this._positionTracker === null) return\n\t\tGLib.source_remove(this._positionTracker)\n\t\tthis._positionTracker = null\n\t}\n\t_createTracker() {\n\t\tthis._positionTracker = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, this._trackPosition.bind(this))\n\t\tGLib.source_set_name_by_id(\n\t\t\tthis._positionTracker,\n\t\t\t\"[quick-settings-tweaks] ProgressControl._createTracker: this._positionTracker\"\n\t\t)\n\t}\n\t_updateTracker() {\n\t\tif (this.mapped) this._createTracker()\n\t\telse this._dropTracker()\n\t\tthis._updateStatus(true)\n\t}\n\n\t// Seconds => HH:MM:SS or MM:SS\n\t_formatSeconds(seconds: number) {\n\t\tconst minutes = Math.floor(seconds / 60) % 60\n\t\tconst hours = Math.floor(seconds / 3600) % 60\n\t\tseconds %= 60\n\n\t\tconst secondsPadded = seconds.toString().padStart(2, \"0\")\n\t\tconst minutesPadded = minutes.toString().padStart(2, \"0\")\n\n\t\tif (hours > 0) return `${hours}:${minutesPadded}:${secondsPadded}`\n\t\treturn `${minutes}:${secondsPadded}`\n\t}\n}\nGObject.registerClass(ProgressControl)\nnamespace ProgressControl {\n\texport interface OptionsBase {\n\t\tsliderStyle: StyledSlider.Options\n\t}\n\texport type Options = {\n\t} & OptionsBase\n}\n// #endregion ProgressControl\n\n// #region MediaItem\nclass MediaItem extends MessageList.Message {\n\t// Gnome 48 doesn't exports MediaMessage, so we should implement it\n\t// (i have no idea why, backward compatibility killer)\n\t_player: Player\n\t_cachedColors: Map<string, Promise<void | [number, number, number]>>\n\t_options: MediaItem.Options\n\t_progressControl?: ProgressControl\n\t_prevButton: St.Button\n\t_pauseButton: St.Button\n\t_nextButton: St.Button\n\n\tconstructor(player: Player, options: MediaItem.Options) {\n\t\tsuper(player.source)\n\t\tthis.add_style_class_name('media-message')\n\n\t\tthis._options = options\n\t\tthis._player = player\n\t\tthis.addEventStop((this as any)._header)\n\n\t\t// Create controls\n\t\tif (options.progressEnabled) {\n\t\t\tthis.child.add_child(\n\t\t\t\tthis._progressControl = new ProgressControl(player, options)\n\t\t\t)\n\t\t}\n\t\tthis._createControlButtons()\n\n\t\t// Connect player\n\t\tthis._player.connectObject(\n\t\t\t'changed', this._update.bind(this),\n\t\t\tthis\n\t\t)\n\t\tthis._update()\n\t}\n\n\t// Create and update control buttons\n\t_createControlButtons() {\n\t\tconst options = this._options\n\t\tif (options.showPrevButton) this._prevButton ??= this.addEventStop(this.addMediaControl(\n\t\t\t'media-skip-backward-symbolic',\n\t\t\t() => this._player.previous()\n\t\t) as unknown as St.Button)\n\t\tif (options.showPauseButton) this._pauseButton ??= this.addEventStop(this.addMediaControl(\n\t\t\t'',\n\t\t\t() => this._player.playPause()\n\t\t) as unknown as St.Button)\n\t\tif (options.showNextButton) this._nextButton ??= this.addEventStop(this.addMediaControl(\n\t\t\t'media-skip-forward-symbolic',\n\t\t\t() => this._player.next()\n\t\t) as unknown as St.Button)\n\t\tconst opacity = options.contorlOpacity\n\t\tif (this._nextButton) this._nextButton.opacity = opacity\n\t\tif (this._prevButton) this._prevButton.opacity = opacity\n\t\tif (this._pauseButton) this._pauseButton.opacity = opacity\n\t}\n\n\t// Sync to player\n\t_update() {\n\t\t// Get icon\n\t\tlet icon: Gio.Icon\n\t\tif (this._player.trackCoverUrl) {\n\t\t\tconst file = Gio.File.new_for_uri(this._player.trackCoverUrl)\n\t\t\ticon = new Gio.FileIcon({file});\n\t\t} else {\n\t\t\ticon = new Gio.ThemedIcon({name: 'audio-x-generic-symbolic'})\n\t\t}\n\n\t\t// Get artist string\n\t\tconst trackArtists: string =\n\t\t\tthis._player.trackArtists?.join(\",\") ?? \"\"\n\n\t\t// Update base informations\n\t\tthis.set({\n\t\t\ttitle: this._player.trackTitle,\n\t\t\tbody: trackArtists,\n\t\t\ticon,\n\t\t})\n\n\t\t// Update control buttons\n\t\tif (this._pauseButton) {\n\t\t\tlet isPlaying = this._player.status === 'Playing';\n\t\t\tlet iconName = isPlaying\n\t\t\t\t? 'media-playback-pause-symbolic'\n\t\t\t\t: 'media-playback-start-symbolic';\n\t\t\t(this._pauseButton.child as St.Icon).icon_name = iconName\n\t\t}\n\t\tif (this._prevButton)\n\t\t\tthis._prevButton.reactive = this._player.canGoPrevious\n\t\tif (this._nextButton)\n\t\t\tthis._nextButton.reactive = this._player.canGoNext\n\n\t\tthis._updateGradient()\n\t}\n\t_updateGradient(): void {\n\t\t// If disabled\n\t\tif (!this._options?.gradientEnabled) {\n\t\t\tthis.style = \"\"\n\t\t\treturn\n\t\t}\n\n\t\t// Push get color task, use cache if possible\n\t\tthis._cachedColors ??= new Map()\n\t\tconst coverUrl = this._player.trackCoverUrl\n\t\tlet colorTask;\n\n\t\tif (!coverUrl || coverUrl.endsWith(\".svg\")) return\n\n\t\tif (coverUrl.startsWith(\"file://\")) {\n\t\t\tconst coverPath = decodeURIComponent(coverUrl.replace(/^file:\\/\\//,\"\"))\n\t\t\tcolorTask = this._cachedColors.get(coverPath)\n\t\t\tif (!colorTask) {\n\t\t\t\tlet pixbuf: GdkPixbuf.Pixbuf;\n\t\t\t\ttry {\n\t\t\t\t\tpixbuf = GdkPixbuf.Pixbuf.new_from_file(coverPath)\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn\n\t\t\t\t}  finally {\n\t\t\t\t\tif (!pixbuf) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tcolorTask = getImageMeanColor(pixbuf)\n\t\t\t\t\tthis._cachedColors.set(coverPath, colorTask)\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (coverUrl.startsWith(\"https://\") || coverUrl.startsWith(\"http://\")) {\n\t\t\tconst coverPath = decodeURIComponent(coverUrl.replace(/^https?:\\/\\//,\"\").replace(/^http?:\\/\\//,\"\"))\n\t\t\tcolorTask = this._cachedColors.get(coverPath)\n\n\t\t\tif (!colorTask) {\n\t\t\t\tconst session = new Soup.Session();\n\t\t\t\tconst uri = GLib.Uri.parse(coverUrl, GLib.UriFlags.NONE);\n\t\t\t\tconst message = new Soup.Message({method: 'GET', uri});\n\n\t\t\t\tcolorTask = session.send_and_read_async(message, null, null)\n\t\t\t\t\t.then(img_bytes => {\n\t\t\t\t\t\tif (!img_bytes) throw new Error(\"No image data received\");\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst stream = Gio.MemoryInputStream.new_from_bytes(img_bytes);\n\t\t\t\t\t\tconst pixbuf = GdkPixbuf.Pixbuf.new_from_stream(stream as any, null);\n\t\t\t\t\t\treturn getImageMeanColor(pixbuf);\n\t\t\t\t\t})\n\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t});\n\n\t\t\t\tthis._cachedColors.set(coverPath, colorTask);\n\t\t\t}\n\t\t}\n\n\t\t// Update style\n\t\tcolorTask.then(color=>{\n\t\t\tif (!color) return\n\t\t\tif (!this._cachedColors) return\n\t\t\tconst mixStart = this._options.gradientStartMix / 1000\n\t\t\tconst mixEnd = this._options.gradientEndMix / 1000\n\t\t\tconst [bgr, bgg, bgb] = this._options.gradientBackground\n\t\t\tconst [r,g,b] = color\n\t\t\tthis.style =\n\t\t\t\t`background-gradient-direction:horizontal;background-gradient-start:rgba(${\n\t\t\t\t\tlerp(bgr, r, mixStart)\n\t\t\t\t},${\n\t\t\t\t\tlerp(bgg, g, mixStart)\n\t\t\t\t},${\n\t\t\t\t\tlerp(bgb, b, mixStart)\n\t\t\t\t},${\n\t\t\t\t\tthis._options.gradientStartOpaque/1000\n\t\t\t\t});background-gradient-end:rgba(${\n\t\t\t\t\tlerp(bgr, r, mixEnd)\n\t\t\t\t},${\n\t\t\t\t\tlerp(bgg, g, mixEnd)\n\t\t\t\t},${\n\t\t\t\t\tlerp(bgb, b, mixEnd)\n\t\t\t\t},${\n\t\t\t\t\tthis._options.gradientEndOpaque/1000\n\t\t\t\t});`\n\t\t})\n\t}\n\n\t// Pass all gesture actions to the parent\n\tvfunc_button_press_event(_event: Clutter.Event): boolean {\n\t\treturn Clutter.EVENT_PROPAGATE\n\t}\n\tvfunc_button_release_event(_event: Clutter.Event): boolean {\n\t\treturn Clutter.EVENT_PROPAGATE\n\t}\n\tvfunc_motion_event(_event: Clutter.Event): boolean {\n\t\treturn Clutter.EVENT_PROPAGATE\n\t}\n\tvfunc_touch_event(_event: Clutter.Event): boolean {\n\t\treturn Clutter.EVENT_PROPAGATE\n\t}\n\n\taddEventStop<T extends Clutter.Actor>(actor: T): T {\n\t\t// actor.connect(\"button-press-event\", ()=>Clutter.EVENT_STOP);\n\t\treturn actor;\n\t}\n}\nGObject.registerClass(MediaItem)\nnamespace MediaItem {\n\texport interface OptionsBase {\n\t\tprogressEnabled: boolean\n\t\tgradientBackground: Rgb\n\t\tgradientStartOpaque: number\n\t\tgradientStartMix: number\n\t\tgradientEndOpaque: number\n\t\tgradientEndMix: number\n\t\tgradientEnabled: boolean\n\t\tcontorlOpacity: number\n\t\tshowNextButton: boolean\n\t\tshowPrevButton: boolean\n\t\tshowPauseButton: boolean\n\t}\n\texport type Options = {\n\t}\n\t\t& OptionsBase\n\t\t& ProgressControl.OptionsBase\n}\n// #endregion MediaItem\n\n// #region MediaList\nclass MediaList extends St.BoxLayout {\n\t_options: MediaList.Options\n\t_current?: MediaItem\n\t_currentMaxPage: number\n\t_currentPage: number\n\t_effect?: RoundClipEffect\n\t_drag: boolean\n\t_scroll: boolean\n\t_dragTranslation?: number\n\t_items: Map<Player, MediaItem>\n\t_source: Source\n\tget _messages(): MediaItem[] {\n\t\treturn this.get_children() as MediaItem[]\n\t}\n\tempty: boolean\n\n\tconstructor(options: MediaList.Options) {\n\t\t// @ts-ignore\n\t\tsuper(options)\n\t}\n\t// @ts-ignore\n\t_init(options: MediaList.Options): void {\n\t\tsuper._init({\n\t\t\tcan_focus: true,\n\t\t\treactive: true,\n\t\t\ttrack_hover: true,\n\t\t\thover: false,\n\t\t\tclip_to_allocation: true,\n\t\t})\n\t\tthis._current = null\n\t\tthis._options = options\n\t\tthis._currentMaxPage = 0\n\t\tthis._currentPage = 0\n\t\tthis._drag = false\n\t\tthis._items = new Map()\n\n\t\t// Round clip effect\n\t\tthis._initEffect()\n\t\tthis.connect(\"notify::height\", this._updateEffect.bind(this))\n\t\tthis.connect(\"notify::width\", this._updateEffect.bind(this))\n\n\t\t// Scroll Event\n\t\tthis.connect(\"scroll-event\", (_: Clutter.Actor, event: Clutter.Event) => {\n\t\t\tif (this._drag) return\n\t\t\tconst direction = event.get_scroll_direction()\n\t\t\tif (direction === Clutter.ScrollDirection.UP) {\n\t\t\t\tthis._seekPage(-1)\n\t\t\t}\n\t\t\tif (direction === Clutter.ScrollDirection.DOWN) {\n\t\t\t\tthis._seekPage(1)\n\t\t\t}\n\t\t})\n\n\t\t// Connect source\n\t\tthis._source = new Source()\n\t\tthis._source.connectObject(\"player-removed\", (_source: any, player: Player)=>{\n\t\t\tconst item = this._items.get(player)\n\t\t\tif (!item) return\n\t\t\titem.destroy()\n\t\t\tthis._items.delete(player)\n\t\t\tthis._sync()\n\t\t},this)\n\t\tthis._source.connectObject(\"player-added\", (_source: any, player: Player)=>{\n\t\t\tif (this._items.has(player)) return\n\t\t\tconst item = new MediaItem(player, this._options)\n\t\t\tthis._items.set(player, item)\n\t\t\tthis.add_child(item)\n\t\t\tthis._sync()\n\t\t}, this)\n\t\tthis._source.start()\n\t}\n\n\t// Round clip effect\n\t_initEffect() {\n\t\t// Disabled\n\t\tif (!this._options.roundClipEnabled) {\n\t\t\tif (this._effect) {\n\t\t\t\tthis.remove_effect_by_name(\"round-clip\")\n\t\t\t}\n\t\t\tthis._effect = null\n\t\t\treturn\n\t\t}\n\n\t\t// Enabled\n\t\tconst effect = this._effect = new RoundClipEffect()\n\t\teffect.enabled = false\n\t\tthis.add_effect_with_name(\"round-clip\", effect)\n\t\teffect.connectObject(\"notify::enabled\", ()=>{\n\t\t\tif (effect !== this._effect) return\n\t\t\tif (effect.enabled) this._updateEffect()\n\t\t}, this)\n\t\tthis._updateEffect()\n\t}\n\t_updateEffect() {\n\t\tif (!this._effect) return\n\t\tif (!this.get_stage()) return\n\t\tconst themeNode = this.mapped ? this._current?.get_theme_node() : null\n\t\tconst padding = this._options.roundClipPadding\n\t\tthis._effect.updateUniforms(1, {\n\t\t\tborder_radius: themeNode?.get_border_radius(null) ?? 16,\n\t\t\tsmoothing: 0,\n\t\t},{\n\t\t\tx1: padding?.[3] ?? 2,\n\t\t\ty1: padding?.[0] ?? 3,\n\t\t\tx2: this.width - (padding?.[1] ?? 2),\n\t\t\ty2: this.height - (padding?.[2] ?? 2)\n\t\t})\n\t}\n\n\t// Handle dragging\n\t_updateDragOffset(current: MediaItem, offset: number) {\n\t\tconst sign = Math.sign(offset)\n\t\tconst width = current.allocation.get_width()\n\t\tconst ratio = Math.max(Math.min(offset / width, 1), -1)\n\t\tconst halfRatio = Math.max(Math.min(offset * 0.5 / width, 1), -1)\n\t\tconst expoRatio = (1 - Math.pow(1 - Math.abs(halfRatio), 4)) * sign\n\t\tcurrent.remove_all_transitions()\n\t\tthis._dragTranslation = current.translationX = expoRatio * (width * 0.6)\n\t\tcurrent.opacity = Math.floor(lerp(255, 80, Math.abs(ratio)))\n\t}\n\t_finalizeDragOffset(current: MediaItem, offset: number) {\n\t\tconst width = current.allocation.get_width()\n\t\tconst direction = -Math.sign(offset)\n\n\t\tif (\n\t\t\t(this._currentPage == this._currentMaxPage - 1 && direction == 1)\n\t\t\t|| (this._currentPage == 0 && direction == -1)\n\t\t\t|| (width/4 > Math.abs(offset))\n\t\t) {\n\t\t\tcurrent.ease({\n\t\t\t\tmode: Clutter.AnimationMode.EASE_OUT_EXPO,\n\t\t\t\ttranslationX: 0,\n\t\t\t\tduration: 360,\n\t\t\t\topacity: 255,\n\t\t\t\tonComplete: ()=>{\n\t\t\t\t\tif (this._effect) this._effect.enabled = false\n\t\t\t\t}\n\t\t\t})\n\t\t\tthis._dragTranslation = null\n\t\t\treturn\n\t\t}\n\t\tthis._seekPage(direction)\n\t\tthis._dragTranslation = null\n\t}\n\tdfunc_drag_end(event: Drag.Event): void {\n\t\tthis._drag = false\n\t\tconst current = this._current\n\t\tif (!current || this._scroll) {\n\t\t\tthis._dragTranslation = null\n\t\t\treturn\n\t\t}\n\t\tif (event.isClick) {\n\t\t\tMain.overview.hide()\n\t\t\tMain.panel.closeQuickSettings()\n\t\t\tcurrent._player?.raise()\n\t\t}\n\n\t\tconst offset = event.coords[0] - (event.moveStartCoords || event.startCoords)[0]\n\t\tthis._finalizeDragOffset(current, offset)\n\t}\n\tdfunc_drag_start(_event: Drag.Event): void {\n\t\tif (this._scroll) return\n\t\tthis._drag = true\n\t\tthis._dragTranslation = 0\n\t\tif (this._effect) this._effect.enabled = true\n\t}\n\tdfunc_drag_motion(event: Drag.Event): void {\n\t\tif (this._scroll) return\n\t\tconst current = this._current\n\t\tif (event.isClick || !current) return\n\t\tconst offset = event.coords[0] - event.moveStartCoords[0]\n\t\tthis._updateDragOffset(current, offset)\n\t}\n\n\t// Handle smooth scrolling\n\tdfunc_scroll_start(_event: Scroll.Event): void {\n\t\tif (this._drag) return\n\t\tthis._scroll = true\n\t\tthis._dragTranslation = 0\n\t\tif (this._effect) this._effect.enabled = true\n\t}\n\tdfunc_scroll_motion(event: Scroll.Event): void {\n\t\tif (this._drag) return\n\t\tconst current = this._current\n\t\tif (!current) return\n\t\tthis._updateDragOffset(current, -event.scrollSumX * this._options.smoothScrollSpeed)\n\t}\n\tdfunc_scroll_end(event: Scroll.Event): void {\n\t\tthis._scroll = false\n\t\tconst current = this._current\n\t\tif (!current || this._drag) {\n\t\t\tthis._dragTranslation = null\n\t\t\treturn\n\t\t}\n\t\tthis._finalizeDragOffset(current, -event.scrollSumX * this._options.smoothScrollSpeed)\n\t}\n\n\t// Handle page action\n\tget page(): number {\n\t\treturn this._currentPage\n\t}\n\tset page(page: number) {\n\t\tthis._setPage(this._messages[page])\n\t}\n\tget maxPage(): number {\n\t\treturn this._currentMaxPage\n\t}\n\t_showFirstPlaying() {\n\t\t// Show first playing message\n\t\tconst messages = this._messages\n\t\tthis._setPage(\n\t\t\tmessages.find(message => message?._player.isPlaying())\n\t\t\t?? messages[0]\n\t\t)\n\t}\n\t_setPage(to: MediaItem) {\n\t\tconst current = this._current\n\t\tconst messages = this._messages\n\t\tthis._current = to\n\t\tif (!to || to == current) return\n\t\tfor (const message of messages) {\n\t\t\tmessage.remove_all_transitions()\n\t\t\tif (message == current) continue\n\t\t\tmessage.hide()\n\t\t}\n\t\tconst toIndex = messages.findIndex(message => message == to)\n\t\tthis._currentPage = toIndex\n\t\tthis.emit(\"page-updated\", toIndex)\n\t\tif (!current) {\n\t\t\tto.show()\n\t\t\treturn\n\t\t}\n\t\tconst currentIndex = messages.findIndex(message => message == current)\n\n\t\tif (this._effect) this._effect.enabled = true\n\t\tcurrent.ease({\n\t\t\topacity: 0,\n\t\t\ttranslationX: (toIndex > currentIndex ? -120 : 120) + (this._dragTranslation ?? 0),\n\t\t\tduration: 100,\n\t\t\tmode: Clutter.AnimationMode.EASE_OUT_QUAD,\n\t\t\tonComplete: ()=>{\n\t\t\t\tcurrent.hide()\n\t\t\t\tto.opacity = 0\n\t\t\t\tto.translationX = toIndex > currentIndex ? 120 : -120\n\t\t\t\tto.show()\n\t\t\t\tto.ease({\n\t\t\t\t\tmode: Clutter.AnimationMode.EASE_OUT_EXPO,\n\t\t\t\t\tduration: 280,\n\t\t\t\t\ttranslationX: 0,\n\t\t\t\t\topacity: 255,\n\t\t\t\t\tonStopped: ()=>{\n\t\t\t\t\t\tif (this._effect) this._effect.enabled = false\n\t\t\t\t\t\tif (!this._messages.includes(to)) return\n\t\t\t\t\t\tto.opacity = 255\n\t\t\t\t\t\tto.translationX = 0\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t\tonStopped: ()=>{\n\t\t\t\tif (!this._messages.includes(current)) return\n\t\t\t\tcurrent.opacity = 255\n\t\t\t\tcurrent.translationX = 0\n\t\t\t}\n\t\t})\n\t}\n\t_seekPage(offset: number) {\n\t\tconst messages = this._messages\n\t\tif (this._current === null) return\n\t\tlet currentIndex = messages.findIndex(message => message == this._current)\n\t\tif (currentIndex == -1) currentIndex = 0\n\t\tconst length = messages.length\n\t\tthis._setPage(messages[((currentIndex + offset + length) % length)])\n\t}\n\n\t// New message / Remove message\n\t_sync() {\n\t\tconst messages = this._messages\n\t\tconst empty = messages.length == 0\n\n\t\t// Emit max page update\n\t\tif (this._currentMaxPage != messages.length) {\n\t\t\tthis.emit(\"max-page-updated\",\n\t\t\t\tthis._currentMaxPage = messages.length\n\t\t\t)\n\t\t}\n\n\t\t// Current message destroyed\n\t\tif (this._current && (empty || !messages.includes(this._current))) {\n\t\t\tthis._current = null\n\t\t}\n\n\t\t// Hide new message\n\t\tfor (const message of messages) {\n\t\t\tif (message == this._current) continue\n\t\t\tmessage.hide()\n\t\t}\n\n\t\t// Show first playing message if nothing shown\n\t\tif (!this._current) {\n\t\t\tthis._showFirstPlaying()\n\t\t}\n\n\t\t// Update empty state\n\t\tthis.empty = empty\n\t}\n}\nDrag.applyTo(MediaList)\nScroll.applyTo(MediaList)\nGObject.registerClass({\n\tSignals: {\n\t\t\"page-updated\": {param_types: [GObject.TYPE_INT]},\n\t\t\"max-page-updated\": {param_types: [GObject.TYPE_INT]},\n\t},\n\tProperties: {\n\t\t\"empty\": GObject.ParamSpec.boolean(\n\t\t\t\"empty\", null, null,\n\t\t\tGObject.ParamFlags.READWRITE,\n\t\t\ttrue\n\t\t),\n\t}\n}, MediaList)\nnamespace MediaList {\n\texport type Options = Partial<{\n\t\troundClipEnabled: boolean,\n\t\troundClipPadding: null|[number, number, number, number],\n\t\tsmoothScrollSpeed: number,\n\t} & St.BoxLayout.ConstructorProps>\n\t\t& MediaItem.OptionsBase\n\t\t& ProgressControl.OptionsBase\n}\n// #endregion MediaList\n\n// #region Header\nclass Header extends St.BoxLayout {\n\t_headerLabel: St.Label\n\t_pageIndicator: PageIndicators\n\n\tconstructor(options: Header.Options) {\n\t\tsuper(options)\n\t}\n\t_init(_options: Header.Options) {\n\t\tsuper._init({\n\t\t\tstyle_class: \"QSTWEAKS-header\"\n\t\t} as Partial<St.BoxLayout.ConstructorProps>)\n\n\t\t// Label\n\t\tthis._headerLabel = new St.Label({\n\t\t\ttext: _(\"Media\"),\n\t\t\tstyle_class: \"QSTWEAKS-header-label\",\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t\tx_align: Clutter.ActorAlign.START,\n\t\t\tx_expand: true\n\t\t})\n\t\tthis.add_child(this._headerLabel)\n\n\t\tthis._pageIndicator = new PageIndicators(Clutter.Orientation.HORIZONTAL)\n\t\tthis._pageIndicator.x_align = Clutter.ActorAlign.END\n\t\tthis._pageIndicator.connectObject(\n\t\t\t\"page-activated\",\n\t\t\t(_: any, page: number) => this.emit(\"page-activated\", page),\n\t\t\tthis\n\t\t)\n\t\tthis._pageIndicator.y_align = Clutter.ActorAlign.CENTER\n\t\tthis.add_child(this._pageIndicator)// as unknown as St.BoxLayout)\n\t}\n\n\tset maxPage(maxPage: number) {\n\t\t(this._pageIndicator as any).setNPages(maxPage)\n\t}\n\tget maxPage(): number {\n\t\treturn (this._pageIndicator as any).nPages\n\t}\n\tset page(page: number) {\n\t\t(this._pageIndicator as any).setCurrentPosition(page)\n\t}\n\tget page(): number {\n\t\treturn (this._pageIndicator as any)._currentPosition\n\t}\n}\nGObject.registerClass({\n\tSignals: {\n\t\t\"page-activated\": {param_types: [GObject.TYPE_INT]},\n\t}\n}, Header)\nnamespace Header {   \n\texport type Options = Partial<{\n\t} & St.BoxLayout.ConstructorProps>\n}\n// #endregion Header\n\n// #region MediaWidget\nclass MediaWidget extends St.BoxLayout {\n\t_options: MediaWidget.Options\n\t_scroll: St.ScrollView\n\t_list: MediaList\n\t_header: Header\n\t_sections: St.BoxLayout\n\n\tconstructor(options: MediaWidget.Options) {\n\t\tsuper(options)\n\t}\n\t_init(options: MediaWidget.Options) {\n\t\tsuper._init({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t\tx_expand: true,\n\t\t\ty_expand: true,\n\t\t\treactive: true,\n\t\t} as Partial<St.BoxLayout.ConstructorProps>)\n\t\tthis._options = options\n\t\tthis._updateStyleClass()\n\n\t\t// Create header\n\t\tthis._header = new Header({})\n\t\tthis.add_child(this._header)\n\n\t\t// Create list\n\t\tthis._list = new MediaList(options)\n\t\tthis.add_child(this._list)\n\t\tthis._list.connectObject(\n\t\t\t\"notify::empty\",\n\t\t\tthis._syncEmpty.bind(this),\n\t\t\tthis\n\t\t)\n\t\tthis._syncEmpty()\n\n\t\t// Sync page update & page indicator\n\t\tthis._header.page = this._list.page\n\t\tthis._header.maxPage = this._list.maxPage\n\t\tthis._list.connectObject(\"page-updated\", (_, page: number): void => {\n\t\t\tif (this._header.page == page) return\n\t\t\tthis._header.page = page\n\t\t}, this)\n\t\tthis._list.connectObject(\"max-page-updated\", (_, maxPage: number): void => {\n\t\t\tif (this._header.maxPage == maxPage) return\n\t\t\tthis._header.maxPage = maxPage\n\t\t}, this)\n\t\tthis._header.connectObject(\"page-activated\", (_, page: number) => {\n\t\t\tthis._list.page = page\n\t\t}, this)\n\t}\n\n\t_syncEmpty() {\n\t\tthis.visible = !this._list.empty\n\t}\n\n\t_updateStyleClass() {\n\t\tconst options = this._options\n\t\tlet style = \"QSTWEAKS-media\"\n\t\tif (options.compact) style += \" QSTWEAKS-message-compact\"\n\t\tif (options.removeShadow) style += \" QSTWEAKS-message-remove-shadow\"\n\t\tthis.style_class = style\n\t}\n}\nGObject.registerClass(MediaWidget)\nnamespace MediaWidget {\n\texport type Options = Partial<{\n\t\tcompact: boolean\n\t\tremoveShadow: boolean\n\t} & St.BoxLayout.ConstructorProps>\n\t\t& MediaItem.OptionsBase\n\t\t& ProgressControl.OptionsBase\n}\n// #endregion MediaWidget\n\n// #region MediaWidgetFeature\nexport class MediaWidgetFeature extends FeatureBase {\n\t// #region settings\n\tenabled: boolean\n\theader: boolean\n\tcompact: boolean\n\tremoveShadow: boolean\n\tprogressEnabled: boolean\n\tsliderStyle: StyledSlider.Options\n\tgradientBackground: Rgb\n\tgradientStartOpaque: number\n\tgradientStartMix: number\n\tgradientEndOpaque: number\n\tgradientEndMix: number\n\tgradientEnabled: boolean\n\tcontorlOpacity: number\n\troundClipEnabled: boolean\n\troundClipPadding: null|[number, number, number, number]\n\tsmoothScrollSpeed: number\n\tshowNextButton: boolean\n\tshowPrevButton: boolean\n\tshowPauseButton: boolean\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.enabled = loader.loadBoolean(\"media-enabled\")\n\t\tthis.header = loader.loadBoolean(\"media-show-header\")\n\t\tthis.compact = loader.loadBoolean(\"media-compact\")\n\t\tthis.removeShadow = loader.loadBoolean(\"media-remove-shadow\")\n\t\tthis.smoothScrollSpeed = loader.loadInt(\"media-smooth-scroll-speed\")\n\n\t\t// Control buttons\n\t\tthis.contorlOpacity = loader.loadInt(\"media-contorl-opacity\")\n\t\tthis.showNextButton = loader.loadBoolean(\"media-contorl-show-next-button\")\n\t\tthis.showPrevButton = loader.loadBoolean(\"media-contorl-show-prev-button\")\n\t\tthis.showPauseButton = loader.loadBoolean(\"media-contorl-show-pause-button\")\n\n\t\t// Gradient\n\t\tthis.gradientBackground = loader.loadRgb(\"media-gradient-background-color\")!\n\t\tthis.gradientEnabled = loader.loadBoolean(\"media-gradient-enabled\")\n\t\tthis.gradientStartOpaque = loader.loadInt(\"media-gradient-start-opaque\")\n\t\tthis.gradientStartMix = loader.loadInt(\"media-gradient-start-mix\")\n\t\tthis.gradientEndOpaque = loader.loadInt(\"media-gradient-end-opaque\")\n\t\tthis.gradientEndMix = loader.loadInt(\"media-gradient-end-mix\")\n\t\t\n\t\t// Progress\n\t\tthis.progressEnabled = loader.loadBoolean(\"media-progress-enabled\")\n\t\tthis.sliderStyle = StyledSlider.Options.fromLoader(loader, \"media-progress\")\n\n\t\t// Round clip\n\t\tthis.roundClipEnabled = loader.loadBoolean(\"media-round-clip-enabled\")\n\t\tconst roundClipPaddingValue = loader.loadValue(\"media-round-clip-padding-adjustment-value\")\n\t\tconst roundClipPaddingEnabled = loader.loadBoolean(\"media-round-clip-padding-adjustment-enabled\")\n\t\tthis.roundClipPadding = (roundClipPaddingEnabled ? roundClipPaddingValue : null) as any\n\t}\n\t// #endregion settings\n\n\tmediaWidget?: MediaWidget\n\toverride reload(key: string): void {\n\t\t// Slider style\n\t\tif (StyledSlider.Options.isStyleKey(\"media-progress\", key)) {\n\t\t\tif (!this.enabled) return\n\t\t\tif (!this.progressEnabled) return\n\t\t\tfor (const message of this.mediaWidget!._list._messages) {\n\t\t\t\tmessage._progressControl!._createSlider()\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tswitch (key) {\n\t\t\tcase \"media-compact\":\n\t\t\tcase \"media-remove-shadow\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tthis.mediaWidget!._updateStyleClass()\n\t\t\t\tbreak\n\t\t\t// Round clip\n\t\t\tcase \"media-round-clip-enabled\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tthis.mediaWidget!._list._initEffect()\n\t\t\t\tbreak\n\t\t\t// Scroll speed\n\t\t\tcase \"media-smooth-scroll-speed\":\n\t\t\t\tbreak\n\t\t\t// Round clip padding\n\t\t\tcase \"media-round-clip-padding-adjustment-value\":\n\t\t\tcase \"media-round-clip-padding-adjustment-enabled\":\n\t\t\t\tbreak\n\t\t\t// Control opacity\n\t\t\tcase \"media-contorl-opacity\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tfor (const message of this.mediaWidget!._list._messages) {\n\t\t\t\t\tmessage._createControlButtons()\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// Gradient\n\t\t\tcase \"media-gradient-background-color\":\n\t\t\tcase \"media-gradient-enabled\":\n\t\t\tcase \"media-gradient-start-opaque\":\n\t\t\tcase \"media-gradient-start-mix\":\n\t\t\tcase \"media-gradient-end-opaque\":\n\t\t\tcase \"media-gradient-end-mix\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tfor (const message of this.mediaWidget!._list._messages) {\n\t\t\t\t\tmessage._updateGradient()\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tsuper.reload()\n\t\t\t\tbreak\n\t\t}\n\t}\n\toverride onLoad(): void {\n\t\tif (!this.enabled) return\n\t\tthis.maid.destroyJob(\n\t\t\tthis.mediaWidget = new MediaWidget(this)\n\t\t)\n\n\t\tGlobal.QuickSettingsGrid.add_child(this.mediaWidget)\n\t\tGlobal.QuickSettingsGrid.layout_manager.child_set_property(\n\t\t\tGlobal.QuickSettingsGrid, this.mediaWidget, \"column-span\", 2\n\t\t)\n\t}\n\toverride onUnload(): void {\n\t\tthis.mediaWidget = null\n\t}\n}\n// #endregion MediaWidgetFeature\n"
  },
  {
    "path": "src/features/widget/notifications.ts",
    "content": "import GObject from \"gi://GObject\"\nimport St from \"gi://St\"\nimport Clutter from \"gi://Clutter\"\nimport * as MessageList from \"resource:///org/gnome/shell/ui/messageList.js\"\nimport { gettext as _ } from \"resource:///org/gnome/shell/extensions/extension.js\"\nimport { type DoNotDisturbSwitch } from \"resource:///org/gnome/shell/ui/calendar.js\"\nimport { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport { StyledScroll } from \"../../libs/shell/styler.js\"\nimport Global from \"../../global.js\"\n\n// #region Placeholder\nclass Placeholder extends St.BoxLayout {\n\t_icon: St.Icon\n\t_label: St.Label\n\n\t_init() {\n\t\tsuper._init({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t\tstyle_class: \"QSTWEAKS-placeholder\",\n\t\t\tx_align: Clutter.ActorAlign.CENTER,\n\t\t\topacity: 60,\n\t\t\tx_expand: true,\n\t\t} as Partial<St.BoxLayout>)\n\n\t\t// Symbolic Icon\n\t\tthis._icon = new St.Icon({\n\t\t\tstyle_class: \"QSTWEAKS-icon\",\n\t\t\ticon_name: \"no-notifications-symbolic\"\n\t\t})\n\t\tthis.add_child(this._icon)\n\n\t\t// No Notifications Label\n\t\tthis._label = new St.Label({ text: _(\"No Notifications\") })\n\t\tthis.add_child(this._label)\n\t}\n}\nGObject.registerClass(Placeholder)\n// #endregion Placeholder\n\n// #region ClearButton\nclass ClearButton extends St.Button {\n\t_icon: St.Icon\n\t_label: St.Label\n\t_container: St.BoxLayout\n\n\t_init() {\n\t\t// Child Container\n\t\tthis._container = new St.BoxLayout({\n\t\t\tx_expand: true,\n\t\t\ty_expand: true,\n\t\t})\n\n\t\t// Button\n\t\tsuper._init({\n\t\t\tstyle_class: \"QSTWEAKS-clear-button\",\n\t\t\tbutton_mask: St.ButtonMask.ONE,\n\t\t\tchild: this._container,\n\t\t\treactive: true,\n\t\t\tcan_focus: true,\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t} as Partial<St.Button.ConstructorProps>)\n\n\t\t// Icon\n\t\tthis._icon = new St.Icon({\n\t\t\tstyle_class: \"QSTWEAKS-icon\",\n\t\t\ticon_name: \"user-trash-symbolic\",\n\t\t\ticon_size: 12\n\t\t})\n\t\tthis._container.add_child(this._icon)\n\n\t\t// Label\n\t\tthis._label = new St.Label({\n\t\t\ttext: _(\"Clear\")\n\t\t})\n\t\tthis._container.add_child(this._label)\n\t}\n}\nGObject.registerClass(ClearButton)\n// #endregion ClearButton\n\n// #region Header\nclass Header extends St.BoxLayout {\n\t_headerLabel: St.Label\n\t_clearButton: ClearButton\n\n\tconstructor(options: Header.Options) {\n\t\tsuper(options)\n\t}\n\t_init(options: Header.Options) {\n\t\tsuper._init({\n\t\t\tstyle_class: \"QSTWEAKS-header\"\n\t\t} as Partial<St.BoxLayout.ConstructorProps>)\n\n\t\t// Label\n\t\tthis._headerLabel = new St.Label({\n\t\t\ttext: _(\"Notifications\"),\n\t\t\tstyle_class: \"QSTWEAKS-header-label\",\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t\tx_align: Clutter.ActorAlign.START,\n\t\t\tx_expand: true\n\t\t})\n\t\tthis.add_child(this._headerLabel)\n\n\t\t// Clear button\n\t\tif (options.createClearButton) {\n\t\t\tthis._clearButton = new ClearButton()\n\t\t\tthis.add_child(this._clearButton)\n\t\t}\n\t}\n}\nGObject.registerClass(Header)\nnamespace Header {   \n\texport type Options = Partial<{\n\t\tcreateClearButton: boolean\n\t} & St.BoxLayout.ConstructorProps>\n}\n// #endregion Header\n\n// #region NativeControl\nclass NativeControl extends St.BoxLayout {\n\t_clearButton: St.Button\n\t_dndButton: St.Button\n\t_dndLabel: St.Label\n\t_dndSwitch: DoNotDisturbSwitch\n\n\t_init() {\n\t\t// See : https://github.com/GNOME/gnome-shell/blob/934dbe549567f87d7d6deb6f28beaceda7da1d46/js/ui/calendar.js#L979\n\t\tsuper._init({\n\t\t\tstyle_class: \"QSTWEAKS-native-controls\",\n\t\t} as Partial<St.BoxLayout.ConstructorProps>)\n\n\t\t// DND Switch\n\t\tthis._dndSwitch = new (Global.MessageList._dndSwitch.constructor as any)() // Calendar.DoNotDisturbSwitch();\n\t\tthis._dndSwitch.style_class += \" QSTWEAKS-native-dnd-switch\"\n\t\t\n\t\t// DND Label\n\t\tthis._dndLabel = new St.Label({\n\t\t\tstyle_class: \"QSTWEAKS-native-dnd-text\",\n\t\t\ttext: _(\"Do Not Disturb\"),\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t})\n\t\tthis.add_child(this._dndLabel)\n\t\tthis._dndButton = new St.Button({\n\t\t\tstyle_class: \"dnd-button\",\n\t\t\tcan_focus: true,\n\t\t\ttoggle_mode: true,\n\t\t\tchild: this._dndSwitch,\n\t\t\tlabel_actor: this._dndLabel,\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t})\n\t\tthis._dndSwitch.bind_property(\"state\",\n\t\t\tthis._dndButton, \"checked\",\n\t\t\tGObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE)\n\t\tthis.add_child(this._dndButton)\n\n\t\t// Clear Button\n\t\tthis._clearButton = new St.Button({\n\t\t\tstyle_class: \"message-list-clear-button button QSTWEAKS-native-clear-button\",\n\t\t\tlabel: _(\"Clear\"),\n\t\t\tcan_focus: true,\n\t\t\tx_expand: true,\n\t\t\tx_align: Clutter.ActorAlign.END,\n\t\t\taccessible_name: C_(\"action\", \"Clear all notifications\"),\n\t\t})\n\t\tthis.add_child(this._clearButton)\n\t}\n}\nGObject.registerClass(NativeControl)\n// #endregion NativeControl\n\n// #region NotificationList\nclass NotificationList extends MessageList.MessageView {\n\tconstructor() {\n\t\tsuper()\n\t}\n\t// Do not setup mpris\n\t_setupMpris() {}\n}\nGObject.registerClass(NotificationList)\n// #endregion NotificationList\n\n// #region NotificationWidget\nclass NotificationWidget extends St.BoxLayout {\n\t_options: NotificationWidget.Options\n\t_header: Header\n\t_placeholder: Placeholder\n\t_list: NotificationList\n\t_scroll: St.ScrollView\n\t_nativeControl: NativeControl\n\t_sections: St.BoxLayout\n\tconstructor(options: NotificationWidget.Options) {\n\t\tsuper(options)\n\t}\n\t_init(options: NotificationWidget.Options) {\n\t\tsuper._init({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t} as Partial<St.BoxLayout.ConstructorProps>)\n\n\t\tthis._options = options\n\n\t\tthis._createScroll()\n\t\tthis._createHeaderArea()\n\t\tthis._createPlaceholder()\n\t\tthis._createNativeControl()\n\n\t\tthis.add_child(this._header)\n\t\tthis.add_child(this._scroll)\n\t\tif (this._placeholder) this.add_child(this._placeholder)\n\t\tif (this._nativeControl) this.add_child(this._nativeControl)\n\n\t\tthis._list.connectObject(\n\t\t\t\"notify::empty\",\n\t\t\tthis._syncEmpty.bind(this),\n\t\t\tthis\n\t\t)\n\t\tthis._list.connectObject(\n\t\t\t\"notify::can-clear\",\n\t\t\tthis._syncClear.bind(this),\n\t\t\tthis\n\t\t)\n\t\tthis._syncEmpty()\n\t\tthis._syncClear()\n\t\tthis._updateMaxHeight()\n\t\tthis._updateStyleClass()\n\t}\n\n\t// Box style\n\t_updateMaxHeight() {\n\t\tconst maxHeight = this._options.maxHeight\n\t\tthis.style = maxHeight\n\t\t\t? `max-height:${maxHeight}px;`\n\t\t\t: \"\"\n\t}\n\t_updateStyleClass() {\n\t\tconst options = this._options\n\t\tlet style = \"QSTWEAKS-notifications\"\n\t\tif (options.useNativeControls) style += \" QSTWEAKS-use-native-controls\"\n\t\tif (options.compact) style += \" QSTWEAKS-message-compact\"\n\t\tif (options.removeShadow) style += \" QSTWEAKS-message-remove-shadow\"\n\t\tthis.style_class = style\n\t}\n\n\t// Scroll view\n\t_createScroll() {\n\t\tthis._list = new NotificationList()\n\t\tthis._scroll = new St.ScrollView({\n\t\t\tx_expand: true,\n\t\t\ty_expand: true,\n\t\t\tchild: this._list,\n\t\t})\n\t\tthis._updateScrollStyle()\n\t\tthis._scroll.connectObject(\n\t\t\t\"notify::vscrollbar-visible\",\n\t\t\tthis._syncScrollbarPadding.bind(this),\n\t\t\tthis\n\t\t)\n\t\tthis._syncScrollbarPadding()\n\t}\n\t_updateScrollStyle() {\n\t\tStyledScroll.updateStyle(this._scroll, this._options.scrollStyle)\n\t}\n\t_syncScrollbarPadding() {\n\t\tthis._scroll.style_class =\n\t\t\tthis._scroll.vscrollbar_visible\n\t\t\t? \"QSTWEAKS-has-scrollbar\"\n\t\t\t: \"\"\n\t}\n\n\t_createHeaderArea() {\n\t\tconst header = this._header = new Header({ createClearButton: !this._options.useNativeControls })\n\n\t\tif (header._clearButton) {\n\t\t\theader._clearButton.connectObject(\n\t\t\t\t\"clicked\",\n\t\t\t\tthis._list.clear.bind(this._list),\n\t\t\t\tthis\n\t\t\t)\n\t\t}\n\t}\n\t_createPlaceholder() {\n\t\tif (this._options.autoHide) return\n\t\tthis._placeholder = new Placeholder()\n\t}\n\t_createNativeControl() {\n\t\tif (!this._options.useNativeControls) return\n\t\tthis._nativeControl = new NativeControl()\n\t\tthis._nativeControl._clearButton.connectObject(\n\t\t\t\"clicked\",\n\t\t\tthis._list.clear.bind(this._list),\n\t\t\tthis\n\t\t)\n\t}\n\n\t// See : https://github.com/GNOME/gnome-shell/blob/934dbe549567f87d7d6deb6f28beaceda7da1d46/js/ui/calendar.js#L1043\n\t_syncClear() {\n\t\t// Sync clear button reactive state\n\t\tconst canClear = this._list.canClear;\n\t\t\n\t\t// Update native control clear button if it exists\n\t\tif (this._nativeControl) {\n\t\t\tthis._nativeControl._clearButton.reactive = canClear;\n\t\t\tthis._nativeControl._clearButton.can_focus = canClear;\n\t\t\t// Update style to visually indicate if button is enabled/disabled\n\t\t\tif (canClear) {\n\t\t\t\tthis._nativeControl._clearButton.remove_style_class_name('disabled');\n\t\t\t} else {\n\t\t\t\tthis._nativeControl._clearButton.add_style_class_name('disabled');\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Update custom clear button if it exists\n\t\tconst clearButton = this._header._clearButton;\n\t\tif (clearButton) {\n\t\t\tclearButton.visible = canClear;\n\t\t\tclearButton.reactive = canClear;\n\t\t\tclearButton.can_focus = canClear;\n\t\t\t// Update style to visually indicate if button is enabled/disabled\n\t\t\tif (canClear) {\n\t\t\t\tclearButton.remove_style_class_name('disabled');\n\t\t\t} else {\n\t\t\t\tclearButton.add_style_class_name('disabled');\n\t\t\t}\n\t\t}\n\t}\n\t_syncEmpty() {\n\t\t// placeholder / autohide\n\t\tconst empty = this._list.empty\n\t\tif (this._options.autoHide) {\n\t\t\tthis.visible = !empty\n\t\t} else {\n\t\t\tthis._scroll.visible = !empty\n\t\t\tthis._placeholder.visible = empty\n\t\t}\n\t}\n}\nGObject.registerClass(NotificationWidget)\nnamespace NotificationWidget {\n\texport type Options = {\n\t\tuseNativeControls: boolean\n\t\tautoHide: boolean\n\t\tmaxHeight: number\n\t\tcompact: boolean\n\t\tremoveShadow: boolean\n\t\tscrollStyle: StyledScroll.Options\n\t}\n\t\t& Partial<St.BoxLayout.ConstructorProps>\n}\n// #endregion NotificationWidget\n\n// #region NotificationsWidgetFeature\nexport class NotificationsWidgetFeature extends FeatureBase {\n\t// #region settings\n\tenabled: boolean\n\tuseNativeControls: boolean\n\tautoHide: boolean\n\tmaxHeight: number\n\tcompact: boolean\n\tremoveShadow: boolean\n\theader: boolean\n\tscrollStyle: StyledScroll.Options\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.enabled = loader.loadBoolean(\"notifications-enabled\")\n\t\tthis.useNativeControls = loader.loadBoolean(\"notifications-use-native-controls\")\n\t\tthis.autoHide = loader.loadBoolean(\"notifications-autohide\")\n\t\tthis.maxHeight = loader.loadInt(\"notifications-max-height\")\n\t\tthis.compact = loader.loadBoolean(\"notifications-compact\")\n\t\tthis.removeShadow = loader.loadBoolean(\"notifications-remove-shadow\")\n\t\tthis.header = loader.loadBoolean(\"notifications-show-header\")\n\t\tthis.scrollStyle = StyledScroll.Options.fromLoader(loader, \"notifications\")\n\t}\n\t// #endregion settings\n\n\tnotificationWidget: NotificationWidget\n\toverride reload(key: string): void {\n\t\tswitch (key) {\n\t\t\tcase \"notifications-max-height\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tthis.notificationWidget!._updateMaxHeight()\n\t\t\t\tbreak\n\t\t\tcase \"notifications-compact\":\n\t\t\tcase \"notifications-remove-shadow\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tthis.notificationWidget!._updateStyleClass()\n\t\t\t\tbreak\n\t\t\tcase \"notifications-fade-offset\":\n\t\t\tcase \"notifications-show-scrollbar\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tthis.notificationWidget!._updateScrollStyle()\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tsuper.reload()\n\t\t\t\tbreak\n\t\t}\n\t}\n\toverride onLoad(): void {\n\t\tif (!this.enabled) return\n\n\t\t// Create Notification Box\n\t\tthis.maid.destroyJob(\n\t\t\tthis.notificationWidget = new NotificationWidget(this)\n\t\t)\n\n\t\t// Add to grid\n\t\tGlobal.QuickSettingsGrid.add_child(this.notificationWidget)\n\t\tGlobal.QuickSettingsGrid.layout_manager.child_set_property(\n\t\t\tGlobal.QuickSettingsGrid, this.notificationWidget, \"column-span\", 2\n\t\t)\n\t}\n\toverride onUnload(): void {\n\t\tthis.notificationWidget = null\n\t}\n}\n// #endregion NotificationsWidgetFeature\n"
  },
  {
    "path": "src/features/widget/volumeMixer.ts",
    "content": "/*\n * This code is partially licensed under the gnome-volume-mixer license.\n * For more details, please check the license page in the about tab of the extension settings.\n*/\nimport St from \"gi://St\"\nimport Gvc from \"gi://Gvc\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport GLib from \"gi://GLib\"\nimport { QuickSlider } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport * as Main from \"resource:///org/gnome/shell/ui/main.js\"\nimport * as PopupMenu from \"resource:///org/gnome/shell/ui/popupMenu.js\"\nimport * as Volume from \"resource:///org/gnome/shell/ui/status/volume.js\"\nimport { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport { StyledScroll } from \"../../libs/shell/styler.js\"\nimport { updateMenuSeparators } from \"../../libs/shell/quickSettingsUtils.js\"\nimport Maid from \"../../libs/shared/maid.js\"\nimport Global from \"../../global.js\"\nimport Logger from \"../../libs/shared/logger.js\"\nimport Clutter from \"gi://Clutter\"\n\nconst ALLOW_AMPLIFIED_VOLUME_KEY = \"allow-volume-above-100-percent\"\n\n// #region StreamSlider\nclass StreamSlider extends QuickSlider {\n\t_maid: Maid\n\t_control: Gvc.MixerControl\n\t_inDrag: boolean\n\t_notifyVolumeChangeId: number\n\t_deviceSection: PopupMenu.PopupMenuSection\n\t_sliderChangedId: number\n\t_options: StreamSlider.Options\n\n\tconstructor(\n\t\tcontrol: Gvc.MixerControl,\n\t\tstream: Gvc.MixerStream,\n\t\toptions: VolumeMixerList.Options\n\t) {\n\t\t// @ts-ignore\n\t\tsuper(control, stream, options)\n\t}\n\n\t// @ts-ignore\n\t_init(control: Gvc.MixerControl, stream: Gvc.MixerStream|undefined, options: StreamSlider.Options) {\n\t\tthis._options = options\n\t\tthis._control = control\n\t\tthis._notifyVolumeChangeId = 0\n\t\tthis._maid = new Maid()\n\t\tsuper._init()\n\t\tthis._maid.connectJob(this, \"destroy\", this._destroy.bind(this))\n\t\t\n\t\t// Update allow amplify\n\t\tthis._soundSettings = new Gio.Settings({\n\t\t\tschema_id: 'org.gnome.desktop.sound',\n\t\t})\n\t\tthis._maid.connectJob(\n\t\t\tthis._soundSettings,\n\t\t\t`changed::${ALLOW_AMPLIFIED_VOLUME_KEY}`,\n\t\t\tthis._updateAllowAmplified.bind(this)\n\t\t)\n\t\tthis._updateAllowAmplified()\n\n\t\t// Update icon\n\t\tthis.iconReactive = true\n\t\tthis.connect(\"icon-clicked\", ()=>{\n\t\t\tif (!this._stream) return\n\t\t\tthis._stream.set_is_muted(!this._stream.is_muted)\n\t\t})\n\n\t\t// Value change connection\n\t\tthis._inDrag = false\n\t\tthis._sliderChangedId = this._maid.connectJob(this.slider, \"notify::value\", this._sliderChanged.bind(this))\n\t\tthis._maid.connectJob(this.slider, \"drag-begin\", () => { this._inDrag = true })\n\t\tthis._maid.connectJob(this.slider, \"drag-end\", () => { this._inDrag = false })\n\n\t\t// this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem())\n\t\t// this.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop')\n\n\t\t// Update stream\n\t\tif (stream) {\n\t\t\tthis.stream = stream\n\t\t} else {\n\t\t\tthis._stream = null\n\t\t}\n\t}\n\n\t// Stream connection\n\t_stream: Gvc.MixerStream\n\tget stream(): Gvc.MixerStream {\n\t\treturn this._stream\n\t}\n\tset stream(stream: Gvc.MixerStream) {\n\t\tif (this._stream == stream) return\n\n\t\tthis._stream?.disconnectObject(this)\n\t\tthis._stream = stream\n\n\t\tif (stream) {\n\t\t\t// Create connection\n\t\t\tstream.connectObject(\n\t\t\t\t'notify::is-muted', this._updateSlider.bind(this),\n\t\t\t\t'notify::volume', this._updateSlider.bind(this),\n\t\t\t\tthis\n\t\t\t)\n\t\t\tthis._updateSlider()\n\t\t} else {\n\t\t\tthis.emit('stream-updated')\n\t\t}\n\n\t\tthis._sync()\n\t}\n\t_sync() {\n\t\t// Sync visibility\n\t\tthis.visible = this._stream != null\n\t\tthis.menuEnabled = false // this._deviceItems.size > 1\n\n\t\t// Show icon\n\t\tif (this._options.showIcon) {\n\t\t\t// this.icon_name = stream.get_icon_name()\n\t\t\tthis.gicon = this._stream.get_gicon()\n\t\t}\n\t}\n\n\t// Volume feedback sfx\n\t_volumeCancellable?: Gio.Cancellable|null\n\t_feedbackVolumeChange() {\n\t\t// Cancel last sound\n\t\tif (this._volumeCancellable) this._volumeCancellable.cancel()\n\t\tthis._volumeCancellable = null\n\n\t\t// Feedback not necessary while playing\n\t\tif (this._stream.state === Gvc.MixerStreamState.RUNNING) return\n\n\t\t// Play sound feedback\n\t\tthis._volumeCancellable = new Gio.Cancellable()\n\t\tglobal\n\t\t\t.display\n\t\t\t.get_sound_player()\n\t\t\t.play_from_theme(\n\t\t\t\t'audio-volume-change',\n\t\t\t\t_('Volume changed'),\n\t\t\t\tthis._volumeCancellable\n\t\t\t)\n\t}\n\n\t// Update slider value (without emitting notify::value connection)\n\t_updateSlider() {\n\t\tthis.slider.block_signal_handler(this._sliderChangedId)\n\t\tthis.slider.value =\n\t\t\tthis._stream.is_muted\n\t\t\t? 0\n\t\t\t: (this._stream.volume / this._control.get_vol_max_norm())\n\t\tthis.slider.unblock_signal_handler(this._sliderChangedId)\n\t\tthis.emit('stream-updated')\n\t}\n\n\t// Slider value notify\n\t_sliderChanged() {\n\t\tif (!this._stream) return\n\n\t\tconst volume: number = this.slider.value * this._control.get_vol_max_norm()\n\t\tconst prevMuted: boolean = this._stream.is_muted\n\t\tconst prevVolume: number = this._stream.volume\n\t\tconst volumeChanged: boolean = this._stream.volume !== prevVolume\n\t\tif (volume < 1) {\n\t\t\tthis._stream.volume = 0\n\t\t\tif (!prevMuted) this._stream.change_is_muted(true)\n\t\t} else {\n\t\t\tthis._stream.volume = volume\n\t\t\tif (prevMuted) this._stream.change_is_muted(false)\n\t\t}\n\t\tthis._stream.push_volume()\n\n\t\tif (volumeChanged && !this._notifyVolumeChangeId && !this._inDrag) {\n\t\t\tthis._notifyVolumeChangeId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 30, () => {\n\t\t\t\tthis._feedbackVolumeChange()\n\t\t\t\tthis._notifyVolumeChangeId = 0\n\t\t\t\treturn GLib.SOURCE_REMOVE\n\t\t\t})\n\t\t\tGLib.Source.set_name_by_id(\n\t\t\t\tthis._notifyVolumeChangeId,\n\t\t\t\t'[quick-settings-tweaks] StreamSlider._sliderChanged: this._notifyVolumeChangeId'\n\t\t\t)\n\t\t}\n\t}\n\n\t// Update allow amplified from org.gnome.desktop.sound\n\t_soundSettings: Gio.Settings\n\t_allowAmplified: boolean\n\t_updateAllowAmplified() {\n\t\tthis._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY)\n\t\tthis.slider.maximumValue = this._allowAmplified ? this.getMaxLevel() : 1\n\t\tif (this._stream) this._updateSlider()\n\t}\n\n\tgetLevel(): number|null {\n\t\tif (!this._stream) return null\n\t\treturn this._stream.volume / this._control.get_vol_max_norm()\n\t}\n\tgetMaxLevel(): number {\n\t\tconst maxVolume =\n\t\t\tthis._allowAmplified\n\t\t\t? this._control.get_vol_max_amplified()\n\t\t\t: this._control.get_vol_max_norm()\n\t\treturn maxVolume / this._control.get_vol_max_norm()\n\t}\n\n\t_destroy() {\n\t\tthis._maid.destroy()\n\t\tthis._maid = null\n\t\tif (this._notifyVolumeChangeId) {\n\t\t\tGLib.Source.remove(this._notifyVolumeChangeId)\n\t\t\tthis._notifyVolumeChangeId = null\n\t\t}\n\t\tthis._soundSettings = null\n\t\tif (this._volumeCancellable) {\n\t\t\tthis._volumeCancellable.cancel()\n\t\t\tthis._volumeCancellable = null\n\t\t}\n\t}\n\n\t// I have no idea why, slider has finite height, so we should floor it for scroll layout\n\tvfunc_get_preferred_height(for_width: number): [number, number] {\n\t\treturn super.vfunc_get_preferred_height(for_width).map(Math.floor) as [number, number]\n\t}\n}\nGObject.registerClass({\n\tSignals: {\n\t\t'stream-updated': {},\n\t},\n}, StreamSlider)\nnamespace StreamSlider {\n\texport interface Options {\n\t\tshowIcon: boolean\n\t}\n}\n// #endregion StreamSlider\n\n// #region VolumeMixerItem\nclass VolumeMixerItem extends St.BoxLayout {\n\t_control: Gvc.MixerControl\n\t_stream: Gvc.MixerStream\n\t_options: VolumeMixerItem.Options\n\t_slider: StreamSlider\n\t_label: St.Label\n\tconstructor(\n\t\tcontrol: Gvc.MixerControl,\n\t\tstream: Gvc.MixerStream|undefined,\n\t\toptions: VolumeMixerItem.Options\n\t) {\n\t\tsuper(control, stream, options)\n\t}\n\t_init(\n\t\tcontrol: Gvc.MixerControl,\n\t\tstream: Gvc.MixerStream|undefined,\n\t\toptions: VolumeMixerItem.Options\n\t) {\n\t\tsuper._init({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t\tstyle_class: \"QSTWEAKS-item\",\n\t\t})\n\t\tthis._control = control\n\t\tthis._stream = stream\n\t\tthis._options = options\n\n\t\t// Create label\n\t\tconst label = this._label = new St.Label({\n\t\t\tx_expand: true,\n\t\t\tstyle_class: \"QSTWEAKS-label\",\n\t\t\topacity: this._options.labelOpacity,\n\t\t})\n\t\tthis._updateLabel()\n\t\tthis.add_child(label)\n\n\t\t// Create Slider\n\t\tconst slider = this._slider = new StreamSlider(control, stream, options)\n\t\tthis.add_child(slider)\n\t}\n\n\t_updateLabel() {\n\t\tconst label = this._label\n\t\tconst name = this._stream.get_name()\n\t\tconst description = this._stream.get_description()\n\t\tswitch (this._options.labelText) {\n\t\t\tcase \"title\":\n\t\t\t\tif (name) label.text = name\n\t\t\t\telse if (description) label.text = description\n\t\t\t\tif (description || name) label.show()\n\t\t\t\telse label.hide()\n\t\t\t\tbreak\n\t\t\tcase \"description\":\n\t\t\t\tif (description) label.text = description\n\t\t\t\telse if (name) label.text = name\n\t\t\t\tif (description || name) label.show()\n\t\t\t\telse label.hide()\n\t\t\t\tbreak\n\t\t\tcase \"both\":\n\t\t\t\tif (name && description) label.text = `${name} - ${description}`\n\t\t\t\telse if (name) label.text = name\n\t\t\t\telse if (description) label.text = description\n\t\t\t\tif (name || description) label.show()\n\t\t\t\telse label.hide()\n\t\t\t\tbreak\n\t\t\tcase \"none\":\n\t\t\t\tlabel.hide()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t_sync() {\n\t\tthis._updateLabel()\n\t\tthis._slider._sync()\n\t}\n}\nGObject.registerClass(VolumeMixerItem)\nnamespace VolumeMixerItem {\n\texport type Options = {\n\t\tlabelText: \"title\"|\"description\"|\"both\"|\"none\",\n\t\tlabelOpacity: number,\n\t} & StreamSlider.Options\n}\n// #endregion VolumeMixerItem\n\n// #region VolumeMixerList\nclass VolumeMixerList extends St.BoxLayout {\n\t_control: Gvc.MixerControl\n\t_maid: Maid\n\t_options: VolumeMixerList.Options\n\t_sliders: Map<number, VolumeMixerItem>\n\tshouldShow: boolean\n\n\tconstructor(options: VolumeMixerList.Options) {\n\t\tsuper({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t\tstyle_class: \"QSTWEAKS-volume-mixer\",\n\t\t\tclip_to_allocation: true,\n\t\t\tx_expand: true,\n\t\t})\n\t\tthis._options = options\n\t\tthis._maid = new Maid()\n\t\tthis._sliders = new Map()\n\n\t\t// this._applicationMenus = new Map()//{}\n\n\t\tthis._control = Volume.getMixerControl()\n\t\tthis._maid.connectJob(this._control, \"stream-added\", this._streamAdded.bind(this))\n\t\tthis._maid.connectJob(this._control, \"stream-removed\", this._streamRemoved.bind(this))\n\t\tthis._maid.connectJob(this._control, \"stream-changed\", this._streamChanged.bind(this))\n\t\tfor (const stream of this._control.get_streams()) {\n\t\t\tthis._streamAdded(this._control, stream.get_id())\n\t\t}\n\n\t\tthis.connect(\"destroy\", ()=>{\n\t\t\tthis._maid.destroy()\n\t\t\tthis._maid = null\n\t\t\tfor (const slider of this._sliders.values()) {\n\t\t\t\tslider.destroy()\n\t\t\t}\n\t\t\tthis._sliders = null\n\t\t})\n\n\t\t// Group with application id << we need this\n\t\t// description regex\n\t\t// name regex\n\t\t// application regex\n\t\t// show as popup menu\n\n\t\t// this._filteredApps = settings[\"volume-mixer-filtered-apps\"]\n\t\t// this._filterMode = settings[\"volume-mixer-filter-mode\"]\n\t\t// this._showStreamDesc = settings[\"volume-mixer-show-description\"]\n\t\t// this._showStreamIcon = settings[\"volume-mixer-show-icon\"]\n\t\t// this._useRegex = settings[\"volume-mixer-use-regex\"]\n\t\t// this._checkDescription = settings[\"volume-mixer-check-description\"]\n\t}\n\n\t_streamAdded(control: Gvc.MixerControl, id: number) {\n\t\tif (this._sliders.has(id)) {\n\t\t\treturn\n\t\t}\n\t\tconst stream = control.lookup_stream_id(id)\n\n\t\tif (stream.is_event_stream || !(stream instanceof Gvc.MixerSinkInput)) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\t// const applicationId =  stream.get_application_id()\n\t\t// const name = stream.get_name()\n\t\t// const description = stream.get_description()\n\n\t\t// filter here\n\t\t// let hasFiltered = false\n\t\t// for (const matchStr of this._filteredApps) {\n\t\t// \tlet matchExp = this._useRegex ? new RegExp(matchStr) : matchStr\n\t\t// \tif (\n\t\t// \t\t// Check name\n\t\t// \t\tthis._checkMatch(name, matchExp)\n\t\t// \t\t// Check description\n\t\t// \t\t|| this._checkDescription && this._checkMatch(description, matchExp)\n\t\t// \t) { hasFiltered = true; break }\n\t\t// }\n\t\t// if (this._filterMode === \"block\" && hasFiltered) return\n\t\t// if (this._filterMode === \"allow\" && !hasFiltered) return\n\n\t\tconst slider = new VolumeMixerItem(\n\t\t\tthis._control,\n\t\t\tstream,\n\t\t\tthis._options\n\t\t)\n\t\tthis._sliders.set(id, slider)\n\n\t\tthis.add_child(slider)\n\t\tthis._sync()\n\t}\n\n\t_streamChanged(control: Gvc.MixerControl, id: number) {\n\t\tconst slider = this._sliders.get(id)\n\t\tconst stream = control.lookup_stream_id(id)\n\t\tif (!slider) return\n\t\t// filter check here, or create new here\n\t\tslider._sync()\n\t}\n\n\t_streamRemoved(_control: Gvc.MixerControl, id: number) {\n\t\tconst slider = this._sliders.get(id)\n\t\tif (!slider) return\n\t\tslider.destroy()\n\t\tthis._sliders.delete(id)\n\t\tthis._sync()\n\t}\n\n\t_sync() {\n\t\tif (!this._sliders.size) {\n\t\t\tthis.shouldShow = false\n\t\t\treturn\n\t\t}\n\t\tfor (const slider of this._sliders.values()) {\n\t\t\tif (slider.visible) {\n\t\t\t\tthis.shouldShow = true\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tthis.shouldShow = false\n\t}\n}\nGObject.registerClass({\n\tProperties: {\n\t\t'should-show': GObject.ParamSpec.boolean(\n\t\t\t'should-show', null, null,\n\t\t\tGObject.ParamFlags.READWRITE,\n\t\t\tfalse),\n\t},\n}, VolumeMixerList)\nnamespace VolumeMixerList {\n\texport type Options = {\n\t} & VolumeMixerItem.Options\n}\n// #endregion VolumeMixerList\n\n// #region VolumeMixerWidget\nclass VolumeMixerWidget extends St.BoxLayout {\n\t_options: VolumeMixerWidget.Options\n\t// _header: Header\n\t_list: VolumeMixerList\n\t_scroll: St.ScrollView\n\t_sections: St.BoxLayout\n\tconstructor(options: VolumeMixerWidget.Options) {\n\t\tsuper(options)\n\t}\n\t_init(options: VolumeMixerWidget.Options) {\n\t\tsuper._init({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t} as Partial<St.BoxLayout.ConstructorProps>)\n\n\t\tthis._options = options\n\n\t\tthis._createScroll()\n\t\tthis.add_child(this._scroll)\n\t\tthis._updateMaxHeight()\n\t\tthis._updateStyleClass()\n\t\tthis._list.connectObject(\n\t\t\t\"notify::should-show\",\n\t\t\tthis._sync.bind(this),\n\t\t\tthis\n\t\t)\n\t\tthis._sync()\n\t}\n\n\t// Box style\n\t_updateMaxHeight() {\n\t\tconst maxHeight = this._options.maxHeight\n\t\tthis.style = maxHeight\n\t\t\t? `max-height:${maxHeight}px;`\n\t\t\t: \"\"\n\t}\n\t_updateStyleClass() {\n\t\tconst options = this._options\n\t\tlet style = \"QSTWEAKS-volume-mixer\"\n\t\tthis.style_class = style\n\t}\n\n\t// Scroll view\n\t_createScroll() {\n\t\tthis._sections = new St.BoxLayout({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t\tx_expand: true,\n\t\t\ty_expand: true,\n\t\t})\n\t\tthis._scroll = new St.ScrollView({\n\t\t\tx_expand: true,\n\t\t\ty_expand: true,\n\t\t\tchild: this._sections,\n\t\t})\n\t\tthis._updateScrollStyle()\n\t\tthis._scroll.connectObject(\n\t\t\t\"notify::vscrollbar-visible\",\n\t\t\tthis._syncScrollbarPadding.bind(this),\n\t\t\tthis\n\t\t)\n\t\tthis._syncScrollbarPadding()\n\t\tthis._list = new VolumeMixerList(this._options)\n\t\tthis._sections.add_child(this._list)\n\t}\n\t_updateScrollStyle() {\n\t\tStyledScroll.updateStyle(this._scroll, this._options.scrollStyle)\n\t}\n\t_syncScrollbarPadding() {\n\t\tthis._sections.style_class =\n\t\t\tthis._scroll.vscrollbar_visible\n\t\t\t? \"QSTWEAKS-has-scrollbar\"\n\t\t\t: \"\"\n\t}\n\n\t// Get height with avoiding unnecessary allocation\n\tvfunc_get_preferred_height(for_width: number): [number, number] {\n\t\tif (!this.get_stage()) return [0, 0]\n\t\tconst contentHeight = this._list.get_preferred_height(for_width)\n\t\tconst maxHeight = this._options.maxHeight\n\t\tif (!maxHeight) return contentHeight\n\t\treturn [Math.min(maxHeight, contentHeight[0]), Math.min(maxHeight, contentHeight[1])]\n\t}\n\n\t_sync() {\n\t\tthis.visible = this._list.shouldShow\n\t}\n}\nGObject.registerClass(VolumeMixerWidget)\nnamespace VolumeMixerWidget {\n\texport type Options = {\n\t\tmaxHeight: number,\n\t\tscrollStyle: StyledScroll.Options\n\t}\n\t\t& Partial<St.BoxLayout.ConstructorProps>\n\t\t& VolumeMixerList.Options\n}\n// #endregion VolumeMixerWidget\n\n// #region VolumeMixerWidgetFeature\nexport class VolumeMixerWidgetFeature extends FeatureBase {\n\t// #region settings\n\tenabled: boolean\n\tshowIcon: boolean\n\tmaxHeight: number\n\tlabelText: VolumeMixerItem.Options[\"labelText\"]\n\tlabelOpacity: number\n\tmenuEnabled: boolean\n\tmenuIcon: string\n\tscrollStyle: StyledScroll.Options\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.enabled = loader.loadBoolean(\"volume-mixer-enabled\")\n\t\tthis.showIcon = loader.loadBoolean(\"volume-mixer-show-icon\")\n\t\tthis.maxHeight = loader.loadInt(\"volume-mixer-max-height\")\n\t\tthis.labelText = loader.loadString(\"volume-mixer-label-text\") as VolumeMixerItem.Options[\"labelText\"]\n\t\tthis.labelOpacity = loader.loadInt(\"volume-mixer-label-opacity\")\n\t\tthis.menuEnabled = loader.loadBoolean(\"volume-mixer-menu-enabled\")\n\t\tthis.menuIcon = loader.loadString(\"volume-mixer-menu-icon\")\n\t\tthis.scrollStyle = StyledScroll.Options.fromLoader(loader, \"volume-mixer\")\n\t}\n\t// #endregion settings\n\n\tvolumeMixerWidget: VolumeMixerWidget\n\tmixerMenuButton: St.Button\n\tmixerMenuSection: PopupMenu.PopupMenuSection\n\tcreateMenu(slider: QuickSlider) {\n\t\t// Create section\n\t\tthis.mixerMenuSection = new PopupMenu.PopupMenuSection()\n\t\tthis.mixerMenuSection.box.add_child(this.volumeMixerWidget)\n\t\tthis.mixerMenuSection.box.hide()\n\t\tthis.maid.destroyJob(this.mixerMenuSection)\n\n\t\t// Create button\n\t\tthis.mixerMenuButton = new St.Button({\n\t\t\tchild: new St.Icon({icon_name: this.menuIcon}),\n\t\t\tstyle_class: \"icon-button flat\",\n\t\t\tcan_focus: true,\n\t\t\tx_expand: false,\n\t\t\ty_expand: true,\n\t\t\tvisible: this.volumeMixerWidget.visible,\n\t\t\taccessible_name: _(\"Open volumx mixer\"),\n\t\t})\n\t\tthis.volumeMixerWidget.bind_property(\n\t\t\t\"visible\",\n\t\t\tthis.mixerMenuButton,\n\t\t\t\"visible\",\n\t\t\tnull\n\t\t)\n\n\t\t// Push to output stream slider menu\n\t\tslider.menu.addMenuItem(this.mixerMenuSection, 1)\n\t\tslider.child.add_child(this.mixerMenuButton)\n\t\tconst revertChanges = ()=>{\n\t\t\tslider.menu.setHeader(\"audio-headphones-symbolic\", (_)(\"Sound Output\"));\n\t\t\t(slider.menu as any)._setSettingsVisibility(Main.sessionMode.allowSettings);\n\t\t\tupdateMenuSeparators(slider.menu);\n\t\t\t(slider as any)._deviceSection.box.show()\n\t\t}\n\t\tthis.maid.connectJob(this.mixerMenuButton, \"clicked\", () => {\n\t\t\tthis.mixerMenuSection.box.show();\n\t\t\t(slider as any)._deviceSection.box.hide();\n\t\t\t(slider.menu as any)._setSettingsVisibility(false)\n\t\t\tupdateMenuSeparators(slider.menu)\n\t\t\tslider.menu.setHeader(\"audio-headphones-symbolic\", _(\"Volume Mixer\"))\n\t\t\tslider.menu.open(true)\n\t\t})\n\t\tthis.maid.destroyJob(this.mixerMenuButton)\n\t\tthis.maid.connectJob(slider.menu, \"menu-closed\", ()=>{\n\t\t\tthis.mixerMenuSection.box.hide()\n\t\t\trevertChanges()\n\t\t})\n\t\tthis.maid.functionJob(revertChanges)\n\t}\n\toverride reload(key: string): void {\n\t\tswitch (key) {\n\t\t\tcase \"volume-mixer-max-height\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tthis.volumeMixerWidget!._updateMaxHeight()\n\t\t\t\tbreak\n\t\t\tcase \"volume-mixer-fade-offset\":\n\t\t\tcase \"volume-mixer-show-scrollbar\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tthis.volumeMixerWidget!._updateScrollStyle()\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tsuper.reload()\n\t\t\t\tbreak\n\t\t}\n\t}\n\toverride onLoad(): void {\n\t\tthis.maid.destroyJob(\n\t\t\tthis.volumeMixerWidget = new VolumeMixerWidget(this)\n\t\t)\n\t\tif (this.menuEnabled) {\n\t\t\tGlobal.GetStreamSlider().then(\n\t\t\t\t({ OutputStreamSlider }) => this.createMenu(OutputStreamSlider)\n\t\t\t).catch(Logger.error)\n\t\t} else {\n\t\t\t(Global.QuickSettingsMenu as any).addItem(this.volumeMixerWidget, 2)\n\t\t\tGlobal.GetStreamSlider().then(({ InputStreamSlider }) => {\n\t\t\t\tGlobal.QuickSettingsGrid.set_child_above_sibling(\n\t\t\t\t\tthis.volumeMixerWidget,\n\t\t\t\t\tInputStreamSlider\n\t\t\t\t)\n\t\t\t})\n\t\t}\n\t}\n\toverride onUnload(): void {\n\t\tthis.volumeMixerWidget = null\n\t}\n}\n// #endregion VolumeMixerWidgetFeature\n"
  },
  {
    "path": "src/features/widget/weather.ts",
    "content": "import Clutter from \"gi://Clutter\"\nimport GObject from \"gi://GObject\"\nimport GLib from \"gi://GLib\"\nimport Pango from \"gi://Pango\"\nimport St from \"gi://St\"\nimport * as Main from \"resource:///org/gnome/shell/ui/main.js\"\n/// @ts-expect-error\nimport {formatTime} from \"resource:///org/gnome/shell/misc/dateUtils.js\"\nimport { WeatherClient } from \"resource:///org/gnome/shell/misc/weather.js\"\nimport GWeather from \"gi://GWeather\"\nimport { FeatureBase, type SettingLoader } from \"../../libs/shell/feature.js\"\nimport Global from \"../../global.js\"\n\n// #region Client\nclass Client extends WeatherClient {\n\tgetInfos(maxForecasts: number, intervalHour: number): GWeather.Info[] {\n\t\tconst infos = []\n\t\tconst forecasts = this.info.get_forecast_list()\n\t\tconst now = GLib.DateTime.new_now_local()\n\t\tlet current = GLib.DateTime.new_from_unix_local(0)\n\t\tfor (let i = 0; i < forecasts.length; i++) {\n\t\t\tconst [valid, timestamp] = forecasts[i].get_value_update()\n\t\t\tif (!valid || timestamp === 0) {\n\t\t\t\tcontinue // 0 means 'never updated'\n\t\t\t}\n\t\t\tconst datetime = GLib.DateTime.new_from_unix_local(timestamp)\n\t\t\tif (now.difference(datetime) > 0) {\n\t\t\t\tcontinue // Ignore earlier forecasts\n\t\t\t}\n\t\t\tif (datetime.difference(current) < GLib.TIME_SPAN_HOUR * intervalHour) {\n\t\t\t\tcontinue // Enforce a minimum interval of 1h\n\t\t\t}\n\t\t\tif (infos.push(forecasts[i]) === maxForecasts) {\n\t\t\t\tbreak // Use a maximum of five forecasts\n\t\t\t}\n\t\t\tcurrent = datetime\n\t\t}\n\t\treturn infos\n\t}\n\tgetBestCurrentLocationName(): string {\n\t\treturn this.getBestLocationName(this.info.get_location())\n\t}\n\tgetBestLocationName(loc: GWeather.Location): string {\n\t\t/// @ts-expect-error\n\t\tconst locName = loc.get_name()\n\t\tif (\n\t\t\t/// @ts-expect-error\n\t\t\tloc.get_level() === GWeather.LocationLevel.CITY\n\t\t\t/// @ts-expect-error\n\t\t\t|| !loc.has_coords()\n\t\t) return locName\n\t\t/// @ts-expect-error\n\t\tconst world = GWeather.Location.get_world()\n\t\t/// @ts-expect-error\n\t\tconst city = world.find_nearest_city(...loc.get_coords())\n\t\tconst cityName = city.get_name()\n\t\treturn locName.includes(cityName) ? cityName : locName\n\t}\n}\n// #endregion Client\n\n// #region Header\nclass Header extends St.BoxLayout {\n\t_headerLabel: St.Label\n\t_locationLabel: St.Label\n\t_client: Client\n\t_options: Header.Options\n\tconstructor(client: Client, options: Header.Options) {\n\t\tsuper(client as any, options as any)\n\t}\n\t_init(client: Client, options: Header.Options) {\n\t\tthis._options = options\n\t\tthis._client = client\n\t\tsuper._init({\n\t\t\tstyle_class: \"QSTWEAKS-header\"\n\t\t} as Partial<St.BoxLayout.ConstructorProps>)\n\n\t\t// Labels\n\t\tthis._headerLabel = new St.Label({\n\t\t\ttext: _(\"Weather\"),\n\t\t\tstyle_class: \"QSTWEAKS-header-label\",\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t\tx_align: Clutter.ActorAlign.START,\n\t\t\tx_expand: true,\n\t\t})\n\t\tthis._locationLabel = new St.Label({\n\t\t\tstyle_class: \"QSTWEAKS-location-label\",\n\t\t\ty_align: Clutter.ActorAlign.CENTER,\n\t\t\topacity: 190,\n\t\t})\n\t\tthis.add_child(this._headerLabel)\n\t\tthis.add_child(this._locationLabel)\n\n\t\t// Client connection\n\t\tclient.connectObject(\"changed\", this._sync.bind(this), this)\n\t\tthis._sync.bind(this)\n\t}\n\t_sync() {\n\t\tif (\n\t\t\tthis._locationLabel.visible =\n\t\t\t\tthis._options.showLocation\n\t\t\t\t&& this._client.hasLocation\n\t\t) {\n\t\t\tthis._locationLabel.text = this._client.getBestCurrentLocationName()\n\t\t}\n\t}\n}\nGObject.registerClass(Header)\nnamespace Header {   \n\texport type Options = {\n\t\tshowLocation: boolean,\n\t}\n}\n// #endregion Header\n\n// #region WeatherSection\nclass WeatherSection extends St.Button {\n\t_client: Client\n\t_grid: St.Widget\n\t_layout: Clutter.GridLayout\n\t_options: WeatherSection.Options\n\tconstructor(client: Client, options: WeatherSection.Options) {\n\t\tsuper(client as any, options as any)\n\t}\n\t_init(client: Client, options: WeatherSection.Options) {\n\t\tthis._client = client\n\t\tthis._options = options\n\t\tsuper._init({\n\t\t\tstyle_class: \"weather-button message\",\n\t\t\tcan_focus: true,\n\t\t\tx_expand: true,\n\t\t})\n\t\tconst box = this.child = new St.BoxLayout({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t\tstyle_class: \"weather-box\",\n\t\t\tx_expand: true,\n\t\t})\n\t\tconst layout = this._layout = new Clutter.GridLayout({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t})\n\t\tconst grid = this._grid = new St.Widget({\n\t\t\tstyle_class: \"weather-grid\",\n\t\t\tlayout_manager: layout,\n\t\t})\n\t\t// @ts-expect-error\n\t\tlayout.hookup_style(grid)\n\t\tbox.add_child(grid)\n\t\tclient.connectObject(\"changed\", this._sync.bind(this), this)\n\t\tthis._sync()\n\t\tthis.connect(\"clicked\", this._click.bind(this))\n\t}\n\t_addForecast(forecast: GWeather.Info, col: number) {\n\t\tconst [, timestamp] = forecast.get_value_update()\n\t\tconst timeStr = formatTime(new Date(timestamp * 1000), {\n\t\t\ttimeOnly: true,\n\t\t\tampm: false,\n\t\t})\n\t\tconst [, tempValue] = forecast.get_value_temp(GWeather.TemperatureUnit.DEFAULT)\n\t\tconst tempPrefix = Math.round(tempValue) >= 0 ? \" \" : \"\"\n\n\t\tconst time = new St.Label({\n\t\t\tstyle_class: \"weather-forecast-time\",\n\t\t\ttext: timeStr,\n\t\t\tx_align: Clutter.ActorAlign.CENTER,\n\t\t})\n\t\tconst icon = new St.Icon({\n\t\t\tstyle_class: \"weather-forecast-icon\",\n\t\t\ticon_name: forecast.get_symbolic_icon_name(),\n\t\t\tx_align: Clutter.ActorAlign.CENTER,\n\t\t\tx_expand: true,\n\t\t})\n\t\tconst temp = new St.Label({\n\t\t\tstyle_class: \"weather-forecast-temp\",\n\t\t\ttext: `${tempPrefix}${Math.round(tempValue)}°`,\n\t\t\tx_align: Clutter.ActorAlign.CENTER,\n\t\t})\n\n\t\ttemp.clutter_text.ellipsize = Pango.EllipsizeMode.NONE\n\t\ttime.clutter_text.ellipsize = Pango.EllipsizeMode.NONE\n\n\t\tthis._layout.attach(time, col, 0, 1, 1)\n\t\tthis._layout.attach(icon, col, 1, 1, 1)\n\t\tthis._layout.attach(temp, col, 2, 1, 1)\n\t}\n\t_updateForecasts() {\n\t\tconst infos = this._client.getInfos(\n\t\t\tthis._options.maxForecasts,\n\t\t\tthis._options.intervalHour\n\t\t)\n\n\t\t// RTL support\n\t\tif (this._grid.text_direction === Clutter.TextDirection.RTL) {\n\t\t\tinfos.reverse()\n\t\t}\n\n\t\tlet col = 0\n\t\tfor (const forecast of infos) {\n\t\t\tif (!forecast.is_valid()) continue\n\t\t\tthis._addForecast(forecast, col)\n\t\t\tcol++\n\t\t}\n\t}\n\t_setStatusLabel(text: string) {\n\t\tlet layout = this._grid.layout_manager\n\t\tlet label = new St.Label({\n\t\t\ttext,\n\t\t\tstyle_class: \"QSTWEAKS-status-label\",\n\t\t})\n\t\t/// @ts-expect-error\n\t\tlayout.attach(label, 0, 0, 1, 1)\n\t}\n\t_sync() {\n\t\tthis._grid.destroy_all_children()\n\t\tif (!this._client.available) {\n\t\t\tthis._setStatusLabel((_)(\"Weather Information Unavailable\"))\n\t\t\treturn\n\t\t}\n\t\tif (!this._client.hasLocation) {\n\t\t\tthis._setStatusLabel(_(\"Location has not been set\"))\n\t\t\treturn\n\t\t}\n\t\tif (this._client.loading) {\n\t\t\tthis._setStatusLabel((_)(\"Loading…\"))\n\t\t\treturn\n\t\t}\n\t\tconst info = this._client.info\n\t\tif (info.is_valid()) {\n\t\t\tthis._updateForecasts()\n\t\t\treturn\n\t\t}\n\t\tif (info.network_error()) {\n\t\t\tthis._setStatusLabel((_)(\"Go Online for Weather Information\"))\n\t\t} else {\n\t\t\tthis._setStatusLabel((_)(\"Weather Information Unavailable\"))\n\t\t}\n\t}\n\t// Show weather app\n\t_click() {\n\t\tconst command = this._options.clickCommand\n\t\tif (command) {\n\t\t\tGLib.spawn_async(null, ['sh', '-c', command], null, GLib.SpawnFlags.SEARCH_PATH, null)\n\t\t} else {\n\t\t\tthis._client.activateApp()\n\t\t}\n\t\tMain.overview.hide()\n\t\tMain.panel.closeCalendar()\n\t}\n}\nGObject.registerClass(WeatherSection)\nnamespace WeatherSection {\n\texport type Options = {\n\t\tmaxForecasts: number,\n\t\tintervalHour: number,\n\t\tclickCommand: string,\n\t} & Header.Options\n}\n// #endregion WeatherSection\n\n// #region WeatherWidget\nclass WeatherWidget extends St.BoxLayout {\n\t_item: St.Button\n\t_header: Header\n\t_client: Client\n\t_options: WeatherWidget.Options\n\tconstructor(options: WeatherWidget.Options) {\n\t\tsuper(options as any)\n\t}\n\t_init(options: WeatherWidget.Options) {\n\t\tthis._options = options\n\t\tconst client = this._client = new Client()\n\t\tsuper._init({\n\t\t\torientation: Clutter.Orientation.VERTICAL,\n\t\t})\n\n\t\tthis.add_child(\n\t\t\tthis._header = new Header(client, options)\n\t\t)\n\t\tthis.add_child(\n\t\t\tthis._item = new WeatherSection(client, options)\n\t\t)\n\n\t\t// Sync changes\n\t\tthis._client.connectObject(\n\t\t\t\"changed\",\n\t\t\tthis._updateStyleClass.bind(this),\n\t\t\tthis\n\t\t)\n\t\tthis._updateStyleClass()\n\t}\n\t_updateStyleClass(): void {\n\t\tconst options = this._options\n\t\tlet style = \"QSTWEAKS-weather\"\n\t\tif (options.removeShadow) style += \" QSTWEAKS-weather-remove-shadow\"\n\t\tif (options.compact) style += \" QSTWEAKS-weather-compact\"\n\t\tthis.styleClass = style\n\t}\n\n\t// Update weather client when widget shown\n\tvfunc_map() {\n\t\tthis._client.update()\n\t\tsuper.vfunc_map()\n\t}\n}\nGObject.registerClass(WeatherWidget)\nnamespace WeatherWidget {\n\texport type Options = {\n\t\tcompact: boolean\n\t\tremoveShadow: boolean\n\t} & WeatherSection.Options\n}\n// #endregion WeatherWidget\n\n// #region WeatherWidgetFeature\nexport class WeatherWidgetFeature extends FeatureBase {\n\t// #region settings\n\tenabled: boolean\n\tcompact: boolean\n\tremoveShadow: boolean\n\tclickCommand: string\n\theader: boolean\n\tmaxForecasts: number\n\tintervalHour: number\n\tshowLocation: boolean\n\toverride loadSettings(loader: SettingLoader): void {\n\t\tthis.enabled = loader.loadBoolean(\"weather-enabled\")\n\t\tthis.removeShadow = loader.loadBoolean(\"weather-remove-shadow\")\n\t\tthis.compact = loader.loadBoolean(\"weather-compact\")\n\t\tthis.clickCommand = loader.loadString(\"weather-click-command\")\n\t\tthis.header = loader.loadBoolean(\"weather-show-header\")\n\t\tthis.showLocation = loader.loadBoolean(\"weather-show-location\")\n\t\tthis.maxForecasts = loader.loadInt(\"weather-max-forecasts\")\n\t\tthis.intervalHour = loader.loadInt(\"weather-interval-hour\")\n\t}\n\t// #endregion settings\n\n\tweatherWidget: WeatherWidget\n\toverride reload(key: string): void {\n\t\tswitch (key) {\n\t\t\tcase \"weather-compact\":\n\t\t\tcase \"weather-remove-shadow\":\n\t\t\t\tif (!this.enabled) return\n\t\t\t\tthis.weatherWidget!._updateStyleClass()\n\t\t\t\tbreak\n\t\t\tcase \"weather-click-command\":\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tsuper.reload()\n\t\t\t\tbreak\n\t\t}\n\t}\n\toverride onLoad(): void {\n\t\tif (!this.enabled) return\n\t\tthis.maid.destroyJob(\n\t\t\tthis.weatherWidget = new WeatherWidget(this)\n\t\t)\n\n\t\tGlobal.QuickSettingsGrid.add_child(this.weatherWidget)\n\t\tGlobal.QuickSettingsGrid.layout_manager.child_set_property(\n\t\t\tGlobal.QuickSettingsGrid, this.weatherWidget, \"column-span\", 2\n\t\t)\n\t}\n\toverride onUnload(): void {\n\t\tthis.weatherWidget = null\n\t}\n}\n// #endregion WeatherWidgetFeature\n"
  },
  {
    "path": "src/global.scss",
    "content": "$p: \".QSTWEAKS\";\n$v: \"-QSTWEAKS\";\n"
  },
  {
    "path": "src/global.ts",
    "content": "import Clutter from \"gi://Clutter\"\nimport St from \"gi://St\"\nimport GLib from \"gi://GLib\"\nimport Gio from \"gi://Gio\"\nimport * as Main from \"resource:///org/gnome/shell/ui/main.js\"\nimport { type Extension } from \"resource:///org/gnome/shell/extensions/extension.js\"\nimport { type MessageTray } from \"resource:///org/gnome/shell/ui/messageTray.js\"\nimport { type DateMenuButton } from \"resource:///org/gnome/shell/ui/dateMenu.js\"\nimport * as PanelMenu from \"resource:///org/gnome/shell/ui/panelMenu.js\"\nimport {\n\ttype CalendarMessageList\n} from \"resource:///org/gnome/shell/ui/calendar.js\";\nimport {\n\ttype SystemItem,\n\ttype Indicator as SystemIndicator\n} from \"resource:///org/gnome/shell/ui/status/system.js\"\nimport { type PopupMenu } from \"resource:///org/gnome/shell/ui/popupMenu.js\"\nimport { type QuickSlider, type QuickSettingsMenu } from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport Logger from \"./libs/shared/logger.js\"\n\ntype StreamSlider = {\n\tVolumeInput: any,\n\tInputStreamSlider: QuickSlider,\n\tOutputStreamSlider: QuickSlider,\n}\nexport default class Global {\n\tstatic QuickSettings: PanelMenu.Button\n\tstatic QuickSettingsMenu: QuickSettingsMenu\n\tstatic QuickSettingsGrid: St.Widget\n\tstatic QuickSettingsBox: St.BoxLayout\n\tstatic QuickSettingsActor: St.Widget\n\tstatic get QuickSettingsSystemIndicator(): Promise<SystemIndicator> {\n\t\treturn new Promise(resolve => {\n\t\t\tlet system = (this.QuickSettings as any)._system\n\t\t\tif (system) {\n\t\t\t\tresolve(system)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tGLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {\n\t\t\t\tsystem = (this.QuickSettings as any)._system\n\t\t\t\tif (!system) return GLib.SOURCE_CONTINUE\n\t\t\t\tresolve(system)\n\t\t\t\treturn GLib.SOURCE_REMOVE\n\t\t\t})\n\t\t})\n\t}\n\tstatic get QuickSettingsSystemItem(): Promise<SystemItem> {\n\t\treturn this.QuickSettingsSystemIndicator\n\t\t\t.then(system=>(system as any)._systemItem)\n\t\t\t.catch(Logger.error)\n\t}\n\tstatic Indicators: St.BoxLayout\n\n\tstatic DateMenu: DateMenuButton\n\tstatic DateMenuMenu: PopupMenu\n\tstatic DateMenuBox: Clutter.Actor\n\tstatic DateMenuHolder: Clutter.Actor\n\n\tstatic MessageTray: MessageTray\n\n\tstatic Extension: Extension\n\tstatic Settings: Gio.Settings\n\n\tstatic get MessageList(): CalendarMessageList {\n\t\treturn (this.DateMenu as any)._messageList\n\t}\n\tstatic get DateMenuIndicator(): Clutter.Actor {\n\t\treturn (this.DateMenu as any)._indicator\n\t}\n\n\tstatic GetShutdownMenuBox(): Promise<Clutter.Actor> {\n\t\t// To prevent freeze, priority should be PRIORITY_DEFAULT_IDLE instead of PRIORITY_DEFAULT\n\t\treturn new Promise(resolve => {\n\t\t\tGLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {\n\t\t\t\tif (!(this.QuickSettings as any)._system)\n\t\t\t\t\treturn GLib.SOURCE_CONTINUE\n\t\t\t\tresolve((this.QuickSettings as any)._system._systemItem.menu.box)\n\t\t\t\treturn GLib.SOURCE_REMOVE\n\t\t\t})\n\t\t})\n\t}\n\n\tprivate static StreamSliderGetter(): StreamSlider|null {\n\t\tif (!(this.QuickSettings as any)._volumeInput)\n\t\t\treturn null\n\t\treturn {\n\t\t\tVolumeInput: (this.QuickSettings as any)._volumeInput,\n\t\t\tInputStreamSlider: (this.QuickSettings as any)._volumeInput._input,\n\t\t\tOutputStreamSlider: (this.QuickSettings as any)._volumeOutput._output,\n\t\t}\n\t}\n\tstatic GetStreamSlider(): Promise<StreamSlider> {\n\t\treturn new Promise(resolve => {\n\t\t\tlet streamSlider = this.StreamSliderGetter()\n\t\t\tif (streamSlider) {\n\t\t\t\tresolve(streamSlider)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tGLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {\n\t\t\t\tstreamSlider = this.StreamSliderGetter()\n\t\t\t\tif (!streamSlider) return GLib.SOURCE_CONTINUE\n\t\t\t\tresolve(streamSlider)\n\t\t\t\treturn GLib.SOURCE_REMOVE\n\t\t\t})\n\t\t})\n\t}\n\n\tprivate static DBusFiles: Map<string, Gio.DBusNodeInfo>\n\tprivate static Decoder: TextDecoder\n\tstatic GetDbusInterface(path: string, interfaceName: string) {\n\t\tlet cachedInfo = this.DBusFiles.get(path)\n\t\tif (!cachedInfo) {\n\t\t\tconst DbusFile = Gio.File.new_for_path(`${this.Extension.path}/${path}`)\n\t\t\tcachedInfo = Gio.DBusNodeInfo.new_for_xml(this.Decoder.decode(DbusFile.load_contents(null)[1]))\n\t\t\tthis.DBusFiles.set(path, cachedInfo)\n\t\t}\n\t\treturn cachedInfo.lookup_interface(interfaceName)\n\t}\n\n\tprivate static Shaders: Map<string, [string, string]>\n\tstatic GetShader(path: string): [string, string] {\n\t\tlet cachedInfo = this.Shaders.get(path)\n\t\tif (!cachedInfo) {\n\t\t\tconst shaderFile = Gio.File.new_for_path(`${this.Extension.path}/${path}`)\n\t\t\tconst [declarations, main] = this.Decoder.decode(shaderFile.load_contents(null)[1]).split(\n\t\t\t\t/^.*?main\\(\\s?\\)\\s?/m\n\t\t\t) as [string, string]\n\t\t\tcachedInfo = [\n\t\t\t\tdeclarations.trim(),\n\t\t\t\tmain.trim().replace(/^[{}]/gm, '').trim()\n\t\t\t]\n\t\t\tthis.Shaders.set(path, cachedInfo)\n\t\t}\n\t\treturn cachedInfo\n\t}\n\n\tstatic unload() {\n\t\tthis.QuickSettings = null\n\t\tthis.QuickSettingsMenu = null\n\t\tthis.QuickSettingsGrid = null\n\t\tthis.QuickSettingsBox = null\n\t\tthis.QuickSettingsActor = null\n\t\tthis.Indicators = null\n\t\tthis.DateMenu = null\n\t\tthis.DateMenuMenu = null\n\t\tthis.DateMenuBox = null\n\t\tthis.DateMenuHolder = null\n\t\tthis.MessageTray = null\n\t\tthis.Extension = null\n\t\tthis.Settings = null\n\t\tthis.DBusFiles = null\n\t\tthis.Shaders = null\n\t\tthis.Decoder = null\n\t}\n\tstatic load(extension: Extension) {\n\t\tthis.Extension = extension\n\t\tthis.Settings = extension.getSettings()\n\t\tthis.Shaders = new Map()\n\t\tthis.DBusFiles = new Map()\n\t\tthis.Decoder = new TextDecoder(\"utf-8\")\n\n\t\t// Quick Settings Items\n\t\tconst QuickSettings = this.QuickSettings = Main.panel.statusArea.quickSettings\n\t\tthis.QuickSettingsMenu = QuickSettings.menu\n\t\tthis.QuickSettingsGrid = QuickSettings.menu._grid\n\t\tthis.QuickSettingsBox = QuickSettings.menu.box\n\t\tthis.QuickSettingsActor = QuickSettings.menu.actor\n\t\tthis.Indicators = QuickSettings._indicators\n\n\t\t// Date Menu\n\t\tconst DateMenu = this.DateMenu = Main.panel.statusArea.dateMenu\n\t\tconst DateMenuMenu = this.DateMenuMenu = DateMenu.menu as any\n\t\tthis.DateMenuBox = DateMenuMenu.box\n\t\tthis.DateMenuHolder = DateMenuMenu.box.first_child.first_child\n\n\t\t// Message\n\t\tthis.MessageTray = Main.messageTray\n\t}\n}\n"
  },
  {
    "path": "src/libs/prefs/components.ts",
    "content": "\nimport Adw from \"gi://Adw\"\nimport Gio from \"gi://Gio\"\nimport Gtk from \"gi://Gtk\"\nimport Gdk from \"gi://Gdk\"\nimport GLib from \"gi://GLib\"\nimport GObject from \"gi://GObject\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport { deepEqual } from \"../shared/jsUtils.js\"\n\nfunction addChildren(target: any, funcName: string, children?: any[]) {\n\tif (!children) return\n\tfor (const item of children) {\n\t\tif (!item) continue\n\t\ttarget[funcName](item)\n\t}\n}\n\nfunction setLinkCursor(target: any) {\n\ttarget.cursor = Gdk.Cursor.new_from_name(\"pointer\", null)\n}\n\nexport function setScrollToFocus(target: Adw.PreferencesPage, value: boolean) {\n\tconst viewport: Gtk.Viewport = target\n\t\t.get_first_child() // GtkScrolledWindow\n\t\t.get_first_child() as any // GtkViewport\n\tviewport.scrollToFocus = value\n}\nexport function delayedSetScrollToFocus(target: Adw.PreferencesPage, value: boolean) {\n\tconst id = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 10, ()=>{\n\t\tsetScrollToFocus(target, value)\n\t\treturn GLib.SOURCE_REMOVE\n\t})\n\tGLib.source_set_name_by_id(id, \"[quick-settings-tweaks] delayedSetScrollToFocus: id\")\n}\n// Fix adwaita scroll flicking issue\nexport function fixPageScrollIssue(page: Adw.PreferencesPage) {\n\tpage.connect(\"unmap\", ()=>{\n\t\tsetScrollToFocus(page, false)\n\t})\n\tpage.connect(\"map\", ()=>{\n\t\tdelayedSetScrollToFocus(page, true)\n\t})\n}\nexport function pushButton(row_with_suffix: Adw.ActionRow, button: any): any {\n\tconst suffixes = row_with_suffix\n\t.get_first_child() // GtkBox header\n\t.get_last_child() // GtkBox suffixes\n\tconst first_suffix = suffixes.get_first_child()\n\tbutton\n\t.insert_before(\n\t\tsuffixes, first_suffix\n\t)\n\treturn first_suffix\n}\nexport function pushDetailedButton(\n\trow_with_suffix: Adw.ActionRow,\n\tonDetailed: ()=>void\n): Gtk.Button {\n\tconst buttonBox = Button({\n\t\taction: onDetailed,\n\t\ticonName: \"emblem-system-symbolic\",\n\t\thasFrame: false,\n\t\ttooltip: _(\"Details\"),\n\t})\n\tbuttonBox.marginEnd = 2\n\tconst button: Gtk.Button = buttonBox.get_first_child() as any\n\tconst image: Gtk.Image = button.get_first_child() as any\n\timage.pixel_size = 12\n\timage.opacity = 0.75\n\trow_with_suffix.activatable_widget = null\n\trow_with_suffix.connect(\"activated\", ()=>onDetailed())\n\tconst switchWidget: Gtk.Switch|null = pushButton(row_with_suffix, buttonBox)\n\tif (switchWidget) switchWidget.canFocus = true\n\treturn button\n}\nexport function removeRowBottomBorder(row: Adw.EntryRow|Adw.ActionRow) {\n\tconst style = new Gtk.CssProvider()\n\tstyle.load_from_string(\"row{border-bottom-width:0px;}\")\n\trow.get_style_context().add_provider(style, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)\n}\nexport function removeRowMinHeight(row: Adw.EntryRow|Adw.ActionRow) {\n\tconst styleRow = new Gtk.CssProvider()\n\tstyleRow.load_from_string(\"row{min-height:0px;}\")\n\trow.get_style_context().add_provider(styleRow, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)\n\tconst styleBox = new Gtk.CssProvider()\n\tstyleBox.load_from_string(\".header{min-height:0px; margin-bottom: 4px;}\")\n\trow.get_first_child().get_style_context().add_provider(styleBox, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)\n}\n\n// #region Dialog\nexport function Dialog({\n\twindow,\n\ttitle,\n\tminHeight,\n\tusePopup,\n\tchildrenRequest,\n}: Dialog.Options): Adw.PreferencesDialog {\n\tconst dialog = new Dialog.PrefDialog(title, childrenRequest, usePopup ?? false)\n\tif (minHeight) dialog.height_request = minHeight\n\tdialog.present(window)\n\treturn dialog\n}\nexport namespace Dialog {\n\texport type ChildrenRequest = (page: Adw.PreferencesPage, dialog: Adw.PreferencesDialog)=>any\n\texport interface Options {\n\t\ttitle?: string\n\t\tminHeight?: number\n\t\tchildrenRequest: ChildrenRequest\n\t\twindow: Adw.PreferencesWindow\n\t\tusePopup?: boolean\n\t}\n\texport const PrefDialogPage = GObject.registerClass({\n\t\tGTypeName: \"qwreey-pref-components-PrefDialogPage\",\n\t}, class PrefDialogPage extends Adw.PreferencesPage {\n\t\tconstructor(childrenRequest: ChildrenRequest, dialog: Adw.PreferencesDialog, title?: string) {\n\t\t\tsuper({\n\t\t\t\tname: \"PrefDialogPage\",\n\t\t\t})\n\t\t\tif (title) {\n\t\t\t\tthis.title = title\n\t\t\t}\n\t\t\taddChildren(this, \"add\", childrenRequest(this, dialog))\n\t\t}\n\t})\n\texport const PrefDialog = GObject.registerClass({\n\t\tGTypeName: \"qwreey-pref-components-PrefDialog\",\n\t}, class PrefDialog extends Adw.PreferencesDialog {\n\t\tconstructor(title: string, childrenRequest: ChildrenRequest, usePopup: boolean) {\n\t\t\tsuper({\n\t\t\t\ttitle: title ?? \"\",\n\t\t\t\tsearch_enabled: true,\n\t\t\t\tpresentation_mode: usePopup\n\t\t\t\t\t? Adw.DialogPresentationMode.FLOATING\n\t\t\t\t\t: Adw.DialogPresentationMode.BOTTOM_SHEET,\n\t\t\t})\n\t\t\tthis.add(new PrefDialogPage(childrenRequest, this))\n\t\t}\n\t})\n\texport function StackedPage({ title, dialog, childrenRequest }: {\n\t\ttitle: string,\n\t\tdialog: Adw.PreferencesDialog,\n\t\tchildrenRequest: ChildrenRequest,\n\t}): Adw.NavigationPage {\n\t\tconst page = new Adw.NavigationPage({\n\t\t\ttitle: title,\n\t\t\tcan_pop: true,\n\t\t})\n\t\tconst view = page.child = new Adw.ToolbarView()\n\t\tview.add_top_bar(new Adw.HeaderBar())\n\t\tview.content = new Dialog.PrefDialogPage(childrenRequest, dialog)\n\t\tdialog.push_subpage(page)\n\t\treturn page\n\t}\n}\n// #endregion Dialog\n\n// #region ExperimentalIcon\nexport function ExperimentalIcon(options?: ExperimentalIcon.Options): Gtk.Image {\n\treturn new Gtk.Image({\n\t\tcss_classes: [\"icon\"],\n\t\ticon_name: \"applications-science-symbolic\",\n\t\tpixel_size: options?.pixelSize ?? 16,\n\t\tmargin_end: options?.marginEnd ?? 4,\n\t\tmargin_start: options?.marginStart ?? 2,\n\t\topacity: 0.8,\n\t\thas_tooltip: true,\n\t\ttooltip_text: _(\"This feature marked as experimental\"),\n\t})\n}\nexport namespace ExperimentalIcon {\n\texport interface Options {\n\t\tmarginEnd?: number\n\t\tmarginStart?: number\n\t\tpixelSize?: number\n\t}\n\texport function prependExperimentalIcon(holder: Gtk.Widget, options?: ExperimentalIcon.Options) {\n\t\tExperimentalIcon(options).insert_before(holder,holder.get_first_child())\n\t}\n}\n// #endregion ExperimentalIcon\n\n// #region Group\nexport function Group(options: Group.Options, children?: any[]): Adw.PreferencesGroup {\n\toptions.title ??= \"\"\n\tconst { experimental, parent, onCreated, nesting } = options\n\tdelete options.parent\n\tdelete options.experimental\n\tdelete options.onCreated\n\tdelete options.nesting\n\tconst target = new Adw.PreferencesGroup(options)\n\tif (nesting) target.marginTop = 14\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(\n\t\ttarget.get_first_child().get_first_child(),\n\t\t{ marginEnd: 18, marginStart: 4, pixelSize: 20 }\n\t)\n\taddChildren(target, \"add\", children)\n\tif (parent) parent.add(target)\n\tif (onCreated) onCreated(target)\n\treturn target\n}\nexport namespace Group {\n\texport type Options = Partial<Adw.PreferencesGroup.ConstructorProps & {\n\t\tparent: any,\n\t\texperimental: boolean,\n\t\tnesting: boolean,\n\t\tonCreated?: (row: Adw.PreferencesGroup)=>void,\n\t}>\n}\n// #endregion Group\n\n// #region Row\nexport function Row({\n\tsettings,\n\tparent,\n\ttitle,\n\tsubtitle,\n\turi,\n\ticon,\n\tsensitiveBind,\n\tsuffix,\n\tprefix,\n\texperimental,\n\tnoLinkIcon,\n\taction,\n\tonCreated,\n}: Row.Options): Adw.ActionRow {\n\tconst row = new Adw.ActionRow({\n\t\ttitle: title ?? null,\n\t\tsubtitle: subtitle ?? null,\n\t\tactivatable: (!!uri) || (!!action),\n\t})\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\tif (uri) {\n\t\trow.connect(\"activated\", ()=>{\n\t\t\tGio.AppInfo.launch_default_for_uri_async(uri, null, null, null)\n\t\t})\n\t\tsetLinkCursor(row)\n\t\tif (!noLinkIcon) Row.addSuffixIcon(row, \"adw-external-link-symbolic\")\n\t\trow.tooltip_text = uri\n\t\trow.has_tooltip = true\n\t}\n\tif (action) {\n\t\trow.connect(\"activated\", ()=>action())\n\t\tsetLinkCursor(row)\n\t\tif (!noLinkIcon) Row.addSuffixIcon(row, \"go-next-symbolic\")\n\t}\n\tif (icon) Row.appendLinkIcon(row, icon)\n\tif (suffix) {\n\t\trow.add_suffix(suffix)\n\t}\n\tif (prefix) {\n\t\trow.add_prefix(prefix)\n\t}\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\trow, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\trow.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\tif (onCreated) onCreated(row)\n\treturn row\n}\nexport namespace Row {\n\texport interface Options {\n\t\tparent?: any\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t\turi?: string\n\t\ticon?: string\n\t\tsettings?: Gio.Settings\n\t\tsensitiveBind?: string\n\t\tsuffix?: Gtk.Widget\n\t\tprefix?: Gtk.Widget\n\t\texperimental?: boolean\n\t\tnoLinkIcon?: boolean,\n\t\taction?: ()=>void\n\t\tonCreated?: (row: Adw.ActionRow)=>void\n\t}\n\texport function appendLinkIcon(row: any, name: string) {\n\t\tconst linkText = row.child.get_first_child()\n\t\tlinkText.margin_start = 32\n\t\tconst image = new Gtk.Image({\n\t\t\tcss_classes: [\"icon\"],\n\t\t\ticon_name: name,\n\t\t\tpixel_size: 20,\n\t\t\tmargin_start: 2,\n\t\t\tmargin_end: 2,\n\t\t\thalign: Gtk.Align.START,\n\t\t})\n\t\timage.insert_before(row.child, linkText)\n\t}\n\texport function addSuffixIcon(row: Adw.ActionRow, name: string) {\n\t\trow.add_suffix(new Gtk.Image({\n\t\t\tcss_classes: [\"icon\"],\n\t\t\ticon_name: name,\n\t\t\tpixel_size: 16,\n\t\t\tmargin_end: 4,\n\t\t\tvalign: Gtk.Align.CENTER,\n\t\t}))\n\t}\n}\n// #endregion Row\n\n// #region DialogRow\nexport function DialogRow(options: DialogRow.Options): Adw.ActionRow {\n\treturn Row({\n\t\t...options,\n\t\taction: () => {\n\t\t\tconst dialog = Dialog({\n\t\t\t\t...options,\n\t\t\t\ttitle: options.dialogTitle,\n\t\t\t})\n\t\t\tif (options.onDialogCreated) {\n\t\t\t\toptions.onDialogCreated(dialog)\n\t\t\t}\n\t\t}\n\t})\n}\nexport namespace DialogRow {\n\texport interface Options extends Dialog.Options, Row.Options {\n\t\tdialogTitle?: string\n\t\tonDialogCreated?: (dialog: Adw.PreferencesDialog)=>void\n\t}\n}\n// #endregion DialogRow\n\n// #region ResetButton\nexport function ResetButton(options: ResetButton.Options): Gtk.Box {\n\tconst { settings, bind } = options\n\toptions.iconName ??= \"view-refresh-symbolic\"\n\tconst box = Button({\n\t\t...options,\n\t\tonCreated: null,\n\t})\n\tbox.halign = Gtk.Align.END\n\tconst button: Gtk.Button = box.get_first_child() as any\n\tbutton.valign = Gtk.Align.CENTER\n\tbutton.has_frame = false\n\tbutton.tooltip_text = _(\"Reset to default\")\n\tbutton.connect(\"clicked\", ()=>settings.reset(bind))\n\tconst image: Gtk.Image = button.get_first_child() as any\n\timage.pixel_size = 12\n\timage.opacity = 0.75\n\tconst setVisible = ()=>{\n\t\tconst state = ResetButton.getOptionState(settings, bind)\n\t\tbox.visible = options.dontHideWhenMatch ? state.isSet : (!state.isMatch)\n\t}\n\tconst settingsConnection = settings.connect(`changed::${bind}`, setVisible)\n\tsetVisible()\n\tbox.connect(\"destroy\", ()=>{\n\t\tsettings.disconnect(settingsConnection)\n\t})\n\treturn box\n}\nexport namespace ResetButton {\n\texport interface Options extends Button.OptionsBase {\n\t\tbind: string,\n\t\tdontHideWhenMatch?: boolean\n\t}\n\texport function getOptionState(settings: Gio.Settings, key: string): {\n\t\tisMatch: boolean,\n\t\tisSet: boolean,\n\t} {\n\t\tconst userValue = settings.get_user_value(key)\n\t\tconst defaultValue = settings.get_default_value(key)\n\t\treturn {\n\t\t\tisSet: userValue != null,\n\t\t\tisMatch:\n\t\t\t\t(userValue == null)\n\t\t\t\t|| (userValue && defaultValue && userValue.equal(defaultValue)),\n\t\t}\n\t}\n\texport function pushResetButton(row_with_suffix: Adw.ActionRow, options: ResetButton.Options) {\n\t\tpushButton(row_with_suffix, ResetButton(options))\n\t}\n}\n// #endregion ResetButton\n\n// #region SwitchRow\nexport function SwitchRow({\n\tbind,\n\tparent,\n\tvalue,\n\ttitle,\n\tsubtitle,\n\taction,\n\tsensitiveBind,\n\tsettings,\n\texperimental,\n\tnoResetButton,\n\tonCreated,\n\tonDetailed,\n}: SwitchRow.Options): Adw.SwitchRow {\n\tif (bind) value ??= settings.get_boolean(bind)\n\n\tconst row = new Adw.SwitchRow({\n\t\ttitle: title ?? \"\",\n\t\tsubtitle: subtitle ?? null,\n\t\tactive: value,\n\t})\n\tsetLinkCursor(row)\n\n\tif (action) {\n\t\trow.connect(\"notify::active\", () => action(row.get_active()))\n\t}\n\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\n\tif (onDetailed) pushDetailedButton(row, onDetailed)\n\n\tif (bind) {\n\t\tsettings.bind(\n\t\t\tbind,\n\t\t\trow, \"active\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tif (!noResetButton) ResetButton.pushResetButton(row, { settings, bind })\n\t}\n\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\trow, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\trow.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\tif (onCreated) onCreated(row)\n\n\treturn row\n}\nexport namespace SwitchRow {\n\texport interface Options {\n\t\tsettings?: Gio.Settings\n\t\tvalue?: boolean\n\t\tbind?: string\n\t\tparent?: any\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t\taction?: (value: boolean)=>void\n\t\tsensitiveBind?: string\n\t\texperimental?: boolean\n\t\tnoResetButton?: boolean\n\t\tonCreated?: (row: Adw.SwitchRow)=>void\n\t\tonDetailed?: ()=>void\n\t}\n}\n// #endregion SwitchRow\n\n// #region ToggleButtonRow\nexport function ToggleButtonRow({\n\tbind,\n\tparent,\n\tvalue,\n\ttitle,\n\tsubtitle,\n\taction,\n\tsensitiveBind,\n\tsettings,\n\texperimental,\n\ttext,\n\tnoResetButton,\n\tonCreated,\n}: ToggleButtonRow.Options): Adw.ActionRow {\n\tif (bind) value ??= settings.get_boolean(bind)\n\n\tconst row = new Adw.ActionRow({\n\t\ttitle: title ?? \"\",\n\t\tsubtitle: subtitle ?? null,\n\t})\n\tconst box = new Gtk.Box({\n\t\tmargin_bottom: 8,\n\t\tmargin_top: 8,\n\t})\n\tconst toggle = new Gtk.ToggleButton({\n\t\tlabel: text,\n\t\tactive: value,\n\t})\n\tbox.insert_child_after(toggle, null)\n\trow.add_suffix(box)\n\tsetLinkCursor(row)\n\n\tif (action) {\n\t\ttoggle.connect(\"notify::active\", () => action(toggle.get_active()))\n\t}\n\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\n\tif (bind) {\n\t\tsettings.bind(\n\t\t\tbind,\n\t\t\ttoggle, \"active\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tif (!noResetButton) ResetButton.pushResetButton(row, { settings, bind })\n\t}\n\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\trow, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\trow.sensitive = settings.get_boolean(sensitiveBind)\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\ttoggle, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\ttoggle.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\tif (onCreated) onCreated(row)\n\n\treturn row\n}\nexport namespace ToggleButtonRow {\n\texport interface Options {\n\t\tsettings?: Gio.Settings\n\t\tvalue?: boolean\n\t\tbind?: string\n\t\tparent?: any\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t\taction?: (value: boolean)=>void\n\t\tsensitiveBind?: string\n\t\texperimental?: boolean\n\t\ttext?: string\n\t\tnoResetButton?: boolean\n\t\tonCreated?: (row: Adw.ActionRow)=>void\n\t}\n}\n// #endregion ToggleButtonRow\n\n// #region Button\nexport function Button({\n\tparent,\n\taction,\n\tsensitiveBind,\n\tsettings,\n\ttext,\n\tmarginTop,\n\tmarginBottom,\n\ticonName,\n\thasFrame,\n\ttooltip,\n\tonCreated,\n}: Button.Options): Gtk.Box {\n\tconst box = new Gtk.Box({\n\t\tmargin_bottom: marginBottom ?? 8,\n\t\tmargin_top: marginTop ?? 8,\n\t})\n\tconst button = new Gtk.Button({\n\t\thas_frame: hasFrame ?? true,\n\t})\n\tbox.insert_child_after(button, null)\n\tsetLinkCursor(button)\n\tif (iconName && !text) {\n\t\tbutton.icon_name = iconName\n\t}\n\tif (text && !iconName) {\n\t\tbutton.label = text\n\t}\n\tif (iconName && text) {\n\t\tconst box = button.child = new Gtk.Box({})\n\t\tnew Gtk.Image({\n\t\t\ticon_name: iconName,\n\t\t\tpixel_size: 12,\n\t\t\tmargin_end: 6,\n\t\t}).insert_before(box, null)\n\t\tnew Gtk.Label({\n\t\t\tlabel: text,\n\t\t}).insert_before(box, null)\n\t}\n\tif (tooltip) {\n\t\tbutton.tooltip_text = tooltip\n\t\tbutton.has_tooltip = true\n\t}\n\n\tif (action) {\n\t\tbutton.connect(\"clicked\", () => action())\n\t}\n\n\tif (parent) {\n\t\tparent.add(box)\n\t}\n\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\tbutton, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tbutton.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\tif (onCreated) onCreated(box)\n\n\treturn box\n}\nexport namespace Button {\n\texport interface Options extends OptionsBase {\n\t\tonCreated?: (row: Gtk.Box)=>void\n\t}\n\texport interface OptionsBase {\n\t\tsettings?: Gio.Settings\n\t\tparent?: any\n\t\taction?: ()=>void\n\t\tsensitiveBind?: string\n\t\ttext?: string\n\t\tmarginTop?: number\n\t\tmarginBottom?: number\n\t\ticonName?: string\n\t\thasFrame?: boolean\n\t\ttooltip?: string\n\t}\n}\n// #endregion Button\n\n// #region ButtonRow\nexport function ButtonRow(options: ButtonRow.Options): Adw.ActionRow {\n\tconst {\n\t\tparent,\n\t\ttitle,\n\t\tsubtitle,\n\t\texperimental,\n\t\tonCreated,\n\t} = options\n\tconst row = new Adw.ActionRow({\n\t\ttitle: title ?? \"\",\n\t\tsubtitle: subtitle ?? null,\n\t})\n\tsetLinkCursor(row)\n\trow.add_suffix(Button({\n\t\t...options,\n\t\tonCreated: null,\n\t}))\n\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\tif (onCreated) onCreated(row)\n\n\treturn row\n}\nexport namespace ButtonRow {\n\texport interface Options extends Button.OptionsBase {\n\t\tsettings?: Gio.Settings\n\t\tparent?: any\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t\taction?: ()=>void\n\t\tsensitiveBind?: string\n\t\texperimental?: boolean\n\t\ttext?: string\n\t\tmarginTop?: number\n\t\tmarginBottom?: number\n\t\tonCreated?: (row: Adw.ActionRow)=>void\n\t}\n}\n// #endregion ButtonRow\n\n// #region UpDownButton\nexport function UpDownButton({\n\tparent,\n\taction,\n\tsensitiveBind,\n\tsettings,\n\tmarginTop,\n\tmarginBottom,\n\tspacing,\n\tonCreated,\n}: UpDownButton.Options): Gtk.Box {\n\tconst box = new Gtk.Box({\n\t\tmargin_bottom: marginTop ?? 8,\n\t\tmargin_top: marginBottom ?? 8,\n\t\tspacing: spacing ?? 8\n\t})\n\tconst down = new Gtk.Button({\n\t\ticon_name: \"go-down-symbolic\"\n\t})\n\tconst up = new Gtk.Button({\n\t\ticon_name: \"go-up-symbolic\"\n\t})\n\tsetLinkCursor(up)\n\tsetLinkCursor(down)\n\tbox.insert_child_after(up, null)\n\tbox.insert_child_after(down, up)\n\n\tif (action) {\n\t\tdown.connect(\"clicked\", () => action(UpDownButton.Direction.Down))\n\t\tup.connect(\"clicked\", () => action(UpDownButton.Direction.Up))\n\t}\n\n\tif (parent) {\n\t\tparent.add(box)\n\t}\n\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\tup, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tup.sensitive = settings.get_boolean(sensitiveBind)\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\tdown, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tdown.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\tif (onCreated) onCreated(box)\n\n\treturn box\n}\nexport namespace UpDownButton {\n\texport interface Options {\n\t\tsettings?: Gio.Settings\n\t\tparent?: any\n\t\tmarginTop?: number\n\t\tmarginBottom?: number\n\t\tspacing?: number\n\t\taction?: (direction: Direction)=>void\n\t\tsensitiveBind?: string\n\t\tonCreated?: (row: Gtk.Box)=>void\n\t}\n\texport enum Direction {\n\t\tUp,\n\t\tDown,\n\t}\n}\n// #endregion UpDownButton\n\n// #region RgbColorRow\nexport function RgbColorRow({\n\ttitle,\n\tsubtitle,\n\taction,\n\tsensitiveBind,\n\tsettings,\n\tbind,\n\texperimental,\n\tnoResetButton,\n\tonCreated,\n\tparent,\n\tvalue,\n\tuseAlpha,\n}: RgbColorRow.Options): Adw.ActionRow {\n\tif (bind) value ??= settings.get_value(bind).recursiveUnpack()\n\n\tconst row = new Adw.ActionRow({\n\t\ttitle: title ?? \"\",\n\t\tsubtitle: subtitle ?? null,\n\t\tactivatable: true,\n\t})\n\tconst button = new Gtk.ColorButton({\n\t\tmargin_start: 6,\n\t\tmargin_top: 6,\n\t\tmargin_bottom: 6,\n\t\tuse_alpha: useAlpha ?? false,\n\t})\n\trow.add_suffix(button)\n\tconst themeDefaultLabel = new Gtk.Label({\n\t\tlabel: _(\"Theme default\"),\n\t\tmargin_start: 12,\n\t\tmargin_end: 12,\n\t\tvisible: false,\n\t})\n\tconst themeDefaultOverlay = new Gtk.Overlay()\n\tthemeDefaultOverlay.child = themeDefaultLabel\n\tthemeDefaultOverlay.insert_before(\n\t\tbutton,\n\t\tnull\n\t)\n\trow.connect(\"activated\", ()=>button.activate())\n\tsetLinkCursor(row)\n\tconst updateColor = ()=>{\n\t\tthemeDefaultLabel.visible = value.length == 0\n\t\tconst color = button.get_color().copy()\n\t\tcolor.red = (value[0] ?? 0) / 255\n\t\tcolor.green = (value[1] ?? 0) / 255\n\t\tcolor.blue = (value[2] ?? 0) / 255\n\t\tif (useAlpha) color.alpha = (value[3] ?? 1000) / 1000\n\t\tbutton.set_rgba(color)\n\t}\n\tupdateColor()\n\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\n\tif (action || bind) button.connect(\"color-set\", ()=>{\n\t\tconst color = button.get_rgba()\n\t\tconst arr = [\n\t\t\tMath.floor(color.red * 255 + .5),\n\t\t\tMath.floor(color.green * 255 + .5),\n\t\t\tMath.floor(color.blue * 255 + .5)\n\t\t] as RgbColorRow.Color\n\t\tif (useAlpha) arr.push(Math.floor(color.alpha * 1000 + .5))\n\t\tif (bind) settings.set_value(bind, new GLib.Variant(\"ai\", arr))\n\t\tif (action) action(arr)\n\t})\n\tif (bind) settings.connect(`changed::${bind}`, ()=>{\n\t\tconst newValue = settings.get_value(bind).recursiveUnpack()\n\t\tif (\n\t\t\tnewValue[0] != value[0]\n\t\t\t|| newValue[1] != value[1]\n\t\t\t|| newValue[2] != value[2]\n\t\t\t|| newValue[3] != value[3]\n\t\t) {\n\t\t\tvalue = newValue\n\t\t\tupdateColor()\n\t\t}\n\t})\n\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\trow, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\tbutton, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tbutton.sensitive = row.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\n\tif (bind && !noResetButton) {\n\t\tResetButton.pushResetButton(row, { settings, bind })\n\t}\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\n\tif (onCreated) onCreated(row)\n\n\treturn row\n}\nexport namespace RgbColorRow {\n\texport type Color = number[]\n\texport interface Options {\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t\taction?: (color: Color)=>void\n\t\tsensitiveBind?: string\n\t\tsettings?: Gio.Settings\n\t\tbind?: string\n\t\texperimental?: boolean\n\t\tnoResetButton?: boolean\n\t\tonCreated?: (row: Adw.ActionRow)=>void\n\t\tparent?: any\n\t\tvalue?: Color\n\t\tuseAlpha?: boolean\n\t\tenableThemeDefault?: boolean\n\t}\n}\n// #endregion RgbColorRow\n\n// #region EntryRow\nexport function EntryRow({\n\tbind,\n\tparent,\n\tvalue,\n\ttitle,\n\taction,\n\tsensitiveBind,\n\tsettings,\n\texperimental,\n\tnoResetButton,\n\tonCreated,\n}: EntryRow.Options): Adw.EntryRow {\n\tif (bind) value ??= settings.get_string(bind)\n\n\tconst row = new Adw.EntryRow({\n\t\ttitle: title ?? \"\",\n\t})\n\n\tif (action) {\n\t\trow.connect(\"notify::text\", () => {\n\t\t\taction(row.text)\n\t\t})\n\t}\n\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\n\tif (bind) {\n\t\tsettings.bind(\n\t\t\tbind,\n\t\t\trow, \"text\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tif (!noResetButton) row.add_suffix(ResetButton({ settings, bind }))\n\t}\n\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\trow, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\trow.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\tif (onCreated) onCreated(row)\n\n\treturn row\n}\nexport namespace EntryRow {\n\texport interface Options {\n\t\tsettings?: Gio.Settings\n\t\tbind?: string\n\t\tparent?: any\n\t\tvalue?: string\n\t\ttitle?: string\n\t\taction?: (value: string)=>void\n\t\tsensitiveBind?: string\n\t\texperimental?: boolean\n\t\tnoResetButton?: boolean\n\t\tonCreated?: (row: Adw.EntryRow)=>void\n\t}\n}\n// #endregion EntryRow\n\n// #region AdjustmentRow\nexport function AdjustmentRow({\n\tmax,\n\tmin,\n\tstepIncrement,\n\tpageIncrement,\n\tbind,\n\tparent,\n\tvalue,\n\ttitle,\n\tsubtitle,\n\taction,\n\tsensitiveBind,\n\tsettings,\n\texperimental,\n\tnoResetButton,\n\tonCreated,\n}: AdjustmentRow.Options): Adw.SpinRow {\n\tif (bind) value ??= settings.get_int(bind)\n\n\tconst row = new Adw.SpinRow({\n\t\ttitle: title ?? \"\",\n\t\tsubtitle: subtitle ?? null,\n\t\tadjustment: new Gtk.Adjustment({\n\t\t\tupper: max ?? 100,\n\t\t\tlower: min ?? 0,\n\t\t\tstepIncrement: stepIncrement ?? 1,\n\t\t\tpageIncrement: pageIncrement ?? 10,\n\t\t\tvalue: value\n\t\t}),\n\t})\n\tsetLinkCursor(row)\n\tconst header = row\n\t.get_first_child() // GtkBox header\n\tconst suffixes = header\n\t.get_last_child() // GtkBox suffixes\n\tconst spin = suffixes\n\t.get_first_child() // GtkSpinButton spin_button\n\tspin.hexpand = false\n\tsuffixes.hexpand = false\n\tnew Gtk.Box({ hexpand: true }).insert_before(header, suffixes)\n\n\tif (action) {\n\t\trow.connect(\"notify::value\", () => {\n\t\t\taction(row.get_value())\n\t\t})\n\t}\n\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\n\tif (bind) {\n\t\tsettings.bind(\n\t\t\tbind,\n\t\t\trow, \"value\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\tif (!noResetButton) ResetButton.pushResetButton(row, { settings, bind })\n\t}\n\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\trow, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\trow.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\tif (onCreated) onCreated(row)\n\n\treturn row\n}\nexport namespace AdjustmentRow {\n\texport interface Options {\n\t\tsettings?: Gio.Settings\n\t\tmax?: number\n\t\tmin?: number\n\t\tstepIncrement?: number\n\t\tpageIncrement?: number\n\t\tbind?: string\n\t\tparent?: any\n\t\tvalue?: number\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t\taction?: (value: number)=>void\n\t\tsensitiveBind?: string\n\t\texperimental?: boolean\n\t\tnoResetButton?: boolean\n\t\tonCreated?: (row: Adw.SpinRow)=>void\n\t}\n}\n// #endregion AdjustmentRow\n\n// #region ExpanderRow\nexport function ExpanderRow({\n\tparent,\n\ttitle,\n\tsubtitle,\n\texpanded,\n\texperimental,\n\tuseMarkup,\n\taction,\n\tonCreated,\n}: ExpanderRow.Options, children?: any[]): Adw.ExpanderRow {\n\tconst row = new Adw.ExpanderRow({\n\t\ttitle: title ?? null,\n\t\tsubtitle: subtitle ?? null,\n\t\tuse_markup: useMarkup ?? false,\n\t})\n\tsetLinkCursor(row)\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\taddChildren(row, \"add_row\", children)\n\tif (expanded === false || expanded === true) {\n\t\trow.expanded = expanded\n\t}\n\tif (action) row.connect(\"notify::expanded\", ()=>action(row.expanded))\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\tif (onCreated) onCreated(row)\n\treturn row\n}\nexport namespace ExpanderRow {\n\texport interface Options {\n\t\tparent?: any\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t\texpanded?: boolean\n\t\texperimental?: boolean\n\t\tuseMarkup?: boolean\n\t\taction?: (expanded: boolean)=>void\n\t\tonCreated?: (row: Adw.ExpanderRow)=>void\n\t}\n}\n// #endregion ExpanderRow\n\n// #region DropdownRow\nexport function DropdownRow<T>({\n\tsettings,\n\titems,\n\tbind,\n\tparent,\n\tvalue,\n\ttitle,\n\tsubtitle,\n\taction,\n\tsensitiveBind,\n\texperimental,\n\tnoResetButton,\n\tonCreated,\n}: DropdownRow.Options<T>) {\n\tlet filterModeModel = new Gio.ListStore({ item_type: DropdownRow.Items as any })\n\tlet type: \"number\"|\"string\"\n\tfor (const item of items) {\n\t\ttype ??= (typeof item.value) as typeof type\n\t\tfilterModeModel.append(new (DropdownRow.Items as any)(item.name, item.value))\n\t}\n\n\tconst getIndex = (value: string) => {\n\t\tfor (let i = 0; i < filterModeModel.get_n_items(); i++) {\n\t\t\tif ((filterModeModel.get_item(i) as any).value === value) {\n\t\t\t\treturn i\n\t\t\t}\n\t\t}\n\t\treturn -1\n\t}\n\tconst getValueFromBind = (): any => {\n\t\tif (type == \"string\") {\n\t\t\treturn settings.get_string(bind)\n\t\t}\n\t\tif (type == \"number\") {\n\t\t\treturn settings.get_int(bind)\n\t\t}\n\t}\n\tconst setValueFromBind = (value: any) => {\n\t\tif (type == \"string\") {\n\t\t\tsettings.set_string(bind, value)\n\t\t\treturn\n\t\t}\n\t\tif (type == \"number\") {\n\t\t\tsettings.set_int(bind, value)\n\t\t\treturn\n\t\t}\n\t}\n\tif (bind) value ??= getValueFromBind()\n\t\n\tlet row = new Adw.ComboRow({\n\t\ttitle: title ?? \"\",\n\t\tsubtitle: subtitle ?? null,\n\t\tmodel: filterModeModel,\n\t\texpression: new (Gtk.PropertyExpression as any)(DropdownRow.Items, null, \"name\"),\n\t\tselected: getIndex(value),\n\t})\n\tsetLinkCursor(row)\n\n\tif (parent) {\n\t\tparent.add(row)\n\t}\n\n\tif (bind) {\n\t\tif (!noResetButton) ResetButton.pushResetButton(row, { settings, bind })\n\t\tconst settingsConnection = settings.connect(`changed::${bind}`, ()=>{\n\t\t\tconst selected = (row.selectedItem as any).value\n\t\t\tconst changedTo = getValueFromBind()\n\t\t\tif (selected != changedTo) {\n\t\t\t\trow.selected = getIndex(changedTo)\n\t\t\t}\n\t\t})\n\t\trow.connect(\"destroy\", ()=>settings.disconnect(settingsConnection))\n\t}\n\tif (bind || action) row.connect(\"notify::selected\", () => {\n\t\tconst selected = (row.selectedItem as any).value\n\t\tif (bind && (selected != getValueFromBind())) {\n\t\t\tsetValueFromBind(selected)\n\t\t}\n\t\tif (action) {\n\t\t\taction(selected)\n\t\t}\n\t})\n\t\t\n\tif (sensitiveBind) {\n\t\tsettings.bind(\n\t\t\tsensitiveBind,\n\t\t\trow, \"sensitive\",\n\t\t\tGio.SettingsBindFlags.DEFAULT\n\t\t)\n\t\trow.sensitive = settings.get_boolean(sensitiveBind)\n\t}\n\tif (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)\n\tif (onCreated) onCreated(row)\n\n\treturn row\n}\nexport namespace DropdownRow {\n\texport interface Options<T> {\n\t\tsettings?: Gio.Settings\n\t\titems: { name: string, value: T }[]\n\t\tbind?: string\n\t\tparent?: any\n\t\tvalue?: string\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t\tsensitiveBind?: string\n\t\taction?: (value: string)=>void\n\t\texperimental?: boolean\n\t\tnoResetButton?: boolean\n\t\tonCreated?: (row: Adw.ComboRow)=>void\n\t}\n\texport const Items = GObject.registerClass({\n\t\tProperties: {\n\t\t\t\"name\": GObject.ParamSpec.string(\n\t\t\t\t\"name\", \"name\", \"name\",\n\t\t\t\tGObject.ParamFlags.READWRITE,\n\t\t\t\tnull),\n\t\t},\n\t}, class DropdownItems<T> extends GObject.Object {\n\t\tvalue: T\n\t\t_init(name: string, value: T) {\n\t\t\tsuper._init({ name })\n\t\t\tthis.value = value\n\t\t}\n\t})\n}\n// #endregion DropdownRow\n\n// #region ContributorsRow\nexport function ContributorsRow(row: ContributorsRow.Contributor[]): Adw.ActionRow {\n\tconst target = Row({})\n\tconst box = new Gtk.Box({\n\t\tbaseline_position: Gtk.BaselinePosition.CENTER,\n\t\thomogeneous: true,\n\t\torientation: Gtk.Orientation.HORIZONTAL,\n\t})\n\ttarget.set_child(box)\n\tfor (const item of row) {\n\t\tlet itemButton = new Gtk.Button({\n\t\t\thas_frame: false,\n\t\t})\n\t\tlet itemBox = new Gtk.Box({\n\t\t\tbaseline_position: Gtk.BaselinePosition.CENTER,\n\t\t\torientation: Gtk.Orientation.VERTICAL,\n\t\t\tcursor: Gdk.Cursor.new_from_name(\"pointer\", null),\n\t\t})\n\t\titemButton.child = itemBox\n\t\titemButton.connect(\"clicked\", ()=>{\n\t\t\tGio.AppInfo.launch_default_for_uri_async(item.link, null, null, null)\n\t\t})\n\t\tconst itemImage = new Gtk.Image({\n\t\t\tmargin_bottom: 2,\n\t\t\tmargin_top: 2,\n\t\t\ticon_name: item.image,\n\t\t\tpixel_size: 38,\n\t\t})\n\t\titemBox.append(itemImage)\n\t\tconst nameText = new Gtk.Label({\n\t\t\tlabel: `<span size=\"small\">${item.name}</span>`,\n\t\t\tuseMarkup: true,\n\t\t\thexpand: true,\n\t\t})\n\t\titemBox.append(nameText)\n\t\tlet labelBox = new Gtk.Box({\n\t\t\tbaseline_position: Gtk.BaselinePosition.CENTER,\n\t\t\torientation: Gtk.Orientation.VERTICAL,\n\t\t\tvexpand: true,\n\t\t\thexpand: true,\n\t\t\tmargin_bottom: 2,\n\t\t\tvalign: Gtk.Align.CENTER\n\t\t})\n\t\tfor (const label of item.label.split(\"\\n\")) {\n\t\t\tconst labelText = new Gtk.Label({\n\t\t\t\tlabel: `<span size=\"small\">${label}</span>`,\n\t\t\t\tuseMarkup: true,\n\t\t\t\thexpand: true,\n\t\t\t\topacity: 0.7,\n\t\t\t})\n\t\t\tlabelBox.append(labelText)\n\t\t}\n\t\titemBox.append(labelBox)\n\t\tbox.append(itemButton)\n\t}\n\treturn target\n}\nexport namespace ContributorsRow {\n\texport interface Contributor {\n\t\tname: string\n\t\tlabel: string\n\t\tlink: string\n\t\timage: string\n\t}\n}\n// #endregion ContributorsRow\n\n// #region LicenseRow\nexport function LicenseRow(item: LicenseRow.License): Adw.ExpanderRow {\n\tlet contentRow: Adw.ActionRow\n\tlet loaded = false\n\treturn ExpanderRow({\n\t\ttitle: item.name + (item.author ? ` <span alpha=\"70%\"><small>by ${item.author}</small></span>` : \"\"),\n\t\tsubtitle: item.description ?? \"\",\n\t\texpanded: false,\n\t\tuseMarkup: true,\n\t\taction: (expanded)=>{\n\t\t\tif (!expanded) return\n\t\t\tif (loaded) return\n\t\t\tif (item.content) item.content().then(\n\t\t\t\tsubtitle => contentRow.subtitle = subtitle\n\t\t\t).catch(\n\t\t\t\terror => {\n\t\t\t\t\tcontentRow.subtitle = `ERROR: ${error}`\n\t\t\t\t\tlog(error)\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t},[\n\t\tRow({\n\t\t\ttitle: _(\"Homepage\"),\n\t\t\tsubtitle: item.url,\n\t\t\turi: item.url,\n\t\t\ticon: \"go-home\",\n\t\t}),\n\t\titem.content ? (contentRow = Row({\n\t\t\ttitle: _(\"License\"),\n\t\t\tsubtitle: _(\"Loading ...\"),\n\t\t})) : null,\n\t\titem.licenseUri ? Row({\n\t\t\ttitle: _(\"License\"),\n\t\t\tsubtitle: item.licenseUri,\n\t\t\ticon: \"emblem-documents-symbolic\",\n\t\t\turi: item.licenseUri\n\t\t}) : null,\n\t\titem.affectedFiles ? Row({\n\t\t\ttitle: _(\"Affected Files\"),\n\t\t\tsubtitle: item.affectedFiles.join(\"\\n\"),\n\t\t\ticon: \"text-x-generic-symbolic\",\n\t\t}) : null,\n\t])\n}\nexport namespace LicenseRow {\n\texport interface License {\n\t\turl: string\n\t\tauthor: string\n\t\tname: string\n\t\tfile?: string\n\t\tcontent?: ()=>Promise<string>\n\t\tlicenseUri?: string\n\t\taffectedFiles?: string[]\n\t\tdescription?: string\n\t}\n}\n// #endregion LicenseRow\n\n// #region LogoBox\nexport function LogoBox({\n\ticon, name, version, versionAction,\n}: LogoBox.Options): Gtk.Box {\n\tconst logoBox = new Gtk.Box({\n\t\tbaseline_position: Gtk.BaselinePosition.CENTER,\n\t\tmargin_top: 6,\n\t\tspacing: 20,\n\t\torientation: Gtk.Orientation.VERTICAL,\n\t})\n\n\t// Logo icon\n\tconst logoImage = new Gtk.Image({\n\t\ticon_name: icon,\n\t\tpixel_size: 100,\n\t})\n\tlogoBox.append(logoImage)\n\n\t// Extension name\n\tconst logoText = new Gtk.Label({\n\t\tlabel: name,\n\t\tcss_classes: [\"title-2\"],\n\t\thalign: Gtk.Align.CENTER,\n\t})\n\tlogoBox.append(logoText)\n\n\t// Version\n\tconst logoVersion = new Gtk.Button({\n\t\tcss_classes: [\"success\"],\n\t\tlabel: version,\n\t\thalign: Gtk.Align.CENTER,\n\t})\n\tlogoBox.append(logoVersion)\n\tif (versionAction) {\n\t\tlogoVersion.connect(\"clicked\", ()=>versionAction())\n\t\tsetLinkCursor(logoVersion)\n\t}\n\n\treturn logoBox\n}\nexport namespace LogoBox {\n\texport interface Options {\n\t\tname: string\n\t\tversion: string\n\t\ticon: string\n\t\tversionAction?: ()=>void\n\t}\n}\n// #endregion LogoBox\n\n// #region LogoGroup\nexport function LogoGroup(options: LogoGroup.Options): Adw.PreferencesGroup {\n\treturn Group({\n\t\tparent: options.parent,\n\t},[\n\t\tLogoBox(options),\n\t])\n}\nexport namespace LogoGroup {\n\texport interface Options extends LogoBox.Options {\n\t\tparent: any,\n\t}\n}\n// #endregion LogoGroup\n\n// #region ChangelogDialog\nexport function ChangelogDialog({\n\tcontent,\n\twindow,\n\tcurrentBuildNumber,\n\tdefaultPageBuildNumber,\n\ttitle,\n\tsubtitle,\n}: ChangelogDialog.Options): Adw.PreferencesDialog {\n\tconst dialog = Dialog({\n\t\twindow,\n\t\ttitle: title ?? _(\"Changelog\"),\n\t\tchildrenRequest: ()=>[Group({\n\t\t\ttitle: title ?? \"\",\n\t\t\tdescription: subtitle ?? \"\",\n\t\t\tonCreated: (group: Adw.PreferencesGroup) => {\n\t\t\t\tcontent()\n\t\t\t\t.then(ChangelogDialog.getReleases)\n\t\t\t\t.then(releases => releases.map(release => Row({\n\t\t\t\t\ttitle: release.version,\n\t\t\t\t\tsubtitle: release.Date ?? \"\",\n\t\t\t\t\taction: ()=>ChangelogDialog.ChangelogPage(dialog, release),\n\t\t\t\t\tonCreated: (row)=>{\n\t\t\t\t\t\tif (release.BuildNumber == currentBuildNumber) {\n\t\t\t\t\t\t\trow.add_css_class(\"success\")\n\t\t\t\t\t\t\trow.title += \" \" + _(\"(Current)\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (release.BuildNumber == defaultPageBuildNumber) {\n\t\t\t\t\t\t\tChangelogDialog.ChangelogPage(dialog, release)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgroup.add(row)\n\t\t\t\t\t}\n\t\t\t\t})))\n\t\t\t\t.catch(log)\n\t\t\t},\n\t\t})]\n\t})\n\tdialog.height_request = 520\n\treturn dialog\n}\nexport namespace ChangelogDialog {\n\texport interface Options {\n\t\twindow: Adw.PreferencesWindow\n\t\tcurrentBuildNumber: number\n\t\tcontent: ()=>Promise<string>\n\t\tdefaultPageBuildNumber?: number\n\t\ttitle?: string\n\t\tsubtitle?: string\n\t}\n\tconst BOLD = (t: string)=>`<span weight=\"bold\">${t}</span>`\n\tconst LITEM = (t: string,lv: number)=>`${\"　 \".repeat(lv)}<span alpha=\"70%\">  •　</span>${t}`\n\tconst TITLE = (t: string,lv: number)=>`<span size=\"${100+((8-lv)*2.5)}%\"><span alpha=\"50%\">${\"#\".repeat(lv)} </span><span weight=\"bold\">${t}</span></span>`\n\tconst QUOTE = (t: string)=>`<span size=\"90%\" alpha=\"70%\">&gt;　</span><span size=\"90%\" alpha=\"75%\">${t}</span>`\n\texport function simpleMarked(mdlike: string): string {\n\t\treturn mdlike.split(\"\\n\").map(\n\t\t\tline => line\n\t\t\t.replaceAll(\n\t\t\t\t/^( *)\\-  *(.*)/g,\n\t\t\t\t(_, indent, t: string)=>LITEM(t, Math.floor(indent.length/2))\n\t\t\t)\n\t\t\t.replaceAll(\n\t\t\t\t/^ *\\>  *(.*)/g,\n\t\t\t\t(_, t: string)=>QUOTE(t)\n\t\t\t)\n\t\t\t.replaceAll(\n\t\t\t\t/^ *(\\#*)  *(.*)/g,\n\t\t\t\t(_, head: string, t: string)=>TITLE(t, head.length)\n\t\t\t)\n\t\t\t.replaceAll(\n\t\t\t\t/\\*\\*(.*?)\\*\\*/g,\n\t\t\t\t(_, t: string)=>BOLD(t)\n\t\t\t)\n\t\t\t.replaceAll(\n\t\t\t\t/\\<\\!\\-\\-.*?\\-\\-\\>/g,\n\t\t\t\t\"\"\n\t\t\t)\n\t\t).join(\"\\n\")\n\t}\n\texport interface Release {\n\t\tversion: string\n\t\tcontent: string\n\t\tIncludes: string[]\n\t\tBuildNumber: number\n\t\tDate: string\n\t\tGit: string\n\t}\n\texport function createHeader(release: Partial<Release>): string {\n\t\treturn [\n\t\t\t_(\"> **Date:** %s\").format(release.Date ?? \"\"),\n\t\t\t_(\"> **Git Hash:** %s\").format(release.Git ?? \"\"),\n\t\t\t_(\"> **Build Number:** %d\").format(release.BuildNumber ?? 0),\n\t\t].join(\"\\n\")\n\t}\n\texport function getReleases(content: string): Release[] {\n\t\ttype Item = Partial<Release & { buffer: string[] }>\n\t\tconst releases: Item[] = []\n\t\tlet last: Item\n\t\tfor (const line of content.split(\"\\n\")) {\n\t\t\tconst version = line.match(/^#  *(.*) *$/)\n\t\t\tif (version) {\n\t\t\t\treleases.push(last = {\n\t\t\t\t\tversion: version[1],\n\t\t\t\t\tbuffer: [line],\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst meta = line.match(\"\\<\\!\\-\\-  *\\@([^ ]*) *: *(.*?) *\\-\\-\\>\")\n\t\t\tif (meta) {\n\t\t\t\tlast[meta[1]] = JSON.parse(meta[2])\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!last) continue\n\t\t\tlast.buffer.push(line.replaceAll(/\\{\\{HEADER\\}\\}/g, ()=>createHeader(last)))\n\t\t}\n\t\tfor (const item of releases) {\n\t\t\titem.content = item.buffer.join(\"\\n\")\n\t\t\tdelete item.buffer\n\t\t}\n\t\treturn releases as Release[]\n\t}\n\texport function ChangelogPage(\n\t\tdialog: Adw.PreferencesDialog,\n\t\trelease: Release,\n\t): Adw.NavigationPage {\n\t\treturn Dialog.StackedPage({\n\t\t\tdialog,\n\t\t\ttitle: release.version,\n\t\t\tchildrenRequest: ()=>[\n\t\t\t\tGroup({},[\n\t\t\t\t\tnew Gtk.Label({\n\t\t\t\t\t\tuse_markup: true,\n\t\t\t\t\t\tlabel: ChangelogDialog.simpleMarked(release.content),\n\t\t\t\t\t\thalign: Gtk.Align.START,\n\t\t\t\t\t\thexpand: true,\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t]\n\t\t})\n\t}\n}\n// #endregion ChangelogDialog\n\n// #region PaddingDialog\nexport function PaddingDialog({\n\tsettings,\n\tsensitiveBind,\n\tbind,\n\twindow,\n}: PaddingDialog.Options) {\n\tconst getValue = ()=>\n\t\tsettings.get_value(bind).recursiveUnpack() as [number, number, number, number]\n\tlet current = getValue()\n\n\tlet top: Adw.SpinRow, right: Adw.SpinRow, bottom: Adw.SpinRow, left: Adw.SpinRow\n\tconst save = ()=>{\n\t\tif (deepEqual(current, getValue())) return\n\t\tsettings.set_value(bind, new GLib.Variant(\"ai\", current))\n\t}\n\tconst dialog = Dialog({\n\t\twindow,\n\t\ttitle: _(\"Padding\"),\n\t\tusePopup: true,\n\t\tchildrenRequest: ()=>[Group({\n\t\t},[\n\t\t\ttop = AdjustmentRow({\n\t\t\t\ttitle: _(\"Top\"),\n\t\t\t\tmax: 2048,\n\t\t\t\tvalue: current[0],\n\t\t\t\taction: (value: number)=>{\n\t\t\t\t\tcurrent[0] = value\n\t\t\t\t\tsave()\n\t\t\t\t},\n\t\t\t\tsettings,\n\t\t\t\tsensitiveBind,\n\t\t\t}),\n\t\t\tbottom = AdjustmentRow({\n\t\t\t\ttitle: _(\"Bottom\"),\n\t\t\t\tmax: 2048,\n\t\t\t\tvalue: current[2],\n\t\t\t\taction: (value: number)=>{\n\t\t\t\t\tcurrent[2] = value\n\t\t\t\t\tsave()\n\t\t\t\t},\n\t\t\t\tsettings,\n\t\t\t\tsensitiveBind,\n\t\t\t}),\n\t\t\tleft = AdjustmentRow({\n\t\t\t\ttitle: _(\"Left\"),\n\t\t\t\tmax: 2048,\n\t\t\t\tvalue: current[3],\n\t\t\t\taction: (value: number)=>{\n\t\t\t\t\tcurrent[3] = value\n\t\t\t\t\tsave()\n\t\t\t\t},\n\t\t\t\tsettings,\n\t\t\t\tsensitiveBind,\n\t\t\t}),\n\t\t\tright = AdjustmentRow({\n\t\t\t\ttitle: _(\"Right\"),\n\t\t\t\tmax: 2048,\n\t\t\t\tvalue: current[1],\n\t\t\t\taction: (value: number)=>{\n\t\t\t\t\tcurrent[1] = value\n\t\t\t\t\tsave()\n\t\t\t\t},\n\t\t\t\tsettings,\n\t\t\t\tsensitiveBind,\n\t\t\t}),\n\t\t])],\n\t})\n\tconst settingsConnection = settings.connect(`changed::${bind}`, ()=>{\n\t\tcurrent = getValue()\n\t\ttop.value = current[0]\n\t\tright.value = current[1]\n\t\tbottom.value = current[2]\n\t\tleft.value = current[3]\n\t})\n\tdialog.connect(\"destroy\", ()=>{\n\t\tsettings.disconnect(settingsConnection)\n\t})\n}\nexport namespace PaddingDialog {\n\texport interface Options {\n\t\tsettings: Gio.Settings\n\t\twindow: Adw.PreferencesWindow\n\t\tsensitiveBind?: string\n\t\tbind: string\n\t}\n}\n// #endregion PaddingDialog\n"
  },
  {
    "path": "src/libs/shared/colors.ts",
    "content": "export type Rgba = [number, number, number, number]\nexport namespace Rgba {\n    export function formatCss(color: Rgba): string {\n        const [r,g,b,a] = color\n        return `rgba(${r},${g},${b},${a/1000})`\n    }\n}\nexport type Rgb = [number, number, number]\n"
  },
  {
    "path": "src/libs/shared/imageUtils.ts",
    "content": "import GdkPixbuf from \"gi://GdkPixbuf\"\nimport GLib from \"gi://GLib\"\n\nnamespace ImageMeanColor {\n\tconst BASE_SIZE = 128\n\tconst SKIP_RATE = 4\n\tconst MAX_DIST = 255+255+255\n\tconst CHANNEL_DIFF_MAX = 255\n\tconst CHANNEL_DIFF_MAX_DOUBLE = CHANNEL_DIFF_MAX * CHANNEL_DIFF_MAX\n\tconst CHANNEL_DIFF_CUT = 32\n\tconst DIV = CHANNEL_DIFF_MAX_DOUBLE * MAX_DIST\n\tconst CACHE_INDEXER_Y = BASE_SIZE\n\tconst CACHE_SIZE = BASE_SIZE * BASE_SIZE\n\texport function getImageMeanColor(\n\t\timage: GdkPixbuf.Pixbuf\n\t): Promise<null|[number,number,number]> {\n\treturn new Promise(resolve=>{\n\t\t// const id = Math.floor(Math.random()*1000)\n\t\t// console.time(\"getImageMeanColor_\"+id)\n\t\tconst baseImage = image.scale_simple(BASE_SIZE, BASE_SIZE, GdkPixbuf.InterpType.NEAREST)\n\t\tconst channels = baseImage.n_channels\n\t\tif (channels < 3) return null\n\t\tconst rowstride = baseImage.rowstride\n\t\tconst pixbuf = baseImage.get_pixels()\n\t\tlet maxGravity = 0\n\t\tlet colorR = 0, colorG = 0, colorB = 0\n\t\tconst channelDiffCaches = new Array(CACHE_SIZE)\n\t\tlet curY=0, curX=-1\n\t\tGLib.idle_add(GLib.PRIORITY_LOW, ()=>{\n\t\t\t// Move current cursor\n\t\t\tcurX += SKIP_RATE\n\t\t\tif (curX >= BASE_SIZE) { curX = 0; curY += SKIP_RATE }\n\t\t\tif (curY >= BASE_SIZE) {\n\t\t\t\t// console.timeEnd(\"getImageMeanColor_\"+id)\n\t\t\t\tresolve([colorR, colorG, colorB])\n\t\t\t\treturn GLib.SOURCE_REMOVE\n\t\t\t}\n\n\t\t\t// Get current pixel\n\t\t\tconst index = curY * rowstride + curX * channels\n\t\t\tconst r = pixbuf[index]\n\t\t\tconst g = pixbuf[index+1]\n\t\t\tconst b = pixbuf[index+2]\n\n\t\t\t// Get channel difference of current pixel\n\t\t\t// Note: spidermonkey js engine doesn't have fastapi like v8, so Math.abs much slower\n\t\t\tconst cacheIndex1 = curY * CACHE_INDEXER_Y + curX\n\t\t\tlet channelDiff1 = channelDiffCaches[cacheIndex1]\n\t\t\tif (channelDiff1 === undefined) {\n\t\t\t\tconst da = r-g, db = r-b, dc = g-b\n\t\t\t\tchannelDiff1 = channelDiffCaches[cacheIndex1] = Math.max(da<0?-da:da, db<0?-db:db, dc<0?-dc:dc)\n\t\t\t}\n\t\t\tif (channelDiff1 <= CHANNEL_DIFF_CUT) return GLib.SOURCE_CONTINUE\n\n\t\t\t// Get gravity\n\t\t\tlet gravity = 0\n\t\t\tfor (let x=0; x<BASE_SIZE; x+=SKIP_RATE) {\n\t\t\tfor (let y=0; y<BASE_SIZE; y+=SKIP_RATE) {\n\t\t\t\tconst index2 = y * rowstride + x * channels\n\t\t\t\tif (index == index2) continue\n\t\t\t\tconst r2 = pixbuf[index2]\n\t\t\t\tconst g2 = pixbuf[index2+1]\n\t\t\t\tconst b2 = pixbuf[index2+2]\n\n\t\t\t\t// Get channel difference of selected pixel\n\t\t\t\tconst cacheIndex2 = y * CACHE_INDEXER_Y + x\n\t\t\t\tlet channelDiff2 = channelDiffCaches[cacheIndex2]\n\t\t\t\tif (channelDiff2 === undefined) {\n\t\t\t\t\tconst da2 = r-g, db2 = r-b, dc2 = g-b\n\t\t\t\t\tchannelDiff2 = channelDiffCaches[cacheIndex2] = Math.max(da2<0?-da2:da2, db2<0?-db2:db2, dc2<0?-dc2:dc2)\n\t\t\t\t}\n\t\t\t\tif (channelDiff2 < CHANNEL_DIFF_CUT) continue\n\n\t\t\t\t// Get color difference between two color\n\t\t\t\tconst cda = r-r2, cdb = g-g2, cdc = b-b2\n\t\t\t\tconst colorDiff = (cda<0?-cda:cda) + (cdb<0?-cdb:cdb) + (cdc<0?-cdc:cdc)\n\t\t\t\t// const colorDiff = Math.abs(r-r2) + Math.abs(g-g2) + Math.abs(b-b2)\n\n\t\t\t\t// Calc gravity\n\t\t\t\t// gravity += (MAX_DIST-colorDiff)/MAX_DIST*channelDiff2*channelDiff1/CHANNEL_DIFF_MAX_DOUBLE\n\t\t\t\tgravity += (MAX_DIST-colorDiff)*channelDiff2*channelDiff1/DIV\n\t\t\t}}\n\t\t\tif (maxGravity < gravity) {\n\t\t\t\tmaxGravity = gravity\n\t\t\t\tcolorR = r\n\t\t\t\tcolorG = g\n\t\t\t\tcolorB = b\n\t\t\t}\n\t\t\treturn GLib.SOURCE_CONTINUE\n\t\t})\n\t})}\n}\nexport const getImageMeanColor = ImageMeanColor.getImageMeanColor\n"
  },
  {
    "path": "src/libs/shared/jsUtils.ts",
    "content": "// Lerp number\nexport function lerp(init: number, target: number, ratio: number) {\n\treturn (target - init) * ratio + init\n}\n\n// Perform a deep equal operation between too any js value\nexport function deepEqual(a: any, b: any): boolean {\n    if (a == b) return true\n    const typeA = typeof a\n    if (typeof b != typeA) return false\n    if (typeA == \"number\" && isNaN(a) && isNaN(b)) return true\n    if (a instanceof RegExp && b instanceof RegExp) return a.toString() == b.toString()\n    if (a instanceof Array && b instanceof Array) {\n        const aLength = a.length\n        if (aLength != b.length) return false\n        if (aLength == 0) return true\n        return a.every((value, index) => deepEqual(value, b[index]))\n    }\n    if (a instanceof Object && b instanceof Object) {\n        for (const [key, value] of Object.entries(a)) {\n            if (!deepEqual(b[key], value)) return false\n        }\n        return true\n    }\n    return false\n}\n"
  },
  {
    "path": "src/libs/shared/logger.ts",
    "content": "// Prefixed, leveled logger\nfunction Logger(str: string|(()=>string)) {\n\tif (str instanceof Function) str = str()\n\tif (Logger.show_info) console.log(Logger.LOG_INFO_HEADER + str)\n}\nnamespace Logger {\n\texport let LOG_HEADER_PREFIX: string = \"\"\n\texport let LOG_INFO_HEADER: string = \"\"\n\texport let LOG_DEBUG_HEADER: string = \"\"\n\texport let LOG_ERROR_HEADER: string = \"\"\n\texport let show_info: boolean = true\n\texport function setHeader(header: string) {\n\t\tLOG_HEADER_PREFIX = header\n\t\tLOG_INFO_HEADER = `${header} (info) `\n\t\tLOG_DEBUG_HEADER = `${header} (debug) `\n\t\tLOG_ERROR_HEADER = `${header} (error) `\n\t}\n\n\texport enum LogLevel {\n\t\tnone = -1,\n\t\terror = 0,\n\t\tinfo = 1,\n\t\tdebug = 2,\n\t}\n\n\tconst void_function = (()=>{}) as (str: string)=>void\n\texport let debug: (str: string|(()=>string))=>void\n\tfunction debug_internal(str: string|(()=>string)) {\n\t\tif (str instanceof Function) str = str()\n\t\tconsole.log(LOG_DEBUG_HEADER + str)\n\t}\n\texport let error: (str: string|(()=>string))=>void\n\tfunction error_internal(str: string|(()=>string)) {\n\t\tif (str instanceof Function) str = str()\n\t\tconsole.log(`${LOG_ERROR_HEADER}${str}\\n${new Error().stack}`)\n\t}\n\n\texport let currentLevel: number\n\texport function setLogLevel(level: number) {\n\t\tdebug = level >= LogLevel.debug\n\t\t\t? debug_internal\n\t\t\t: void_function\n\t\terror = level >= LogLevel.error\n\t\t\t? error_internal\n\t\t\t: void_function\n\t\tshow_info = level >= LogLevel.info\n\t\tcurrentLevel = level\n\t}\n}\nexport default Logger\n"
  },
  {
    "path": "src/libs/shared/maid.ts",
    "content": "// Connection destroyer\nclass Maid {\n\tprivate records: [Maid.TaskType, number, ...any][]\n\n\tconstructor() {\n\t\tthis.records = []\n\t}\n\n\tconnectJob(\n\t\tsignalObject: any,\n\t\tsignalName: string,\n\t\thandleFunc: (...args: any)=>any,\n\t\tpriority: number = 0\n\t): number {\n\t\tconst id = signalObject.connect(signalName, handleFunc)\n\t\tthis.getRecords().push([Maid.TaskType.Connect, priority, signalObject, id])\n\t\treturn id\n\t}\n\n\tfunctionJob(func: (...args: any)=>any, priority: number = 0) {\n\t\tthis.getRecords().push([Maid.TaskType.Function, priority, func])\n\t}\n\n\tdisposeJob<T extends { dispose: ()=>void }>(object: T, priority: number = 0): T {\n\t\tthis.getRecords().push([Maid.TaskType.Dispose, priority, object])\n\t\treturn object\n\t}\n\n\trunDisposeJob<T extends { run_dispose: ()=>void }>(object: any, priority: number = 0): T {\n\t\tthis.getRecords().push([Maid.TaskType.RunDispose, priority, object])\n\t\treturn object\n\t}\n\n\tdestroyJob<T extends { destroy: ()=>void }>(object: T, priority: number = 0): T {\n\t\tthis.getRecords().push([Maid.TaskType.Destroy, priority, object])\n\t\treturn object\n\t}\n\n\tdestroy() {\n\t\tthis.clear()\n\t\tthis.records = null\n\t}\n\n\tgetRecords(): Maid[\"records\"] {\n\t\tif (!this.records) Error(\"Maid object already destroyed\")\n\t\treturn this.records\n\t}\n\n\tpatchJob(\n\t\tpatchObject: any,\n\t\tpatchName: string,\n\t\thandleFunc: (...args: any)=>any,\n\t\tpriority: number = 0\n\t) {\n\t\t// Check if patchObject is defined before accessing its properties\n\t\tif (!patchObject) {\n\t\t\tconsole.error('Maid.patchJob: patchObject is undefined');\n\t\t\treturn;\n\t\t}\n\t\tconst original = patchObject[patchName]\n\t\tthis.getRecords().push([Maid.TaskType.Patch, priority, patchObject, patchName, original])\n\t\tpatchObject[patchName] = handleFunc(original)\n\t}\n\n\t// [ patchObject, connection, original, undo? ]\n\thideJob<T extends {hide: any, visible: boolean, connect: any}>(\n\t\tpatchObject: T,\n\t\tundo?: (old: boolean, patchObject: T)=>(boolean|null|void|undefined),\n\t\tpriority: number = 0\n\t) {\n\t\t// Check if patchObject is defined\n\t\tif (!patchObject) {\n\t\t\tconsole.error('Maid.hideJob: patchObject is undefined');\n\t\t\treturn;\n\t\t}\n\t\tconst original = patchObject.visible\n\t\tconst connection = patchObject.connect(\"show\", ()=>{\n\t\t\tpatchObject.hide()\n\t\t})\n\t\tpatchObject.hide()\n\t\tthis.getRecords().push([Maid.TaskType.Hide, priority, patchObject, connection, original, undo])\n\t}\n\n\tclear() {\n\t\tconst records = this.getRecords()\n\t\trecords.sort((a, b) => b[1] - a[1])\n\t\tfor (const record of records) {\n\t\t\tswitch (record[0]) {\n\t\t\t\tcase Maid.TaskType.Connect:\n\t\t\t\t\trecord[2].disconnect(record[3])\n\t\t\t\t\tbreak\n\t\t\t\tcase Maid.TaskType.Function:\n\t\t\t\t\trecord[2]()\n\t\t\t\t\tbreak\n\t\t\t\tcase Maid.TaskType.Dispose:\n\t\t\t\t\trecord[2].dispose()\n\t\t\t\t\tbreak\n\t\t\t\tcase Maid.TaskType.RunDispose:\n\t\t\t\t\trecord[2].run_dispose()\n\t\t\t\t\tbreak\n\t\t\t\tcase Maid.TaskType.Destroy:\n\t\t\t\t\trecord[2].destroy()\n\t\t\t\t\tbreak\n\t\t\t\tcase Maid.TaskType.Patch:\n\t\t\t\t\t// Check if patchObject (record[2]) is defined\n\t\t\t\t\tif (record[2]) {\n\t\t\t\t\t\trecord[2][record[3]] = record[4]\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase Maid.TaskType.Hide:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst patchObject = record[2]\n\t\t\t\t\t\t// Check if patchObject is defined before using it\n\t\t\t\t\t\tif (!patchObject) break;\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst original = record[4]\n\t\t\t\t\t\tconst undo = record[5]\n\t\t\t\t\t\tpatchObject.disconnect(record[3])\n\t\t\t\t\t\tif (undo) {\n\t\t\t\t\t\t\tconst result = undo(original, patchObject)\n\t\t\t\t\t\t\tif (result === true) {\n\t\t\t\t\t\t\t\tpatchObject.show()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (original) patchObject.show()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Error(\"Unknown task type.\")\n\t\t\t}\n\t\t}\n\t\tthis.records = []\n\t}\n}\nnamespace Maid {\n\texport enum TaskType {\n\t\tConnect,\n\t\tFunction,\n\t\tDispose,\n\t\tRunDispose,\n\t\tDestroy,\n\t\tPatch,\n\t\tHide,\n\t}\n\texport const Priority = {\n\t\tHigh: 2000,\n\t\tDefault: 0,\n\t\tLow: -2000,\n\t}\n}\nexport default Maid\n"
  },
  {
    "path": "src/libs/shared/styleClass.ts",
    "content": "// Re-layout & painting only once\n// We use StyleClass instead of add_style_class_name in this extension\nexport class StyleClass {\n\tclassArray: string[]\n\tmodified: boolean\n\tconstructor(classString: string) {\n\t\tthis.modified = false\n\t\tthis.classArray = classString.split(\" \")\n\t}\n\tremove(className: string): StyleClass {\n\t\tconst lastLen = this.classArray.length\n\t\tthis.classArray = this.classArray.filter(\n\t\t\ti => i != className\n\t\t)\n\t\tif (this.classArray.length != lastLen) {\n\t\t\tthis.modified = true\n\t\t}\n\t\treturn this\n\t}\n\tadd(className: string): StyleClass {\n\t\tif (this.classArray.includes(className)) return this\n\t\tthis.classArray.push(className)\n\t\tthis.modified = true\n\t\treturn this\n\t}\n\tstringify(): string {\n\t\treturn this.classArray.join(\" \")\n\t}\n}\n"
  },
  {
    "path": "src/libs/shell/advani.ts",
    "content": "import Clutter from \"gi://Clutter\"\nimport Graphene from \"gi://Graphene\"\n\n// Gnome base ease function params\nexport interface EasingParams {\n    repeatCount?: number\n    autoReverse?: boolean\n    animationRequired?: boolean\n    duration?: number\n    delay?: number\n    mode?: Clutter.AnimationMode | any\n    [key: string]: any\n}\n\n// AdvAni ease function params\nexport interface AdvEasingParams extends EasingParams {\n    mode: Clutter.AnimationMode | AdvAnimationMode,\n}\n\n// AdvAni ease mode define type\nexport interface ModeDefineIface {\n    mode: Clutter.AnimationMode\n    getCubicBezierProgress?: ()=>[Graphene.Point, Graphene.Point]\n    cubicBezierProgress?: [Graphene.Point, Graphene.Point]\n}\nexport interface ModeDefine extends ModeDefineIface {}\nexport class ModeDefine {\n    constructor(params: ModeDefineIface) {\n        for (const [key, value] of Object.entries(params)) {\n            this[key] = value\n        }\n    }\n}\n\n// Utility functions\nexport function createBezier(\n    x1: number, y1: number, x2: number, y2: number\n):[Graphene.Point, Graphene.Point] {\n    return [\n        new Graphene.Point({ x: x1, y: y1 }),\n        new Graphene.Point({ x: x2, y: y2 })\n    ]\n}\n\n// Template AdvAni animations\nexport enum AdvAnimationMode {\n    LowBackover = 2000,\n    MiddleBackover = 2001,\n}\nexport const AdvAnimationModeDefines = [\n    new ModeDefine({\n        mode: Clutter.AnimationMode.CUBIC_BEZIER,\n        getCubicBezierProgress: ()=>createBezier(.225,1.2,.45,1)\n    }),\n    new ModeDefine({\n        mode: Clutter.AnimationMode.CUBIC_BEZIER,\n        getCubicBezierProgress: ()=>createBezier(.4,1.35,.55,1)\n    }),\n] as ModeDefine[]\n\n// Main AdvAni ease function\nexport function ease(actor: Clutter.Actor, params: AdvEasingParams) {\n    // Get mode defines\n    let modeDefine: ModeDefine|null\n    if (params.mode && params.mode > Clutter.AnimationMode.ANIMATION_LAST) {\n        modeDefine = AdvAnimationModeDefines[params.mode - AdvAnimationMode.LowBackover]\n        params.mode = modeDefine.mode\n    } else if ((typeof params.mode == \"object\") && ((params.mode as any) instanceof ModeDefine)) {\n        modeDefine = params.mode\n        params.mode = modeDefine.mode\n    }\n\n    // Run gnome ease function\n    actor.ease(params)\n    if (!modeDefine) return\n\n    // Adjust bezier progress if option exist\n    let { getCubicBezierProgress, cubicBezierProgress } = modeDefine\n    if (getCubicBezierProgress) cubicBezierProgress = getCubicBezierProgress()\n    if (cubicBezierProgress) {\n        for (const key in params) {\n            const transition = actor.get_transition(key.replace(/_/g, '-'))\n            if (!transition) continue\n            transition.set_cubic_bezier_progress(...cubicBezierProgress)\n        }\n    }\n}\n"
  },
  {
    "path": "src/libs/shell/effects.ts",
    "content": "import GObject from 'gi://GObject'\nimport Shell from 'gi://Shell'\nimport Cogl from 'gi://Cogl'\nimport Clutter from 'gi://Clutter'\nimport Global from '../../global.js'\n\n// #region RoundClipEffect\nexport class RoundClipEffect extends Shell.GLSLEffect {\n\tstatic uniforms: RoundClipEffect.Uniforms|null = null\n\n\tvfunc_build_pipeline (): void {\n\t\tconst [declarations, code] = Global.GetShader(\"media/rounded_corners.frag\")\n\t\tthis.add_glsl_snippet(\n\t\t\t// FIXME: waitting for type definition update\n\t\t\tCogl.SnippetHook.FRAGMENT as any,\n\t\t\tdeclarations,\n\t\t\tcode,\n\t\t\tfalse\n\t\t)\n\t}\n\n\tvfunc_paint_target (node: Clutter.PaintNode, ctx: Clutter.PaintContext) {\n\t\t// Reset to default blend string.\n\t\tthis.get_pipeline()?.set_blend(\n\t\t\t'RGBA = ADD(SRC_COLOR, DST_COLOR*(1-SRC_COLOR[A]))'\n\t\t)\n\t\tsuper.vfunc_paint_target(node, ctx)\n\t}\n\n\tupdateUniforms (\n\t\tscale_factor: number,\n\t\tcorners_cfg: {\n\t\t\tpadding?: { left: number, right: number, top: number, bottom: number },\n\t\t\tborder_radius: number,\n\t\t\tsmoothing: number,\n\t\t},\n\t\touter_bounds: { x1: number, x2: number, y1: number, y2: number },\n\t\tborder?: {\n\t\t\twidth: number\n\t\t\tcolor: [number, number, number, number]\n\t\t},\n\t\tpixel_step?: [number, number]\n\t) {\n\t\tconst border_width = (border?.width ?? 0) * scale_factor\n\t\tconst border_color = border?.color ?? [0, 0, 0, 0]\n\n\t\tconst outer_radius = corners_cfg.border_radius * scale_factor\n\t\tconst { padding, smoothing } = corners_cfg\n\n\t\tconst bounds = [\n\t\t\touter_bounds.x1 + (padding ? (padding.left * scale_factor) : 0),\n\t\t\touter_bounds.y1 + (padding ? (padding.top * scale_factor) : 0),\n\t\t\touter_bounds.x2 - (padding ? (padding.right * scale_factor) : 0),\n\t\t\touter_bounds.y2 - (padding ? (padding.bottom * scale_factor) : 0),\n\t\t]\n\n\t\tconst inner_bounds = [\n\t\t\tbounds[0] + border_width,\n\t\t\tbounds[1] + border_width,\n\t\t\tbounds[2] - border_width,\n\t\t\tbounds[3] - border_width,\n\t\t]\n\n\t\tlet inner_radius = outer_radius - border_width\n\t\tif (inner_radius < 0.001) {\n\t\t\tinner_radius = 0.0\n\t\t}\n\n\t\tif (!pixel_step) {\n\t\t\tconst actor = this.actor\n\t\t\tpixel_step = [1 / actor.get_width (), 1 / actor.get_height ()]\n\t\t}\n\n\t\t// Setup with squircle shape\n\t\tlet exponent = smoothing * 10.0 + 2.0\n\t\tlet radius = outer_radius * 0.5 * exponent\n\t\tconst max_radius = Math.min (bounds[3] - bounds[0], bounds[4] - bounds[1])\n\t\tif (radius > max_radius) {\n\t\t\texponent *= max_radius / radius\n\t\t\tradius = max_radius\n\t\t}\n\t\tinner_radius *= radius / outer_radius\n\n\t\tconst location = this.getLocation()\n\t\tthis.set_uniform_float(location.bounds, 4, bounds)\n\t\tthis.set_uniform_float(location.inner_bounds, 4, inner_bounds)\n\t\tthis.set_uniform_float(location.pixel_step, 2, pixel_step)\n\t\tthis.set_uniform_float(location.border_width, 1, [border_width])\n\t\tthis.set_uniform_float(location.exponent, 1, [exponent])\n\t\tthis.set_uniform_float(location.clip_radius, 1, [radius])\n\t\tthis.set_uniform_float(location.border_color, 4, border_color)\n\t\tthis.set_uniform_float(location.inner_clip_radius, 1, [inner_radius])\n\t\tthis.queue_repaint()\n\t}\n\n\tgetLocation(): RoundClipEffect.Uniforms {\n\t\tlet location = RoundClipEffect.uniforms\n\t\tif (!location) {\n\t\t\tlocation = new RoundClipEffect.Uniforms()\n\t\t\tfor (const key in location) {\n\t\t\t\tlocation[key] = this.get_uniform_location(key)\n\t\t\t}\n\t\t\tRoundClipEffect.uniforms = location\n\t\t}\n\t\treturn location\n\t}\n}\nGObject.registerClass(RoundClipEffect)\nexport namespace RoundClipEffect {\n\t// Uniform location cache\n\texport class Uniforms {\n\t\tbounds = 0\n\t\tclip_radius = 0\n\t\texponent = 0\n\t\tinner_bounds = 0\n\t\tinner_clip_radius = 0\n\t\tpixel_step = 0\n\t\tborder_width = 0\n\t\tborder_color = 0\n\t}\n}\n// #endregion RoundClipEffect\n"
  },
  {
    "path": "src/libs/shell/feature.ts",
    "content": "import { type Rgb, type Rgba } from \"../shared/colors.js\"\nimport Maid from \"../shared/maid.js\";\nimport Global from \"../../global.js\";\nimport Logger from \"../shared/logger.js\";\n\nexport class SettingLoader {\n\trecords: Set<string>\n\tlisteners: number[]\n\tonChange: (key: string)=>void\n\tparent: FeatureBase\n\tconstructor(\n\t\tonChange: SettingLoader[\"onChange\"],\n\t\tparent: FeatureBase,\n\t) {\n\t\tthis.parent = parent\n\t\tthis.records = new Set()\n\t\tthis.listeners = []\n\t\tthis.onChange = onChange\n\t}\n\n\tprivate push(key: string) {\n\t\tif (this.records.has(key)) return\n\t\tthis.records.add(key)\n\t\tthis.listeners.push(\n\t\t\tGlobal.Settings.connect(\n\t\t\t\t`changed::${key}`,\n\t\t\t\t() => this.onChange(key)\n\t\t\t)\n\t\t)\n\t\tif (!this.parent.disableDebugMessage)\n\t\t\tLogger.debug(()=>`Setting listener for key '${key}' added for feature ${this.parent.constructor.name}`)\n\t}\n\tclear() {\n\t\tfor (const source of this.listeners) {\n\t\t\tGlobal.Settings.disconnect(source)\n\t\t}\n\t\tthis.listeners = []\n\t\tthis.records.clear()\n\t\tif (!this.parent.disableDebugMessage) {\n\t\t\tLogger.debug(()=>`Disconnected setting listeners for feature ${this.parent.constructor.name\t}`)\n\t\t}\n\t}\n\n\tloadBoolean(key: string): boolean {\n\t\tthis.push(key)\n\t\treturn Global.Settings.get_boolean(key)\n\t}\n\tloadString(key: string): string {\n\t\tthis.push(key)\n\t\treturn Global.Settings.get_string(key)\n\t}\n\tloadInt(key: string): number {\n\t\tthis.push(key)\n\t\treturn Global.Settings.get_int(key)\n\t}\n\tloadStrv(key: string): string[] {\n\t\tthis.push(key)\n\t\treturn Global.Settings.get_strv(key)\n\t}\n\tloadValue<T>(key: string): T {\n\t\tthis.push(key)\n\t\treturn Global.Settings.get_value(key).recursiveUnpack()\n\t}\n\tloadRgb(key: string): Rgb|null {\n\t\tthis.push(key)\n\t\tconst color = Global.Settings.get_value(key).recursiveUnpack()\n\t\tif (!color.length) return null\n\t\treturn color\n\t}\n\tloadRgba(key: string): Rgba|null {\n\t\tthis.push(key)\n\t\tconst color = Global.Settings.get_value(key).recursiveUnpack()\n\t\tif (!color.length) return null\n\t\treturn color\n\t}\n}\n\nexport abstract class FeatureBase {\n\tdisableDebugMessage: boolean = false\n\tloader: SettingLoader\n\tmaid: Maid\n\n\tconstructor() {\n\t\tthis.maid = new Maid()\n\t\tthis.loader = new SettingLoader((key: string)=>{\n\t\t\tthis.loader.clear()\n\t\t\tthis.loadSettings(this.loader)\n\t\t\tthis.reload(key)\n\t\t}, this)\n\t}\n\n\tload(noSettingsLoad?: boolean): void {\n\t\tif (!noSettingsLoad) this.loadSettings(this.loader)\n\t\tthis.onLoad()\n\t}\n\tunload(noSettingsUnload?: boolean): void {\n\t\tif (!noSettingsUnload) this.loader.clear()\n\t\tthis.onUnload()\n\t\tthis.maid.clear()\n\t}\n\tabstract onLoad(): void\n\tabstract onUnload(): void\n\treload(changedKey?: string): void {\n\t\tthis.unload(true)\n\t\tthis.load(true)\n\t}\n\tabstract loadSettings(loader: SettingLoader): void\n}\n"
  },
  {
    "path": "src/libs/shell/gesture.ts",
    "content": "import St from \"gi://St\"\nimport Clutter from \"gi://Clutter\"\n\n// #region Drag\nexport abstract class Drag extends St.Bin {\n\t_dragging: boolean\n\t_dragIsClick: boolean\n\t_dragStartCoords: Drag.Coords\n\t_dragMoveStartCoords: Drag.Coords\n\t_grab: Clutter.Grab\n\t_grabbedDevice: Clutter.InputDevice\n\t_grabbedSequence: Clutter.EventSequence\n\tdfunc_drag_end: (event: Drag.Event)=>void\n\tdfunc_drag_start: (event: Drag.Event)=>void\n\tdfunc_drag_motion: (event: Drag.Event)=>void\n\n\t_dragStart(event: Clutter.Event): boolean {\n\t\tif (this._dragging) return Clutter.EVENT_PROPAGATE\n\t\tthis._dragging = true\n\t\tthis._dragIsClick = true\n\t\tthis._dragStartCoords = event.get_coords()\n\t\tthis._grabbedDevice = event.get_device()\n\t\tthis._grabbedSequence = event.get_event_sequence()\n\n\t\t// @ts-expect-error Types not implemented\n\t\tthis._grab = global.stage.grab(this)\n\n\t\tconst dragEvent: Drag.Event = event as Drag.Event\n\t\tdragEvent.isClick = true\n\t\tdragEvent.startCoords = this._dragStartCoords\n\t\tdragEvent.coords = this._dragStartCoords\n\t\tdragEvent.moveStartCoords = this._dragMoveStartCoords\n\t\tif (this.dfunc_drag_start) this.dfunc_drag_start(dragEvent)\n\n\t\treturn Clutter.EVENT_STOP\n\t}\n\t_dragEnd(event: Clutter.Event): boolean {\n\t\tif (!this._dragging) {\n\t\t\treturn Clutter.EVENT_PROPAGATE\n\t\t}\n\n\t\tif (this._grab) {\n\t\t\tthis._grab.dismiss()\n\t\t\tthis._grab = null\n\t\t}\n\n\t\tthis._grabbedSequence = null\n\t\tthis._grabbedDevice = null\n\t\tthis._dragging = false\n\n\t\tconst coords = event.get_coords()\n\t\tthis._checkDragIsClick(coords)\n\n\t\tconst dragEvent: Drag.Event = event as Drag.Event\n\t\tdragEvent.isClick = this._dragIsClick\n\t\tdragEvent.startCoords = this._dragStartCoords\n\t\tdragEvent.coords = coords\n\t\tdragEvent.moveStartCoords = this._dragMoveStartCoords\n\n\t\tthis._dragStartCoords =\n\t\tthis._dragMoveStartCoords = null\n\n\t\tif (this.dfunc_drag_end) this.dfunc_drag_end(dragEvent)\n\t\treturn Clutter.EVENT_STOP\n\t}\n\t_dragMotion(event: Clutter.Event): boolean {\n\t\tconst coords = event.get_coords()\n\t\tthis._checkDragIsClick(coords)\n\n\t\tconst dragEvent: Drag.Event = event as Drag.Event\n\t\tdragEvent.isClick = this._dragIsClick\n\t\tdragEvent.startCoords = this._dragStartCoords\n\t\tdragEvent.coords = coords\n\t\tdragEvent.moveStartCoords = this._dragMoveStartCoords\n\t\tif (this.dfunc_drag_motion) this.dfunc_drag_motion(dragEvent)\n\t\treturn Clutter.EVENT_STOP\n\t}\n\t_checkDragIsClick(coords: Drag.Coords) {\n\t\tif (!this._dragIsClick) return\n\t\tif (\n\t\t\tDrag.getCoordsDistanceSquare(\n\t\t\t\tcoords, this._dragStartCoords\n\t\t\t) > Drag.DragMinPixelSquare\n\t\t) {\n\t\t\tthis._dragMoveStartCoords = coords\n\t\t\tthis._dragIsClick = false\n\t\t}\n\t}\n\n\tvfunc_button_press_event(event: Clutter.Event): boolean {\n\t\treturn this._dragStart(event)\n\t}\n\n\tvfunc_button_release_event(event: Clutter.Event): boolean {\n\t\treturn this._dragEnd(event)\n\t}\n\n\tvfunc_touch_event(event: Clutter.Event): boolean {\n\t\tconst sequence = event.get_event_sequence()\n\t\tconst slotSame = this._grabbedSequence && sequence.get_slot() === this._grabbedSequence.get_slot()\n\n\t\tswitch (event.type()) {\n\t\t\tcase Clutter.EventType.TOUCH_BEGIN:\n\t\t\t\treturn this._dragStart(event)\n\t\t\tcase Clutter.EventType.TOUCH_UPDATE:\n\t\t\t\tif (!slotSame) return Clutter.EVENT_PROPAGATE\n\t\t\t\treturn this._dragMotion(event)\n\t\t\tcase Clutter.EventType.TOUCH_END:\n\t\t\t\tif (!slotSame) return Clutter.EVENT_PROPAGATE\n\t\t\t\treturn this._dragEnd(event)\n\t\t}\n\n\t\treturn Clutter.EVENT_PROPAGATE;\n\t}\n\n\tvfunc_motion_event(event: Clutter.Event): boolean {\n\t\tif (this._dragging && !this._grabbedSequence) {\n\t\t\treturn this._dragMotion(event)\n\t\t}\n\t\treturn Clutter.EVENT_PROPAGATE\n\t}\n\n\tstatic applyTo(widgetClass: any) {\n\t\tconst widgetProto = widgetClass.prototype\n\t\tconst dragProto = Drag.prototype\n\t\tfor (const methodName of Object.getOwnPropertyNames(dragProto)) {\n\t\t\tObject.defineProperty(widgetProto, methodName, {\n\t\t\t\tvalue: dragProto[methodName],\n\t\t\t\tconfigurable: true,\n\t\t\t\twritable: true,\n\t\t\t})\n\t\t}\n\t}\n\tstatic getCoordsDistanceSquare(coordsA: Drag.Coords, coordsB: Drag.Coords): number {\n\t\tconst [ax, ay] = coordsA\n\t\tconst [bx, by] = coordsB\n\t\tconst xdist = ax - bx\n\t\tconst ydist = ay - by\n\t\treturn xdist*xdist + ydist*ydist\n\t}\n}\nexport namespace Drag {\n\texport const DragMinPixel = 6\n\texport const DragMinPixelSquare = DragMinPixel*DragMinPixel\n\texport type Coords = [number, number]\n\texport type Event = Clutter.Event & {\n\t\tisClick: boolean,\n\t\tmoveStartCoords: Coords,\n\t\tstartCoords: Coords,\n\t\tcoords: Coords,\n\t}\n}\n// #endregion Drag\n\n// #region Scroll\nexport abstract class Scroll extends St.Bin {\n\t_scrollSumY: number\n\t_scrollSumX: number\n\t_scrolling: boolean\n\tdfunc_scroll_start: (event: Scroll.Event)=>void\n\tdfunc_scroll_motion: (event: Scroll.Event)=>void\n\tdfunc_scroll_end: (event: Scroll.Event)=>void\n\n\tvfunc_scroll_event(event: Clutter.Event): boolean {\n\t\tif (\n\t\t\tevent.get_scroll_direction() != Clutter.ScrollDirection.SMOOTH\n\t\t\t|| event.get_scroll_source() == Clutter.ScrollSource.WHEEL\n\t\t) return Clutter.EVENT_PROPAGATE\n\t\tconst finish = event.get_scroll_finish_flags()\n\t\tconst [dx, dy] = event.get_scroll_delta()\n\t\tif (!this._scrolling) {\n\t\t\tthis._scrolling = true\n\t\t\tthis._scrollSumX = dx\n\t\t\tthis._scrollSumY = dy\n\t\t\tif (this.dfunc_scroll_start) {\n\t\t\t\tconst scrollEvent: Scroll.Event = event as Scroll.Event\n\t\t\t\tscrollEvent.scrollSumX = dx\n\t\t\t\tscrollEvent.scrollSumY = dy\n\t\t\t\tscrollEvent.dx = dx\n\t\t\t\tscrollEvent.dy = dy\n\t\t\t\tthis.dfunc_scroll_start(scrollEvent)\n\t\t\t}\n\t\t} else {\n\t\t\tthis._scrollSumX += dx\n\t\t\tthis._scrollSumY += dy\n\t\t\tif (this.dfunc_scroll_motion) {\n\t\t\t\tconst scrollEvent: Scroll.Event = event as Scroll.Event\n\t\t\t\tscrollEvent.scrollSumX = this._scrollSumX\n\t\t\t\tscrollEvent.scrollSumY = this._scrollSumY\n\t\t\t\tscrollEvent.dx = dx\n\t\t\t\tscrollEvent.dy = dy\n\t\t\t\tthis.dfunc_scroll_motion(scrollEvent)\n\t\t\t}\n\t\t}\n\t\tif (finish != Clutter.ScrollFinishFlags.NONE) {\n\t\t\tthis._scrolling = false\n\t\t\tif (this.dfunc_scroll_end) {\n\t\t\t\tconst scrollEvent: Scroll.Event = event as Scroll.Event\n\t\t\t\tscrollEvent.scrollSumX = this._scrollSumX\n\t\t\t\tscrollEvent.scrollSumY = this._scrollSumY\n\t\t\t\tscrollEvent.dx = dx\n\t\t\t\tscrollEvent.dy = dy\n\t\t\t\tscrollEvent.finish = finish\n\t\t\t\tthis.dfunc_scroll_end(scrollEvent)\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic applyTo(widgetClass: any) {\n\t\tconst widgetProto = widgetClass.prototype\n\t\tconst scrollProto = Scroll.prototype\n\t\tfor (const methodName of Object.getOwnPropertyNames(scrollProto)) {\n\t\t\tObject.defineProperty(widgetProto, methodName, {\n\t\t\t\tvalue: scrollProto[methodName],\n\t\t\t\tconfigurable: true,\n\t\t\t\twritable: true,\n\t\t\t})\n\t\t}\n\t}\n}\nexport namespace Scroll {\n\texport type Event = Clutter.Event & {\n\t\tscrollSumX: number\n\t\tscrollSumY: number\n\t\tdx: number\n\t\tdy: number\n\t\tfinish?: Clutter.ScrollFinishFlags\n\t}\n}\n// #endregion Scroll\n"
  },
  {
    "path": "src/libs/shell/quickSettingsUtils.ts",
    "content": "import {\n\tQuickMenuToggle,\n\tQuickToggle,\n\tSystemIndicator,\n\ttype QuickSettingsMenu,\n} from \"resource:///org/gnome/shell/ui/quickSettings.js\"\nimport { type PopupMenuBase, PopupSeparatorMenuItem } from \"resource:///org/gnome/shell/ui/popupMenu.js\"\nimport Global from \"../../global.js\"\nimport Maid from \"../shared/maid.js\"\n\nexport abstract class ChildrenTrackerBase<T> {\n\tappliedChild: Map<T, Maid>\n\taddConnection: number\n\tconnectTarget: any\n\tprotected abstract getConnectTarget(): any\n\tprotected abstract catchChild(child: any): void\n\tload(): void {\n\t\tconst connectTarget = this.connectTarget = this.getConnectTarget()\n\t\tthis.appliedChild = new Map()\n\t\tthis.addConnection = connectTarget.connect(\"child-added\", (_: any, child: any)=>{\n\t\t\tthis.catchChild(child)\n\t\t\tif (this.onUpdate) this.onUpdate()\n\t\t})\n\t\tfor (const child of connectTarget.get_children()) {\n\t\t\tthis.catchChild(child)\n\t\t}\n\t\tif (this.onUpdate) this.onUpdate()\n\t}\n\tunload(): void {\n\t\tfor (const maid of this.appliedChild.values()) {\n\t\t\tmaid.destroy()\n\t\t}\n\t\tthis.connectTarget.disconnect(this.addConnection)\n\t\tthis.addConnection = null\n\t\tthis.appliedChild = null\n\t}\n\tget items(): T[] {\n\t\tif (!this.appliedChild) return []\n\t\treturn [...this.appliedChild.keys()]\n\t}\n\tonUpdate: ()=>void\n}\n\nexport class QuickSettingsMenuTracker extends ChildrenTrackerBase<QuickSettingsMenu> {\n\tonMenuOpen: (maid: Maid, menu: QuickSettingsMenu, isOpen: boolean)=>void\n\tonMenuCreated: (maid: Maid, menu: QuickSettingsMenu)=>void\n\tprotected override catchChild(child: any): void {\n\t\tconst menu = child.menu\n\t\tif (!menu) return\n\t\tif (this.appliedChild.has(menu)) return\n\n\t\tconst menuMaid = new Maid()\n\t\tmenuMaid.functionJob(()=>{\n\t\t\tthis.appliedChild.delete(menu)\n\t\t})\n\t\tmenuMaid.connectJob(menu, \"open-state-changed\", (_: any, isOpen: boolean) => {\n\t\t\tif (this.onMenuOpen) this.onMenuOpen(menuMaid, menu, isOpen)\n\t\t})\n\t\tmenuMaid.connectJob(menu, \"destroy\", ()=>{\n\t\t\tmenuMaid.destroy()\n\t\t})\n\t\tif (this.onMenuCreated) this.onMenuCreated(menuMaid, menu)\n\t\tthis.appliedChild.set(menu, menuMaid)\n\t}\n\tprotected override getConnectTarget() {\n\t\treturn Global.QuickSettingsGrid\n\t}\n\tget menus() {\n\t\tif (!this.appliedChild) return []\n\t\treturn [...this.appliedChild.keys()]\n\t}\n}\n\nexport class QuickSettingsToggleTracker extends ChildrenTrackerBase<QuickToggle|QuickMenuToggle> {\n\tonToggleCreated: (maid: Maid, toggle: QuickToggle|QuickMenuToggle)=>void\n\tprotected override catchChild(child: any): void {\n\t\tif (\n\t\t\t!(child instanceof QuickToggle)\n\t\t\t&& !(child instanceof QuickMenuToggle)\n\t\t) return\n\t\tif (this.appliedChild.has(child)) return\n\n\t\tconst toggleMaid = new Maid()\n\t\ttoggleMaid.functionJob(()=>{\n\t\t\tthis.appliedChild.delete(child)\n\t\t})\n\t\ttoggleMaid.connectJob(child, \"destroy\", ()=>{\n\t\t\ttoggleMaid.destroy()\n\t\t})\n\t\tif (this.onToggleCreated) this.onToggleCreated(toggleMaid, child)\n\t\tthis.appliedChild.set(child, toggleMaid)\n\t}\n\tprotected override getConnectTarget() {\n\t\treturn Global.QuickSettingsGrid\n\t}\n}\n\nexport class SystemIndicatorTracker extends ChildrenTrackerBase<SystemIndicator> {\n\tonIndicatorCreated: (maid: Maid, indicator: SystemIndicator)=>void\n\tprotected override catchChild(child: any): void {\n\t\tif (\n\t\t\t!(child instanceof SystemIndicator)\n\t\t) return\n\t\tif (this.appliedChild.has(child)) return\n\n\t\tconst indicatorMaid = new Maid()\n\t\tindicatorMaid.functionJob(()=>{\n\t\t\tthis.appliedChild.delete(child)\n\t\t})\n\t\tindicatorMaid.connectJob(child, \"destroy\", ()=>{\n\t\t\tindicatorMaid.destroy()\n\t\t})\n\t\tif (this.onIndicatorCreated) this.onIndicatorCreated(indicatorMaid, child)\n\t\tthis.appliedChild.set(child, indicatorMaid)\n\t}\n\tprotected override getConnectTarget() {\n\t\treturn Global.Indicators\n\t}\n}\n\nexport function updateMenuSeparators(menu: PopupMenuBase) {\n\tfor (const item of (menu as any)._getMenuItems()) {\n\t\tif (!(item instanceof PopupSeparatorMenuItem)) {\n\t\t\tcontinue\n\t\t}\n\t\t(menu as any)._updateSeparatorVisibility(item)\n\t}\n}\n"
  },
  {
    "path": "src/libs/shell/styler.ts",
    "content": "import St from \"gi://St\"\nimport { type SettingLoader } from \"./feature.js\"\nimport { Rgba } from \"../shared/colors.js\"\n\nexport namespace StyledSlider {\n\texport interface Options {\n\t\tstyle: \"slim\" | \"default\"\n\t\tactiveBackgroundColor: Rgba | null\n\t\thandleRadius: number\n\t\thandleColor: Rgba | null\n\t\tbackgroundColor: Rgba | null\n\t\theight: number\n\t}\n\texport function getStyle(options: Options): string {\n\t\tconst {\n\t\t\tstyle,\n\t\t\tactiveBackgroundColor,\n\t\t\thandleRadius,\n\t\t\thandleColor,\n\t\t\tbackgroundColor,\n\t\t\theight,\n\t\t} = options\n\t\tconst styleList = []\n\t\tswitch (style) {\n\t\t\tcase \"slim\":\n\t\t\t\tstyleList.push(\"-slider-handle-radius:0px\")\n\t\t\t\tif (activeBackgroundColor) {\n\t\t\t\t\tstyleList.push(\"color:\"+Rgba.formatCss(activeBackgroundColor))\n\t\t\t\t} else {\n\t\t\t\t\tstyleList.push(\"color:-st-accent-color\")\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase \"default\":\n\t\t\tdefault:\n\t\t\t\tif (handleRadius) {\n\t\t\t\t\tstyleList.push(`-slider-handle-radius:${handleRadius}px`)\n\t\t\t\t}\n\t\t\t\tif (handleColor) {\n\t\t\t\t\tstyleList.push(`color:${Rgba.formatCss(handleColor)}`)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\t\tif (height) styleList.push(`-barlevel-height:${height}px`)\n\t\tif (activeBackgroundColor) styleList.push(\n\t\t\t`-barlevel-active-background-color:${Rgba.formatCss(activeBackgroundColor)}`\n\t\t)\n\t\tif (backgroundColor) styleList.push(\n\t\t\t`-barlevel-background-color:${Rgba.formatCss(backgroundColor)}`\n\t\t)\n\t\tconst result = styleList.join(\";\")\n\t\treturn result\n\t}\n\texport namespace Options {\n\t\texport function fromLoader(loader: SettingLoader, prefix: string): Options {\n\t\t\treturn {\n\t\t\t\tstyle: loader.loadString(prefix+\"-style\") as Options[\"style\"],\n\t\t\t\thandleColor: loader.loadRgba(prefix+\"-handle-color\"),\n\t\t\t\thandleRadius: loader.loadInt(prefix+\"-handle-radius\"),\n\t\t\t\tbackgroundColor: loader.loadRgba(prefix+\"-background-color\"),\n\t\t\t\theight: loader.loadInt(prefix+\"-height\"),\n\t\t\t\tactiveBackgroundColor: loader.loadRgba(prefix+\"-active-background-color\"),\n\t\t\t}\n\t\t}\n\t\texport function isStyleKey(prefix: string, key: string): boolean {\n\t\t\tif (key == prefix + \"-style\") return true\n\t\t\tif (key == prefix + \"-handle-color\") return true\n\t\t\tif (key == prefix + \"-handle-radius\") return true\n\t\t\tif (key == prefix + \"-background-color\") return true\n\t\t\tif (key == prefix + \"-height\") return true\n\t\t\tif (key == prefix + \"-active-background-color\") return true\n\t\t\treturn false\n\t\t}\n\t}\n}\n\nexport namespace StyledScroll {\n\texport interface Options {\n\t\tshowScrollbar: boolean\n\t\tfadeOffset: number\n\t}\n\texport function updateStyle(scroll: St.ScrollView, options: Options) {\n\t\tscroll.style_class =\n\t\t\toptions.fadeOffset\n\t\t\t? \"vfade\"\n\t\t\t: \"\"\n\t\tscroll.vscrollbar_policy =\n\t\t\toptions.showScrollbar\n\t\t\t? St.PolicyType.AUTOMATIC\n\t\t\t: St.PolicyType.EXTERNAL\n\t\tscroll.style =\n\t\t\toptions.fadeOffset\n\t\t\t? `-st-vfade-offset:${options.fadeOffset}px;`\n\t\t\t: \"\"\n\t}\n\texport namespace Options {\n\t\texport function fromLoader(loader: SettingLoader, prefix: string): Options {\n\t\t\treturn {\n\t\t\t\tshowScrollbar: loader.loadBoolean(prefix+\"-show-scrollbar\"),\n\t\t\t\tfadeOffset: loader.loadInt(prefix+\"-fade-offset\"),\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/libs/types/quickSettingsOrderItem.ts",
    "content": "export interface QuickSettingsOrderItem {\n    id?: string\n    lineBreak?: boolean\n    pageBreak?: boolean\n    hide?: boolean // not used\n    friendlyName?: string // not used\n}\nexport namespace QuickSettingsOrderItem {\n    export function match(a: QuickSettingsOrderItem, b: QuickSettingsOrderItem) {\n        return a.id == b.id\n    }\n}\n"
  },
  {
    "path": "src/libs/types/systemIndicatorOrderItem.ts",
    "content": "import GObject from \"gi://GObject\"\nimport {\n    type SystemIndicator,\n} from \"resource:///org/gnome/shell/ui/quickSettings.js\"\n\nexport interface SystemIndicatorOrderItem {\n    gtypeName?: string\n    constructorName?: string\n    friendlyName?: string\n    nonOrdered?: boolean\n    isSystem?: boolean\n    hide?: boolean\n}\nexport namespace SystemIndicatorOrderItem {\n    export function match(a: SystemIndicatorOrderItem, b: SystemIndicatorOrderItem) {\n        if (\n            a.isSystem != b.isSystem\n            || a.nonOrdered != b.nonOrdered\n            || a.hide != b.hide\n        ) return false\n        if (a.nonOrdered) return true\n        if (a.isSystem) return a.gtypeName == b.gtypeName\n        return (\n            a.constructorName == b.constructorName\n            && a.friendlyName == b.friendlyName\n            && a.gtypeName == b.gtypeName\n        )\n    }\n    export function indicatorMatch(item: SystemIndicatorOrderItem, indicator: SystemIndicator): boolean {\n        if (item.nonOrdered) return false\n        if (item.gtypeName && GObject.type_name_from_instance(indicator as any) != item.gtypeName)\n            return false\n        if (item.constructorName && indicator.constructor.name != item.constructorName)\n            return false\n        return true\n    }\n    export const Default: SystemIndicatorOrderItem = {\n        hide: false,\n        constructorName: \"\",\n        friendlyName: \"\",\n        gtypeName: \"\",\n    }\n    export function create(friendlyName: string): SystemIndicatorOrderItem {\n        return {\n            ...Default,\n            friendlyName,\n        }\n    }\n}\n"
  },
  {
    "path": "src/libs/types/toggleOrderItem.ts",
    "content": "import GObject from \"gi://GObject\"\nimport {\n    type QuickToggle,\n    type QuickMenuToggle,\n} from \"resource:///org/gnome/shell/ui/quickSettings.js\"\n\nexport interface ToggleOrderItem {\n    gtypeName?: string\n    constructorName?: string\n    titleRegex?: string\n    friendlyName?: string\n    nonOrdered?: boolean\n    isSystem?: boolean\n    cachedTitleRegex?: RegExp\n    hide?: boolean\n}\nexport namespace ToggleOrderItem {\n    export function match(a: ToggleOrderItem, b: ToggleOrderItem) {\n        if (\n            a.isSystem != b.isSystem\n            || a.nonOrdered != b.nonOrdered\n            || a.hide != b.hide\n        ) return false\n        if (a.nonOrdered) return true\n        if (a.isSystem) return a.constructorName == b.constructorName\n        return (\n            a.constructorName == b.constructorName\n            && a.titleRegex == b.titleRegex\n            && a.friendlyName == b.friendlyName\n            && a.gtypeName == b.gtypeName\n        )\n    }\n    export function toggleMatch(item: ToggleOrderItem, toggle: QuickToggle|QuickMenuToggle): boolean {\n        if (item.nonOrdered) return false\n        if (item.gtypeName && GObject.type_name_from_instance(toggle as any) != item.gtypeName)\n            return false\n        if (item.constructorName && toggle.constructor.name != item.constructorName)\n            return false\n        if (item.cachedTitleRegex && toggle.title.match(item.cachedTitleRegex) == null)\n            return false\n        if (!item.gtypeName && !item.constructorName && !item.cachedTitleRegex) return false\n        return true\n    }\n    export const Default: ToggleOrderItem = {\n        hide: false,\n        titleRegex: \"\",\n        constructorName: \"\",\n        friendlyName: \"\",\n        gtypeName: \"\",\n    }\n    export function create(friendlyName: string): ToggleOrderItem {\n        return {\n            ...Default,\n            friendlyName,\n        }\n    }\n}\n"
  },
  {
    "path": "src/prefPages/about.ts",
    "content": "import Adw from \"gi://Adw\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport type QstExtensionPreferences from \"../prefs.js\"\nimport Config from \"../config.js\"\nimport {\n\tGroup,\n\tRow,\n\tContributorsRow,\n\tLicenseRow,\n\tLogoGroup,\n\tDialogRow,\n\tChangelogDialog,\n\tfixPageScrollIssue,\n\tSwitchRow,\n\tDropdownRow,\n} from \"../libs/prefs/components.js\"\n\nexport const AboutPage = GObject.registerClass({\n\tGTypeName: Config.baseGTypeName+\"AboutPage\",\n}, class AboutPage extends Adw.PreferencesPage {\n\tconstructor(settings: Gio.Settings, prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {\n\t\tsuper({\n\t\t\tname: \"about\",\n\t\t\ttitle: _(\"About\"),\n\t\t\ticonName: \"dialog-information-symbolic\"\n\t\t})\n\t\tfixPageScrollIssue(this)\n\n\t\t// Logo\n\t\tLogoGroup({\n\t\t\tparent: this,\n\t\t\tname: prefs.metadata.name,\n\t\t\ticon: \"qst-project-icon\",\n\t\t\tversion: prefs.getVersionString(),\n\t\t\tversionAction: () => ChangelogDialog({\n\t\t\t\twindow,\n\t\t\t\tcontent: async () => prefs.getChangelog(),\n\t\t\t\tcurrentBuildNumber: Config.buildNumber,\n\t\t\t\tdefaultPageBuildNumber: Config.buildNumber,\n\t\t\t})\n\t\t})\n\n\t\t// About\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"About\"),\n\t\t\tdescription: _(\"Common extension informations\"),\n\t\t},[\n\t\t\tRow({\n\t\t\t\ttitle: _(\"Changelogs\"),\n\t\t\t\tsubtitle: _(\"View the change history for this extension\"),\n\t\t\t\taction: ()=>ChangelogDialog({\n\t\t\t\t\twindow,\n\t\t\t\t\ttitle: _(\"Changelogs\"),\n\t\t\t\t\tsubtitle: _(\"View the change history for this extension\"),\n\t\t\t\t\tcontent: async () => prefs.getChangelog(),\n\t\t\t\t\tcurrentBuildNumber: Config.buildNumber,\n\t\t\t\t}),\n\t\t\t\ticon: \"object-rotate-right-symbolic\",\n\t\t\t}),\n\t\t\tDialogRow({\n\t\t\t\twindow,\n\t\t\t\ttitle: _(\"License\"),\n\t\t\t\tsubtitle: _(\"License of codes\"),\n\t\t\t\tdialogTitle: _(\"License\"),\n\t\t\t\tminHeight: 520,\n\t\t\t\ticon: \"document-open-recent-symbolic\",\n\t\t\t\tchildrenRequest: _page=>[\n\t\t\t\t\tGroup({\n\t\t\t\t\t\ttitle: _(\"License\"),\n\t\t\t\t\t\tdescription: _(\"License of codes\")\n\t\t\t\t\t}, prefs.getLicenses().map(LicenseRow)),\n\t\t\t\t],\n\t\t\t}),\n\t\t\tDialogRow({\n\t\t\t\twindow,\n\t\t\t\ttitle: _(\"Contributors\"),\n\t\t\t\tsubtitle: _(\"The creators of this extension\"),\n\t\t\t\tdialogTitle: _(\"Contributors\"),\n\t\t\t\ticon: \"starred-symbolic\",\n\t\t\t\tchildrenRequest: _page=>[\n\t\t\t\t\tGroup({\n\t\t\t\t\t\ttitle: _(\"Contributors\"),\n\t\t\t\t\t\tdescription: _(\"The creators of this extension\"),\n\t\t\t\t\t}, [\n\t\t\t\t\t\t...prefs.getContributorRows().map(ContributorsRow),\n\t\t\t\t\t\tRow({\n\t\t\t\t\t\t\ttitle: _(\"More contributors\"),\n\t\t\t\t\t\t\tsubtitle: _(\"See more contributors on github\"),\n\t\t\t\t\t\t\turi: \"https://github.com/qwreey/quick-settings-tweaks/graphs/contributors\"\n\t\t\t\t\t\t}),\n\t\t\t\t\t])\n\t\t\t\t]\n\t\t\t})\n\t\t])\n\n\t\t// Links\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Link\"),\n\t\t\tdescription: _(\"External links about this extension\")\n\t\t},[\n\t\t\tRow({\n\t\t\t\turi: \"https://github.com/sponsors/qwreey\",\n\t\t\t\ttitle: _(\"Donate via github sponsors\"),\n\t\t\t\tsubtitle: _(\"Support development!\"),\n\t\t\t\ticon: \"emblem-favorite-symbolic\",\n\t\t\t}),\n\t\t\tRow({\n\t\t\t\turi: \"https://extensions.gnome.org/extension/5446/quick-settings-tweaker/\",\n\t\t\t\ttitle: \"Gnome Extension\",\n\t\t\t\tsubtitle: _(\"Rate and comment the extension!\"),\n\t\t\t\ticon: \"qst-gnome-extension-logo-symbolic\",\n\t\t\t}),\n\t\t\tRow({\n\t\t\t\turi: \"https://github.com/qwreey75/quick-settings-tweaks\",\n\t\t\t\ttitle: _(\"Github Repository\"),\n\t\t\t\tsubtitle: _(\"Add Star on Repository is helping me a lot!\\nPlease, if you found bug from this extension, you can make issue to make me know that!\\nOr, you can create PR with wonderful features!\"),\n\t\t\t\ticon: \"qst-github-logo-symbolic\",\n\t\t\t}),\n\t\t\t// Row({\n\t\t\t// \turi: \"https://weblate.paring.moe/projects/gs-quick-settings-tweaks/\",\n\t\t\t// \ttitle: \"Webslate\",\n\t\t\t// \tsubtitle: _(\"Add translation to this extension!\"),\n\t\t\t// \ticon: \"qst-weblate-logo-symbolic\",\n\t\t\t// }),\n\t\t])\n\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Debug\"),\n\t\t\tdescription: _(\"Extension debugging options\"),\n\t\t}, [\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Expose environment\"),\n\t\t\t\tsubtitle: _(\"Expose extension environment to globalThis.qst\"),\n\t\t\t\tbind: \"debug-expose\"\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Show layout border\"),\n\t\t\t\tsubtitle: _(\"Show layout borders on Quick Settings\"),\n\t\t\t\tbind: \"debug-show-layout-border\"\n\t\t\t}),\n\t\t\tDropdownRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Log level\"),\n\t\t\t\tbind: \"debug-log-level\",\n\t\t\t\titems: [\n\t\t\t\t\t{ name: _(\"none\"), value: -1 },\n\t\t\t\t\t{ name: _(\"error\"), value: 0 },\n\t\t\t\t\t{ name: _(\"info\"), value: 1 },\n\t\t\t\t\t{ name: _(\"debug\"), value: 2 },\n\t\t\t\t],\n\t\t\t}),\n\t\t])\n\t}\n})\n"
  },
  {
    "path": "src/prefPages/layout.ts",
    "content": "import Adw from \"gi://Adw\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport GLib from \"gi://GLib\"\nimport Gtk from \"gi://Gtk\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport Config from \"../config.js\"\nimport type QstExtensionPreferences from \"../prefs.js\"\nimport { ToggleOrderItem } from \"../libs/types/toggleOrderItem.js\"\nimport {\n\tSwitchRow,\n\tUpDownButton,\n\tRow,\n\tGroup,\n\tDialogRow,\n\tToggleButtonRow,\n\tResetButton,\n\tsetScrollToFocus,\n\tdelayedSetScrollToFocus,\n\tfixPageScrollIssue,\n\tDialog,\n\tButton,\n\tremoveRowBottomBorder,\n\tremoveRowMinHeight,\n\tDropdownRow,\n} from \"../libs/prefs/components.js\"\nimport { SystemIndicatorOrderItem } from \"../libs/types/systemIndicatorOrderItem.js\"\nimport { QuickSettingsOrderItem } from \"../libs/types/quickSettingsOrderItem.js\"\n\n// #region OrderGroup\nfunction OrderGroup<T extends OrderInfo.Base>({\n\tpage, dialog, bind, sensitiveBind, info\n}:{\n\tpage: Adw.PreferencesPage,\n\tdialog: Adw.PreferencesDialog,\n\tbind: string,\n\tsensitiveBind: string,\n\tinfo: OrderInfo<T>\n}): Adw.PreferencesGroup {\n\t// Create group\n\tconst itemRows = new Map<T, Adw.ActionRow>()\n\tconst header = new Gtk.Box({})\n\tconst group = Group({\n\t\ttitle: info.getGroupTitle(),\n\t\tdescription: info.getGroupDescription(),\n\t\theaderSuffix: header\n\t})\n\n\t// Edit functions\n\tconst saveItem = (item: T, edited: T): string|null => {\n\t\tconst list = info.getListFromSettings()\n\t\tconst index = list.findIndex(targetItem => info.match(targetItem, item))\n\t\tif (index == -1) {\n\t\t\treturn _(\"The item not found\")\n\t\t}\n\t\tif (info.match(item, edited)) {\n\t\t\treturn _(\"No changes\")\n\t\t}\n\t\tif (list.some(listItem => info.match(listItem, edited))) {\n\t\t\treturn _(\"The same item already exists\")\n\t\t}\n\t\tlist[index] = edited\n\t\tinfo.setListToSettings(list)\n\t\treturn null\n\t}\n\tconst editItem = (item: T)=>{\n\t\tDialog.StackedPage({\n\t\t\tdialog,\n\t\t\ttitle: _(\"Properties of %s\").format(item.friendlyName),\n\t\t\tchildrenRequest: (_page, _dialog)=>{\n\t\t\t\tconst editLayout = info.createEditLayout(item)\n\t\t\t\tconst saveButton = Button({\n\t\t\t\t\tmarginBottom: 0,\n\t\t\t\t\tmarginTop: 0,\n\t\t\t\t\ticonName: \"document-save-symbolic\",\n\t\t\t\t\ttext: _(\"Save\"),\n\t\t\t\t\taction: ()=>{\n\t\t\t\t\t\tconst edited = editLayout.getValue()\n\t\t\t\t\t\tconst saved = saveItem(item, edited)\n\t\t\t\t\t\tif (saved == null) {\n\t\t\t\t\t\t\titem = edited\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdialog.add_toast(new Adw.Toast({\n\t\t\t\t\t\t\t\ttimeout: 6,\n\t\t\t\t\t\t\t\ttitle: saved\n\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn [\n\t\t\t\t\tGroup({\n\t\t\t\t\t\ttitle: _(\"Toggle editor\"),\n\t\t\t\t\t\theader_suffix: saveButton,\n\t\t\t\t\t}, editLayout.layout)\n\t\t\t\t]\n\t\t\t}\n\t\t})\n\t}\n\tconst deleteItem = (item: T)=>{\n\t\tconst list = info.getListFromSettings()\n\t\tconst index = list.findIndex(targetItem => info.match(targetItem, item))\n\t\tif (index == -1) return\n\t\tlist.splice(index, 1)\n\t\tinfo.setListToSettings(list)\n\t}\n\tconst hideItem = (item: T, hide: boolean)=>{\n\t\tconst list = info.getListFromSettings()\n\t\tlist.find(targetItem => info.match(targetItem, item)).hide = hide\n\t\tinfo.setListToSettings(list)\n\t\tdialog.add_toast(new Adw.Toast({\n\t\t\ttitle: _(\"This option requires full gnome-shell reloading\"),\n\t\t\ttimeout: 12,\n\t\t}))\n\t}\n\tconst moveItem = (item: T, offset: number)=>{\n\t\tconst list = info.getListFromSettings()\n\t\tconst index = list.findIndex(targetItem => info.match(targetItem, item))\n\t\tif (!offset) return\n\t\tconst sign = Math.sign(offset)\n\t\tlet targetIndex = index\n\t\tfor (let count = Math.abs(offset); count > 0;) {\n\t\t\tif (targetIndex <= 0 && sign == -1) break\n\t\t\tif ((targetIndex >= (list.length - 1)) && sign == 1) break\n\t\t\tif (info.moveBlocking(list, item, index, list[targetIndex], targetIndex)) break\n\t\t\ttargetIndex += sign\n\t\t\tif (info.skip(list, item, index, list[targetIndex], targetIndex)) count--\n\t\t}\n\t\tif (index == targetIndex) return\n\t\tlist.splice(index, 1)\n\t\tlist.splice(targetIndex, 0, item)\n\t\tinfo.setListToSettings(list)\n\t}\n\n\t// Control items\n\tconst pruneItems = (list: T[])=>{\n\t\tfor (const [targetItem, row] of itemRows.entries()) {\n\t\t\tif (list.some(item => info.match(item, targetItem))) continue\n\t\t\titemRows.delete(targetItem)\n\t\t\tgroup.remove(row)\n\t\t}\n\t}\n\tconst pushItems = (list: T[])=>{\n\t\tfor (const newItem of list) {\n\t\t\t// Filter already exist\n\t\t\tif ([...itemRows.entries()].find(([item]) => info.match(item, newItem)))\n\t\t\t\tcontinue\n\n\t\t\t// Create row\n\t\t\tconst row = Row({\n\t\t\t\tsettings: info.settings,\n\t\t\t\ttitle: info.getDisplayName(newItem),\n\t\t\t\tsubtitle: info.getSubtitle(newItem),\n\t\t\t\tsensitiveBind,\n\t\t\t})\n\t\t\trow.visible = info.shouldShow(newItem)\n\n\t\t\t// Update icon\n\t\t\tconst systemKey = info.getSystemKey(newItem)\n\t\t\tconst iconName = systemKey && info.systemIcons.get(systemKey)\n\t\t\tif (iconName) {\n\t\t\t\tconst icon = new Gtk.Image({\n\t\t\t\t\ticon_name: iconName,\n\t\t\t\t\tpixel_size: 18,\n\t\t\t\t\tmargin_start: 8,\n\t\t\t\t\tmargin_end: 2,\n\t\t\t\t})\n\t\t\t\trow.add_prefix(icon)\n\t\t\t}\n\n\t\t\t// Create Up & Down button\n\t\t\tconst updown = UpDownButton({\n\t\t\t\tsettings: info.settings,\n\t\t\t\tsensitiveBind: \"toggles-layout-enabled\",\n\t\t\t\taction: (direction)=>{\n\t\t\t\t\tmoveItem(newItem, direction == UpDownButton.Direction.Up ? -1 : 1)\n\t\t\t\t}\n\t\t\t})\n\t\t\trow.add_prefix(updown)\n\n\t\t\t// Hide button\n\t\t\tif (info.canHide(newItem)) {\n\t\t\t\tconst toggle = new Gtk.ToggleButton({\n\t\t\t\t\tmargin_bottom: 8,\n\t\t\t\t\tmargin_top: 8,\n\t\t\t\t\tlabel: _(\"Hide\"),\n\t\t\t\t\tactive: newItem.hide ?? false,\n\t\t\t\t})\n\t\t\t\ttoggle.connect(\"notify::active\", () => hideItem(newItem, toggle.get_active()))\n\t\t\t\trow.add_suffix(toggle)\n\t\t\t}\n\n\t\t\t// Delete & Edit button\n\t\t\tif (info.canEdit(newItem)) {\n\t\t\t\tconst deleteButton = new Gtk.Button({\n\t\t\t\t\ticon_name: \"edit-clear-symbolic\",\n\t\t\t\t\tmargin_bottom: 8,\n\t\t\t\t\tmargin_top: 8,\n\t\t\t\t})\n\t\t\t\tconst editButton = new Gtk.Button({\n\t\t\t\t\ticon_name: \"document-edit-symbolic\",\n\t\t\t\t\tmargin_bottom: 8,\n\t\t\t\t\tmargin_top: 8,\n\t\t\t\t})\n\t\t\t\tdeleteButton.connect(\"clicked\", deleteItem.bind(null, newItem))\n\t\t\t\teditButton.connect(\"clicked\", editItem.bind(null, newItem))\n\t\t\t\trow.add_suffix(deleteButton)\n\t\t\t\trow.add_suffix(editButton)\n\t\t\t}\n\n\t\t\titemRows.set(newItem, row)\n\t\t\tgroup.add(row)\n\t\t}\n\t}\n\tconst orderItems = (list: T[])=>{\n\t\tconst rows = [...itemRows.entries()]\n\t\tconst orderedRows = list\n\t\t\t.map(\n\t\t\t\ttargetItem=>rows.find(\n\t\t\t\t\t([item]) => info.match(targetItem, item)\n\t\t\t\t)?.[1] ?? null\n\t\t\t)\n\t\tfor (const row of orderedRows) {\n\t\t\tif (!row) continue\n\t\t\tgroup.remove(row)\n\t\t\tgroup.add(row)\n\t\t}\n\t}\n\n\t// Reset button\n\tconst resetButton = ResetButton({ settings: info.settings, bind, marginBottom: 0, marginTop: 0 })\n\tresetButton.insert_after(header, null)\n\n\t// Add button\n\tconst addButton = info.createAddButton(editItem)\n\taddButton.insert_after(header, resetButton)\n\n\t// Sync to settings\n\tconst update = ()=>{\n\t\tsetScrollToFocus(page, false)\n\t\tconst list = info.getListFromSettings()\n\t\tpushItems(list)\n\t\tpruneItems(list)\n\t\torderItems(list)\n\t\tdelayedSetScrollToFocus(page, true)\n\t}\n\tconst settingsConnection = info.settings.connect(`changed::${bind}`, update.bind(null))\n\tupdate()\n\tpage.connect(\"destroy\", ()=>info.settings.disconnect(settingsConnection))\n\n\treturn group\n}\nabstract class OrderInfo<T extends OrderInfo.Base> {\n\tsettings: Gio.Settings\n\tconstructor(settings: Gio.Settings) {\n\t\tthis.settings = settings\n\t}\n\tabstract getSystemNames(): Map<string, string>\n\tabstract getSystemIcons(): Map<string, string>\n\tabstract getSystemKey(item: T): string\n\tabstract getListFromSettings(): T[]\n\tabstract setListToSettings(list: T[]): void\n\tprivate _systemNames: Map<string, string>\n\tprivate _systemIcons: Map<string, string>\n\tget systemNames(): Map<string, string> {\n\t\treturn this._systemNames ??= this.getSystemNames()\n\t}\n\tget systemIcons(): Map<string, string> {\n\t\treturn this._systemIcons ??= this.getSystemIcons()\n\t}\n\tabstract getDisplayName(item: T): string\n\tabstract getSubtitle(item: T): string\n\tabstract canHide(item: T): boolean\n\tabstract canEdit(item: T): boolean\n\tabstract createEditLayout(item: T): OrderInfo.EditLayout<T>\n\tgetNextName(list: T[]): string {\n\t\tlet nth = 1\n\t\tlet name: string\n\t\twhile (true) {\n\t\t\tname = _(\"My item #%d\").format(nth)\n\t\t\tif (list.findIndex(item => item.friendlyName == name) == -1) break\n\t\t\tnth += 1\n\t\t}\n\t\treturn name\n\t}\n\tabstract create(friendlyName: string): T\n\tabstract match(a: T, b: T): boolean\n\tabstract shouldShow(item: T): boolean\n\tskip(_list: T[], _moving: T, _movingIndex: number, target: T, _targetIndex: number): boolean {\n\t\treturn this.shouldShow(target)\n\t}\n\tmoveBlocking(_list: T[], _moving: T, _movingIndex: number, target: T, _targetIndex: number): boolean {\n\t\treturn false\n\t}\n\tcreateAddButton(editItem: (item: T)=>void): Gtk.Widget {\n\t\treturn Button({\n\t\t\tmarginBottom: 0,\n\t\t\tmarginTop: 0,\n\t\t\ticonName: \"list-add\",\n\t\t\ttext: _(\"New Item\"),\n\t\t\taction: ()=>{\n\t\t\t\tconst list = this.getListFromSettings()\n\t\t\t\tconst item = this.create(this.getNextName(list))\n\t\t\t\tlist.push(item)\n\t\t\t\tthis.setListToSettings(list)\n\t\t\t\teditItem(item)\n\t\t\t}\n\t\t})\n\t}\n\tgetGroupTitle(): string {\n\t\treturn _(\"Ordering and Hiding\")\n\t}\n\tgetGroupDescription(): string|null {\n\t\treturn null\n\t}\n}\nnamespace OrderInfo {\n\texport type EditLayout<T> = {\n\t\tlayout: any[],\n\t\tgetValue: ()=>T,\n\t}\n\texport type Base = {\n\t\thide?: boolean,\n\t\tfriendlyName?: string,\n\t}\n}\n// #endregion OrderGroup\n\nclass ToggleOrderInfo extends OrderInfo<ToggleOrderItem> {\n\tcreateEditLayout(item: ToggleOrderItem): OrderInfo.EditLayout<ToggleOrderItem> {\n\t\tconst friendlyName = new Adw.EntryRow({\n\t\t\ttext: item.friendlyName ?? \"\",\n\t\t\tmax_length: 2048,\n\t\t\ttitle: _(\"Friendly Name\"),\n\t\t})\n\t\tremoveRowBottomBorder(friendlyName)\n\t\tconst hideRow = new Adw.SwitchRow({\n\t\t\tactive: item.hide ?? false,\n\t\t\ttitle: _(\"Hide\"),\n\t\t})\n\t\tconst titleRegex = new Adw.EntryRow({\n\t\t\ttext: item.titleRegex ?? \"\",\n\t\t\tmax_length: 2048,\n\t\t\ttitle: _(\"Title Regex (Javascript Regex)\")\n\t\t})\n\t\tconst constructorName = new Adw.EntryRow({\n\t\t\ttext: item.constructorName ?? \"\",\n\t\t\tmax_length: 2028,\n\t\t\ttitle: _(\"Constructor Name\")\n\t\t})\n\t\tremoveRowBottomBorder(constructorName)\n\t\tconst gtypeName = new Adw.EntryRow({\n\t\t\ttext: item.gtypeName ?? \"\",\n\t\t\tmax_length: 2028,\n\t\t\ttitle: _(\"GType Name\")\n\t\t})\n\t\tremoveRowBottomBorder(gtypeName)\n\t\treturn {\n\t\t\tlayout: [\n\t\t\t\thideRow,\n\t\t\t\tfriendlyName,\n\t\t\t\tRow({\n\t\t\t\t\tsubtitle: _(\"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"),\n\t\t\t\t\tonCreated: removeRowMinHeight,\n\t\t\t\t}),\n\t\t\t\tconstructorName,\n\t\t\t\tRow({\n\t\t\t\t\tsubtitle: _(\"Javascript constructor name\"),\n\t\t\t\t\tonCreated: removeRowMinHeight,\n\t\t\t\t}),\n\t\t\t\tgtypeName,\n\t\t\t\tRow({\n\t\t\t\t\tsubtitle: _(\"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"),\n\t\t\t\t\tonCreated: removeRowMinHeight,\n\t\t\t\t}),\n\t\t\t\ttitleRegex,\n\t\t\t],\n\t\t\tgetValue: ()=>({\n\t\t\t\t...item,\n\t\t\t\tfriendlyName: friendlyName.text,\n\t\t\t\tconstructorName: constructorName.text,\n\t\t\t\tgtypeName: gtypeName.text,\n\t\t\t\ttitleRegex: titleRegex.text,\n\t\t\t\thide: hideRow.active,\n\t\t\t})\n\t\t}\n\t}\n\tgetSystemKey(item: ToggleOrderItem): string {\n\t\treturn item.constructorName\n\t}\n\tgetSystemNames(): Map<string, string> {\n\t\tconst IGNORE_XGETTEXT=_\n\t\treturn new Map<string, string>([\n\t\t\t[ \"NMWiredToggle\", IGNORE_XGETTEXT(\"Wired Connections\") ],\n\t\t\t[ \"NMWirelessToggle\", IGNORE_XGETTEXT(\"Wi-Fi\") ],\n\t\t\t[ \"NMModemToggle\", IGNORE_XGETTEXT(\"Mobile Connections\") ],\n\t\t\t[ \"NMBluetoothToggle\", IGNORE_XGETTEXT(\"Bluetooth Tethers\") ],\n\t\t\t[ \"NMVpnToggle\", IGNORE_XGETTEXT(\"VPN\") ],\n\t\t\t[ \"BluetoothToggle\", IGNORE_XGETTEXT(\"Bluetooth\") ],\n\t\t\t[ \"PowerProfilesToggle\", IGNORE_XGETTEXT(\"Power Mode\") ],\n\t\t\t[ \"NightLightToggle\", IGNORE_XGETTEXT(\"Night Light\") ],\n\t\t\t[ \"DarkModeToggle\", IGNORE_XGETTEXT(\"Dark Style\") ],\n\t\t\t[ \"KeyboardBrightnessToggle\", _(\"Keyboard Backlight\") ],\n\t\t\t[ \"RfkillToggle\", IGNORE_XGETTEXT(\"Airplane Mode\") ],\n\t\t\t[ \"RotationToggle\", IGNORE_XGETTEXT(\"Auto Rotate\") ],\n\t\t\t[ \"DoNotDisturbToggle\", _(\"Do Not Disturb\") ],\n\t\t\t[ \"UnsafeQuickToggle\", _(\"Unsafe Mode\") ],\n\t\t])\n\t}\n\tgetSystemIcons(): Map<string, string> {\n\t\treturn new Map<string, string>([\n\t\t\t[ \"NMWiredToggle\", \"network-wired-symbolic\" ],\n\t\t\t[ \"NMWirelessToggle\", \"network-wireless-signal-excellent-symbolic\" ],\n\t\t\t[ \"NMModemToggle\", \"network-cellular-symbolic\" ],\n\t\t\t[ \"NMBluetoothToggle\", \"network-cellular-symbolic\" ],\n\t\t\t[ \"NMVpnToggle\", \"network-vpn-symbolic\" ],\n\t\t\t[ \"BluetoothToggle\", \"bluetooth-active-symbolic\" ],\n\t\t\t[ \"PowerProfilesToggle\", \"power-profile-balanced-symbolic\" ],\n\t\t\t[ \"NightLightToggle\", \"night-light-symbolic\" ],\n\t\t\t[ \"DarkModeToggle\", \"weather-clear-night\" ],\n\t\t\t[ \"KeyboardBrightnessToggle\", \"preferences-desktop-keyboard\" ],\n\t\t\t[ \"RfkillToggle\", \"airplane-mode-symbolic\" ],\n\t\t\t[ \"RotationToggle\", \"object-rotate-right\" ],\n\t\t\t[ \"DoNotDisturbToggle\", \"notifications-disabled-symbolic\" ],\n\t\t\t[ \"UnsafeQuickToggle\", \"channel-secure-symbolic\" ],\n\t\t])\n\t}\n\tgetListFromSettings(): ToggleOrderItem[] {\n\t\treturn this.settings.get_value(\"toggles-layout-order\").recursiveUnpack() as ToggleOrderItem[]\n\t}\n\tsetListToSettings(list: ToggleOrderItem[]): void {\n\t\tconst mappedList = list.map(item => {\n\t\t\tconst out = {}\n\t\t\tfor (const [key, value] of Object.entries(item)) {\n\t\t\t\tswitch (typeof value) {\n\t\t\t\t\tcase \"boolean\":\n\t\t\t\t\t\tout[key] = GLib.Variant.new_variant(\n\t\t\t\t\t\t\tGLib.Variant.new_boolean(value)\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\tout[key] = GLib.Variant.new_variant(\n\t\t\t\t\t\t\tGLib.Variant.new_string(value)\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out\n\t\t})\n\t\tthis.settings.set_value(\"toggles-layout-order\", new GLib.Variant(\"aa{sv}\", mappedList))\n\t}\n\tgetDisplayName(item: ToggleOrderItem): string {\n\t\tif (item.nonOrdered) return _(\"Unordered items\")\n\t\tif (item.isSystem) return this.systemNames.get(item.constructorName) ?? \"Unknown\"\n\t\treturn item.friendlyName || item.constructorName || item.gtypeName || item.titleRegex || \"Unknown\"\n\t}\n\tgetSubtitle(item: ToggleOrderItem): string {\n\t\tif (item.nonOrdered) return \"\"\n\t\tif (item.isSystem) return item.constructorName ?? \"\"\n\t\tif (item.friendlyName) return item.constructorName || item.gtypeName || item.titleRegex || \"Unknown\"\n\t\treturn \"\"\n\t}\n\tcanHide(item: ToggleOrderItem): boolean {\n\t\tif (!item.isSystem) return true\n\t\treturn (\n\t\t\titem.constructorName != \"UnsafeQuickToggle\"\n\t\t)\n\t}\n\tcanEdit(item: ToggleOrderItem): boolean {\n\t\treturn !item.isSystem && !item.nonOrdered\n\t}\n\tmatch(a: ToggleOrderItem, b: ToggleOrderItem): boolean {\n\t\treturn ToggleOrderItem.match(a, b)\n\t}\n\tcreate(friendlyName: string): ToggleOrderItem {\n\t\treturn ToggleOrderItem.create(friendlyName)\n\t}\n\tshouldShow(item: ToggleOrderItem): boolean {\n\t\tif (item.constructorName == \"UnsafeQuickToggle\") {\n\t\t\treturn this.settings.get_boolean(\"unsafe-quick-toggle-enabled\")\n\t\t}\n\t\treturn true\n\t}\n}\n\nclass SystemIndicatorOrderInfo extends OrderInfo<SystemIndicatorOrderItem> {\n\tcreateEditLayout(item: SystemIndicatorOrderItem): OrderInfo.EditLayout<SystemIndicatorOrderItem> {\n\t\tconst friendlyName = new Adw.EntryRow({\n\t\t\ttext: item.friendlyName ?? \"\",\n\t\t\tmax_length: 2048,\n\t\t\ttitle: _(\"Friendly Name\"),\n\t\t})\n\t\tremoveRowBottomBorder(friendlyName)\n\t\tconst hideRow = new Adw.SwitchRow({\n\t\t\tactive: item.hide ?? false,\n\t\t\ttitle: _(\"Hide\"),\n\t\t})\n\t\tconst constructorName = new Adw.EntryRow({\n\t\t\ttext: item.constructorName ?? \"\",\n\t\t\tmax_length: 2028,\n\t\t\ttitle: _(\"Constructor Name\")\n\t\t})\n\t\tremoveRowBottomBorder(constructorName)\n\t\tconst gtypeName = new Adw.EntryRow({\n\t\t\ttext: item.gtypeName ?? \"\",\n\t\t\tmax_length: 2028,\n\t\t\ttitle: _(\"GType Name\")\n\t\t})\n\t\tremoveRowBottomBorder(gtypeName)\n\t\treturn {\n\t\t\tlayout: [\n\t\t\t\thideRow,\n\t\t\t\tfriendlyName,\n\t\t\t\tRow({\n\t\t\t\t\tsubtitle: _(\"This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension\"),\n\t\t\t\t\tonCreated: removeRowMinHeight,\n\t\t\t\t}),\n\t\t\t\tconstructorName,\n\t\t\t\tRow({\n\t\t\t\t\tsubtitle: _(\"Javascript constructor name\"),\n\t\t\t\t\tonCreated: removeRowMinHeight,\n\t\t\t\t}),\n\t\t\t\tgtypeName,\n\t\t\t\tRow({\n\t\t\t\t\tsubtitle: _(\"GObject gtype name. You can get this value by calling GObject.type_name_from_instance\"),\n\t\t\t\t\tonCreated: removeRowMinHeight,\n\t\t\t\t}),\n\t\t\t],\n\t\t\tgetValue: ()=>({\n\t\t\t\t...item,\n\t\t\t\tfriendlyName: friendlyName.text,\n\t\t\t\tconstructorName: constructorName.text,\n\t\t\t\tgtypeName: gtypeName.text,\n\t\t\t\thide: hideRow.active,\n\t\t\t})\n\t\t}\n\t}\n\tgetSystemKey(item: SystemIndicatorOrderItem): string {\n\t\treturn item.gtypeName\n\t}\n\tgetSystemNames(): Map<string, string> {\n\t\tconst IGNORE_XGETTEXT=_\n\t\treturn new Map<string, string>([\n\t\t\t[ \"Gjs_toggle_dndQuickToggle_DndIndicator\", _(\"Do Not Disturb\") ],\n\t\t\t[ \"Gjs_status_remoteAccess_RemoteAccessApplet\", _(\"Remote Access Applet\") ],\n\t\t\t[ \"Gjs_status_camera_Indicator\", _(\"Camera\") ],\n\t\t\t[ \"Gjs_status_volume_InputIndicator\", _(\"Volume Input\") ],\n\t\t\t[ \"Gjs_status_location_Indicator\", _(\"Location\") ],\n\t\t\t[ \"Gjs_status_thunderbolt_Indicator\", _(\"Thunderbolt\") ],\n\t\t\t[ \"Gjs_status_nightLight_Indicator\", IGNORE_XGETTEXT(\"Night Light\") ],\n\t\t\t[ \"Gjs_status_network_Indicator\", _(\"Network\") ],\n\t\t\t[ \"Gjs_status_bluetooth_Indicator\", IGNORE_XGETTEXT(\"Bluetooth\") ],\n\t\t\t[ \"Gjs_status_rfkill_Indicator\", IGNORE_XGETTEXT(\"Airplane Mode\") ],\n\t\t\t[ \"Gjs_status_volume_OutputIndicator\", _(\"Volume Output\") ],\n\t\t\t[ \"Gjs_ui_panel_UnsafeModeIndicator\", _(\"Unsafe Mode\") ],\n\t\t\t[ \"Gjs_status_system_Indicator\", _(\"System (Battery)\") ],\n\t\t])\n\t}\n\tgetSystemIcons(): Map<string, string> {\n\t\treturn new Map<string, string>([\n\t\t\t[ \"Gjs_toggle_dndQuickToggle_DndIndicator\", \"notifications-disabled-symbolic\" ],\n\t\t\t[ \"Gjs_status_remoteAccess_RemoteAccessApplet\", \"preferences-desktop-remote-desktop\" ],\n\t\t\t[ \"Gjs_status_camera_Indicator\", \"camera-photo-symbolic\" ],\n\t\t\t[ \"Gjs_status_volume_InputIndicator\", \"microphone-sensitivity-high-symbolic\" ],\n\t\t\t[ \"Gjs_status_location_Indicator\", \"find-location-symbolic\" ],\n\t\t\t[ \"Gjs_status_thunderbolt_Indicator\", \"system-run-symbolic\" ],\n\t\t\t[ \"Gjs_status_nightLight_Indicator\", \"night-light-symbolic\" ],\n\t\t\t[ \"Gjs_status_network_Indicator\", \"network-wireless-signal-excellent-symbolic\" ],\n\t\t\t[ \"Gjs_status_bluetooth_Indicator\", \"bluetooth-active-symbolic\" ],\n\t\t\t[ \"Gjs_status_rfkill_Indicator\", \"airplane-mode-symbolic\" ],\n\t\t\t[ \"Gjs_status_volume_OutputIndicator\", \"audio-volume-medium-symbolic\" ],\n\t\t\t[ \"Gjs_ui_panel_UnsafeModeIndicator\", \"channel-secure-symbolic\" ],\n\t\t\t[ \"Gjs_status_system_Indicator\", \"system-shutdown-symbolic\" ],\n\t\t])\n\t}\n\tgetListFromSettings(): SystemIndicatorOrderItem[] {\n\t\treturn this.settings.get_value(\"system-indicator-layout-order\").recursiveUnpack() as SystemIndicatorOrderItem[]\n\t}\n\tsetListToSettings(list: SystemIndicatorOrderItem[]): void {\n\t\tconst mappedList = list.map(item => {\n\t\t\tconst out = {}\n\t\t\tfor (const [key, value] of Object.entries(item)) {\n\t\t\t\tswitch (typeof value) {\n\t\t\t\t\tcase \"boolean\":\n\t\t\t\t\t\tout[key] = GLib.Variant.new_variant(\n\t\t\t\t\t\t\tGLib.Variant.new_boolean(value)\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\tout[key] = GLib.Variant.new_variant(\n\t\t\t\t\t\t\tGLib.Variant.new_string(value)\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out\n\t\t})\n\t\tthis.settings.set_value(\"system-indicator-layout-order\", new GLib.Variant(\"aa{sv}\", mappedList))\n\t}\n\tgetDisplayName(item: SystemIndicatorOrderItem): string {\n\t\tif (item.nonOrdered) return _(\"Unordered items\")\n\t\tif (item.isSystem) return this.systemNames.get(item.gtypeName) ?? \"Unknown\"\n\t\treturn item.friendlyName || item.constructorName || item.gtypeName || \"Unknown\"\n\t}\n\tgetSubtitle(item: SystemIndicatorOrderItem): string {\n\t\tif (item.nonOrdered) return \"\"\n\t\tif (item.isSystem) return item.gtypeName ?? \"\"\n\t\tif (item.friendlyName) return item.constructorName || item.gtypeName || \"Unknown\"\n\t\treturn \"\"\n\t}\n\tcanHide(item: SystemIndicatorOrderItem): boolean {\n\t\tif (!item.isSystem) return true\n\t\treturn item.gtypeName != \"Gjs_toggle_dndQuickToggle_DndIndicator\"\n\t}\n\tcanEdit(item: SystemIndicatorOrderItem): boolean {\n\t\treturn !item.isSystem && !item.nonOrdered\n\t}\n\tmatch(a: SystemIndicatorOrderItem, b: SystemIndicatorOrderItem): boolean {\n\t\treturn SystemIndicatorOrderItem.match(a, b)\n\t}\n\tcreate(friendlyName: string): SystemIndicatorOrderItem {\n\t\treturn SystemIndicatorOrderItem.create(friendlyName)\n\t}\n\tshouldShow(item: SystemIndicatorOrderItem): boolean {\n\t\tif (item.gtypeName == \"Gjs_toggle_dndQuickToggle_DndIndicator\") {\n\t\t\treturn (\n\t\t\t\tthis.settings.get_string(\"dnd-quick-toggle-indicator-position\") == \"system-tray\"\n\t\t\t)\n\t\t}\n\t\treturn true\n\t}\n}\n\n// class QuickSettingsOrderInfo extends OrderInfo<QuickSettingsOrderItem> {\n\t\n// }\n\n// #region SystemItemOrderGroup\nfunction SystemItemOrderGroup(settings: Gio.Settings, page: Adw.PreferencesPage): Adw.PreferencesGroup {\n\tlet items = new Map<string, Adw.ActionRow>()\n\tlet group: Adw.PreferencesGroup\n\tconst reorder = ()=>{\n\t\tsetScrollToFocus(page, false)\n\t\tconst order = SystemItemOrderGroup.copyOrder(settings.get_strv(\"system-items-layout-order\"))\n\t\tfor (const name of order) {\n\t\t\tconst target = items.get(name)\n\t\t\tgroup.remove(target)\n\t\t\tgroup.add(target)\n\t\t}\n\t\tdelayedSetScrollToFocus(page, true)\n\t}\n\tconst move = (direction: UpDownButton.Direction, name: string)=>{\n\t\tconst order = SystemItemOrderGroup.copyOrder(settings.get_strv(\"system-items-layout-order\"))\n\t\tconst index = order.indexOf(name)\n\t\tif (direction == UpDownButton.Direction.Up) {\n\t\t\tif (index == 0) return\n\t\t\torder[index] = order[index - 1]\n\t\t\torder[index - 1] = name\n\t\t} else {\n\t\t\tif (index == (SystemItemOrderGroup.DefaultOrder.length - 1)) return\n\t\t\torder[index] = order[index + 1]\n\t\t\torder[index + 1] = name\n\t\t}\n\t\tsettings.set_strv(\"system-items-layout-order\", order)\n\t}\n\n\tconst orderConnection = settings.connect(\"changed::system-items-layout-order\", reorder)\n\tpage.connect(\"destroy\", ()=>settings.disconnect(orderConnection))\n\n\treturn Group({\n\t\ttitle: _(\"Ordering and Hiding\"),\n\t\theaderSuffix: ResetButton({ settings, bind: \"system-items-layout-order\", marginBottom: 0, marginTop: 0 }),\n\t\tonCreated(row: Adw.PreferencesGroup) {\n\t\t\tgroup = row\n\t\t\treorder()\n\t\t},\n\t}, [\n\t\tRow({\n\t\t\ttitle: _(\"Desktop Spacer\"),\n\t\t\tprefix: UpDownButton({\n\t\t\t\tsettings,\n\t\t\t\tsensitiveBind: \"system-items-layout-enabled\",\n\t\t\t\taction: (direction) => move(direction, \"desktopSpacer\"),\n\t\t\t}),\n\t\t\tonCreated(row) {\n\t\t\t\titems.set(\"desktopSpacer\", row)\n\t\t\t},\n\t\t}),\n\t\tRow({\n\t\t\ttitle: _(\"Laptop Spacer\"),\n\t\t\tprefix: UpDownButton({\n\t\t\t\tsettings,\n\t\t\t\tsensitiveBind: \"system-items-layout-enabled\",\n\t\t\t\taction: (direction) => move(direction, \"laptopSpacer\"),\n\t\t\t}),\n\t\t\tonCreated(row) {\n\t\t\t\titems.set(\"laptopSpacer\", row)\n\t\t\t},\n\t\t}),\n\t\t...[\n\t\t\t{\n\t\t\t\ttitle: _(\"Capture button\"),\n\t\t\t\tbind: \"system-items-layout-hide-screenshot\",\n\t\t\t\ticon: \"camera-photo\",\n\t\t\t\ttargetName: \"screenshot\",\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: _(\"Settings button\"),\n\t\t\t\tbind: \"system-items-layout-hide-settings\",\n\t\t\t\ticon: \"preferences-system-symbolic\",\n\t\t\t\ttargetName: \"settings\",\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: _(\"Lock button\"),\n\t\t\t\tbind: \"system-items-layout-hide-lock\",\n\t\t\t\ticon: \"system-lock-screen-symbolic\",\n\t\t\t\ttargetName: \"lock\",\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: _(\"Shutdown button\"),\n\t\t\t\tbind: \"system-items-layout-hide-shutdown\",\n\t\t\t\ticon: \"system-shutdown-symbolic\",\n\t\t\t\ttargetName: \"shutdown\",\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: _(\"Battery button\"),\n\t\t\t\tbind: \"system-items-layout-hide-battery\",\n\t\t\t\ticon: \"battery-symbolic\",\n\t\t\t\ttargetName: \"battery\",\n\t\t\t},\n\t\t].map(item => ToggleButtonRow({\n\t\t\tsettings,\n\t\t\ttext: _(\"Hide\"),\n\t\t\tsensitiveBind: \"system-items-layout-enabled\",\n\t\t\t...item,\n\t\t\tonCreated(row: Adw.ActionRow) {\n\t\t\t\titems.set(item.targetName, row)\n\t\t\t\trow.add_prefix(new Gtk.Image({\n\t\t\t\t\ticon_name: item.icon,\n\t\t\t\t\tpixel_size: 16,\n\t\t\t\t\tmargin_start: 8\n\t\t\t\t}))\n\t\t\t\trow.add_prefix(UpDownButton({\n\t\t\t\t\tsettings,\n\t\t\t\t\tsensitiveBind: \"system-items-layout-enabled\",\n\t\t\t\t\taction: (direction) => move(direction, item.targetName),\n\t\t\t\t}))\n\t\t\t},\n\t\t}))\n\t])\n}\nnamespace SystemItemOrderGroup {\n\texport const DefaultOrder = [\"battery\", \"laptopSpacer\", \"screenshot\", \"settings\", \"desktopSpacer\", \"lock\", \"shutdown\"]\n\texport function copyOrder(order: string[]): string[] {\n\t\treturn DefaultOrder\n\t\t.map(item => ({\n\t\t\titem,\n\t\t\tindex: order.indexOf(item),\n\t\t}))\n\t\t.sort((a, b)=>a.index-b.index)\n\t\t.map(item => item.item)\n\t}\n}\n// #endregion SystemItemOrderGroup\n\nexport const LayoutPage = GObject.registerClass({\n\tGTypeName: Config.baseGTypeName+\"LayoutPage\",\n}, class LayoutPage extends Adw.PreferencesPage {\n\tconstructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {\n\t\tsuper({\n\t\t\tname: \"Layout\",\n\t\t\ttitle: _(\"Layout\"),\n\t\t\ticonName: \"view-sort-descending-symbolic\",\n\t\t})\n\t\tfixPageScrollIssue(this)\n\n\t\t// Quick toggles\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Quick Toggles Layout\"),\n\t\t\tdescription: _(\"Adjust quick toggles layout\"),\n\t\t},[\n\t\t\tSwitchRow({\n\t\t\t\tbind: \"toggles-layout-enabled\",\n\t\t\t\tsettings,\n\t\t\t\tonDetailed: ()=>{\n\t\t\t\t\tDialog({\n\t\t\t\t\t\twindow,\n\t\t\t\t\t\tchildrenRequest: (page, dialog) => [OrderGroup({\n\t\t\t\t\t\t\tpage,\n\t\t\t\t\t\t\tdialog,\n\t\t\t\t\t\t\tbind: \"toggles-layout-order\",\n\t\t\t\t\t\t\tsensitiveBind: \"toggles-layout-enabled\",\n\t\t\t\t\t\t\tinfo: new ToggleOrderInfo(settings),\n\t\t\t\t\t\t})],\n\t\t\t\t\t\ttitle: _(\"Adjust quick toggles layout\"),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\ttitle: _(\"Ordering and Hiding\"),\n\t\t\t\tsubtitle: _(\"Reorder and hide quick toggles\"),\n\t\t\t\texperimental: true,\n\t\t\t}),\n\t\t])\n\n\t\t// System indicators\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"System Indicators\"),\n\t\t\tdescription: _(\"Adjust system indicators layout and style\"),\n\t\t},[\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"system-indicator-screen-sharing-indicator-use-accent\",\n\t\t\t\ttitle: _(\"Accent screen sharing indicator\"),\n\t\t\t\tsubtitle: _(\"Use shell accent color on screen sharing indicator\"),\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"system-indicator-screen-recording-indicator-use-accent\",\n\t\t\t\ttitle: _(\"Accent screen recording indicator\"),\n\t\t\t\tsubtitle: _(\"Use shell accent color on screen recording indicator\"),\n\t\t\t}),\n\t\t\tDropdownRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"system-indicator-privacy-indicator-style\",\n\t\t\t\ttitle: _(\"Privacy indicators style\"),\n\t\t\t\tsubtitle: _(\"Use monochrome or shell accent color on privarcy indicators\"),\n\t\t\t\titems: [\n\t\t\t\t\t{ name: _(\"Default\"), value: \"default\" },\n\t\t\t\t\t{ name: _(\"Accent\"), value: \"accent\" },\n\t\t\t\t\t{ name: _(\"Monochrome\"), value: \"monochrome\" },\n\t\t\t\t],\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"system-indicator-layout-enabled\",\n\t\t\t\tonDetailed: ()=>{\n\t\t\t\t\tDialog({\n\t\t\t\t\t\twindow,\n\t\t\t\t\t\ttitle: _(\"Adjust system indicators\"),\n\t\t\t\t\t\tchildrenRequest: (page, dialog) => [OrderGroup({\n\t\t\t\t\t\t\tpage,\n\t\t\t\t\t\t\tdialog,\n\t\t\t\t\t\t\tbind: \"system-indicator-layout-order\",\n\t\t\t\t\t\t\tsensitiveBind: \"system-indicator-layout-enabled\",\n\t\t\t\t\t\t\tinfo: new SystemIndicatorOrderInfo(settings),\n\t\t\t\t\t\t})],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\ttitle: _(\"Ordering and Hiding\"),\n\t\t\t\tsubtitle: _(\"Reorder and hide system indicators\"),\n\t\t\t\texperimental: true,\n\t\t\t}),\n\t\t])\n\n\t\t// System Items\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"System Items Layout\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"system-items-layout-enabled\",\n\t\t\t}),\n\t\t\tdescription: _(\"Adjust system items layout\"),\n\t\t},[\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Hide layout box\"),\n\t\t\t\tsubtitle: _(\"Hide all buttons and layout box\"),\n\t\t\t\tbind: \"system-items-layout-hide\",\n\t\t\t\tsensitiveBind: \"system-items-layout-enabled\",\n\t\t\t}),\n\t\t\tDialogRow({\n\t\t\t\tsettings,\n\t\t\t\twindow,\n\t\t\t\tsensitiveBind: \"system-items-layout-enabled\",\n\t\t\t\ttitle: _(\"Ordering and Hiding\"),\n\t\t\t\tsubtitle: _(\"Reorder and hide system items\"),\n\t\t\t\tdialogTitle: _(\"Adjust system items layout\"),\n\t\t\t\texperimental: true,\n\t\t\t\tchildrenRequest: page => [SystemItemOrderGroup(settings, page)],\n\t\t\t}),\n\t\t])\n\n\t\t// DateMenu\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Date Menu\"),\n\t\t\tdescription: _(\"Adjust Date Menu layout\"),\n\t\t},[\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Hide left box\"),\n\t\t\t\tsubtitle: _(\"Hide the left box of the date menu, which contains notifications and media control\"),\n\t\t\t\tbind: \"datemenu-hide-left-box\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Hide right box\"),\n\t\t\t\tsubtitle: _(\"Hide the right box of the date menu, which contains calendar, world clock and weather\"),\n\t\t\t\tbind: \"datemenu-hide-right-box\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Disable menu\"),\n\t\t\t\tsubtitle: _(\"Do not open date menu when the date menu button clicked\"),\n\t\t\t\tbind: \"datemenu-disable-menu\",\n\t\t\t}),\n\t\t])\n\t}\n})\n"
  },
  {
    "path": "src/prefPages/menu.ts",
    "content": "import Adw from \"gi://Adw\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport Config from \"../config.js\"\nimport type QstExtensionPreferences from \"../prefs.js\"\nimport {\n\tSwitchRow,\n\tAdjustmentRow,\n\tDropdownRow,\n\tGroup,\n\tDialogRow,\n\tfixPageScrollIssue,\n} from \"../libs/prefs/components.js\"\n\n// #region AdvancedAnimationStyleGroup\nfunction AdvancedAnimationStyleGroup(settings: Gio.Settings): Adw.PreferencesGroup {\n\treturn Group({\n\t\ttitle: _(\"Advanced animation style\"),\n\t},[\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Open Duration\"),\n\t\t\tsubtitle: _(\"Open animation duration in microseconds\"),\n\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\tbind: \"menu-animation-open-duration\",\n\t\t\tmax: 4000,\n\t\t}),\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Close Duration\"),\n\t\t\tsubtitle: _(\"Close animation duration in microseconds\"),\n\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\tbind: \"menu-animation-close-duration\",\n\t\t\tmax: 4000,\n\t\t}),\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Grid Content Opacity\"),\n\t\t\tsubtitle: _(\"Adjust grid content opacity.\\nSet this to 255 to make opaque, and 0 to make transparent\"),\n\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\tbind: \"menu-animation-grid-content-opacity\",\n\t\t\tmax: 255,\n\t\t}),\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Background Blur Radius\"),\n\t\t\tsubtitle: _(\"Adjust background blur radius.\\nSet this to 0 to disable blur effect\"),\n\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\tbind: \"menu-animation-background-blur-radius\",\n\t\t\tmax: 32,\n\t\t}),\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Background Brightness\"),\n\t\t\tsubtitle: _(\"Adjust background brightness.\\nSet this to 1000 to disable brightness control effect.\\nNot impacts on gnome-shell's default dim effect.\"),\n\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\tbind: \"menu-animation-background-brightness\",\n\t\t\tmax: 2000,\n\t\t}),\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Background Opacity\"),\n\t\t\tsubtitle: _(\"Adjust background opacity.\\nSet this to 255 to make opaque, and 0 to make transparent\"),\n\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\tbind: \"menu-animation-background-opacity\",\n\t\t\tmax: 255,\n\t\t}),\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Background X Scale\"),\n\t\t\tsubtitle: _(\"Adjust background x scale, 1000 means 1.0 scale\"),\n\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\tbind: \"menu-animation-background-scale-x\",\n\t\t\tmax: 4000,\n\t\t}),\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Background Y Scale\"),\n\t\t\tsubtitle: _(\"Adjust background y scale, 1000 means 1.0 scale\"),\n\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\tbind: \"menu-animation-background-scale-y\",\n\t\t\tmax: 4000,\n\t\t}),\n\t])\n}\n// #endregion AdvancedAnimationStyleGroup\n\nexport const MenuPage = GObject.registerClass({\n\tGTypeName: Config.baseGTypeName+\"MenuPage\",\n}, class MenuPage extends Adw.PreferencesPage {\n\tconstructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {\n\t\tsuper({\n\t\t\tname: \"Menu\",\n\t\t\ttitle: _(\"Menu\"),\n\t\t\ticonName: \"user-available-symbolic\",\n\t\t})\n\t\tfixPageScrollIssue(this)\n\n\t\t// Overlay\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Overlay Mode\"),\n\t\t\tdescription: _(\"Display toggle, power, and sound menus as overlay\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"overlay-menu-enabled\",\n\t\t\t}),\n\t\t\texperimental: true,\n\t\t},[\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Overlay Width\"),\n\t\t\t\tsubtitle: _(\"Adjust overlay menu width\\nSet this to 0 to disable adjusting\"),\n\t\t\t\tsensitiveBind: \"overlay-menu-enabled\",\n\t\t\t\tbind: \"overlay-menu-width\",\n\t\t\t\tmax: 2048,\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Overlay Animation Duration\"),\n\t\t\t\tsubtitle: _(\"Custom menu open animation duration in microseconds\\nSet this to 0 to disable custom animation\"),\n\t\t\t\tsensitiveBind: \"overlay-menu-enabled\",\n\t\t\t\tbind: \"overlay-menu-animate-duration\",\n\t\t\t\tmax: 4000,\n\t\t\t}),\n\t\t\tDropdownRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Overlay Animation Style\"),\n\t\t\t\tsubtitle: _(\"Custom menu open animation style\"),\n\t\t\t\titems: [\n\t\t\t\t\t{ \"name\": _(\"Flyout\"), \"value\": \"flyout\" },\n\t\t\t\t\t{ \"name\": _(\"Dialog\"), \"value\": \"dialog\" },\n\t\t\t\t],\n\t\t\t\tbind: \"overlay-menu-animate-style\",\n\t\t\t\tsensitiveBind: \"overlay-menu-enabled\"\n\t\t\t}),\n\t\t\tDropdownRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Overlay overflow anchor\"),\n\t\t\t\tsubtitle: _(\"When the menu box is taller than Quick Settings, determines where in Quick Settings the menu box will be fixed\"),\n\t\t\t\titems: [\n\t\t\t\t\t{ \"name\": _(\"Top\"), \"value\": \"top\" },\n\t\t\t\t\t{ \"name\": _(\"Center\"), \"value\": \"center\" },\n\t\t\t\t\t{ \"name\": _(\"Bottom\"), \"value\": \"bottom\" },\n\t\t\t\t],\n\t\t\t\tbind: \"overlay-menu-overflow-anchor\",\n\t\t\t\tsensitiveBind: \"overlay-menu-enabled\"\n\t\t\t})\n\t\t])\n\n\t\t// Animation\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Animation\"),\n\t\t\tdescription: _(\"Add menu animation on toggle menu opening and closing\\nTo get the best feel, turn on overlay mode\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"menu-animation-enabled\",\n\t\t\t}),\n\t\t\texperimental: true,\n\t\t},[\n\t\t\tDialogRow({\n\t\t\t\twindow,\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Advanced animation style\"),\n\t\t\t\tsubtitle: _(\"Adjust speed, blur, scale, and opacity\"),\n\t\t\t\tdialogTitle: _(\"Animation\"),\n\t\t\t\tsensitiveBind: \"menu-animation-enabled\",\n\t\t\t\tchildrenRequest: ()=>[AdvancedAnimationStyleGroup(settings)],\n\t\t\t}),\n\t\t])\n\t}\n})\n"
  },
  {
    "path": "src/prefPages/toggles.ts",
    "content": "import Adw from \"gi://Adw\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport Config from \"../config.js\"\nimport type QstExtensionPreferences from \"../prefs.js\"\nimport {\n\tSwitchRow,\n\tGroup,\n\tfixPageScrollIssue,\n} from \"../libs/prefs/components.js\"\n\nexport const TogglesPage = GObject.registerClass({\n\tGTypeName: Config.baseGTypeName+\"TogglesPage\",\n}, class TogglesPage extends Adw.PreferencesPage {\n\tconstructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {\n\t\tsuper({\n\t\t\tname: \"Toggles\",\n\t\t\ttitle: _(\"Toggles\"),\n\t\t\ticonName: \"view-grid-symbolic\",\n\t\t})\n\t\tfixPageScrollIssue(this)\n\n\t\t// Unsafe Mode Toggle\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Unsafe Mode Quick Toggle\"),\n\t\t\tdescription: _(\"Turn on to add the unsafe quick toggle on the Quick Settings panel\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"unsafe-quick-toggle-enabled\",\n\t\t\t}),\n\t\t}, [\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Save last session state\"),\n\t\t\t\tsubtitle: _(\"Turn on to save last session unsafe state\"),\n\t\t\t\tbind: \"unsafe-quick-toggle-save-last-state\",\n\t\t\t\tsensitiveBind: \"unsafe-quick-toggle-enabled\",\n\t\t\t}),\n\t\t])\n\t}\n})\n"
  },
  {
    "path": "src/prefPages/widgets.ts",
    "content": "import Adw from \"gi://Adw\"\nimport GObject from \"gi://GObject\"\nimport Gio from \"gi://Gio\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport Config from \"../config.js\"\nimport type QstExtensionPreferences from \"../prefs.js\"\nimport {\n\tSwitchRow,\n\tAdjustmentRow,\n\tGroup,\n\tfixPageScrollIssue,\n\tRgbColorRow,\n\tDropdownRow,\n\tEntryRow,\n\tDialog,\n\tPaddingDialog,\n} from \"../libs/prefs/components.js\"\n\nfunction SliderCustomizes({\n\tsettings,\n\tbaseName,\n\tsensitiveBind,\n}: {\n\tsettings: Gio.Settings,\n\tbaseName: string,\n\tsensitiveBind?: string\n}): any[] {\n\t// Handle color & radius\n\tconst handleRadius = AdjustmentRow({\n\t\tsettings,\n\t\tmax: 1000,\n\t\ttitle: _(\"Handle radius\"),\n\t\tsubtitle: _(\"Set this to 0 to use default radius\"),\n\t\tbind: baseName+\"-handle-radius\",\n\t\tsensitiveBind,\n\t})\n\tconst handleColor = RgbColorRow({\n\t\tsettings,\n\t\ttitle: _(\"Handle color\"),\n\t\tbind: baseName+\"-handle-color\",\n\t\tsensitiveBind,\n\t\tuseAlpha: true,\n\t})\n\tconst updateHandleOptionVisible = ()=>{\n\t\tconst value = settings.get_string(baseName+\"-style\")\n\t\thandleRadius.visible =\n\t\thandleColor.visible = value != \"slim\"\n\t}\n\tconst updateHandleOptionVisibleConnection =\n\t\tsettings.connect(\n\t\t\t`changed::${baseName}-style`,\n\t\t\tupdateHandleOptionVisible\n\t\t)\n\tupdateHandleOptionVisible()\n\thandleColor.child.connect(\"destroy\", ()=>{\n\t\tsettings.disconnect(updateHandleOptionVisibleConnection)\n\t})\n\n\treturn [\n\t\tDropdownRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Slider style\"),\n\t\t\tbind: baseName+\"-style\",\n\t\t\titems: [\n\t\t\t\t{ name: _(\"Slim\"), value: \"slim\" },\n\t\t\t\t{ name: _(\"Default\"), value: \"default\" },\n\t\t\t],\n\t\t\tsensitiveBind,\n\t\t}),\n\t\thandleRadius,\n\t\thandleColor,\n\t\tRgbColorRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Background color\"),\n\t\t\tbind: baseName+\"-background-color\",\n\t\t\tsensitiveBind,\n\t\t\tuseAlpha: true,\n\t\t}),\n\t\tRgbColorRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Active Background color\"),\n\t\t\tbind: baseName+\"-active-background-color\",\n\t\t\tsensitiveBind,\n\t\t\tuseAlpha: true,\n\t\t}),\n\t\tAdjustmentRow({\n\t\t\tsettings,\n\t\t\ttitle: _(\"Thickness\"),\n\t\t\tmax: 1000,\n\t\t\tbind: baseName+\"-height\",\n\t\t\tsensitiveBind,\n\t\t\tsubtitle: _(\"Set this to 0 to use default thickness\"),\n\t\t})\n\t]\n}\n\nexport const WidgetsPage = GObject.registerClass({\n\tGTypeName: Config.baseGTypeName+\"WidgetsPage\",\n}, class WidgetsPage extends Adw.PreferencesPage {\n\tconstructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {\n\t\tsuper({\n\t\t\tname: \"Widgets\",\n\t\t\ttitle: _(\"Widgets\"),\n\t\t\ticonName: \"window-new-symbolic\",\n\t\t})\n\t\tfixPageScrollIssue(this)\n\n\t\t// media\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Media Widget\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"media-enabled\",\n\t\t\t}),\n\t\t\tdescription: _(\"Turn on to make the media widget visible on the Quick Settings panel\"),\n\t\t},[\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Compact mode\"),\n\t\t\t\tsubtitle: _(\"Make Media Controls widget smaller\\nMake it more similar in size to the notification message\"),\n\t\t\t\tbind: \"media-compact\",\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Control buttons opacity\"),\n\t\t\t\tsubtitle: _(\"Set this to 255 to make opaque, and 0 to make transparent\"),\n\t\t\t\tmax: 255,\n\t\t\t\tbind: \"media-contorl-opacity\",\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"media-contorl-show-next-button\",\n\t\t\t\ttitle: _(\"Show next button\"),\n\t\t\t\tsubtitle: _(\"Add next contorl button next to description\"),\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"media-contorl-show-prev-button\",\n\t\t\t\ttitle: _(\"Show previous button\"),\n\t\t\t\tsubtitle: _(\"Add previous contorl button next to description\"),\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"media-contorl-show-pause-button\",\n\t\t\t\ttitle: _(\"Show pause button\"),\n\t\t\t\tsubtitle: _(\"Add pause contorl button next to description\"),\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"media-progress-enabled\",\n\t\t\t\ttitle: _(\"Show progress bar\"),\n\t\t\t\tsubtitle: _(\"Add progress bar under description\"),\n\t\t\t\texperimental: true,\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t\tonDetailed: ()=>{Dialog({\n\t\t\t\t\twindow,\n\t\t\t\t\ttitle: _(\"Media Widget\"),\n\t\t\t\t\tchildrenRequest: ()=>[Group({\n\t\t\t\t\t\ttitle: _(\"Show progress bar\"),\n\t\t\t\t\t\tdescription: _(\"Add progress bar under description\"),\n\t\t\t\t\t\theader_suffix: SwitchRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tbind: \"media-progress-enabled\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t}, SliderCustomizes({\n\t\t\t\t\t\tsettings,\n\t\t\t\t\t\tbaseName: \"media-progress\",\n\t\t\t\t\t\tsensitiveBind: \"media-progress-enabled\"\n\t\t\t\t\t}))],\n\t\t\t\t})}\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"media-gradient-enabled\",\n\t\t\t\ttitle: _(\"Gradient background\"),\n\t\t\t\tsubtitle: _(\"Use gradient background extracted from cover image\\nMay affect performance slightly\"),\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t\texperimental: true,\n\t\t\t\tonDetailed: ()=>{Dialog({\n\t\t\t\t\twindow,\n\t\t\t\t\ttitle: _(\"Media Widget\"),\n\t\t\t\t\tchildrenRequest: ()=>[Group({\n\t\t\t\t\t\ttitle: _(\"Gradient background\"),\n\t\t\t\t\t\theader_suffix: SwitchRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tbind: \"media-gradient-enabled\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdescription: _(\"Use gradient background extracted from cover image\\nMay affect performance slightly\"),\n\t\t\t\t\t},[\n\t\t\t\t\t\tRgbColorRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\ttitle: _(\"Background color\"),\n\t\t\t\t\t\t\tsubtitle: _(\"Base background color\"),\n\t\t\t\t\t\t\tbind: \"media-gradient-background-color\",\n\t\t\t\t\t\t\tsensitiveBind: \"media-gradient-enabled\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tAdjustmentRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tmax: 1000,\n\t\t\t\t\t\t\tsensitiveBind: \"media-gradient-enabled\",\n\t\t\t\t\t\t\ttitle: _(\"Start opacity\"),\n\t\t\t\t\t\t\tsubtitle: _(\"Adjust left side transparency, Set this to 1000 to make opaque\"),\n\t\t\t\t\t\t\tbind: \"media-gradient-start-opaque\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tAdjustmentRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tmax: 1000,\n\t\t\t\t\t\t\tsensitiveBind: \"media-gradient-enabled\",\n\t\t\t\t\t\t\ttitle: _(\"Start color\"),\n\t\t\t\t\t\t\tsubtitle: _(\"Adjust left side background color mixing, Set this to 1000 to show extracted color\"),\n\t\t\t\t\t\t\tbind: \"media-gradient-start-mix\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tAdjustmentRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tmax: 1000,\n\t\t\t\t\t\t\tsensitiveBind: \"media-gradient-enabled\",\n\t\t\t\t\t\t\ttitle: _(\"End opacity\"),\n\t\t\t\t\t\t\tsubtitle: _(\"Adjust right side transparency, Set this to 1000 to make opaque\"),\n\t\t\t\t\t\t\tbind: \"media-gradient-end-opaque\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tAdjustmentRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tmax: 1000,\n\t\t\t\t\t\t\tsensitiveBind: \"media-gradient-enabled\",\n\t\t\t\t\t\t\ttitle: _(\"End color\"),\n\t\t\t\t\t\t\tsubtitle: _(\"Adjust right side background color mixing, Set this to 1000 to show extracted color\"),\n\t\t\t\t\t\t\tbind: \"media-gradient-end-mix\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t])],\n\t\t\t\t})}\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Round clip effect\"),\n\t\t\t\tsubtitle: _(\"Use round clip effect to make transition more natural\"),\n\t\t\t\tbind: \"media-round-clip-enabled\",\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t\texperimental: true,\n\t\t\t\tonDetailed: ()=>{Dialog({\n\t\t\t\t\twindow,\n\t\t\t\t\ttitle: _(\"Media Widget\"),\n\t\t\t\t\tchildrenRequest: ()=>[Group({\n\t\t\t\t\t\ttitle: _(\"Round clip effect\"),\n\t\t\t\t\t\theader_suffix: SwitchRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tbind: \"media-round-clip-enabled\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdescription: _(\"Use round clip effect to make transition more natural\"),\n\t\t\t\t\t},[\n\t\t\t\t\t\tSwitchRow({\n\t\t\t\t\t\t\ttitle: _(\"Padding adjustment\"),\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tsubtitle: _(\"Adjust clip effect padding, edit this if your theme has a different margin or padding\"),\n\t\t\t\t\t\t\tbind: \"media-round-clip-padding-adjustment-enabled\",\n\t\t\t\t\t\t\tsensitiveBind: \"media-round-clip-enabled\",\n\t\t\t\t\t\t\tonDetailed: ()=>{\n\t\t\t\t\t\t\t\tPaddingDialog({\n\t\t\t\t\t\t\t\t\twindow,\n\t\t\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\t\t\tbind: \"media-round-clip-padding-adjustment-value\",\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t])],\n\t\t\t\t})}\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Remove shadow\"),\n\t\t\t\tsubtitle: _(\"Remove shadow from media message\\nUse if your theme creates unnecessary shadows\"),\n\t\t\t\tbind: \"media-remove-shadow\",\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Smooth scroll speed\"),\n\t\t\t\tsubtitle: _(\"Adjust trackpad and trackpoint scroll speed, negative number for invert direction\"),\n\t\t\t\tmax: 2048,\n\t\t\t\tmin: -2048,\n\t\t\t\tbind: \"media-smooth-scroll-speed\",\n\t\t\t\tsensitiveBind: \"media-enabled\",\n\t\t\t}),\n\t\t])\n\n\t\t// notification\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Notifications Widget\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"notifications-enabled\"\n\t\t\t}),\n\t\t\tdescription: _(\"Turn on to make the notifications widget visible on the Quick Settings panel\"),\n\t\t},[\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Compact mode\"),\n\t\t\t\tsubtitle: _(\"Make notifications smaller\"),\n\t\t\t\tbind: \"notifications-compact\",\n\t\t\t\tsensitiveBind: \"notifications-enabled\",\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Max height\"),\n\t\t\t\tsubtitle: _(\"Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height\")\n\t\t\t\t\t.format(settings.get_default_value(\"notifications-max-height\").unpack()),\n\t\t\t\tmax: 2048,\n\t\t\t\tbind: \"notifications-max-height\",\n\t\t\t\tsensitiveBind: \"notifications-enabled\",\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Fade out offset\"),\n\t\t\t\tsubtitle: _(\"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"),\n\t\t\t\tmax: 2048,\n\t\t\t\tbind: \"notifications-fade-offset\",\n\t\t\t\tsensitiveBind: \"notifications-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Auto hide\"),\n\t\t\t\tsubtitle: _(\"Hide the Notifications widget when have no notifications\"),\n\t\t\t\tbind: \"notifications-autohide\",\n\t\t\t\tsensitiveBind: \"notifications-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Use native controls\"),\n\t\t\t\tsubtitle: _(\"Use native dnd switch and clear button\"),\n\t\t\t\tbind: \"notifications-use-native-controls\",\n\t\t\t\tsensitiveBind: \"notifications-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Remove shadow\"),\n\t\t\t\tsubtitle: _(\"Remove shadow from notification message\\nUse if your theme creates unnecessary shadows\"),\n\t\t\t\tbind: \"notifications-remove-shadow\",\n\t\t\t\tsensitiveBind: \"notifications-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Show scrollbar\"),\n\t\t\t\tsubtitle: _(\"Show scrollbar on message list\"),\n\t\t\t\tbind: \"notifications-show-scrollbar\",\n\t\t\t\tsensitiveBind: \"notifications-enabled\",\n\t\t\t}),\n\t\t])\n\n\t\t// weather\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Weather Widget\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"weather-enabled\"\n\t\t\t}),\n\t\t\tdescription: _(\"Turn on to make the weather widget visible on the Quick Settings panel\"),\n\t\t},[\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Compact mode\"),\n\t\t\t\tsubtitle: _(\"Make weather widget smaller\"),\n\t\t\t\tbind: \"weather-compact\",\n\t\t\t\tsensitiveBind: \"weather-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Remove shadow\"),\n\t\t\t\tsubtitle: _(\"Remove shadow from weather widget\\nUse if your theme creates unnecessary shadows\"),\n\t\t\t\tbind: \"weather-remove-shadow\",\n\t\t\t\tsensitiveBind: \"weather-enabled\",\n\t\t\t}),\n\t\t\tEntryRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Click command\"),\n\t\t\t\tbind: \"weather-click-command\",\n\t\t\t\tsensitiveBind: \"weather-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Show location\"),\n\t\t\t\tsubtitle: _(\"Show the location label on header\"),\n\t\t\t\tbind: \"weather-show-location\",\n\t\t\t\tsensitiveBind: \"weather-enabled\",\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\tmax: 1024,\n\t\t\t\tmin: 1,\n\t\t\t\tbind: \"weather-interval-hour\",\n\t\t\t\ttitle: _(\"Forecast interval\"),\n\t\t\t\tsubtitle: _(\"Adjust forecast interval in hour\"),\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\tmax: 12,\n\t\t\t\tmin: 0,\n\t\t\t\tbind: \"weather-max-forecasts\",\n\t\t\t\ttitle: _(\"Max forecasts\"),\n\t\t\t\tsubtitle: _(\"Adjust max forecasts\"),\n\t\t\t}),\n\t\t])\n\n\t\t// volume mixer\n\t\tGroup({\n\t\t\tparent: this,\n\t\t\ttitle: _(\"Volume mixer Widget\"),\n\t\t\theaderSuffix: SwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"volume-mixer-enabled\"\n\t\t\t}),\n\t\t\tdescription: _(\"Turn on to make the volume mixer widget visible on the Quick Settings panel\"),\n\t\t},[\n\t\t\tDropdownRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Label text\"),\n\t\t\t\tsubtitle: _(\"Choose label above slider text source\"),\n\t\t\t\titems: [\n\t\t\t\t\t{ name: _(\"Both\"), value: \"both\" },\n\t\t\t\t\t{ name: _(\"Title\"), value: \"title\" },\n\t\t\t\t\t{ name: _(\"Description\"), value: \"description\" },\n\t\t\t\t\t{ name: _(\"None\"), value: \"none\" },\n\t\t\t\t],\n\t\t\t\tbind: \"volume-mixer-label-text\",\n\t\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\tmax: 255,\n\t\t\t\ttitle: _(\"Label opacity\"),\n\t\t\t\tsubtitle: _(\"Adjust label opacity.\\nSet this to 255 to make opaque, and 0 to make transparent\"),\n\t\t\t\tbind: \"volume-mixer-label-opacity\",\n\t\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Max height\"),\n\t\t\t\tsubtitle: _(\"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height\")\n\t\t\t\t\t.format(settings.get_default_value(\"volume-mixer-max-height\").unpack()),\n\t\t\t\tmax: 2048,\n\t\t\t\tbind: \"volume-mixer-max-height\",\n\t\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Show scrollbar\"),\n\t\t\t\tsubtitle: _(\"Show scrollbar on mixer list\"),\n\t\t\t\tbind: \"volume-mixer-show-scrollbar\",\n\t\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Show stream icon\"),\n\t\t\t\tsubtitle: _(\"Show stream icon above mixer sliders\"),\n\t\t\t\tbind: \"volume-mixer-show-icon\",\n\t\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t\t}),\n\t\t\tAdjustmentRow({\n\t\t\t\tsettings,\n\t\t\t\ttitle: _(\"Fade out offset\"),\n\t\t\t\tsubtitle: _(\"Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46\"),\n\t\t\t\tmax: 2048,\n\t\t\t\tbind: \"volume-mixer-fade-offset\",\n\t\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t\t}),\n\t\t\tSwitchRow({\n\t\t\t\tsettings,\n\t\t\t\tbind: \"volume-mixer-menu-enabled\",\n\t\t\t\ttitle: _(\"Attach to output slider\"),\n\t\t\t\tsubtitle: _(\"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"),\n\t\t\t\tsensitiveBind: \"volume-mixer-enabled\",\n\t\t\t\tonDetailed: ()=>{Dialog({\n\t\t\t\t\twindow,\n\t\t\t\t\ttitle: _(\"Volume mixer Widget\"),\n\t\t\t\t\tchildrenRequest: ()=>[Group({\n\t\t\t\t\t\ttitle: _(\"Attach to output slider\"),\n\t\t\t\t\t\tdescription: _(\"Attach volume mixer menu button to output slider. Use if you prefer compact layout\"),\n\t\t\t\t\t\theader_suffix: SwitchRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tbind: \"volume-mixer-menu-enabled\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t},[\n\t\t\t\t\t\tEntryRow({\n\t\t\t\t\t\t\tsettings,\n\t\t\t\t\t\t\tbind: \"volume-mixer-menu-icon\",\n\t\t\t\t\t\t\ttitle: _(\"Menu icon\"),\n\t\t\t\t\t\t\tsensitiveBind: \"volume-mixer-menu-enabled\",\n\t\t\t\t\t\t})\n\t\t\t\t\t])],\n\t\t\t\t})}\n\t\t\t}),\n\t\t])\n\t}\n})\n"
  },
  {
    "path": "src/prefs.ts",
    "content": "import Gtk from \"gi://Gtk\"\nimport Gdk from \"gi://Gdk\"\nimport Gio from \"gi://Gio\"\nimport Adw from \"gi://Adw\"\nimport { ExtensionPreferences } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport { gettext as _ } from \"resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js\"\nimport { WidgetsPage } from \"./prefPages/widgets.js\"\nimport { TogglesPage } from \"./prefPages/toggles.js\"\nimport { LayoutPage } from \"./prefPages/layout.js\"\nimport { AboutPage } from \"./prefPages/about.js\"\nimport { MenuPage } from \"./prefPages/menu.js\"\nimport { ContributorsRow, LicenseRow } from \"./libs/prefs/components.js\"\nimport Config from \"./config.js\"\n\nvar pageList = [\n\tWidgetsPage,\n\tTogglesPage,\n\tLayoutPage,\n\tMenuPage,\n\tAboutPage,\n]\n\nexport default class QstExtensionPreferences extends ExtensionPreferences {\n\tappendIconPath(path: string) {\n\t\tconst iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default())\n\t\tif (!iconTheme.get_search_path().includes(path))\n\t\t\ticonTheme.add_search_path(path)\n\t}\n\n\treadExtensionFile(path: string) {\n\t\tconst decoder = new TextDecoder()\n\t\tconst file = Gio.File.new_for_path(`${this.path}/${path}`)\n\t\tconst content = file.load_contents(null)[1]\n\t\treturn decoder.decode(content)\n\t}\n\n\tgetContributorRows(): ContributorsRow.Contributor[][] {\n\t\tconst contributors = JSON.parse(\n\t\t\tthis.readExtensionFile(\"media/contributors/data.json\")\n\t\t) as ContributorsRow.Contributor[]\n\t\tif (!contributors.length) return []\n\t\tconst rows: ContributorsRow.Contributor[][] = [[]]\n\t\tcontributors.reduce((currentRow: ContributorsRow.Contributor[], obj: ContributorsRow.Contributor)=>{\n\t\t\tif (currentRow.length >= 4) rows.push(currentRow = [])\n\t\t\tcurrentRow.push(obj)\n\t\t\treturn currentRow\n\t\t}, rows[0])\n\t\treturn rows\n\t}\n\n\tgetLicenses(): LicenseRow.License[] {\n\t\tconst licenses = JSON.parse(\n\t\t\tthis.readExtensionFile(\"media/licenses.json\")\n\t\t) as LicenseRow.License[]\n\t\tfor (const item of licenses) {\n\t\t\tif (item.file) {\n\t\t\t\titem.content = async () => this.readExtensionFile(item.file)\n\t\t\t}\n\t\t}\n\t\treturn licenses\n\t}\n\n\tgetVersionString(): string {\n\t\tlet version = Config.version.toUpperCase().replace(/-.*?$/, \"\")\n\t\tif (this.metadata.version) {\n\t\t\tversion += \".\" + this.metadata.version\n\t\t}\n\t\tversion += \"   —   \"\n\t\tif (Config.isReleaseBuild) {\n\t\t\tversion += _(\"Stable\") \n\t\t} else if (Config.isDevelopmentBuild) {\n\t\t\tversion += _(\"Development\")\n\t\t} else {\n\t\t\tversion += _(\"Preview\")\n\t\t}\n\t\tif (Config.isGithubBuild) {\n\t\t\tversion += \"  \" + _(\"(Github Release)\")\n\t\t} else if (!this.metadata.version) {\n\t\t\tversion += \"  \" + _(\"(Built from source)\")\n\t\t}\n\t\treturn version\n\t}\n\n\tgetChangelog(): string {\n\t\treturn this.readExtensionFile(\"media/Changelog.md\")\n\t}\n\n\tasync fillPreferencesWindow(window: Adw.PreferencesWindow) {\n\t\tlet settings = this.getSettings()\n\n\t\t// Window options\n\t\twindow.set_search_enabled(true)\n\t\twindow.set_default_size(690, 680)\n\n\t\t// Register icon path\n\t\tthis.appendIconPath(this.path + \"/media\")\n\t\tthis.appendIconPath(this.path + \"/media/contributors\")\n\n\t\tfor (const page of pageList) {\n\t\t\twindow.add(new page(settings, this, window))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/styles/date-menu.scss",
    "content": "@use \"../global.scss\" as *;\n\n.datemenu-popover {\n    &#{$p}-hide-left-box {\n        .datemenu-calendar-column {\n            margin: 0px;\n        }\n    }\n    &#{$p}-hide-right-box {\n        .message-list {\n            margin: 0px;\n            border: none;\n            min-height: 340px;\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/debug.scss",
    "content": "@use \"../global.scss\" as *;\n\n#{$p}-debug-show-layout * {\n    outline: 1px solid red;\n}\n"
  },
  {
    "path": "src/styles/media-widget.scss",
    "content": "@use \"../global.scss\" as *;\n\n#{$p}-media {\n    padding: 0px;\n    margin: 0px 0px 0px 0px;\n\n    // Message Card\n    .message {\n        margin: 0px;\n    }\n\n    // Message Content (Texts)\n    .message-content {\n        width: 0px; // Min size, texts will be expended\n        text-overflow: ellipsis;\n    }\n\n    // Header\n    #{$p}-header {\n        margin-bottom: 6px;\n\n        // Header Label\n        #{$p}-header-label {\n            font-weight: bold;\n            font-size: 0.98em;\n            margin-left: 4px;\n        }\n\n        .page-indicators {\n            margin-right: 4px;\n            spacing: 6px;\n            .page-indicator {\n                height: 8px;\n                width: 8px;\n                padding: 0px;\n            }\n        }\n    }\n\n    // Progress Control (Position/Length Text and Slider)\n    #{$p}-progress-control {\n        spacing: 8px;\n        padding: 0px 6px;\n\n        #{$p}-position-label, #{$p}-length-label {\n            font-size: 0.92em;\n        }\n    }\n\n    .message-list-section-list {\n        margin: 0px;\n        padding: 0px;\n        spacing: 0px;\n    }\n}\n"
  },
  {
    "path": "src/styles/message-compact.scss",
    "content": "@use \"../global.scss\" as *;\n\n#{$p}-message-compact {\n    // Message Card\n    .message {\n        margin-bottom: 8px;\n        padding: 5px 6px;\n        &.media-message {\n            padding: 3px 6px 8px 6px !important; // idk required for some reason\n            .message-media-control {\n                /* control button sizing */\n                padding-left: 5px;\n                padding-right: 5px;\n            }\n        }\n\n        // Message Content Box (Outside)\n        .message-box {\n            padding-top: 1px; // Header & Content spacing\n\n            // Message Content (Texts)\n            .message-content {\n                spacing: 3px; // Title & Content spacing\n                font-size: 0.89em;\n            }\n        }\n\n        // Message Header (App, Button)\n        .message-header {\n            spacing: 3px; // close / expand button spacing\n\n            // Buttons\n            .message-expand-button,\n            .message-close-button {\n                padding: 2px !important;\n            }\n\n            // Title\n            .message-header-content {\n                padding-left: 6px;\n            }\n        }\n\n        // Action buttons\n        .notification-button {\n            font-size: 0.9em;\n            padding: 5px;\n            margin-top: 0px;\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/message-remove-shadow.scss",
    "content": "@use \"../global.scss\" as *;\n\n#{$p}-message-remove-shadow .message {\n    box-shadow: none !important;\n}\n"
  },
  {
    "path": "src/styles/notification-widget.scss",
    "content": "@use \"../global.scss\" as *;\n\n#{$p}-notifications {\n    padding: 0px;\n    margin: 0px 0px 0px 0px;\n\n    // Message Card\n    .message {\n        // Message Content (Texts)\n        .message-content {\n            width: 0px; // Min size, texts will be expended\n            text-overflow: ellipsis;\n        }\n\n        // Message header\n        .message-header {\n            margin: 0px;\n            padding: 0px 4px 2px 6px;\n            spacing: 4px;\n        }\n    }\n\n    // Avoid Scrollbar\n    .message-view {\n        margin: 0px;\n    }\n    #{$p}-has-scrollbar {\n        .message-view {\n            padding: 0px 5px 0px 0px;\n        }\n    }\n\n    // Header\n    #{$p}-header {\n        margin-bottom: 6px;\n\n        // Header Label\n        #{$p}-header-label {\n            font-weight: bold;\n            font-size: 0.98em;\n            margin-left: 4px;\n        }\n\n        // Clear button\n        #{$p}-clear-button {\n            font-weight: bold;\n            font-size: 0.98em;\n            padding: 1px 4px;\n            border-radius: 8px;\n            margin-right: 4px;\n            &:hover {\n                background-color: rgba(127, 127, 127, .2);\n            }\n            #{$p}-icon {\n                margin-right: 4px;\n            }\n        }\n    }\n    &#{$p}-use-native-controls #{$p}-header {\n        margin-bottom: 8px;\n    }\n\n    // No notification placeholder\n    #{$p}-placeholder {\n        font-weight: bold;\n        margin: 10px 0px;\n        #{$p}-icon {\n            margin-bottom: 12px;\n        }\n    }\n\n    // Native controls\n    #{$p}-native-controls {\n        margin-top: 5px;\n        padding: 0px 4px;\n        #{$p}-native-dnd-switch {\n            margin: 0px 0px 0px 6px;\n            height: 24px; // 26px;\n            width: 40px;\n            .handle {\n                margin: 2px;\n                width: 20px;\n                height: 20px;\n            }\n        }\n        #{$p}-native-dnd-text {\n            font-size: 0.92em;\n            margin-right: 4px;\n            margin-bottom: 0px;\n        }\n        #{$p}-native-clear-button {\n            font-size: 0.92em;\n            padding: 4px 8px;\n        }\n        #{$p}-native-control-box {\n            padding: 8px 4px 0px 4px;\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/system-indicator.scss",
    "content": "@use \"../global.scss\" as *;\n\n#panel {\n    #{$p}-privacy-indicator-use-accent .privacy-indicator {\n        color: -st-accent-color;\n    }#{$p}-privacy-indicator-use-monochrome .privacy-indicator {\n        color: -st-accent-fg-color;\n    }\n    #{$p}-screen-sharing-indicator-use-accent,\n    #{$p}-screen-recording-indicator-use-accent {\n        box-shadow: inset 0 0 0 100px -st-accent-color;\n        &:hover, &:focus {\n            box-shadow: inset 0 0 0 100px st-mix(-st-accent-color, -st-accent-fg-color, 75%);\n        }\n        &:active {\n            box-shadow: inset 0 0 0 100px st-mix(-st-accent-color, -st-accent-fg-color, 60%);\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/volume-mixer-widget.scss",
    "content": "@use \"../global.scss\" as *;\n\n/* volume mixer label */\n#{$p}-volume-mixer {\n    #{$p}-item {\n        #{$p}-label {\n            padding-left: 6px;\n            font-size: 0.92em;\n            text-overflow: ellipsis;\n            width: 0px;\n        }\n        spacing: 4px;\n    }\n    spacing: 6px;\n    #{$p}-has-scrollbar {\n        padding: 0px 5px 0px 0px;\n    }\n}\n.quick-toggle-menu-container {\n    #{$p}-volume-mixer {\n        #{$p}-item {\n            #{$p}-label {\n                font-size: 1.02em;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/weather-widget.scss",
    "content": "@use \"../global.scss\" as *;\n\n#{$p}-weather {\n    &#{$p}-weather-remove-shadow {\n        .weather-button {\n            box-shadow: none !important;\n        }\n    }\n    &#{$p}-weather-compact {\n        .weather-button {\n            padding: 8px 0px 10px 0px;\n            .weather-forecast-time {\n                padding-top: 4px;\n                padding-bottom: 2px;\n            }\n            .weather-forecast-icon {\n                margin-bottom: 2px;\n            }\n        }\n    }\n    .weather-button {\n        margin: 0px;\n        #{$p}-status-label {\n            margin: 2px 10px 2px 10px;\n        }\n    }\n\n    // Header\n    #{$p}-header {\n        margin-bottom: 6px;\n\n        // Header Label\n        #{$p}-header-label {\n            font-weight: bold;\n            font-size: 0.98em;\n            margin-left: 4px;\n        }\n\n        // Location Label\n        #{$p}-location-label {\n            font-weight: bold;\n            font-size: 0.98em;\n            margin-right: 6px;\n            margin-top: 2px;\n        }\n    }\n}\n"
  },
  {
    "path": "src/stylesheet.scss",
    "content": "@use \"./global.scss\" as *;\n\n@use \"./styles/notification-widget.scss\";\n@use \"./styles/media-widget.scss\";\n@use \"./styles/weather-widget.scss\";\n@use \"./styles/message-compact.scss\";\n@use \"./styles/message-remove-shadow.scss\";\n@use \"./styles/volume-mixer-widget.scss\";\n@use \"./styles/date-menu.scss\";\n@use \"./styles/system-indicator.scss\";\n@use \"./styles/debug.scss\";\n\n/* input output labels */\n#{$p}-input-output-label {\n    width: auto;\n}\n"
  },
  {
    "path": "src/types.d.ts",
    "content": "import \"@girs/gnome-shell/ambient\"\nimport \"@girs/gnome-shell/extensions/global\"\nimport \"@girs/gjs/dom\"\nimport \"@girs/gjs\"\nimport \"./ambient\"\n\n// Shell environment\n// import Clutter from \"@girs/clutter-15/clutter-15\"\n// import GObject from \"gi://GObject\"\n// import Atk from \"gi://Atk\"\ndeclare module \"@girs/clutter-15/clutter-15\" {\n    namespace Clutter {\n        interface Actor {\n            ease(params: EasingParamsWithProps): void\n            ease_property(propName: string, target: any, params: EasingParams)\n        }\n    }\n}\ndeclare module \"@girs/gobject-2.0/gobject-2.0\" {\n    import SignalTracker from \"resource:///org/gnome/shell/misc/signals.js\"\n    namespace GObject {\n        interface Object {\n            connectObject: SignalTracker.EventEmitter[\"connectObject\"]\n            connect_object: SignalTracker.EventEmitter[\"connectObject\"]\n            disconnectObject: SignalTracker.EventEmitter[\"disconnectObject\"]\n            disconnect_object: SignalTracker.EventEmitter[\"disconnectObject\"]\n        }\n    }\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"moduleResolution\": \"Bundler\",\n        \"outDir\": \"target/tsc\",\n        \"target\": \"ESNext\",\n        \"module\": \"ESNext\",\n        \"removeComments\": false,\n        \"skipLibCheck\": true,\n        \"lib\": [\"ESNext\"],\n        \"allowArbitraryExtensions\": true,\n        \"incremental\": true,\n        \"tsBuildInfoFile\": \"target/.tsbuildinfo\",\n        \"useDefineForClassFields\": false\n    },\n    \"include\": [\"./src/**/*.ts\", \"src/types.d.ts\", \"src/contributors.js\"]\n}\n"
  }
]