├── .gitignore ├── 404.html ├── CNAME ├── LICENSE.txt ├── README.md ├── _config.yml ├── _includes ├── footer.html └── header.html ├── _layouts └── default.html ├── assets ├── css │ ├── components │ │ ├── _appbar.css │ │ ├── _badge.css │ │ ├── _bubble.css │ │ ├── _button.css │ │ ├── _checkbox.css │ │ ├── _dialog.css │ │ ├── _grid.css │ │ ├── _header.css │ │ ├── _icon.css │ │ ├── _image.css │ │ ├── _imgarticle.css │ │ ├── _input.css │ │ ├── _layout.css │ │ ├── _menu.css │ │ ├── _radio.css │ │ ├── _search.css │ │ ├── _select.css │ │ ├── _slider.css │ │ ├── _tab.css │ │ ├── _textual.css │ │ ├── _toast.css │ │ └── _toggle.css │ ├── fonts │ │ ├── SamsungSharpSans-Bold.eot │ │ ├── SamsungSharpSans-Bold.svg │ │ ├── SamsungSharpSans-Bold.ttf │ │ ├── SamsungSharpSans-Bold.woff │ │ ├── SamsungSharpSans-Regular.eot │ │ ├── SamsungSharpSans-Regular.svg │ │ ├── SamsungSharpSans-Regular.ttf │ │ ├── SamsungSharpSans-Regular.woff │ │ ├── samsungone-300-webfont.woff │ │ ├── samsungone-300-webfont.woff2 │ │ ├── samsungone-600-webfont.woff │ │ ├── samsungone-600-webfont.woff2 │ │ ├── samsungone-700-webfont.woff │ │ ├── samsungone-700-webfont.woff2 │ │ ├── samsungone-800-webfont.ttf │ │ ├── samsungone-800-webfont.woff │ │ └── samsungone-800-webfont.woff2 │ ├── icons │ │ ├── bluetooth.svg │ │ ├── check.svg │ │ ├── check_white.svg │ │ ├── handset.svg │ │ ├── left.svg │ │ ├── monitor.svg │ │ ├── mute.svg │ │ ├── palette.svg │ │ ├── peripherals.svg │ │ ├── phone.svg │ │ ├── plus.svg │ │ ├── previous.svg │ │ ├── right.svg │ │ ├── search.svg │ │ ├── smarthome.svg │ │ ├── vertical_ellipsis.svg │ │ └── volume.svg │ ├── oui.css │ ├── scripts │ │ ├── oui.js │ │ └── polyfill │ │ │ └── focus-visible.js │ ├── themes │ │ ├── oui-dark-theme.css │ │ └── oui-light-theme.css │ └── utils │ │ ├── _easings.css │ │ ├── _font.css │ │ ├── _frosted.css │ │ ├── _media.css │ │ ├── _misc.css │ │ ├── _reset.css │ │ └── _spacing.css ├── fonts │ ├── Noto-Sans-700 │ │ ├── Noto-Sans-700.eot │ │ ├── Noto-Sans-700.svg │ │ ├── Noto-Sans-700.ttf │ │ ├── Noto-Sans-700.woff │ │ └── Noto-Sans-700.woff2 │ ├── Noto-Sans-700italic │ │ ├── Noto-Sans-700italic.eot │ │ ├── Noto-Sans-700italic.svg │ │ ├── Noto-Sans-700italic.ttf │ │ ├── Noto-Sans-700italic.woff │ │ └── Noto-Sans-700italic.woff2 │ ├── Noto-Sans-italic │ │ ├── Noto-Sans-italic.eot │ │ ├── Noto-Sans-italic.svg │ │ ├── Noto-Sans-italic.ttf │ │ ├── Noto-Sans-italic.woff │ │ └── Noto-Sans-italic.woff2 │ └── Noto-Sans-regular │ │ ├── Noto-Sans-regular.eot │ │ ├── Noto-Sans-regular.svg │ │ ├── Noto-Sans-regular.ttf │ │ ├── Noto-Sans-regular.woff │ │ └── Noto-Sans-regular.woff2 └── js │ └── scale.fix.js ├── clipboard.js ├── index.md └── package.svg /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .DS_Store 3 | .jekyll 4 | .jekyll-metadata 5 | .bundle 6 | .sass-cache 7 | Gemfile 8 | Gemfile.lock 9 | node_modules 10 | package.json 11 | -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 404 9 | 775 | 776 | 777 | 778 | 779 | 780 |
781 | 4 782 | 4 783 | 4 784 | 4 785 | 4 786 | 4 787 | 4 788 | 4 789 | 4 790 | 4 791 | 4 792 | 4 793 | 4 794 | 4 795 | 4 796 | 4 797 | 4 798 | 4 799 | 4 800 | 4 801 | 4 802 | 4 803 | 4 804 | 4 805 | 4 806 | 4 807 | 4 808 | 4 809 | 4 810 | 4 811 | 4 812 | 4 813 | 4 814 | 4 815 | 4 816 | 4 817 | 4 818 | 4 819 | 4 820 | 4 821 | 0 822 | 0 823 | 0 824 | 0 825 | 0 826 | 0 827 | 0 828 | 0 829 | 0 830 | 0 831 | 0 832 | 0 833 | 0 834 | 0 835 | 0 836 | 0 837 | 0 838 | 0 839 | 0 840 | 0 841 | 0 842 | 0 843 | 0 844 | 0 845 | 0 846 | 0 847 | 0 848 | 0 849 | 0 850 | 0 851 | 0 852 | 0 853 | 0 854 | 0 855 | 0 856 | 0 857 | 0 858 | 0 859 | 0 860 | 0 861 |
862 |

404 | 页面不见了

863 |

请检查网址是否正确

864 |

865 | 866 |

5秒后自动重定向
867 |

868 |
869 |
870 | 871 | 872 | 882 | 887 | 892 | 893 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Attribution-NonCommercial-ShareAlike 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International 58 | Public License 59 | 60 | By exercising the Licensed Rights (defined below), You accept and agree 61 | to be bound by the terms and conditions of this Creative Commons 62 | Attribution-NonCommercial-ShareAlike 4.0 International Public License 63 | ("Public License"). To the extent this Public License may be 64 | interpreted as a contract, You are granted the Licensed Rights in 65 | consideration of Your acceptance of these terms and conditions, and the 66 | Licensor grants You such rights in consideration of benefits the 67 | Licensor receives from making the Licensed Material available under 68 | these terms and conditions. 69 | 70 | 71 | Section 1 -- Definitions. 72 | 73 | a. Adapted Material means material subject to Copyright and Similar 74 | Rights that is derived from or based upon the Licensed Material 75 | and in which the Licensed Material is translated, altered, 76 | arranged, transformed, or otherwise modified in a manner requiring 77 | permission under the Copyright and Similar Rights held by the 78 | Licensor. For purposes of this Public License, where the Licensed 79 | Material is a musical work, performance, or sound recording, 80 | Adapted Material is always produced where the Licensed Material is 81 | synched in timed relation with a moving image. 82 | 83 | b. Adapter's License means the license You apply to Your Copyright 84 | and Similar Rights in Your contributions to Adapted Material in 85 | accordance with the terms and conditions of this Public License. 86 | 87 | c. BY-NC-SA Compatible License means a license listed at 88 | creativecommons.org/compatiblelicenses, approved by Creative 89 | Commons as essentially the equivalent of this Public License. 90 | 91 | d. Copyright and Similar Rights means copyright and/or similar rights 92 | closely related to copyright including, without limitation, 93 | performance, broadcast, sound recording, and Sui Generis Database 94 | Rights, without regard to how the rights are labeled or 95 | categorized. For purposes of this Public License, the rights 96 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 97 | Rights. 98 | 99 | e. Effective Technological Measures means those measures that, in the 100 | absence of proper authority, may not be circumvented under laws 101 | fulfilling obligations under Article 11 of the WIPO Copyright 102 | Treaty adopted on December 20, 1996, and/or similar international 103 | agreements. 104 | 105 | f. Exceptions and Limitations means fair use, fair dealing, and/or 106 | any other exception or limitation to Copyright and Similar Rights 107 | that applies to Your use of the Licensed Material. 108 | 109 | g. License Elements means the license attributes listed in the name 110 | of a Creative Commons Public License. The License Elements of this 111 | Public License are Attribution, NonCommercial, and ShareAlike. 112 | 113 | h. Licensed Material means the artistic or literary work, database, 114 | or other material to which the Licensor applied this Public 115 | License. 116 | 117 | i. Licensed Rights means the rights granted to You subject to the 118 | terms and conditions of this Public License, which are limited to 119 | all Copyright and Similar Rights that apply to Your use of the 120 | Licensed Material and that the Licensor has authority to license. 121 | 122 | j. Licensor means the individual(s) or entity(ies) granting rights 123 | under this Public License. 124 | 125 | k. NonCommercial means not primarily intended for or directed towards 126 | commercial advantage or monetary compensation. For purposes of 127 | this Public License, the exchange of the Licensed Material for 128 | other material subject to Copyright and Similar Rights by digital 129 | file-sharing or similar means is NonCommercial provided there is 130 | no payment of monetary compensation in connection with the 131 | exchange. 132 | 133 | l. Share means to provide material to the public by any means or 134 | process that requires permission under the Licensed Rights, such 135 | as reproduction, public display, public performance, distribution, 136 | dissemination, communication, or importation, and to make material 137 | available to the public including in ways that members of the 138 | public may access the material from a place and at a time 139 | individually chosen by them. 140 | 141 | m. Sui Generis Database Rights means rights other than copyright 142 | resulting from Directive 96/9/EC of the European Parliament and of 143 | the Council of 11 March 1996 on the legal protection of databases, 144 | as amended and/or succeeded, as well as other essentially 145 | equivalent rights anywhere in the world. 146 | 147 | n. You means the individual or entity exercising the Licensed Rights 148 | under this Public License. Your has a corresponding meaning. 149 | 150 | 151 | Section 2 -- Scope. 152 | 153 | a. License grant. 154 | 155 | 1. Subject to the terms and conditions of this Public License, 156 | the Licensor hereby grants You a worldwide, royalty-free, 157 | non-sublicensable, non-exclusive, irrevocable license to 158 | exercise the Licensed Rights in the Licensed Material to: 159 | 160 | a. reproduce and Share the Licensed Material, in whole or 161 | in part, for NonCommercial purposes only; and 162 | 163 | b. produce, reproduce, and Share Adapted Material for 164 | NonCommercial purposes only. 165 | 166 | 2. Exceptions and Limitations. For the avoidance of doubt, where 167 | Exceptions and Limitations apply to Your use, this Public 168 | License does not apply, and You do not need to comply with 169 | its terms and conditions. 170 | 171 | 3. Term. The term of this Public License is specified in Section 172 | 6(a). 173 | 174 | 4. Media and formats; technical modifications allowed. The 175 | Licensor authorizes You to exercise the Licensed Rights in 176 | all media and formats whether now known or hereafter created, 177 | and to make technical modifications necessary to do so. The 178 | Licensor waives and/or agrees not to assert any right or 179 | authority to forbid You from making technical modifications 180 | necessary to exercise the Licensed Rights, including 181 | technical modifications necessary to circumvent Effective 182 | Technological Measures. For purposes of this Public License, 183 | simply making modifications authorized by this Section 2(a) 184 | (4) never produces Adapted Material. 185 | 186 | 5. Downstream recipients. 187 | 188 | a. Offer from the Licensor -- Licensed Material. Every 189 | recipient of the Licensed Material automatically 190 | receives an offer from the Licensor to exercise the 191 | Licensed Rights under the terms and conditions of this 192 | Public License. 193 | 194 | b. Additional offer from the Licensor -- Adapted Material. 195 | Every recipient of Adapted Material from You 196 | automatically receives an offer from the Licensor to 197 | exercise the Licensed Rights in the Adapted Material 198 | under the conditions of the Adapter's License You apply. 199 | 200 | c. No downstream restrictions. You may not offer or impose 201 | any additional or different terms or conditions on, or 202 | apply any Effective Technological Measures to, the 203 | Licensed Material if doing so restricts exercise of the 204 | Licensed Rights by any recipient of the Licensed 205 | Material. 206 | 207 | 6. No endorsement. Nothing in this Public License constitutes or 208 | may be construed as permission to assert or imply that You 209 | are, or that Your use of the Licensed Material is, connected 210 | with, or sponsored, endorsed, or granted official status by, 211 | the Licensor or others designated to receive attribution as 212 | provided in Section 3(a)(1)(A)(i). 213 | 214 | b. Other rights. 215 | 216 | 1. Moral rights, such as the right of integrity, are not 217 | licensed under this Public License, nor are publicity, 218 | privacy, and/or other similar personality rights; however, to 219 | the extent possible, the Licensor waives and/or agrees not to 220 | assert any such rights held by the Licensor to the limited 221 | extent necessary to allow You to exercise the Licensed 222 | Rights, but not otherwise. 223 | 224 | 2. Patent and trademark rights are not licensed under this 225 | Public License. 226 | 227 | 3. To the extent possible, the Licensor waives any right to 228 | collect royalties from You for the exercise of the Licensed 229 | Rights, whether directly or through a collecting society 230 | under any voluntary or waivable statutory or compulsory 231 | licensing scheme. In all other cases the Licensor expressly 232 | reserves any right to collect such royalties, including when 233 | the Licensed Material is used other than for NonCommercial 234 | purposes. 235 | 236 | 237 | Section 3 -- License Conditions. 238 | 239 | Your exercise of the Licensed Rights is expressly made subject to the 240 | following conditions. 241 | 242 | a. Attribution. 243 | 244 | 1. If You Share the Licensed Material (including in modified 245 | form), You must: 246 | 247 | a. retain the following if it is supplied by the Licensor 248 | with the Licensed Material: 249 | 250 | i. identification of the creator(s) of the Licensed 251 | Material and any others designated to receive 252 | attribution, in any reasonable manner requested by 253 | the Licensor (including by pseudonym if 254 | designated); 255 | 256 | ii. a copyright notice; 257 | 258 | iii. a notice that refers to this Public License; 259 | 260 | iv. a notice that refers to the disclaimer of 261 | warranties; 262 | 263 | v. a URI or hyperlink to the Licensed Material to the 264 | extent reasonably practicable; 265 | 266 | b. indicate if You modified the Licensed Material and 267 | retain an indication of any previous modifications; and 268 | 269 | c. indicate the Licensed Material is licensed under this 270 | Public License, and include the text of, or the URI or 271 | hyperlink to, this Public License. 272 | 273 | 2. You may satisfy the conditions in Section 3(a)(1) in any 274 | reasonable manner based on the medium, means, and context in 275 | which You Share the Licensed Material. For example, it may be 276 | reasonable to satisfy the conditions by providing a URI or 277 | hyperlink to a resource that includes the required 278 | information. 279 | 3. If requested by the Licensor, You must remove any of the 280 | information required by Section 3(a)(1)(A) to the extent 281 | reasonably practicable. 282 | 283 | b. ShareAlike. 284 | 285 | In addition to the conditions in Section 3(a), if You Share 286 | Adapted Material You produce, the following conditions also apply. 287 | 288 | 1. The Adapter's License You apply must be a Creative Commons 289 | license with the same License Elements, this version or 290 | later, or a BY-NC-SA Compatible License. 291 | 292 | 2. You must include the text of, or the URI or hyperlink to, the 293 | Adapter's License You apply. You may satisfy this condition 294 | in any reasonable manner based on the medium, means, and 295 | context in which You Share Adapted Material. 296 | 297 | 3. You may not offer or impose any additional or different terms 298 | or conditions on, or apply any Effective Technological 299 | Measures to, Adapted Material that restrict exercise of the 300 | rights granted under the Adapter's License You apply. 301 | 302 | 303 | Section 4 -- Sui Generis Database Rights. 304 | 305 | Where the Licensed Rights include Sui Generis Database Rights that 306 | apply to Your use of the Licensed Material: 307 | 308 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 309 | to extract, reuse, reproduce, and Share all or a substantial 310 | portion of the contents of the database for NonCommercial purposes 311 | only; 312 | 313 | b. if You include all or a substantial portion of the database 314 | contents in a database in which You have Sui Generis Database 315 | Rights, then the database in which You have Sui Generis Database 316 | Rights (but not its individual contents) is Adapted Material, 317 | including for purposes of Section 3(b); and 318 | 319 | c. You must comply with the conditions in Section 3(a) if You Share 320 | all or a substantial portion of the contents of the database. 321 | 322 | For the avoidance of doubt, this Section 4 supplements and does not 323 | replace Your obligations under this Public License where the Licensed 324 | Rights include other Copyright and Similar Rights. 325 | 326 | 327 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 328 | 329 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 330 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 331 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 332 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 333 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 334 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 335 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 336 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 337 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 338 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 339 | 340 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 341 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 342 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 343 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 344 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 345 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 346 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 347 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 348 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 349 | 350 | c. The disclaimer of warranties and limitation of liability provided 351 | above shall be interpreted in a manner that, to the extent 352 | possible, most closely approximates an absolute disclaimer and 353 | waiver of all liability. 354 | 355 | 356 | Section 6 -- Term and Termination. 357 | 358 | a. This Public License applies for the term of the Copyright and 359 | Similar Rights licensed here. However, if You fail to comply with 360 | this Public License, then Your rights under this Public License 361 | terminate automatically. 362 | 363 | b. Where Your right to use the Licensed Material has terminated under 364 | Section 6(a), it reinstates: 365 | 366 | 1. automatically as of the date the violation is cured, provided 367 | it is cured within 30 days of Your discovery of the 368 | violation; or 369 | 370 | 2. upon express reinstatement by the Licensor. 371 | 372 | For the avoidance of doubt, this Section 6(b) does not affect any 373 | right the Licensor may have to seek remedies for Your violations 374 | of this Public License. 375 | 376 | c. For the avoidance of doubt, the Licensor may also offer the 377 | Licensed Material under separate terms or conditions or stop 378 | distributing the Licensed Material at any time; however, doing so 379 | will not terminate this Public License. 380 | 381 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 382 | License. 383 | 384 | 385 | Section 7 -- Other Terms and Conditions. 386 | 387 | a. The Licensor shall not be bound by any additional or different 388 | terms or conditions communicated by You unless expressly agreed. 389 | 390 | b. Any arrangements, understandings, or agreements regarding the 391 | Licensed Material not stated herein are separate from and 392 | independent of the terms and conditions of this Public License. 393 | 394 | 395 | Section 8 -- Interpretation. 396 | 397 | a. For the avoidance of doubt, this Public License does not, and 398 | shall not be interpreted to, reduce, limit, restrict, or impose 399 | conditions on any use of the Licensed Material that could lawfully 400 | be made without permission under this Public License. 401 | 402 | b. To the extent possible, if any provision of this Public License is 403 | deemed unenforceable, it shall be automatically reformed to the 404 | minimum extent necessary to make it enforceable. If the provision 405 | cannot be reformed, it shall be severed from this Public License 406 | without affecting the enforceability of the remaining terms and 407 | conditions. 408 | 409 | c. No term or condition of this Public License will be waived and no 410 | failure to comply consented to unless expressly agreed to by the 411 | Licensor. 412 | 413 | d. Nothing in this Public License constitutes or may be interpreted 414 | as a limitation upon, or waiver of, any privileges and immunities 415 | that apply to the Licensor or You, including from the legal 416 | processes of any jurisdiction or authority. 417 | 418 | ======================================================================= 419 | 420 | Creative Commons is not a party to its public 421 | licenses. Notwithstanding, Creative Commons may elect to apply one of 422 | its public licenses to material it publishes and in those instances 423 | will be considered the “Licensor.” The text of the Creative Commons 424 | public licenses is dedicated to the public domain under the CC0 Public 425 | Domain Dedication. Except for the limited purpose of indicating that 426 | material is shared under a Creative Commons public license or as 427 | otherwise permitted by the Creative Commons policies published at 428 | creativecommons.org/policies, Creative Commons does not authorize the 429 | use of the trademark "Creative Commons" or any other trademark or logo 430 | of Creative Commons without its prior written consent including, 431 | without limitation, in connection with any unauthorized modifications 432 | to any of its public licenses or any other arrangements, 433 | understandings, or agreements concerning use of licensed material. For 434 | the avoidance of doubt, this paragraph does not form part of the 435 | public licenses. 436 | 437 | Creative Commons may be contacted at creativecommons.org. 438 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 发布地址 2 | 3 | ## [source.zgqinc.gq](https://source.zgqinc.gq/) 4 | 5 | ![source](https://socialify.git.ci/ZGQ-inc/source/image?description=1&descriptionEditable=%E4%B8%AA%E4%BA%BA%E6%90%9C%E9%9B%86%20%7C%20%E4%B9%A6%E6%BA%90%E3%80%81%E5%9B%BE%E6%BA%90%E3%80%81%E8%AE%A2%E9%98%85%E6%BA%90%E3%80%81%E8%A7%84%E5%88%99%E3%80%81%E7%9B%B4%E6%92%AD%E6%BA%90%E3%80%81%E5%90%84%E7%A7%8D%E6%BA%90%20%E5%A4%A7%E5%9E%8B%E6%95%B4%E5%90%88&font=Inter&forks=1&logo=https%3A%2F%2Fsource.zgqinc.gq%2Fpackage.svg&name=1&owner=1&pattern=Signal&stargazers=1&theme=Light) 6 | 7 | 8 | 9 | 10 | 11 | Star History Chart 12 | 13 | 14 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | markdown: kramdown 2 | highlighter: rouge 3 | theme: null 4 | title: 各种源 5 | 6 | 7 | exclude: 8 | - LICENSE.txt 9 | - README.md 10 | - CNAME 11 | - Gemfile 12 | - Gemfile.lock 13 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/_includes/footer.html -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/_includes/header.html -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 各种源大型整合 9 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 | 25 | 26 | 27 | 28 | 224 | 266 | 267 | 268 |
269 |
270 |

书源、图源、订阅源、规则、直播源、各种源 大型整合

271 |

项目地址

272 |

个人主页

273 | 274 |
275 |
276 | 277 | {{ content }} 278 | 279 |
280 | 285 |
286 | 287 | 288 | 289 | 290 | 291 | 294 | 295 | 311 | 312 | 330 | 331 | 336 | 337 | 355 | 356 | 361 | 362 | 391 | 392 | 393 | 394 | -------------------------------------------------------------------------------- /assets/css/components/_appbar.css: -------------------------------------------------------------------------------- 1 | .oui-appbar { 2 | display: flex; 3 | flex-direction: row; 4 | width: 100%; 5 | color: var(--on-surface); 6 | height: 25.2pt; 7 | align-items: center; 8 | background-color: var(--background); 9 | margin-bottom: 5.4pt; 10 | position: relative; 11 | } 12 | 13 | .oui-appbar:before{ 14 | display: inline-block; 15 | content: ''; 16 | position: absolute; 17 | top: 100%; 18 | width: 25px; 19 | height: 25px; 20 | left: 0; 21 | background-color: var(--background); 22 | mask-image: url(../icons/left.svg); 23 | -webkit-mask-image: url(../icons/left.svg); 24 | } 25 | 26 | .oui-appbar::after{ 27 | display: inline-block; 28 | content: ''; 29 | position: absolute; 30 | top: 100%; 31 | width: 25px; 32 | height: 25px; 33 | right: 0; 34 | background-color: var(--background); 35 | mask-image: url(../icons/right.svg); 36 | -webkit-mask-image: url(../icons/right.svg); 37 | } 38 | 39 | .oui-appbar-back-button { 40 | flex: 0 1 auto; 41 | width: 32px; 42 | height: 32px; 43 | line-height: 53px; 44 | background-color: var(--text); 45 | margin-left: 9pt; 46 | color: var(--text); 47 | 48 | /* wip */ 49 | mask-image: url(../icons/previous.svg); 50 | -webkit-mask-image: url(../icons/previous.svg); 51 | mask-position: center; 52 | -webkit-mask-position: center; 53 | mask-repeat: no-repeat; 54 | -webkit-mask-repeat: no-repeat; 55 | mask-size: 20px; 56 | -webkit-mask-size: 20px; 57 | } 58 | 59 | .oui-appbar-title { 60 | flex: 1 1 auto; 61 | align-self: center; 62 | word-wrap: break-word; 63 | margin-left: 5.4pt; 64 | } 65 | 66 | .oui-appbar-actions { 67 | flex: 0 1 auto; 68 | width: 32px; 69 | height: 32px; 70 | line-height: 53px; 71 | background: center no-repeat; 72 | margin-right: 9pt; 73 | background-color: var(--text); 74 | /* wip */ 75 | mask-image: url(../icons/vertical_ellipsis.svg); 76 | -webkit-mask-image: url(../icons/vertical_ellipsis.svg); 77 | mask-position: center; 78 | -webkit-mask-position: center; 79 | mask-repeat: no-repeat; 80 | -webkit-mask-repeat: no-repeat; 81 | } -------------------------------------------------------------------------------- /assets/css/components/_badge.css: -------------------------------------------------------------------------------- 1 | .oui-badge { 2 | width: max-content; 3 | color: var(--on-accent-badge); 4 | background-color: var(--accent-badge); 5 | margin: 1em; 6 | padding: .5em; 7 | display: flex; 8 | flex-direction: row; 9 | font-size: 1em; 10 | min-width: 2em; 11 | min-height: 2em; 12 | max-height: 5px; 13 | justify-content: center; 14 | align-items: center; 15 | border-radius: 1em; 16 | position:relative; 17 | } 18 | 19 | .oui-badge-placement { 20 | position: absolute; 21 | top: 0.1em; 22 | right: 0.1em; 23 | } -------------------------------------------------------------------------------- /assets/css/components/_bubble.css: -------------------------------------------------------------------------------- 1 | .oui-bubble-title { 2 | padding: 12px 24px 5px; 3 | font-size: 14px; 4 | color: #858585; 5 | line-height: 20px; 6 | font-weight: 600; 7 | display: block; 8 | } 9 | 10 | .oui-bubble { 11 | padding: 10px 20px; 12 | border-radius: 26px; 13 | border: 1px solid var(--border-surface); 14 | background-color: var(--surface-background); 15 | position: relative; 16 | } 17 | 18 | .oui-bubble-item { 19 | position: relative; 20 | padding: 13px 0px; 21 | } 22 | 23 | .oui-bubble-item:after { 24 | content: ""; 25 | position: absolute; 26 | bottom: 1px; 27 | right: 0; 28 | /* width: calc(100% - 60px); */ 29 | width: 100%; 30 | border-bottom: 1px solid var(--border-surface); 31 | } 32 | 33 | .oui-bubble-item:last-child:after { 34 | border: none; 35 | } 36 | 37 | .oui-overlay-bubble { 38 | margin-bottom: 2em; 39 | margin-left: 0px; 40 | margin-right: 0px; 41 | padding: 0 20px; 42 | border-radius: 26px; 43 | border: 1px solid var(--border-surface); 44 | background-color: var(--surface-background); 45 | box-shadow: 0px 2px 3px 0px var(--border-surface); 46 | z-index: 100; 47 | } 48 | 49 | .oui-overlay-bubble-item { 50 | position: relative; 51 | padding: 10px 0; 52 | line-height: 2em; 53 | font-size: 1.1em; 54 | } 55 | 56 | .oui-bubble-list { 57 | width: 100%; 58 | } 59 | 60 | .oui-bubble-list li { 61 | display: inline-block; 62 | position: relative; 63 | width: 100%; 64 | padding: 18px 0 16px; 65 | } 66 | 67 | .oui-bubble-list li:after { 68 | display: inline-block; 69 | content: ''; 70 | position: absolute; 71 | bottom: 0; 72 | right: 0; 73 | width: 100%; 74 | height: 1px; 75 | background-color: #e6e6e6; 76 | } 77 | 78 | .oui-bubble-list li:last-child:after { 79 | content: ''; 80 | height: 0px; 81 | } 82 | 83 | .icon { 84 | display: inline-block; 85 | position: absolute; 86 | top: 50%; 87 | left: 0; 88 | transform: translate(0,-50%); 89 | -webkit-transform: translate(0,-50%); 90 | } -------------------------------------------------------------------------------- /assets/css/components/_button.css: -------------------------------------------------------------------------------- 1 | .oui-button { 2 | display: inline-block; 3 | height: 48px; 4 | padding: 0 24px; 5 | line-height: 48px; 6 | border: 1px solid transparent; 7 | border-radius: 24px; 8 | font-family: 'Roboto', sans-serif; 9 | font-weight: 500; 10 | color: var(--app-accent); 11 | background-color: var(--control-background); 12 | transition: border .3s; 13 | text-decoration: none; 14 | text-align: center; 15 | -webkit-appearance: none; 16 | } 17 | 18 | .oui-icon-button { 19 | padding: 0; 20 | border: 1px solid transparent; 21 | line-height: inherit; 22 | border-radius: 50%; 23 | color: var(--app-accent); 24 | background-color: var(--control-background); 25 | transition: border .3s; 26 | } 27 | 28 | .oui-button:hover, 29 | .oui-button:focus, 30 | .oui-icon-button:hover, 31 | .oui-icon-button:focus { 32 | color: var(--active); 33 | border: solid 1px var(--app-accent); 34 | } 35 | 36 | .oui-button--active, 37 | .oui-icon-button--active { 38 | color: var(--on-primary); 39 | background-color: var(--app-accent); 40 | border: solid 1px var(--app-accent); 41 | } 42 | 43 | .oui-button--active:hover, 44 | .oui-icon-button--active:hover { 45 | color: var(--on-active); 46 | background-color: var(--active) 47 | } 48 | -------------------------------------------------------------------------------- /assets/css/components/_checkbox.css: -------------------------------------------------------------------------------- 1 | .oui-container-checkbox { 2 | display: flex; 3 | align-items: center; 4 | position: relative; 5 | padding-left: 50px; 6 | height: 40px; 7 | margin-bottom: 1em; 8 | cursor: pointer; 9 | user-select: none; 10 | } 11 | 12 | .oui-input-checkbox { 13 | position: absolute; 14 | opacity: 0; 15 | cursor: pointer; 16 | height: 0; 17 | width: 0; 18 | } 19 | 20 | .oui-input-checkbox-checkmark { 21 | position: absolute; 22 | top: 9px; 23 | left: 9px; 24 | display: block; 25 | width: 20px; 26 | height: 20px; 27 | border: 1px solid var(--on-background); 28 | border-radius: 5px; 29 | background: no-repeat center; 30 | background-size: 12px; 31 | transition-property: box-shadow, background-color, border-color; 32 | transition: .5s; 33 | } 34 | 35 | .oui-container-checkbox:hover .oui-input-checkbox-checkmark, 36 | .oui-container-checkbox:focus .oui-input-checkbox-checkmark { 37 | box-shadow: 0px 0px 0px 10px rgba(0,0,0,0.2); 38 | } 39 | 40 | .oui-container-checkbox input:checked ~ .oui-input-checkbox-checkmark { 41 | background-color: var(--app-accent); 42 | border-color: var(--app-accent); 43 | background-image: url(../icons/check_white.svg); 44 | } 45 | -------------------------------------------------------------------------------- /assets/css/components/_dialog.css: -------------------------------------------------------------------------------- 1 | .oui-dialog { 2 | /* Inherit from bubble */ 3 | position: fixed; 4 | left: 0; 5 | bottom: 0; 6 | width: 100%; 7 | min-height: 300px; 8 | padding: 40px 17pt; 9 | border-radius: 24px; 10 | border: 1px solid var(--border-surface); 11 | background-color: var(--surface-background); 12 | z-index: 2000; 13 | left: 50%; 14 | transform: translateX(-50%); 15 | } 16 | 17 | .oui-dialog-header { 18 | font-size: 17pt; 19 | font-weight: medium; 20 | } 21 | 22 | .oui-dialog-description { 23 | padding-top: 20pt; 24 | color: var(--on-background); 25 | } 26 | 27 | .oui-dialog-action { 28 | position: absolute; 29 | bottom: 0; 30 | left: 0; 31 | right: 0; 32 | width: 100%; 33 | display: flex; 34 | } 35 | 36 | .oui-dialog-action-link { 37 | flex-grow: 5; 38 | text-align: center; 39 | padding: 20px; 40 | text-decoration: none; 41 | color: var(--app-accent) 42 | } 43 | 44 | .oui-dialog-divider { 45 | width: 1px; 46 | margin: 6px 0; 47 | height: 1.5em; 48 | background: var(--border-surface); 49 | align-self: center; 50 | } 51 | 52 | .oui-dialog-mask { 53 | position: fixed; 54 | top: 0; 55 | right: 0; 56 | bottom: 0; 57 | left: 0; 58 | background: black; 59 | opacity: 0.8; 60 | z-index: 1000; 61 | backdrop-filter: blur(var(--frosted-blur-size)); 62 | } -------------------------------------------------------------------------------- /assets/css/components/_grid.css: -------------------------------------------------------------------------------- 1 | .oui-row { 2 | display: flex !important; 3 | flex: 0 1 auto; 4 | flex-direction: row; 5 | flex-wrap: wrap; 6 | padding-left: 0px !important; 7 | } 8 | 9 | .x1, 10 | .x2, 11 | .x3, 12 | .x4, 13 | .x5, 14 | .x6 { 15 | flex: 1; 16 | box-sizing: border-box; 17 | } 18 | 19 | .x1 { 20 | flex: 0 0 auto; 21 | flex-basis: calc(100% / 6 ); 22 | max-width: calc(100% / 6 ); 23 | } 24 | 25 | .x2 { 26 | flex: 0 0 auto; 27 | flex-basis: calc(100% / 6 * 2); 28 | max-width: calc(100% / 6 * 2); 29 | } 30 | 31 | .x3 { 32 | flex: 0 0 auto; 33 | flex-basis: calc(100% / 6 * 3); 34 | max-width: calc(100% / 6 * 3); 35 | } 36 | 37 | .x4 { 38 | flex: 0 0 auto; 39 | flex-basis: calc(100% / 6 * 4); 40 | max-width: calc(100% / 6 * 4); 41 | } 42 | 43 | .x5 { 44 | flex: 0 0 auto; 45 | flex-basis: calc(100% / 6 * 5); 46 | max-width: calc(100% / 6 * 5); 47 | } 48 | 49 | .x6 { 50 | flex-basis: 100%; 51 | max-width: 100%; 52 | flex: 0 0 auto; 53 | } -------------------------------------------------------------------------------- /assets/css/components/_header.css: -------------------------------------------------------------------------------- 1 | .header { 2 | text-align: center; 3 | } 4 | 5 | .lozenge { 6 | background-color: var(--control-background); 7 | display: inline-block; 8 | width: auto; 9 | margin: 1em; 10 | padding: 2px 10px; 11 | border-radius: calc(0.5em + 2px); 12 | font-size: 1em; 13 | font-weight: 400; 14 | } -------------------------------------------------------------------------------- /assets/css/components/_icon.css: -------------------------------------------------------------------------------- 1 | .oui-icon { 2 | display: block; 3 | width: 32px; 4 | height: 32px; 5 | line-height: 53px; 6 | background: center no-repeat; 7 | background-size: 20px; 8 | } 9 | 10 | .oui-icon--large { 11 | display: block; 12 | width: 52px; 13 | height: 52px; 14 | line-height: 53px; 15 | background: center no-repeat; 16 | background-size: 30px; 17 | } 18 | 19 | .oui-icon-plus { 20 | background-image: url(../icons/plus.svg); 21 | } 22 | 23 | .oui-icon-palette { 24 | background-image: url(../icons/palette.svg); 25 | } 26 | 27 | .oui-icon-save { 28 | background-image: url(../icons/plus.svg); 29 | } -------------------------------------------------------------------------------- /assets/css/components/_image.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --oui-thumbnail-radius: 26px; 3 | } 4 | 5 | .oui-image-cover { 6 | border-radius: var(--oui-thumbnail-radius); 7 | border: 1px solid var(--border-surface); 8 | object-fit: cover; 9 | width: 100%; 10 | } 11 | 12 | .oui-image-caption { 13 | margin: auto; 14 | font-size: .8em; 15 | color: var(--on-surface); 16 | line-height: .8em; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /assets/css/components/_imgarticle.css: -------------------------------------------------------------------------------- 1 | .oui-imgarticle { 2 | position: relative; 3 | display: flex; 4 | align-items: center; 5 | } 6 | 7 | .oui-imgarticle-img { 8 | width: 40px; 9 | height: 40px; 10 | margin-right: 20px; 11 | border-radius: 50%; 12 | } 13 | 14 | .oui-imgarticle-title { 15 | margin: 0 0 3px 0; 16 | font-size: 1.3em; 17 | font-weight: 400; 18 | } 19 | 20 | .oui-imgarticle-text { 21 | color: var(--on-background); 22 | } -------------------------------------------------------------------------------- /assets/css/components/_input.css: -------------------------------------------------------------------------------- 1 | .oui-label { 2 | } 3 | -------------------------------------------------------------------------------- /assets/css/components/_layout.css: -------------------------------------------------------------------------------- 1 | .oui-viewing { 2 | scroll-snap-align: start; 3 | background-color: var(--background); 4 | display: flex; 5 | align-items: center; 6 | justify-content: center; 7 | flex-direction: column; 8 | min-height: 40%; 9 | padding: 4em; 10 | } 11 | 12 | .oui-viewing-title { 13 | text-align: center; 14 | word-wrap: break-word; 15 | width: 60%; 16 | } 17 | 18 | .oui-viewing-subtitle { 19 | margin-top: 16px; 20 | } 21 | 22 | .oui-interaction { 23 | min-height: 60%; 24 | scroll-snap-align: start; 25 | margin-bottom: 60pt; 26 | } 27 | 28 | .container { 29 | min-width: 260px; 30 | max-width: 400px; 31 | margin: 0 auto; 32 | } -------------------------------------------------------------------------------- /assets/css/components/_menu.css: -------------------------------------------------------------------------------- 1 | .oui-menu-trigger { 2 | cursor: pointer; 3 | list-style: none; 4 | } 5 | .js-focus-visible :focus:not(.focus-visible) { 6 | outline: none; 7 | } 8 | .oui-menu-trigger::-webkit-details-marker { 9 | display: none; 10 | } 11 | .oui-menu { 12 | position: relative; 13 | height: min-content; 14 | } 15 | .oui-menu>ul { 16 | position: absolute; 17 | transform: scale(0.8); 18 | transform-origin: 0 0; 19 | z-index: 100; 20 | transition: opacity 0.1s ease-in, transform 0.3s var(--easeOutBack); 21 | opacity: 0; 22 | line-height: normal; 23 | top: 0; 24 | left: 0; 25 | width: max-content; 26 | padding-left: 0; 27 | padding-right: 0; 28 | cursor: auto; 29 | } 30 | .oui-menu[open]>ul { 31 | transform: scale(1); 32 | opacity: 1; 33 | } 34 | .oui-menu-trigger::before { 35 | content: "▾ "; 36 | } 37 | .oui-menu-direction-up.oui-menu-direction-up { 38 | bottom: 0; 39 | top: auto; 40 | } 41 | .oui-menu-direction-left.oui-menu-direction-left { 42 | right: 0; 43 | left: auto; 44 | } 45 | .oui-menu>ul>li { 46 | padding: 0; 47 | } 48 | .oui-menu>ul>li>a { 49 | position: relative; 50 | padding: 10px 20px; 51 | display: block; 52 | } 53 | .oui-menu>ul>li>a::before { 54 | position: absolute; 55 | left: 0; 56 | right: 0; 57 | top: 0; 58 | bottom: 0; 59 | content: ''; 60 | background-color: var(--dark-m-grey); 61 | clip-path: circle(0%); 62 | transition: clip-path 0.5s ease-out; 63 | z-index: -1; 64 | } 65 | 66 | .oui-menu>ul>li>a:hover::before, 67 | .js-focus-visible .oui-menu>ul>li>a.focus-visible::before 68 | { 69 | clip-path: circle(100%); 70 | } 71 | 72 | .oui-menu>ul>li>a { 73 | text-decoration: none; 74 | color: inherit; 75 | } 76 | 77 | @media (prefers-reduced-motion) { 78 | .oui-menu,.oui-menu>ul>li::before { 79 | transition: none; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /assets/css/components/_radio.css: -------------------------------------------------------------------------------- 1 | .oui-container-radio { 2 | display: flex; 3 | align-items: center; 4 | position: relative; 5 | padding-left: 50px; 6 | height: 40px; 7 | margin-bottom: 1em; 8 | cursor: pointer; 9 | user-select: none; 10 | } 11 | 12 | .oui-input-radio { 13 | position: absolute; 14 | opacity: 0; 15 | cursor: pointer; 16 | height: 0; 17 | width: 0; 18 | } 19 | 20 | .oui-input-radio-checkmark { 21 | position: absolute; 22 | top: 9px; 23 | left: 9px; 24 | display: block; 25 | width: 22px; 26 | height: 22px; 27 | border: 1px solid var(--on-background); 28 | border-radius: 50%; 29 | transition-property: box-shadow, background-color, border-color; 30 | transition: .5s; 31 | } 32 | 33 | .oui-input-radio-checkmark:after { 34 | content: ""; 35 | position: absolute; 36 | top: 4px; 37 | right: 4px; 38 | display: block; 39 | width: 12px; 40 | height: 12px; 41 | border-radius: 50%; 42 | } 43 | 44 | .oui-container-radio:hover .oui-input-radio-checkmark, 45 | .oui-container-radio:focus .oui-input-radio-checkmark { 46 | box-shadow: 0px 0px 0px 10px rgba(0,0,0,0.2); 47 | } 48 | 49 | .oui-container-radio input:checked ~ .oui-input-radio-checkmark { 50 | border-color: var(--app-accent); 51 | background-color: transparent; 52 | } 53 | 54 | .oui-container-radio input:focus ~ .oui-input-radio-checkmark { 55 | outline-style: solid; 56 | outline-width: 2px; 57 | outline-color: var(--app-accent); 58 | } 59 | 60 | .oui-container-radio input:checked ~ .oui-input-radio-checkmark:after { 61 | background-color: var(--app-accent); 62 | } 63 | -------------------------------------------------------------------------------- /assets/css/components/_search.css: -------------------------------------------------------------------------------- 1 | .oui-input-search { 2 | position: relative; 3 | height: 48px; 4 | padding: 24px; 5 | padding-left: 40px; 6 | line-height: 48px; 7 | border: 1px solid transparent; 8 | border-radius: 24px; 9 | background: url('../icons/search.svg') no-repeat 12px center var(--control-background); 10 | background-size: 20px; 11 | transition: border .3s; 12 | } 13 | 14 | .oui-input-search:focus, 15 | .oui-input-search:hover { 16 | border: 1px solid var(--app-accent); 17 | } 18 | -------------------------------------------------------------------------------- /assets/css/components/_select.css: -------------------------------------------------------------------------------- 1 | .oui-input-select { 2 | height: 48px; 3 | padding: 0 24px; 4 | line-height: 48px; 5 | border: solid 1px var(--surface-background); 6 | border-radius: 24px; 7 | background-color: var(--surface-background); 8 | transition: border .3s; 9 | } 10 | 11 | .oui-input-select:focus, 12 | .oui-input-select:hover { 13 | border: solid 1px var(--app-accent); 14 | } -------------------------------------------------------------------------------- /assets/css/components/_slider.css: -------------------------------------------------------------------------------- 1 | .oui-container-slider { 2 | width: 100%; 3 | } 4 | 5 | .oui-input-slider { 6 | -webkit-appearance: none; 7 | appearance: none; 8 | width: 100%; 9 | height: 34.1px; 10 | background: transparent; 11 | border:none; 12 | } 13 | 14 | /* blink/webkit */ 15 | .oui-input-slider::-webkit-slider-thumb { 16 | -webkit-appearance: none; 17 | appearance: none; 18 | position: relative; 19 | margin-top:-7px; 20 | width: 17px; 21 | height: 17px; 22 | background: var(--app-accent); 23 | border: none; 24 | border-radius: 50%; 25 | cursor: pointer; 26 | transform-origin: center; 27 | -webkit-transition: width .3s, height .3s, background-color .3s, box-shadow .3s, transform .3s; 28 | } 29 | 30 | .oui-input-slider:hover::-webkit-slider-thumb { 31 | transform: scale(1.3, 1.3); 32 | transform-origin: center; 33 | box-shadow: 0px 0px 0px 6px rgba(0,0,0,0.2); 34 | } 35 | 36 | .oui-input-slider::-webkit-slider-runnable-track { 37 | background-color: var(--app-accent); 38 | height: 4px; 39 | border-radius: 2px; 40 | } 41 | 42 | /* firefox */ 43 | .oui-input-slider::-moz-range-thumb { 44 | -webkit-appearance: none; 45 | appearance: none; 46 | background: var(--app-accent); 47 | border: none; 48 | border-radius: 50%; 49 | cursor: pointer; 50 | box-shadow: 0 0 1px var(--active); 51 | transform-origin: center; 52 | transition: width .3s, height .3s, background-color .3s, box-shadow .3s, transform .3s; 53 | } 54 | 55 | .oui-input-slider:hover::-moz-range-thumb { 56 | transform: scale(1.3, 1.3); 57 | box-shadow: 0px 0px 0px 6px rgba(0,0,0,0.2); 58 | } 59 | 60 | .oui-input-slider::-moz-range-track { 61 | background-color: var(--inactive); 62 | height: 4px; 63 | border-radius: 2px; 64 | } 65 | 66 | .oui-input-slider::-moz-range-progress { 67 | background-color:var(--app-accent); 68 | height: 4px; 69 | border-radius: 2px; 70 | } 71 | 72 | /* edge */ 73 | .oui-input-slider::-ms-thumb { 74 | width: 17px; 75 | height: 17px; 76 | background-color:var(--app-accent); 77 | border: none; 78 | border-radius: 50%; 79 | cursor: pointer; 80 | overflow:visible; 81 | transform: translate(0px, 4px); 82 | transform-origin: center; 83 | transition: box-shadow .3s, transform .3s; 84 | } 85 | 86 | .oui-input-slider:hover::-ms-thumb { 87 | background-color: var(--app-accent); 88 | transform: scale(1.15, 1.15) translate(0px, 3px); 89 | } 90 | 91 | .oui-input-slider::-ms-track { 92 | width:100%; 93 | height: 4px; 94 | background: transparent; 95 | border-color: transparent; 96 | border-radius: 2px; 97 | } 98 | 99 | .oui-input-slider::-ms-fill-upper { 100 | width: 100%; 101 | background-color: var(--inactive); 102 | border:none; 103 | border-radius: 2px; 104 | } 105 | 106 | .oui-input-slider::-ms-fill-lower { 107 | width: 100%; 108 | background-color: var(--app-accent); 109 | border:none; 110 | border-radius: 2px; 111 | } -------------------------------------------------------------------------------- /assets/css/components/_tab.css: -------------------------------------------------------------------------------- 1 | .oui-tab { 2 | position: fixed; 3 | bottom: 0; 4 | display: flex; 5 | justify-content: center; 6 | width: 100%; 7 | background-color: var(--control-background); 8 | } 9 | 10 | .oui-tab-link { 11 | margin: 20px 20px 30px 20px; 12 | padding-bottom: 4px; 13 | font-size: 1.3em; 14 | text-decoration: none; 15 | color: var(--text-secondary); 16 | flex-grow: 1; 17 | text-align: center; 18 | } 19 | 20 | .oui-tab-link--active { 21 | border-bottom: 2px dotted var(--on-background); 22 | color: var(--app-accent); 23 | } -------------------------------------------------------------------------------- /assets/css/components/_textual.css: -------------------------------------------------------------------------------- 1 | .oui-input-textual { 2 | height: 48px; 3 | padding: 0 24px; 4 | line-height: 48px; 5 | color: var(--text); 6 | border: 1px solid var(--textual-background); 7 | border-radius: 24px; 8 | background-color: var(--textual-background); 9 | transition: border .3s; 10 | } 11 | 12 | .oui-input-textual:focus, 13 | .oui-input-textual:hover { 14 | border: 1px solid var(--app-accent); 15 | } 16 | 17 | .oui-input-textual-embed { 18 | margin: 0 .5em 0 .5em; 19 | padding: 0 0px; 20 | border: 0; 21 | color: var(--text); 22 | clear:both; 23 | line-height: 1.8em; 24 | background-color: transparent; 25 | box-shadow: 0px 1px 0px 0px var(--control-background); 26 | transition: box-shadow .3s; 27 | } 28 | 29 | .oui-input-textual-embed-title { 30 | color: var(--app-accent); 31 | font-size: .9em; 32 | } 33 | 34 | .oui-input-textual-embed:focus, 35 | .oui-input-textual-embed:hover { 36 | box-shadow: 0px 1.5px 0px 0px var(--app-accent); 37 | } 38 | 39 | .oui-paragraph { 40 | line-height: 1.6em; 41 | } 42 | 43 | .format-item { 44 | margin:.8em 0em .2em 0em; 45 | } 46 | -------------------------------------------------------------------------------- /assets/css/components/_toast.css: -------------------------------------------------------------------------------- 1 | .oui-toast { 2 | display: flex; 3 | align-items: center; 4 | flex-direction: column; 5 | position: fixed; 6 | z-index: 1000; 7 | bottom: 10%; 8 | width: 100%; 9 | margin: 2.25pt; 10 | } 11 | 12 | .oui-toast-text { 13 | text-align: center; 14 | background: var(--alt-surface-background); 15 | color: var(--white); 16 | border: 1px solid var(--text-color); 17 | border-radius: 1em; 18 | padding: 7.2pt; 19 | padding-left: 7.2pt; 20 | padding-right: 7.2pt; 21 | padding-top: 4.5pt; 22 | padding-bottom: 4.5pt; 23 | max-width: 52%; 24 | } -------------------------------------------------------------------------------- /assets/css/components/_toggle.css: -------------------------------------------------------------------------------- 1 | /* The switch - the box around the toggle-slider */ 2 | .oui-container-toggle { 3 | position: relative; 4 | display: flex; 5 | align-items: center; 6 | } 7 | 8 | .toggle { 9 | opacity: 0; 10 | position: absolute; 11 | width: 0; 12 | height: 0; 13 | } 14 | 15 | .toggle-slider { 16 | position: relative; 17 | display: block; 18 | width: 38px; 19 | height: 18px; 20 | border-radius: 10px; 21 | margin: 20px; 22 | border: 1px solid var(--on-background); 23 | cursor: pointer; 24 | } 25 | 26 | .toggle-slider:after { 27 | position: absolute; 28 | content: ""; 29 | height: 20px; 30 | width: 20px; 31 | top: -2px; 32 | left: -2px; 33 | border-radius: 50%; 34 | border: 1px solid var(--on-background); 35 | background-color: var(--on-primary); 36 | transition: .5s; 37 | } 38 | 39 | input:checked + .toggle-slider { 40 | background-color: var(--app-accent); 41 | border-color: var(--app-accent); 42 | } 43 | 44 | input:focus + .toggle-slider { 45 | box-shadow: 0 0 1px var(--app-accent); 46 | } 47 | 48 | input:checked + .toggle-slider:after { 49 | transform: translateX(20px); 50 | border-color: var(--app-accent); 51 | } 52 | 53 | .oui-container-toggle:hover .toggle-slider:after { 54 | box-shadow: 0px 0px 0px 10px rgba(0,0,0,0.2); 55 | } -------------------------------------------------------------------------------- /assets/css/fonts/SamsungSharpSans-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/SamsungSharpSans-Bold.eot -------------------------------------------------------------------------------- /assets/css/fonts/SamsungSharpSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/SamsungSharpSans-Bold.ttf -------------------------------------------------------------------------------- /assets/css/fonts/SamsungSharpSans-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/SamsungSharpSans-Bold.woff -------------------------------------------------------------------------------- /assets/css/fonts/SamsungSharpSans-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/SamsungSharpSans-Regular.eot -------------------------------------------------------------------------------- /assets/css/fonts/SamsungSharpSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/SamsungSharpSans-Regular.ttf -------------------------------------------------------------------------------- /assets/css/fonts/SamsungSharpSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/SamsungSharpSans-Regular.woff -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-300-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-300-webfont.woff -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-300-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-300-webfont.woff2 -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-600-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-600-webfont.woff -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-600-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-600-webfont.woff2 -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-700-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-700-webfont.woff -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-700-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-700-webfont.woff2 -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-800-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-800-webfont.ttf -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-800-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-800-webfont.woff -------------------------------------------------------------------------------- /assets/css/fonts/samsungone-800-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/css/fonts/samsungone-800-webfont.woff2 -------------------------------------------------------------------------------- /assets/css/icons/bluetooth.svg: -------------------------------------------------------------------------------- 1 | Asset 2 -------------------------------------------------------------------------------- /assets/css/icons/check.svg: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/css/icons/check_white.svg: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/css/icons/handset.svg: -------------------------------------------------------------------------------- 1 | volume -------------------------------------------------------------------------------- /assets/css/icons/left.svg: -------------------------------------------------------------------------------- 1 | Asset 1 -------------------------------------------------------------------------------- /assets/css/icons/monitor.svg: -------------------------------------------------------------------------------- 1 | volume -------------------------------------------------------------------------------- /assets/css/icons/mute.svg: -------------------------------------------------------------------------------- 1 | volume -------------------------------------------------------------------------------- /assets/css/icons/palette.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/css/icons/peripherals.svg: -------------------------------------------------------------------------------- 1 | volume -------------------------------------------------------------------------------- /assets/css/icons/phone.svg: -------------------------------------------------------------------------------- 1 | volume -------------------------------------------------------------------------------- /assets/css/icons/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/css/icons/previous.svg: -------------------------------------------------------------------------------- 1 | previous -------------------------------------------------------------------------------- /assets/css/icons/right.svg: -------------------------------------------------------------------------------- 1 | Asset 2 -------------------------------------------------------------------------------- /assets/css/icons/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/css/icons/smarthome.svg: -------------------------------------------------------------------------------- 1 | volume -------------------------------------------------------------------------------- /assets/css/icons/vertical_ellipsis.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/css/icons/volume.svg: -------------------------------------------------------------------------------- 1 | volume -------------------------------------------------------------------------------- /assets/css/oui.css: -------------------------------------------------------------------------------- 1 | /*import cayman*/ 2 | /* @import 'cayman/jekyll-theme-cayman.css'; */ 3 | 4 | /* import the theme you want to use */ 5 | /* @import "themes/oui-light-theme.css" screen; 6 | @import "themes/oui-dark-theme.css" screen and (prefers-color-scheme: dark); */ 7 | /* Auto load dark theme */ 8 | 9 | /*add components you will use in your app*/ 10 | /* @import 'components/_appbar.css'; 11 | @import 'components/_badge.css'; 12 | @import 'components/_bubble.css'; 13 | @import 'components/_button.css'; 14 | @import 'components/_checkbox.css'; 15 | @import 'components/_dialog.css'; 16 | @import 'components/_header.css'; 17 | @import 'components/_icon.css'; 18 | @import 'components/_image.css'; 19 | @import 'components/_imgarticle.css'; 20 | @import 'components/_input.css'; 21 | @import 'components/_tab.css'; 22 | @import 'components/_menu.css'; 23 | @import 'components/_radio.css'; 24 | @import 'components/_search.css'; 25 | @import 'components/_select.css'; 26 | @import 'components/_slider.css'; 27 | @import 'components/_textual.css'; 28 | @import 'components/_toast.css'; 29 | @import 'components/_toggle.css'; 30 | @import 'components/_layout.css'; 31 | @import 'components/_grid.css'; */ 32 | 33 | 34 | /* Required utils */ 35 | /* @import 'utils/_easings.css'; 36 | @import 'utils/_misc.css'; 37 | @import 'utils/_font.css'; 38 | @import 'utils/_media.css'; 39 | @import 'utils/_spacing.css'; 40 | @import 'utils/_frosted.css'; 41 | 42 | html { 43 | background-color: var(--background); 44 | color: var(--text); 45 | } */ 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | @font-face { 54 | font-family: 'Noto Sans'; 55 | font-weight: 400; 56 | font-style: normal; 57 | src: url("../fonts/Noto-Sans-regular/Noto-Sans-regular.eot"); 58 | src: url("../fonts/Noto-Sans-regular/Noto-Sans-regular.eot?#iefix") format("embedded-opentype"), local("Noto Sans"), local("Noto-Sans-regular"), url("../fonts/Noto-Sans-regular/Noto-Sans-regular.woff2") format("woff2"), url("../fonts/Noto-Sans-regular/Noto-Sans-regular.woff") format("woff"), url("../fonts/Noto-Sans-regular/Noto-Sans-regular.ttf") format("truetype"), url("../fonts/Noto-Sans-regular/Noto-Sans-regular.svg#NotoSans") format("svg") 59 | } 60 | 61 | @font-face { 62 | font-family: 'Noto Sans'; 63 | font-weight: 700; 64 | font-style: normal; 65 | src: url("../fonts/Noto-Sans-700/Noto-Sans-700.eot"); 66 | src: url("../fonts/Noto-Sans-700/Noto-Sans-700.eot?#iefix") format("embedded-opentype"), local("Noto Sans Bold"), local("Noto-Sans-700"), url("../fonts/Noto-Sans-700/Noto-Sans-700.woff2") format("woff2"), url("../fonts/Noto-Sans-700/Noto-Sans-700.woff") format("woff"), url("../fonts/Noto-Sans-700/Noto-Sans-700.ttf") format("truetype"), url("../fonts/Noto-Sans-700/Noto-Sans-700.svg#NotoSans") format("svg") 67 | } 68 | 69 | @font-face { 70 | font-family: 'Noto Sans'; 71 | font-weight: 400; 72 | font-style: italic; 73 | src: url("../fonts/Noto-Sans-italic/Noto-Sans-italic.eot"); 74 | src: url("../fonts/Noto-Sans-italic/Noto-Sans-italic.eot?#iefix") format("embedded-opentype"), local("Noto Sans Italic"), local("Noto-Sans-italic"), url("../fonts/Noto-Sans-italic/Noto-Sans-italic.woff2") format("woff2"), url("../fonts/Noto-Sans-italic/Noto-Sans-italic.woff") format("woff"), url("../fonts/Noto-Sans-italic/Noto-Sans-italic.ttf") format("truetype"), url("../fonts/Noto-Sans-italic/Noto-Sans-italic.svg#NotoSans") format("svg") 75 | } 76 | 77 | @font-face { 78 | font-family: 'Noto Sans'; 79 | font-weight: 700; 80 | font-style: italic; 81 | src: url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot"); 82 | src: url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot?#iefix") format("embedded-opentype"), local("Noto Sans Bold Italic"), local("Noto-Sans-700italic"), url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2") format("woff2"), url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff") format("woff"), url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf") format("truetype"), url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg#NotoSans") format("svg") 83 | } 84 | 85 | .highlight table td { 86 | padding: 5px 87 | } 88 | 89 | .highlight table pre { 90 | margin: 0 91 | } 92 | 93 | .highlight .cm { 94 | color: #999988; 95 | font-style: italic 96 | } 97 | 98 | .highlight .cp { 99 | color: #999999; 100 | font-weight: bold 101 | } 102 | 103 | .highlight .c1 { 104 | color: #999988; 105 | font-style: italic 106 | } 107 | 108 | .highlight .cs { 109 | color: #999999; 110 | font-weight: bold; 111 | font-style: italic 112 | } 113 | 114 | .highlight .c, 115 | .highlight .cd { 116 | color: #999988; 117 | font-style: italic 118 | } 119 | 120 | .highlight .err { 121 | color: #a61717; 122 | background-color: #e3d2d2 123 | } 124 | 125 | .highlight .gd { 126 | color: #000000; 127 | background-color: #ffdddd 128 | } 129 | 130 | .highlight .ge { 131 | color: #000000; 132 | font-style: italic 133 | } 134 | 135 | .highlight .gr { 136 | color: #aa0000 137 | } 138 | 139 | .highlight .gh { 140 | color: #999999 141 | } 142 | 143 | .highlight .gi { 144 | color: #000000; 145 | background-color: #ddffdd 146 | } 147 | 148 | .highlight .go { 149 | color: #888888 150 | } 151 | 152 | .highlight .gp { 153 | color: #555555 154 | } 155 | 156 | .highlight .gs { 157 | font-weight: bold 158 | } 159 | 160 | .highlight .gu { 161 | color: #aaaaaa 162 | } 163 | 164 | .highlight .gt { 165 | color: #aa0000 166 | } 167 | 168 | .highlight .kc { 169 | color: #000000; 170 | font-weight: bold 171 | } 172 | 173 | .highlight .kd { 174 | color: #000000; 175 | font-weight: bold 176 | } 177 | 178 | .highlight .kn { 179 | color: #000000; 180 | font-weight: bold 181 | } 182 | 183 | .highlight .kp { 184 | color: #000000; 185 | font-weight: bold 186 | } 187 | 188 | .highlight .kr { 189 | color: #000000; 190 | font-weight: bold 191 | } 192 | 193 | .highlight .kt { 194 | color: #445588; 195 | font-weight: bold 196 | } 197 | 198 | .highlight .k, 199 | .highlight .kv { 200 | color: #000000; 201 | font-weight: bold 202 | } 203 | 204 | .highlight .mf { 205 | color: #009999 206 | } 207 | 208 | .highlight .mh { 209 | color: #009999 210 | } 211 | 212 | .highlight .il { 213 | color: #009999 214 | } 215 | 216 | .highlight .mi { 217 | color: #009999 218 | } 219 | 220 | .highlight .mo { 221 | color: #009999 222 | } 223 | 224 | .highlight .m, 225 | .highlight .mb, 226 | .highlight .mx { 227 | color: #009999 228 | } 229 | 230 | .highlight .sb { 231 | color: #d14 232 | } 233 | 234 | .highlight .sc { 235 | color: #d14 236 | } 237 | 238 | .highlight .sd { 239 | color: #d14 240 | } 241 | 242 | .highlight .s2 { 243 | color: #d14 244 | } 245 | 246 | .highlight .se { 247 | color: #d14 248 | } 249 | 250 | .highlight .sh { 251 | color: #d14 252 | } 253 | 254 | .highlight .si { 255 | color: #d14 256 | } 257 | 258 | .highlight .sx { 259 | color: #d14 260 | } 261 | 262 | .highlight .sr { 263 | color: #009926 264 | } 265 | 266 | .highlight .s1 { 267 | color: #d14 268 | } 269 | 270 | .highlight .ss { 271 | color: #990073 272 | } 273 | 274 | .highlight .s { 275 | color: #d14 276 | } 277 | 278 | .highlight .na { 279 | color: #008080 280 | } 281 | 282 | .highlight .bp { 283 | color: #999999 284 | } 285 | 286 | .highlight .nb { 287 | color: #0086B3 288 | } 289 | 290 | .highlight .nc { 291 | color: #445588; 292 | font-weight: bold 293 | } 294 | 295 | .highlight .no { 296 | color: #008080 297 | } 298 | 299 | .highlight .nd { 300 | color: #3c5d5d; 301 | font-weight: bold 302 | } 303 | 304 | .highlight .ni { 305 | color: #800080 306 | } 307 | 308 | .highlight .ne { 309 | color: #990000; 310 | font-weight: bold 311 | } 312 | 313 | .highlight .nf { 314 | color: #990000; 315 | font-weight: bold 316 | } 317 | 318 | .highlight .nl { 319 | color: #990000; 320 | font-weight: bold 321 | } 322 | 323 | .highlight .nn { 324 | color: #555555 325 | } 326 | 327 | .highlight .nt { 328 | color: #000080 329 | } 330 | 331 | .highlight .vc { 332 | color: #008080 333 | } 334 | 335 | .highlight .vg { 336 | color: #008080 337 | } 338 | 339 | .highlight .vi { 340 | color: #008080 341 | } 342 | 343 | .highlight .nv { 344 | color: #008080 345 | } 346 | 347 | .highlight .ow { 348 | color: #000000; 349 | font-weight: bold 350 | } 351 | 352 | .highlight .o { 353 | color: #000000; 354 | font-weight: bold 355 | } 356 | 357 | .highlight .w { 358 | color: #bbbbbb 359 | } 360 | 361 | .highlight { 362 | background-color: #f8f8f8 363 | } 364 | 365 | body { 366 | background-color: #fff; 367 | padding: 50px; 368 | font: 14px/1.5 "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; 369 | color: #727272; 370 | font-weight: 400 371 | } 372 | 373 | h1, 374 | h2, 375 | h3, 376 | h4, 377 | h5, 378 | h6 { 379 | color: #222; 380 | margin: 0 0 20px 381 | } 382 | 383 | p, 384 | ul, 385 | ol, 386 | table, 387 | pre, 388 | dl { 389 | margin: 0 0 20px 390 | } 391 | 392 | h1, 393 | h2, 394 | h3 { 395 | line-height: 1.1 396 | } 397 | 398 | h1 { 399 | font-size: 28px 400 | } 401 | 402 | h2 { 403 | color: #393939 404 | } 405 | 406 | h3, 407 | h4, 408 | h5, 409 | h6 { 410 | color: #494949 411 | } 412 | 413 | a { 414 | color: #267CB9; 415 | text-decoration: none 416 | } 417 | 418 | a:hover, 419 | a:focus { 420 | color: #069; 421 | font-weight: bold 422 | } 423 | 424 | a small { 425 | font-size: 11px; 426 | color: #777; 427 | margin-top: -0.3em; 428 | display: block 429 | } 430 | 431 | a:hover small { 432 | color: #777 433 | } 434 | 435 | .wrapper { 436 | width: 860px; 437 | margin: 0 auto 438 | } 439 | 440 | blockquote { 441 | border-left: 1px solid #e5e5e5; 442 | margin: 0; 443 | padding: 0 0 0 20px; 444 | font-style: italic 445 | } 446 | 447 | code, 448 | pre { 449 | font-family: Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace; 450 | color: #333 451 | } 452 | 453 | pre { 454 | padding: 8px 15px; 455 | background: #f8f8f8; 456 | border-radius: 5px; 457 | border: 1px solid #e5e5e5; 458 | overflow-x: auto 459 | } 460 | 461 | table { 462 | width: 100%; 463 | border-collapse: collapse 464 | } 465 | 466 | th, 467 | td { 468 | text-align: left; 469 | padding: 5px 10px; 470 | border-bottom: 1px solid #e5e5e5 471 | } 472 | 473 | dt { 474 | color: #444; 475 | font-weight: 700 476 | } 477 | 478 | th { 479 | color: #444 480 | } 481 | 482 | img { 483 | max-width: 100% 484 | } 485 | 486 | kbd { 487 | background-color: #fafbfc; 488 | border: 1px solid #c6cbd1; 489 | border-bottom-color: #959da5; 490 | border-radius: 3px; 491 | box-shadow: inset 0 -1px 0 #959da5; 492 | color: #444d56; 493 | display: inline-block; 494 | font-size: 11px; 495 | line-height: 10px; 496 | padding: 3px 5px; 497 | vertical-align: middle 498 | } 499 | 500 | header { 501 | width: 270px; 502 | float: left; 503 | position: fixed; 504 | -webkit-font-smoothing: subpixel-antialiased 505 | } 506 | 507 | ul.downloads { 508 | list-style: none; 509 | height: 40px; 510 | padding: 0; 511 | background: #f4f4f4; 512 | border-radius: 5px; 513 | border: 1px solid #e0e0e0; 514 | width: 270px 515 | } 516 | 517 | .downloads li { 518 | width: 89px; 519 | float: left; 520 | border-right: 1px solid #e0e0e0; 521 | height: 40px 522 | } 523 | 524 | .downloads li:first-child a { 525 | border-radius: 5px 0 0 5px 526 | } 527 | 528 | .downloads li:last-child a { 529 | border-radius: 0 5px 5px 0 530 | } 531 | 532 | .downloads a { 533 | line-height: 1; 534 | font-size: 11px; 535 | color: #676767; 536 | display: block; 537 | text-align: center; 538 | padding-top: 6px; 539 | height: 34px 540 | } 541 | 542 | .downloads a:hover, 543 | .downloads a:focus { 544 | color: #675C5C; 545 | font-weight: bold 546 | } 547 | 548 | .downloads ul a:active { 549 | background-color: #f0f0f0 550 | } 551 | 552 | strong { 553 | color: #222; 554 | font-weight: 700 555 | } 556 | 557 | .downloads li+li+li { 558 | border-right: none; 559 | width: 89px 560 | } 561 | 562 | .downloads a strong { 563 | font-size: 14px; 564 | display: block; 565 | color: #222 566 | } 567 | 568 | section { 569 | width: 500px; 570 | float: right; 571 | padding-bottom: 50px 572 | } 573 | 574 | small { 575 | font-size: 11px 576 | } 577 | 578 | hr { 579 | border: 0; 580 | background: #e5e5e5; 581 | height: 1px; 582 | margin: 0 0 20px 583 | } 584 | 585 | footer { 586 | width: 270px; 587 | float: left; 588 | position: fixed; 589 | bottom: 50px; 590 | -webkit-font-smoothing: subpixel-antialiased 591 | } 592 | 593 | @media print, 594 | screen and (max-width: 960px) { 595 | div.wrapper { 596 | width: auto; 597 | margin: 0 598 | } 599 | 600 | header, 601 | section, 602 | footer { 603 | float: none; 604 | position: static; 605 | width: auto 606 | } 607 | 608 | header { 609 | padding-right: 320px 610 | } 611 | 612 | section { 613 | border: 1px solid #e5e5e5; 614 | border-width: 1px 0; 615 | padding: 20px 0; 616 | margin: 0 0 20px 617 | } 618 | 619 | header a small { 620 | display: inline 621 | } 622 | 623 | header ul { 624 | position: absolute; 625 | right: 50px; 626 | top: 52px 627 | } 628 | } 629 | 630 | @media print, 631 | screen and (max-width: 720px) { 632 | body { 633 | word-wrap: break-word 634 | } 635 | 636 | header { 637 | padding: 0 638 | } 639 | 640 | header ul, 641 | header p.view { 642 | position: static 643 | } 644 | 645 | pre, 646 | code { 647 | word-wrap: normal 648 | } 649 | } 650 | 651 | @media print, 652 | screen and (max-width: 480px) { 653 | body { 654 | padding: 15px 655 | } 656 | 657 | .downloads { 658 | width: 99% 659 | } 660 | 661 | .downloads li, 662 | .downloads li+li+li { 663 | width: 33% 664 | } 665 | } 666 | 667 | @media print { 668 | body { 669 | padding: 0.4in; 670 | font-size: 12pt; 671 | color: #444 672 | } 673 | } -------------------------------------------------------------------------------- /assets/css/scripts/oui.js: -------------------------------------------------------------------------------- 1 | function onkeydown(e) { 2 | // For controlling the menu, source: 3 | // https://www.w3.org/TR/wai-aria-practices-1.1/examples/menu-button/menu-button-links.html 4 | 5 | const element = e.currentTarget; 6 | 7 | if (!element) return; 8 | 9 | const currentFocusEl = element.querySelector(":focus"); 10 | 11 | const letterKey = e.code.match(/^Key([A-Z])$/); 12 | if (letterKey) { 13 | element.open = true; 14 | const letter = letterKey[1].toLowerCase(); 15 | const elsAfter = Array.from( 16 | element.querySelectorAll("li:focus-within ~ li") 17 | ); 18 | for (const el of elsAfter) { 19 | if (el.textContent.trim().toLowerCase()[0] === letter) { 20 | return el.querySelector("a").focus(); 21 | } 22 | } 23 | const allEls = Array.from(element.querySelectorAll("li")); 24 | for (const el of allEls) { 25 | if (el.textContent.trim().toLowerCase()[0] === letter) { 26 | return el.querySelector("a").focus(); 27 | } 28 | } 29 | return; 30 | } 31 | 32 | if (currentFocusEl.tagName === "SUMMARY") { 33 | switch (e.code) { 34 | case "ArrowUp": 35 | e.preventDefault(); 36 | element.open = true; 37 | element.querySelector("li:last-child>a").focus(); 38 | return false; 39 | 40 | case "ArrowDown": 41 | case "Space": 42 | case "Return": 43 | e.preventDefault(); 44 | element.open = true; 45 | element.querySelector("li:first-child>a").focus(); 46 | return false; 47 | } 48 | } 49 | 50 | if (currentFocusEl.tagName === "A") { 51 | let el, prevEl; 52 | 53 | switch (e.code) { 54 | case "ArrowUp": 55 | e.preventDefault(); 56 | el = element.querySelector("li:focus-within"); 57 | prevEl = 58 | el.previousElementSibling || 59 | element.querySelector("li:last-child"); 60 | prevEl.querySelector("a").focus(); 61 | return false; 62 | 63 | case "ArrowDown": 64 | e.preventDefault(); 65 | el = 66 | element.querySelector("li:focus-within+li>a") || 67 | element.querySelector("li:first-child>a"); 68 | el.focus(); 69 | return false; 70 | 71 | case "Enter": 72 | case "Escape": 73 | element.open = false; 74 | element.querySelector("summary").focus(); 75 | break; 76 | 77 | case "Home": 78 | e.preventDefault(); 79 | element.querySelector("li:first-child>a").focus(); 80 | break; 81 | 82 | case "End": 83 | e.preventDefault(); 84 | element.querySelector("li:last-child>a").focus(); 85 | break; 86 | } 87 | } 88 | } 89 | 90 | function onblur(e) { 91 | const element = e.currentTarget; 92 | if (element.matches(':focus-within')) return; 93 | element.open = false; 94 | } 95 | 96 | function ontoggle(e) { 97 | const element = e.currentTarget; 98 | if (element.querySelector('ul').matches(':focus-within')) return; 99 | if (element.open) element.querySelector("li:first-child>a").focus(); 100 | } 101 | 102 | function ouiBindKeys() { 103 | for (const el of [...document.querySelectorAll(".oui-menu")]) { 104 | el.removeEventListener("blur", onblur); 105 | el.removeEventListener("toggle", ontoggle); 106 | el.removeEventListener("keydown", onkeydown); 107 | el.addEventListener("blur", onblur, true); 108 | el.addEventListener("toggle", ontoggle); 109 | el.addEventListener("keydown", onkeydown); 110 | } 111 | } 112 | ouiBindKeys(); 113 | -------------------------------------------------------------------------------- /assets/css/scripts/polyfill/focus-visible.js: -------------------------------------------------------------------------------- 1 | /** 2 | * https://github.com/WICG/focus-visible 3 | */ 4 | function init() { 5 | var hadKeyboardEvent = true; 6 | var hadFocusVisibleRecently = false; 7 | var hadFocusVisibleRecentlyTimeout = null; 8 | 9 | var inputTypesWhitelist = { 10 | text: true, 11 | search: true, 12 | url: true, 13 | tel: true, 14 | email: true, 15 | password: true, 16 | number: true, 17 | date: true, 18 | month: true, 19 | week: true, 20 | time: true, 21 | datetime: true, 22 | 'datetime-local': true 23 | }; 24 | 25 | /** 26 | * Helper function for legacy browsers and iframes which sometimes focus 27 | * elements like document, body, and non-interactive SVG. 28 | * @param {Element} el 29 | */ 30 | function isValidFocusTarget(el) { 31 | if ( 32 | el && 33 | el !== document && 34 | el.nodeName !== 'HTML' && 35 | el.nodeName !== 'BODY' && 36 | 'classList' in el && 37 | 'contains' in el.classList 38 | ) { 39 | return true; 40 | } 41 | return false; 42 | } 43 | 44 | /** 45 | * Computes whether the given element should automatically trigger the 46 | * `focus-visible` class being added, i.e. whether it should always match 47 | * `:focus-visible` when focused. 48 | * @param {Element} el 49 | * @return {boolean} 50 | */ 51 | function focusTriggersKeyboardModality(el) { 52 | var type = el.type; 53 | var tagName = el.tagName; 54 | 55 | if (tagName == 'INPUT' && inputTypesWhitelist[type] && !el.readOnly) { 56 | return true; 57 | } 58 | 59 | if (tagName == 'TEXTAREA' && !el.readOnly) { 60 | return true; 61 | } 62 | 63 | if (el.isContentEditable) { 64 | return true; 65 | } 66 | 67 | return false; 68 | } 69 | 70 | /** 71 | * Add the `focus-visible` class to the given element if it was not added by 72 | * the author. 73 | * @param {Element} el 74 | */ 75 | function addFocusVisibleClass(el) { 76 | if (el.classList.contains('focus-visible')) { 77 | return; 78 | } 79 | el.classList.add('focus-visible'); 80 | el.setAttribute('data-focus-visible-added', ''); 81 | } 82 | 83 | /** 84 | * Remove the `focus-visible` class from the given element if it was not 85 | * originally added by the author. 86 | * @param {Element} el 87 | */ 88 | function removeFocusVisibleClass(el) { 89 | if (!el.hasAttribute('data-focus-visible-added')) { 90 | return; 91 | } 92 | el.classList.remove('focus-visible'); 93 | el.removeAttribute('data-focus-visible-added'); 94 | } 95 | 96 | /** 97 | * Treat `keydown` as a signal that the user is in keyboard modality. 98 | * Apply `focus-visible` to any current active element and keep track 99 | * of our keyboard modality state with `hadKeyboardEvent`. 100 | * @param {Event} e 101 | */ 102 | function onKeyDown() { 103 | if (isValidFocusTarget(document.activeElement)) { 104 | addFocusVisibleClass(document.activeElement); 105 | } 106 | 107 | hadKeyboardEvent = true; 108 | } 109 | 110 | /** 111 | * If at any point a user clicks with a pointing device, ensure that we change 112 | * the modality away from keyboard. 113 | * This avoids the situation where a user presses a key on an already focused 114 | * element, and then clicks on a different element, focusing it with a 115 | * pointing device, while we still think we're in keyboard modality. 116 | * @param {Event} e 117 | */ 118 | function onPointerDown() { 119 | hadKeyboardEvent = false; 120 | } 121 | 122 | /** 123 | * On `focus`, add the `focus-visible` class to the target if: 124 | * - the target received focus as a result of keyboard navigation, or 125 | * - the event target is an element that will likely require interaction 126 | * via the keyboard (e.g. a text box) 127 | * @param {Event} e 128 | */ 129 | function onFocus(e) { 130 | // Prevent IE from focusing the document or HTML element. 131 | if (!isValidFocusTarget(e.target)) { 132 | return; 133 | } 134 | 135 | if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) { 136 | addFocusVisibleClass(e.target); 137 | } 138 | } 139 | 140 | /** 141 | * On `blur`, remove the `focus-visible` class from the target. 142 | * @param {Event} e 143 | */ 144 | function onBlur(e) { 145 | if (!isValidFocusTarget(e.target)) { 146 | return; 147 | } 148 | 149 | if ( 150 | e.target.classList.contains('focus-visible') || 151 | e.target.hasAttribute('data-focus-visible-added') 152 | ) { 153 | // To detect a tab/window switch, we look for a blur event followed 154 | // rapidly by a visibility change. 155 | // If we don't see a visibility change within 100ms, it's probably a 156 | // regular focus change. 157 | hadFocusVisibleRecently = true; 158 | window.clearTimeout(hadFocusVisibleRecentlyTimeout); 159 | hadFocusVisibleRecentlyTimeout = window.setTimeout(function() { 160 | hadFocusVisibleRecently = false; 161 | window.clearTimeout(hadFocusVisibleRecentlyTimeout); 162 | }, 100); 163 | removeFocusVisibleClass(e.target); 164 | } 165 | } 166 | 167 | /** 168 | * If the user changes tabs, keep track of whether or not the previously 169 | * focused element had .focus-visible. 170 | * @param {Event} e 171 | */ 172 | function onVisibilityChange() { 173 | if (document.visibilityState == 'hidden') { 174 | // If the tab becomes active again, the browser will handle calling focus 175 | // on the element (Safari actually calls it twice). 176 | // If this tab change caused a blur on an element with focus-visible, 177 | // re-apply the class when the user switches back to the tab. 178 | if (hadFocusVisibleRecently) { 179 | hadKeyboardEvent = true; 180 | } 181 | addInitialPointerMoveListeners(); 182 | } 183 | } 184 | 185 | /** 186 | * Add a group of listeners to detect usage of any pointing devices. 187 | * These listeners will be added when the polyfill first loads, and anytime 188 | * the window is blurred, so that they are active when the window regains 189 | * focus. 190 | */ 191 | function addInitialPointerMoveListeners() { 192 | document.addEventListener('mousemove', onInitialPointerMove); 193 | document.addEventListener('mousedown', onInitialPointerMove); 194 | document.addEventListener('mouseup', onInitialPointerMove); 195 | document.addEventListener('pointermove', onInitialPointerMove); 196 | document.addEventListener('pointerdown', onInitialPointerMove); 197 | document.addEventListener('pointerup', onInitialPointerMove); 198 | document.addEventListener('touchmove', onInitialPointerMove); 199 | document.addEventListener('touchstart', onInitialPointerMove); 200 | document.addEventListener('touchend', onInitialPointerMove); 201 | } 202 | 203 | function removeInitialPointerMoveListeners() { 204 | document.removeEventListener('mousemove', onInitialPointerMove); 205 | document.removeEventListener('mousedown', onInitialPointerMove); 206 | document.removeEventListener('mouseup', onInitialPointerMove); 207 | document.removeEventListener('pointermove', onInitialPointerMove); 208 | document.removeEventListener('pointerdown', onInitialPointerMove); 209 | document.removeEventListener('pointerup', onInitialPointerMove); 210 | document.removeEventListener('touchmove', onInitialPointerMove); 211 | document.removeEventListener('touchstart', onInitialPointerMove); 212 | document.removeEventListener('touchend', onInitialPointerMove); 213 | } 214 | 215 | /** 216 | * When the polfyill first loads, assume the user is in keyboard modality. 217 | * If any event is received from a pointing device (e.g. mouse, pointer, 218 | * touch), turn off keyboard modality. 219 | * This accounts for situations where focus enters the page from the URL bar. 220 | * @param {Event} e 221 | */ 222 | function onInitialPointerMove(e) { 223 | // Work around a Safari quirk that fires a mousemove on whenever the 224 | // window blurs, even if you're tabbing out of the page. ¯\_(ツ)_/¯ 225 | if (e.target.nodeName.toLowerCase() === 'html') { 226 | return; 227 | } 228 | 229 | hadKeyboardEvent = false; 230 | removeInitialPointerMoveListeners(); 231 | } 232 | 233 | document.addEventListener('keydown', onKeyDown, true); 234 | document.addEventListener('mousedown', onPointerDown, true); 235 | document.addEventListener('pointerdown', onPointerDown, true); 236 | document.addEventListener('touchstart', onPointerDown, true); 237 | document.addEventListener('focus', onFocus, true); 238 | document.addEventListener('blur', onBlur, true); 239 | document.addEventListener('visibilitychange', onVisibilityChange, true); 240 | addInitialPointerMoveListeners(); 241 | 242 | document.body.classList.add('js-focus-visible'); 243 | } 244 | 245 | /** 246 | * Subscription when the DOM is ready 247 | * @param {Function} callback 248 | */ 249 | function onDOMReady(callback) { 250 | var loaded; 251 | 252 | /** 253 | * Callback wrapper for check loaded state 254 | */ 255 | function load() { 256 | if (!loaded) { 257 | loaded = true; 258 | 259 | callback(); 260 | } 261 | } 262 | 263 | if (['interactive', 'complete'].indexOf(document.readyState) >= 0) { 264 | callback(); 265 | } else { 266 | loaded = false; 267 | document.addEventListener('DOMContentLoaded', load, false); 268 | window.addEventListener('load', load, false); 269 | } 270 | } 271 | 272 | if (typeof document !== 'undefined') { 273 | onDOMReady(init); 274 | } 275 | -------------------------------------------------------------------------------- /assets/css/themes/oui-dark-theme.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | /*color palette*/ 3 | --p-white: #FFFFFF; 4 | --white: #FAFAFA; 5 | --black-col: 8,8,8; 6 | --black: rgb(var(--black-col)); 7 | --d-grey: #252525; 8 | --m-grey: #979797; 9 | --l-grey: #CCCCCC; 10 | --xl-grey: #F2F2F2; 11 | --orange: #C65306; 12 | --blue: #2692FF; 13 | --d-blue: #062E52; 14 | --m-blue: #0074D4; 15 | --red: #F01346; 16 | --green: #15B76C; 17 | --purple: #6446E6; 18 | --yellow: #FF9E01; 19 | 20 | /*main theme variables*/ 21 | --text: var(--p-white); 22 | --text-secondary: var(--m-grey); 23 | --primary: var(--blue); 24 | --secondary: var(); 25 | --active: var(--m-blue); 26 | --inactive: var(--d-blue); 27 | --app-accent: var(--primary); 28 | 29 | /*backgrounds*/ 30 | --background: var(--black); 31 | --control-background: var(--d-grey); 32 | --textual-background: var(--d-grey); 33 | --surface-background: var(--d-grey); 34 | --alt-surface-background: var(--d-grey); 35 | /* 36 | These inherit from the light theme 37 | --frosted-opacity: 0.8; 38 | --frosted-blur-size: 10px; */ 39 | --frosted-background-color: rgba(var(--black-col), var(--frosted-opacity)); 40 | 41 | /*accents*/ 42 | --error: var(--red); 43 | --confirmation: var(--green); 44 | --accent-badge: var(--orange); 45 | 46 | /*on top colors*/ 47 | --on-primary: var(--p-white); 48 | --on-secondary: var(); 49 | --on-active: var(--p-white); 50 | --on-background: var(--white); 51 | --on-alt-background: var(--l-grey); 52 | --on-surface: var(--p-white); 53 | --on-error: var(--p-white); 54 | --on-confirmation: var(--white); 55 | --on-accent-badge: var(--p-white); 56 | 57 | /*borders*/ 58 | --border-surface: var(--xl-grey); 59 | --border-alt-surface: var(--d-grey); 60 | --border-control: var(--d-grey); 61 | 62 | /*misc*/ 63 | --shadow-color: rgba(var(--black-col), 0.3); 64 | } 65 | -------------------------------------------------------------------------------- /assets/css/themes/oui-light-theme.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /*color palette*/ 3 | --p-white: #FFFFFF; 4 | --white-col: 252,252,252; 5 | --white: rgb(var(--white-col)); 6 | --black-col: 37, 37, 37; 7 | --black: rgb(var(--black-col)); 8 | --d-grey: #737373; 9 | --dark-m-grey: #b6b6b6; 10 | --m-grey: #c4c4c4; 11 | --l-grey: #E6E6E6; 12 | --xl-grey-col: 242,242,242; /*#F2F2F2*/ 13 | --xl-grey: rgb(var(--xl-grey-col)); 14 | --orange: #C65306; 15 | --blue: #0865C3; 16 | --l-blue: #4297FF; 17 | --xl-blue: #AAD0F5; 18 | --red: #F01346; 19 | --green: #15B76C; 20 | --purple: #6446E6; 21 | --yellow: #FF9E01; 22 | 23 | /*main theme variables*/ 24 | --text: var(--black); 25 | --text-secondary: var(--d-grey); 26 | --primary: var(--blue); 27 | --secondary: var(); 28 | --active: var(--l-blue); 29 | --inactive: var(--xl-blue); 30 | --app-accent: var(--primary); 31 | 32 | /*backgrounds*/ 33 | --background: var(--xl-grey); 34 | --control-background: var(--l-grey); 35 | --textual-background: var(--white); 36 | --surface-background: var(--white); 37 | --alt-surface-background: var(--d-grey); 38 | --frosted-opacity: 0.8; 39 | --frosted-blur-size: 0.5rem; 40 | --frosted-background-color: rgba(var(--xl-grey-col), var(--frosted-opacity)); 41 | 42 | /*accents*/ 43 | --error: var(--red); 44 | --confirmation: var(--green); 45 | --accent-badge: var(--orange); 46 | 47 | /*on top colors*/ 48 | --on-primary: var(--p-white); 49 | --on-secondary: var(); 50 | --on-active: var(--p-white); 51 | --on-background: var(--black); 52 | --on-alt-background: var(--p-white); 53 | --on-surface: var(--black); 54 | --on-error: var(--white); 55 | --on-confirmation: var(--white); 56 | --on-accent-badge: var(--p-white); 57 | 58 | /*borders*/ 59 | --border-surface: var(--l-grey); 60 | --border-alt-surface: var(--l-grey); 61 | --border-control: var(--d-grey); 62 | 63 | /*misc*/ 64 | --shadow-color: rgba(var(--black-col), 0.3); 65 | } 66 | -------------------------------------------------------------------------------- /assets/css/utils/_easings.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /* Cubic */ 3 | --easeInCubic : cubic-bezier(0.550, 0.055, 0.675, 0.190); 4 | --easeOutCubic : cubic-bezier(0.215, 0.610, 0.355, 1.000); 5 | --easeInOutCubic : cubic-bezier(0.645, 0.045, 0.355, 1.000); 6 | 7 | /* Circ */ 8 | --easeInCirc : cubic-bezier(0.600, 0.040, 0.980, 0.335); 9 | --easeOutCirc : cubic-bezier(0.075, 0.820, 0.165, 1.000); 10 | --easeInOutCirc : cubic-bezier(0.785, 0.135, 0.150, 0.860); 11 | 12 | /* Expo */ 13 | --easeInExpo : cubic-bezier(0.950, 0.050, 0.795, 0.035); 14 | --easeOutExpo : cubic-bezier(0.190, 1.000, 0.220, 1.000); 15 | --easeInOutExpo : cubic-bezier(1.000, 0.000, 0.000, 1.000); 16 | 17 | /* Quad */ 18 | --easeInQuad : cubic-bezier(0.550, 0.085, 0.680, 0.530); 19 | --easeOutQuad : cubic-bezier(0.250, 0.460, 0.450, 0.940); 20 | --easeInOutQuad : cubic-bezier(0.455, 0.030, 0.515, 0.955); 21 | 22 | /* Quart */ 23 | --easeInQuart : cubic-bezier(0.895, 0.030, 0.685, 0.220); 24 | --easeOutQuart : cubic-bezier(0.165, 0.840, 0.440, 1.000); 25 | --easeInOutQuart : cubic-bezier(0.770, 0.000, 0.175, 1.000); 26 | 27 | /* Quint */ 28 | --easeInQuint : cubic-bezier(0.755, 0.050, 0.855, 0.060); 29 | --easeOutQuint : cubic-bezier(0.230, 1.000, 0.320, 1.000); 30 | --easeInOutQuint : cubic-bezier(0.860, 0.000, 0.070, 1.000); 31 | 32 | /* Sine */ 33 | --easeInSine : cubic-bezier(0.470, 0.000, 0.745, 0.715); 34 | --easeOutSine : cubic-bezier(0.390, 0.575, 0.565, 1.000); 35 | --easeInOutSine : cubic-bezier(0.445, 0.050, 0.550, 0.950); 36 | 37 | /* Back */ 38 | --easeInBack : cubic-bezier(0.600, -0.280, 0.735, 0.045); 39 | --easeOutBack : cubic-bezier(0.175, 0.885, 0.320, 1.275); 40 | --easeInOutBack : cubic-bezier(0.680, -0.550, 0.265, 1.550); 41 | } -------------------------------------------------------------------------------- /assets/css/utils/_font.css: -------------------------------------------------------------------------------- 1 | 2 | /*fonts used in oneui web*/ 3 | @font-face { 4 | font-family: 'SamsungSharpSans-Regular'; 5 | src: url('../fonts/SamsungSharpSans-Regular.eot') format('embedded-opentype'), url('../fonts/SamsungSharpSans-Regular.woff') format('woff'), url('../fonts/SamsungSharpSans-Regular.ttf') format('truetype'), url('../fonts/SamsungSharpSans-Regular.svg#SamsungSharpSans-Regular') format('svg'); 6 | font-weight: normal; 7 | font-style: normal; 8 | font-display: auto; 9 | } 10 | 11 | @font-face { 12 | font-family: 'SamsungSharpSans-Bold'; 13 | src: url('../fonts/SamsungSharpSans-Bold.eot') format('embedded-opentype'), url('../fonts/SamsungSharpSans-Bold.woff') format('woff'), url('../fonts/SamsungSharpSans-Bold.ttf') format('truetype'), url('../fonts/SamsungSharpSans-Bold.svg#SamsungSharpSans-Bold') format('svg'); 14 | font-weight: normal; 15 | font-style: normal; 16 | font-display: auto; 17 | } 18 | 19 | @font-face { 20 | font-family: 'SamsungOne-Regular'; 21 | src: url('../fonts/samsungone-300-webfont.woff') format('woff'); 22 | font-weight: 300; 23 | font-style: normal; 24 | font-display: auto; 25 | } 26 | 27 | @font-face { 28 | font-family: 'SamsungOne-Regular'; 29 | src: url('../fonts/samsungone-600-webfont.woff') format('woff'); 30 | font-weight: 600; 31 | font-style: normal; 32 | font-display: auto; 33 | } 34 | 35 | @font-face { 36 | font-family: 'SamsungOne-Regular'; 37 | src: url('../fonts/samsungone-700-webfont.woff') format('woff'); 38 | font-weight: 700; 39 | font-style: normal; 40 | font-display: auto; 41 | } 42 | 43 | @font-face { 44 | font-family: 'SamsungOne-Regular'; 45 | src: url('../fonts/samsungone-800-webfont.woff') format('woff'); 46 | font-weight: 800; 47 | font-style: normal; 48 | font-display: auto; 49 | } 50 | 51 | body { 52 | font-family: 'SamsungOne-Regular', sans-serif; 53 | font-weight: 300; 54 | font-size: 13px; 55 | } 56 | 57 | @media (min-width: var(--s-tablet)) { 58 | font-size: 15px; 59 | } 60 | 61 | .oui-page-title { 62 | text-align: center; 63 | } 64 | 65 | h1 { 66 | padding: 1em 0; 67 | font-weight: 400; 68 | font-size: 2.5em; 69 | } 70 | 71 | h2 { 72 | font-weight: 500; 73 | font-size: 1.6em; 74 | } 75 | 76 | h3 { 77 | font-weight: 500; 78 | font-size: 1.4em; 79 | } 80 | 81 | p { 82 | line-height: 1.4em; 83 | } 84 | 85 | a { 86 | color: var(--app-accent); 87 | } 88 | 89 | a:hover, a:active { 90 | color: var(--active); 91 | } 92 | -------------------------------------------------------------------------------- /assets/css/utils/_frosted.css: -------------------------------------------------------------------------------- 1 | @supports (backdrop-filter: blur(10px)) { 2 | .oui-frosted { 3 | background-color: var(--frosted-background-color); 4 | backdrop-filter: blur(var(--frosted-blur-size)); 5 | box-shadow: 0 10px 5px -5px var(--shadow-color); 6 | } 7 | 8 | @media (prefers-reduced-transparency: reduce) { 9 | .oui-frosted { 10 | background-color: var(--background); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /assets/css/utils/_media.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --s-handset: 240px; 3 | --m-handset: 360px; 4 | --l-handset: 480px; 5 | 6 | --s-tablet: 600px; 7 | --m-tablet: 720px; 8 | --l-tablet: 840px; 9 | 10 | --desktop: 960px; 11 | } -------------------------------------------------------------------------------- /assets/css/utils/_misc.css: -------------------------------------------------------------------------------- 1 | .oui-noscroll { 2 | overflow: hidden; 3 | height: 100%; 4 | } -------------------------------------------------------------------------------- /assets/css/utils/_reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, menu, nav, section { 29 | display: block; 30 | } 31 | body { 32 | line-height: 1; 33 | } 34 | ol, ul { 35 | list-style: none; 36 | } 37 | blockquote, q { 38 | quotes: none; 39 | } 40 | blockquote:before, blockquote:after, 41 | q:before, q:after { 42 | content: ''; 43 | content: none; 44 | } 45 | table { 46 | border-collapse: collapse; 47 | border-spacing: 0; 48 | } 49 | 50 | /* apply a natural box layout model to all elements, but allowing components to change */ 51 | html { 52 | box-sizing: border-box; 53 | } 54 | *, *:before, *:after { 55 | box-sizing: inherit; 56 | } -------------------------------------------------------------------------------- /assets/css/utils/_spacing.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --margin-s: 16px; 3 | --margin-m: 24px; 4 | --margin-l: 32px; 5 | } -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-700/Noto-Sans-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-700/Noto-Sans-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2 -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff -------------------------------------------------------------------------------- /assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZGQ-inc/source/eba6c9c999f9f222c32e17a3ffe2d4d8c647dabe/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 -------------------------------------------------------------------------------- /assets/js/scale.fix.js: -------------------------------------------------------------------------------- 1 | (function(document) { 2 | var metas = document.getElementsByTagName('meta'), 3 | changeViewportContent = function(content) { 4 | for (var i = 0; i < metas.length; i++) { 5 | if (metas[i].name == "viewport") { 6 | metas[i].content = content; 7 | } 8 | } 9 | }, 10 | initialize = function() { 11 | changeViewportContent("width=device-width, minimum-scale=1.0, maximum-scale=1.0"); 12 | }, 13 | gestureStart = function() { 14 | changeViewportContent("width=device-width, minimum-scale=0.25, maximum-scale=1.6"); 15 | }, 16 | gestureEnd = function() { 17 | initialize(); 18 | }; 19 | 20 | 21 | if (navigator.userAgent.match(/iPhone/i)) { 22 | initialize(); 23 | 24 | document.addEventListener("touchstart", gestureStart, false); 25 | document.addEventListener("touchend", gestureEnd, false); 26 | } 27 | })(document); 28 | -------------------------------------------------------------------------------- /clipboard.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.11 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | (function webpackUniversalModuleDefinition(root, factory) { 8 | if (typeof exports === 'object' && typeof module === 'object') 9 | module.exports = factory(); 10 | else if (typeof define === 'function' && define.amd) 11 | define([], factory); 12 | else if (typeof exports === 'object') 13 | exports["ClipboardJS"] = factory(); 14 | else 15 | root["ClipboardJS"] = factory(); 16 | })(this, function () { 17 | return /******/ (function () { // webpackBootstrap 18 | /******/ var __webpack_modules__ = ({ 19 | 20 | /***/ 686: 21 | /***/ (function (__unused_webpack_module, __webpack_exports__, __webpack_require__) { 22 | 23 | "use strict"; 24 | 25 | // EXPORTS 26 | __webpack_require__.d(__webpack_exports__, { 27 | "default": function () { return /* binding */ clipboard; } 28 | }); 29 | 30 | // EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js 31 | var tiny_emitter = __webpack_require__(279); 32 | var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter); 33 | // EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js 34 | var listen = __webpack_require__(370); 35 | var listen_default = /*#__PURE__*/__webpack_require__.n(listen); 36 | // EXTERNAL MODULE: ./node_modules/select/src/select.js 37 | var src_select = __webpack_require__(817); 38 | var select_default = /*#__PURE__*/__webpack_require__.n(src_select); 39 | ;// CONCATENATED MODULE: ./src/common/command.js 40 | /** 41 | * Executes a given operation type. 42 | * @param {String} type 43 | * @return {Boolean} 44 | */ 45 | function command(type) { 46 | try { 47 | return document.execCommand(type); 48 | } catch (err) { 49 | return false; 50 | } 51 | } 52 | ;// CONCATENATED MODULE: ./src/actions/cut.js 53 | 54 | 55 | /** 56 | * Cut action wrapper. 57 | * @param {String|HTMLElement} target 58 | * @return {String} 59 | */ 60 | 61 | var ClipboardActionCut = function ClipboardActionCut(target) { 62 | var selectedText = select_default()(target); 63 | command('cut'); 64 | return selectedText; 65 | }; 66 | 67 | /* harmony default export */ var actions_cut = (ClipboardActionCut); 68 | ;// CONCATENATED MODULE: ./src/common/create-fake-element.js 69 | /** 70 | * Creates a fake textarea element with a value. 71 | * @param {String} value 72 | * @return {HTMLElement} 73 | */ 74 | function createFakeElement(value) { 75 | var isRTL = document.documentElement.getAttribute('dir') === 'rtl'; 76 | var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS 77 | 78 | fakeElement.style.fontSize = '12pt'; // Reset box model 79 | 80 | fakeElement.style.border = '0'; 81 | fakeElement.style.padding = '0'; 82 | fakeElement.style.margin = '0'; // Move element out of screen horizontally 83 | 84 | fakeElement.style.position = 'absolute'; 85 | fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically 86 | 87 | var yPosition = window.pageYOffset || document.documentElement.scrollTop; 88 | fakeElement.style.top = "".concat(yPosition, "px"); 89 | fakeElement.setAttribute('readonly', ''); 90 | fakeElement.value = value; 91 | return fakeElement; 92 | } 93 | ;// CONCATENATED MODULE: ./src/actions/copy.js 94 | 95 | 96 | 97 | /** 98 | * Create fake copy action wrapper using a fake element. 99 | * @param {String} target 100 | * @param {Object} options 101 | * @return {String} 102 | */ 103 | 104 | var fakeCopyAction = function fakeCopyAction(value, options) { 105 | var fakeElement = createFakeElement(value); 106 | options.container.appendChild(fakeElement); 107 | var selectedText = select_default()(fakeElement); 108 | command('copy'); 109 | fakeElement.remove(); 110 | return selectedText; 111 | }; 112 | /** 113 | * Copy action wrapper. 114 | * @param {String|HTMLElement} target 115 | * @param {Object} options 116 | * @return {String} 117 | */ 118 | 119 | 120 | var ClipboardActionCopy = function ClipboardActionCopy(target) { 121 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { 122 | container: document.body 123 | }; 124 | var selectedText = ''; 125 | 126 | if (typeof target === 'string') { 127 | selectedText = fakeCopyAction(target, options); 128 | } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) { 129 | // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange 130 | selectedText = fakeCopyAction(target.value, options); 131 | } else { 132 | selectedText = select_default()(target); 133 | command('copy'); 134 | } 135 | 136 | return selectedText; 137 | }; 138 | 139 | /* harmony default export */ var actions_copy = (ClipboardActionCopy); 140 | ;// CONCATENATED MODULE: ./src/actions/default.js 141 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } 142 | 143 | 144 | 145 | /** 146 | * Inner function which performs selection from either `text` or `target` 147 | * properties and then executes copy or cut operations. 148 | * @param {Object} options 149 | */ 150 | 151 | var ClipboardActionDefault = function ClipboardActionDefault() { 152 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 153 | // Defines base properties passed from constructor. 154 | var _options$action = options.action, 155 | action = _options$action === void 0 ? 'copy' : _options$action, 156 | container = options.container, 157 | target = options.target, 158 | text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'. 159 | 160 | if (action !== 'copy' && action !== 'cut') { 161 | throw new Error('Invalid "action" value, use either "copy" or "cut"'); 162 | } // Sets the `target` property using an element that will be have its content copied. 163 | 164 | 165 | if (target !== undefined) { 166 | if (target && _typeof(target) === 'object' && target.nodeType === 1) { 167 | if (action === 'copy' && target.hasAttribute('disabled')) { 168 | throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); 169 | } 170 | 171 | if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) { 172 | throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); 173 | } 174 | } else { 175 | throw new Error('Invalid "target" value, use a valid Element'); 176 | } 177 | } // Define selection strategy based on `text` property. 178 | 179 | 180 | if (text) { 181 | return actions_copy(text, { 182 | container: container 183 | }); 184 | } // Defines which selection strategy based on `target` property. 185 | 186 | 187 | if (target) { 188 | return action === 'cut' ? actions_cut(target) : actions_copy(target, { 189 | container: container 190 | }); 191 | } 192 | }; 193 | 194 | /* harmony default export */ var actions_default = (ClipboardActionDefault); 195 | ;// CONCATENATED MODULE: ./src/clipboard.js 196 | function clipboard_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return clipboard_typeof(obj); } 197 | 198 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 199 | 200 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 201 | 202 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 203 | 204 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } 205 | 206 | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 207 | 208 | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } 209 | 210 | function _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } 211 | 212 | function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 213 | 214 | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () { })); return true; } catch (e) { return false; } } 215 | 216 | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 217 | 218 | 219 | 220 | 221 | 222 | 223 | /** 224 | * Helper function to retrieve attribute value. 225 | * @param {String} suffix 226 | * @param {Element} element 227 | */ 228 | 229 | function getAttributeValue(suffix, element) { 230 | var attribute = "data-clipboard-".concat(suffix); 231 | 232 | if (!element.hasAttribute(attribute)) { 233 | return; 234 | } 235 | 236 | return element.getAttribute(attribute); 237 | } 238 | /** 239 | * Base class which takes one or more elements, adds event listeners to them, 240 | * and instantiates a new `ClipboardAction` on each click. 241 | */ 242 | 243 | 244 | var Clipboard = /*#__PURE__*/function (_Emitter) { 245 | _inherits(Clipboard, _Emitter); 246 | 247 | var _super = _createSuper(Clipboard); 248 | 249 | /** 250 | * @param {String|HTMLElement|HTMLCollection|NodeList} trigger 251 | * @param {Object} options 252 | */ 253 | function Clipboard(trigger, options) { 254 | var _this; 255 | 256 | _classCallCheck(this, Clipboard); 257 | 258 | _this = _super.call(this); 259 | 260 | _this.resolveOptions(options); 261 | 262 | _this.listenClick(trigger); 263 | 264 | return _this; 265 | } 266 | /** 267 | * Defines if attributes would be resolved using internal setter functions 268 | * or custom functions that were passed in the constructor. 269 | * @param {Object} options 270 | */ 271 | 272 | 273 | _createClass(Clipboard, [{ 274 | key: "resolveOptions", 275 | value: function resolveOptions() { 276 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 277 | this.action = typeof options.action === 'function' ? options.action : this.defaultAction; 278 | this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; 279 | this.text = typeof options.text === 'function' ? options.text : this.defaultText; 280 | this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body; 281 | } 282 | /** 283 | * Adds a click event listener to the passed trigger. 284 | * @param {String|HTMLElement|HTMLCollection|NodeList} trigger 285 | */ 286 | 287 | }, { 288 | key: "listenClick", 289 | value: function listenClick(trigger) { 290 | var _this2 = this; 291 | 292 | this.listener = listen_default()(trigger, 'click', function (e) { 293 | return _this2.onClick(e); 294 | }); 295 | } 296 | /** 297 | * Defines a new `ClipboardAction` on each click event. 298 | * @param {Event} e 299 | */ 300 | 301 | }, { 302 | key: "onClick", 303 | value: function onClick(e) { 304 | var trigger = e.delegateTarget || e.currentTarget; 305 | var action = this.action(trigger) || 'copy'; 306 | var text = actions_default({ 307 | action: action, 308 | container: this.container, 309 | target: this.target(trigger), 310 | text: this.text(trigger) 311 | }); // Fires an event based on the copy operation result. 312 | 313 | this.emit(text ? 'success' : 'error', { 314 | action: action, 315 | text: text, 316 | trigger: trigger, 317 | clearSelection: function clearSelection() { 318 | if (trigger) { 319 | trigger.focus(); 320 | } 321 | 322 | window.getSelection().removeAllRanges(); 323 | } 324 | }); 325 | } 326 | /** 327 | * Default `action` lookup function. 328 | * @param {Element} trigger 329 | */ 330 | 331 | }, { 332 | key: "defaultAction", 333 | value: function defaultAction(trigger) { 334 | return getAttributeValue('action', trigger); 335 | } 336 | /** 337 | * Default `target` lookup function. 338 | * @param {Element} trigger 339 | */ 340 | 341 | }, { 342 | key: "defaultTarget", 343 | value: function defaultTarget(trigger) { 344 | var selector = getAttributeValue('target', trigger); 345 | 346 | if (selector) { 347 | return document.querySelector(selector); 348 | } 349 | } 350 | /** 351 | * Allow fire programmatically a copy action 352 | * @param {String|HTMLElement} target 353 | * @param {Object} options 354 | * @returns Text copied. 355 | */ 356 | 357 | }, { 358 | key: "defaultText", 359 | 360 | /** 361 | * Default `text` lookup function. 362 | * @param {Element} trigger 363 | */ 364 | value: function defaultText(trigger) { 365 | return getAttributeValue('text', trigger); 366 | } 367 | /** 368 | * Destroy lifecycle. 369 | */ 370 | 371 | }, { 372 | key: "destroy", 373 | value: function destroy() { 374 | this.listener.destroy(); 375 | } 376 | }], [{ 377 | key: "copy", 378 | value: function copy(target) { 379 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { 380 | container: document.body 381 | }; 382 | return actions_copy(target, options); 383 | } 384 | /** 385 | * Allow fire programmatically a cut action 386 | * @param {String|HTMLElement} target 387 | * @returns Text cutted. 388 | */ 389 | 390 | }, { 391 | key: "cut", 392 | value: function cut(target) { 393 | return actions_cut(target); 394 | } 395 | /** 396 | * Returns the support of the given action, or all actions if no action is 397 | * given. 398 | * @param {String} [action] 399 | */ 400 | 401 | }, { 402 | key: "isSupported", 403 | value: function isSupported() { 404 | var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut']; 405 | var actions = typeof action === 'string' ? [action] : action; 406 | var support = !!document.queryCommandSupported; 407 | actions.forEach(function (action) { 408 | support = support && !!document.queryCommandSupported(action); 409 | }); 410 | return support; 411 | } 412 | }]); 413 | 414 | return Clipboard; 415 | }((tiny_emitter_default())); 416 | 417 | /* harmony default export */ var clipboard = (Clipboard); 418 | 419 | /***/ 420 | }), 421 | 422 | /***/ 828: 423 | /***/ (function (module) { 424 | 425 | var DOCUMENT_NODE_TYPE = 9; 426 | 427 | /** 428 | * A polyfill for Element.matches() 429 | */ 430 | if (typeof Element !== 'undefined' && !Element.prototype.matches) { 431 | var proto = Element.prototype; 432 | 433 | proto.matches = proto.matchesSelector || 434 | proto.mozMatchesSelector || 435 | proto.msMatchesSelector || 436 | proto.oMatchesSelector || 437 | proto.webkitMatchesSelector; 438 | } 439 | 440 | /** 441 | * Finds the closest parent that matches a selector. 442 | * 443 | * @param {Element} element 444 | * @param {String} selector 445 | * @return {Function} 446 | */ 447 | function closest(element, selector) { 448 | while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { 449 | if (typeof element.matches === 'function' && 450 | element.matches(selector)) { 451 | return element; 452 | } 453 | element = element.parentNode; 454 | } 455 | } 456 | 457 | module.exports = closest; 458 | 459 | 460 | /***/ 461 | }), 462 | 463 | /***/ 438: 464 | /***/ (function (module, __unused_webpack_exports, __webpack_require__) { 465 | 466 | var closest = __webpack_require__(828); 467 | 468 | /** 469 | * Delegates event to a selector. 470 | * 471 | * @param {Element} element 472 | * @param {String} selector 473 | * @param {String} type 474 | * @param {Function} callback 475 | * @param {Boolean} useCapture 476 | * @return {Object} 477 | */ 478 | function _delegate(element, selector, type, callback, useCapture) { 479 | var listenerFn = listener.apply(this, arguments); 480 | 481 | element.addEventListener(type, listenerFn, useCapture); 482 | 483 | return { 484 | destroy: function () { 485 | element.removeEventListener(type, listenerFn, useCapture); 486 | } 487 | } 488 | } 489 | 490 | /** 491 | * Delegates event to a selector. 492 | * 493 | * @param {Element|String|Array} [elements] 494 | * @param {String} selector 495 | * @param {String} type 496 | * @param {Function} callback 497 | * @param {Boolean} useCapture 498 | * @return {Object} 499 | */ 500 | function delegate(elements, selector, type, callback, useCapture) { 501 | // Handle the regular Element usage 502 | if (typeof elements.addEventListener === 'function') { 503 | return _delegate.apply(null, arguments); 504 | } 505 | 506 | // Handle Element-less usage, it defaults to global delegation 507 | if (typeof type === 'function') { 508 | // Use `document` as the first parameter, then apply arguments 509 | // This is a short way to .unshift `arguments` without running into deoptimizations 510 | return _delegate.bind(null, document).apply(null, arguments); 511 | } 512 | 513 | // Handle Selector-based usage 514 | if (typeof elements === 'string') { 515 | elements = document.querySelectorAll(elements); 516 | } 517 | 518 | // Handle Array-like based usage 519 | return Array.prototype.map.call(elements, function (element) { 520 | return _delegate(element, selector, type, callback, useCapture); 521 | }); 522 | } 523 | 524 | /** 525 | * Finds closest match and invokes callback. 526 | * 527 | * @param {Element} element 528 | * @param {String} selector 529 | * @param {String} type 530 | * @param {Function} callback 531 | * @return {Function} 532 | */ 533 | function listener(element, selector, type, callback) { 534 | return function (e) { 535 | e.delegateTarget = closest(e.target, selector); 536 | 537 | if (e.delegateTarget) { 538 | callback.call(element, e); 539 | } 540 | } 541 | } 542 | 543 | module.exports = delegate; 544 | 545 | 546 | /***/ 547 | }), 548 | 549 | /***/ 879: 550 | /***/ (function (__unused_webpack_module, exports) { 551 | 552 | /** 553 | * Check if argument is a HTML element. 554 | * 555 | * @param {Object} value 556 | * @return {Boolean} 557 | */ 558 | exports.node = function (value) { 559 | return value !== undefined 560 | && value instanceof HTMLElement 561 | && value.nodeType === 1; 562 | }; 563 | 564 | /** 565 | * Check if argument is a list of HTML elements. 566 | * 567 | * @param {Object} value 568 | * @return {Boolean} 569 | */ 570 | exports.nodeList = function (value) { 571 | var type = Object.prototype.toString.call(value); 572 | 573 | return value !== undefined 574 | && (type === '[object NodeList]' || type === '[object HTMLCollection]') 575 | && ('length' in value) 576 | && (value.length === 0 || exports.node(value[0])); 577 | }; 578 | 579 | /** 580 | * Check if argument is a string. 581 | * 582 | * @param {Object} value 583 | * @return {Boolean} 584 | */ 585 | exports.string = function (value) { 586 | return typeof value === 'string' 587 | || value instanceof String; 588 | }; 589 | 590 | /** 591 | * Check if argument is a function. 592 | * 593 | * @param {Object} value 594 | * @return {Boolean} 595 | */ 596 | exports.fn = function (value) { 597 | var type = Object.prototype.toString.call(value); 598 | 599 | return type === '[object Function]'; 600 | }; 601 | 602 | 603 | /***/ 604 | }), 605 | 606 | /***/ 370: 607 | /***/ (function (module, __unused_webpack_exports, __webpack_require__) { 608 | 609 | var is = __webpack_require__(879); 610 | var delegate = __webpack_require__(438); 611 | 612 | /** 613 | * Validates all params and calls the right 614 | * listener function based on its target type. 615 | * 616 | * @param {String|HTMLElement|HTMLCollection|NodeList} target 617 | * @param {String} type 618 | * @param {Function} callback 619 | * @return {Object} 620 | */ 621 | function listen(target, type, callback) { 622 | if (!target && !type && !callback) { 623 | throw new Error('Missing required arguments'); 624 | } 625 | 626 | if (!is.string(type)) { 627 | throw new TypeError('Second argument must be a String'); 628 | } 629 | 630 | if (!is.fn(callback)) { 631 | throw new TypeError('Third argument must be a Function'); 632 | } 633 | 634 | if (is.node(target)) { 635 | return listenNode(target, type, callback); 636 | } 637 | else if (is.nodeList(target)) { 638 | return listenNodeList(target, type, callback); 639 | } 640 | else if (is.string(target)) { 641 | return listenSelector(target, type, callback); 642 | } 643 | else { 644 | throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList'); 645 | } 646 | } 647 | 648 | /** 649 | * Adds an event listener to a HTML element 650 | * and returns a remove listener function. 651 | * 652 | * @param {HTMLElement} node 653 | * @param {String} type 654 | * @param {Function} callback 655 | * @return {Object} 656 | */ 657 | function listenNode(node, type, callback) { 658 | node.addEventListener(type, callback); 659 | 660 | return { 661 | destroy: function () { 662 | node.removeEventListener(type, callback); 663 | } 664 | } 665 | } 666 | 667 | /** 668 | * Add an event listener to a list of HTML elements 669 | * and returns a remove listener function. 670 | * 671 | * @param {NodeList|HTMLCollection} nodeList 672 | * @param {String} type 673 | * @param {Function} callback 674 | * @return {Object} 675 | */ 676 | function listenNodeList(nodeList, type, callback) { 677 | Array.prototype.forEach.call(nodeList, function (node) { 678 | node.addEventListener(type, callback); 679 | }); 680 | 681 | return { 682 | destroy: function () { 683 | Array.prototype.forEach.call(nodeList, function (node) { 684 | node.removeEventListener(type, callback); 685 | }); 686 | } 687 | } 688 | } 689 | 690 | /** 691 | * Add an event listener to a selector 692 | * and returns a remove listener function. 693 | * 694 | * @param {String} selector 695 | * @param {String} type 696 | * @param {Function} callback 697 | * @return {Object} 698 | */ 699 | function listenSelector(selector, type, callback) { 700 | return delegate(document.body, selector, type, callback); 701 | } 702 | 703 | module.exports = listen; 704 | 705 | 706 | /***/ 707 | }), 708 | 709 | /***/ 817: 710 | /***/ (function (module) { 711 | 712 | function select(element) { 713 | var selectedText; 714 | 715 | if (element.nodeName === 'SELECT') { 716 | element.focus(); 717 | 718 | selectedText = element.value; 719 | } 720 | else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') { 721 | var isReadOnly = element.hasAttribute('readonly'); 722 | 723 | if (!isReadOnly) { 724 | element.setAttribute('readonly', ''); 725 | } 726 | 727 | element.select(); 728 | element.setSelectionRange(0, element.value.length); 729 | 730 | if (!isReadOnly) { 731 | element.removeAttribute('readonly'); 732 | } 733 | 734 | selectedText = element.value; 735 | } 736 | else { 737 | if (element.hasAttribute('contenteditable')) { 738 | element.focus(); 739 | } 740 | 741 | var selection = window.getSelection(); 742 | var range = document.createRange(); 743 | 744 | range.selectNodeContents(element); 745 | selection.removeAllRanges(); 746 | selection.addRange(range); 747 | 748 | selectedText = selection.toString(); 749 | } 750 | 751 | return selectedText; 752 | } 753 | 754 | module.exports = select; 755 | 756 | 757 | /***/ 758 | }), 759 | 760 | /***/ 279: 761 | /***/ (function (module) { 762 | 763 | function E() { 764 | // Keep this empty so it's easier to inherit from 765 | // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) 766 | } 767 | 768 | E.prototype = { 769 | on: function (name, callback, ctx) { 770 | var e = this.e || (this.e = {}); 771 | 772 | (e[name] || (e[name] = [])).push({ 773 | fn: callback, 774 | ctx: ctx 775 | }); 776 | 777 | return this; 778 | }, 779 | 780 | once: function (name, callback, ctx) { 781 | var self = this; 782 | function listener() { 783 | self.off(name, listener); 784 | callback.apply(ctx, arguments); 785 | }; 786 | 787 | listener._ = callback 788 | return this.on(name, listener, ctx); 789 | }, 790 | 791 | emit: function (name) { 792 | var data = [].slice.call(arguments, 1); 793 | var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); 794 | var i = 0; 795 | var len = evtArr.length; 796 | 797 | for (i; i < len; i++) { 798 | evtArr[i].fn.apply(evtArr[i].ctx, data); 799 | } 800 | 801 | return this; 802 | }, 803 | 804 | off: function (name, callback) { 805 | var e = this.e || (this.e = {}); 806 | var evts = e[name]; 807 | var liveEvents = []; 808 | 809 | if (evts && callback) { 810 | for (var i = 0, len = evts.length; i < len; i++) { 811 | if (evts[i].fn !== callback && evts[i].fn._ !== callback) 812 | liveEvents.push(evts[i]); 813 | } 814 | } 815 | 816 | // Remove event from queue to prevent memory leak 817 | // Suggested by https://github.com/lazd 818 | // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 819 | 820 | (liveEvents.length) 821 | ? e[name] = liveEvents 822 | : delete e[name]; 823 | 824 | return this; 825 | } 826 | }; 827 | 828 | module.exports = E; 829 | module.exports.TinyEmitter = E; 830 | 831 | 832 | /***/ 833 | }) 834 | 835 | /******/ 836 | }); 837 | /************************************************************************/ 838 | /******/ // The module cache 839 | /******/ var __webpack_module_cache__ = {}; 840 | /******/ 841 | /******/ // The require function 842 | /******/ function __webpack_require__(moduleId) { 843 | /******/ // Check if module is in cache 844 | /******/ if (__webpack_module_cache__[moduleId]) { 845 | /******/ return __webpack_module_cache__[moduleId].exports; 846 | /******/ 847 | } 848 | /******/ // Create a new module (and put it into the cache) 849 | /******/ var module = __webpack_module_cache__[moduleId] = { 850 | /******/ // no module.id needed 851 | /******/ // no module.loaded needed 852 | /******/ exports: {} 853 | /******/ 854 | }; 855 | /******/ 856 | /******/ // Execute the module function 857 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 858 | /******/ 859 | /******/ // Return the exports of the module 860 | /******/ return module.exports; 861 | /******/ 862 | } 863 | /******/ 864 | /************************************************************************/ 865 | /******/ /* webpack/runtime/compat get default export */ 866 | /******/ !function () { 867 | /******/ // getDefaultExport function for compatibility with non-harmony modules 868 | /******/ __webpack_require__.n = function (module) { 869 | /******/ var getter = module && module.__esModule ? 870 | /******/ function () { return module['default']; } : 871 | /******/ function () { return module; }; 872 | /******/ __webpack_require__.d(getter, { a: getter }); 873 | /******/ return getter; 874 | /******/ 875 | }; 876 | /******/ 877 | }(); 878 | /******/ 879 | /******/ /* webpack/runtime/define property getters */ 880 | /******/ !function () { 881 | /******/ // define getter functions for harmony exports 882 | /******/ __webpack_require__.d = function (exports, definition) { 883 | /******/ for (var key in definition) { 884 | /******/ if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 885 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 886 | /******/ 887 | } 888 | /******/ 889 | } 890 | /******/ 891 | }; 892 | /******/ 893 | }(); 894 | /******/ 895 | /******/ /* webpack/runtime/hasOwnProperty shorthand */ 896 | /******/ !function () { 897 | /******/ __webpack_require__.o = function (obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } 898 | /******/ 899 | }(); 900 | /******/ 901 | /************************************************************************/ 902 | /******/ // module exports must be returned from runtime so entry inlining is disabled 903 | /******/ // startup 904 | /******/ // Load entry module and return exports 905 | /******/ return __webpack_require__(686); 906 | /******/ 907 | })() 908 | .default; 909 | }); -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | *** 6 | 7 | 8 | 9 | ## 开源阅读 10 | 11 | - [**阅读Beta版**下载地址](https://miaogongzi.lanzout.com/b01rgkhhe)(推荐)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 12 | 13 | - [**阅读3.0**下载地址](https://github.com/gedoor/legado)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 14 | 15 | - 24767个书源 16 | 17 | > ~~书源文件有点大,导入时间取决于设备性能,请耐心等待。~~ 18 | > 19 | > 最近发现导入时有概率导致应用卡死,原因是应用堆最大256MB,发生了OOM,现在拆分为多个文件,请逐个导入。 20 | > 21 | > 如果导入过慢,请连接代理或者本地导入。 22 | 23 | 一键导入1
24 | 一键导入2
25 | 一键导入3
26 | 一键导入4
27 | 一键导入5 28 | 29 | 网络导入: 30 | 31 | 38 | 39 | 40 | 41 | 本地导入: 42 | 43 | [点击下载json文件压缩包1](https://source-repo.zgqinc.gq/legado3/bookSource/bookSource_1.json)
44 | [点击下载json文件压缩包2](https://source-repo.zgqinc.gq/legado3/bookSource/bookSource_2.json)
45 | [点击下载json文件压缩包3](https://source-repo.zgqinc.gq/legado3/bookSource/bookSource_3.json)
46 | [点击下载json文件压缩包4](https://source-repo.zgqinc.gq/legado3/bookSource/bookSource_4.json)
47 | [点击下载json文件压缩包5](https://source-repo.zgqinc.gq/legado3/bookSource/bookSource_5.json) 48 | 49 | - 2695个RSS订阅源 50 | 51 | 一键导入 52 | 53 | 网络导入: 54 | 55 | ``` 56 | https://source-repo.zgqinc.gq/legado3/exportRssSource.json 57 | ``` 58 | 59 | 60 | 61 | 本地导入: 62 | 63 | [点击下载json文件](https://source-repo.zgqinc.gq/legado3/exportRssSource.json) 64 | 65 | - 335个TTS朗读引擎 66 | 67 | 一键导入 68 | 69 | - 189个净化规则 70 | 71 | 一键导入 72 | 73 | - 29个目录规则 74 | 75 | 一键导入 76 | 77 | 源仓库: 78 | 79 | - [link3.cc/yckceo](https://link3.cc/yckceo) 80 | 81 | Yiove 书源仓库: 82 | 83 | - [shuyuan.yiove.com](https://shuyuan.yiove.com/) 84 | 85 | Github项目: 86 | 87 | [windyhusky/PixivSource](https://github.com/windyhusky/PixivSource) 88 | 89 | 90 | 91 | ## Mihon 92 | 93 | - [**Mihon**下载地址](https://github.com/mihonapp/mihon)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 94 | 95 | [插件仓库](https://keiyoushi.github.io/extensions) 96 | 97 | [拷贝漫画插件](https://github.com/stevenyomi/copymanga) 98 | 99 | [更多fork](https://t.me/MihonReleases/112) 100 | 101 | 102 | 103 | ## TVBox 104 | 105 | 电报频道: 106 | 107 | [@Qiao_blog](https://t.me/Qiao_blog/521) 108 | 109 | 110 | 111 | ## Cimoc 112 | 113 | - [**Cimoc**下载地址](https://github.com/Haleydu/Cimoc)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 114 | 115 | 配套图源: 116 | 117 | ``` 118 | https://gitcode.net/Haleydutest/cupdate/-/raw/master/sourceBaseUrl.json 119 | ``` 120 | 121 | 122 | 123 | 124 | 125 | ## Flexbooru 126 | 127 | - [**Flexbooru**下载地址](https://t.me/ZGQincLiqun/2386)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 128 | 129 | - 16个booru网站配置 130 | 131 | 文件导入: 132 | 133 | [点击下载json文件](https://source-repo.zgqinc.gq/flexbooru/boorus_16.json) 134 | 135 | - [原消息](https://t.me/ZGQincLiqun/1431) 136 | 137 | 138 | 139 | ## IPTV 140 | 141 | - [**IPTV Pro**下载地址](https://play.google.com/store/apps/details?id=ru.iptvremote.android.iptv.pro)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 142 | 143 | - [**PotPlayer**下载地址](https://potplayer.daum.net/)![Windows](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+V2luZG93czwvdGl0bGU+PHBhdGggZmlsbD0iIzAwNzhENiIgZD0iTTAsMEgxMS4zNzdWMTEuMzcySDBaTTEyLjYyMywwSDI0VjExLjM3MkgxMi42MjNaTTAsMTIuNjIzSDExLjM3N1YyNEgwWm0xMi42MjMsMEgyNFYyNEgxMi42MjMiLz48L3N2Zz4=&logoColor=0078D6) 144 | 145 | - 流媒体M3U/M3U8链接分享 146 | 147 | Github项目: 148 | 149 | [iptv-org/iptv](https://github.com/iptv-org/iptv) 150 | 151 | [imDazui/Tvlist-awesome-m3u-m3u8](https://github.com/imDazui/Tvlist-awesome-m3u-m3u8) 152 | 153 | 电报频道: 154 | 155 | [@EXM3U](https://t.me/EXM3U) 156 | 157 | [@Qiao_blog](https://t.me/Qiao_blog/456) 158 | 159 | - [原消息](https://t.me/ZGQincLiqun/1240) 160 | 161 | 162 | 163 | ## Sync 164 | 165 | - [**Sync**下载地址](https://play.google.com/store/apps/details?id=com.resilio.sync)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 166 | 167 | - SyncKey分享 168 | 169 | 电报频道: 170 | 171 | [@shenkey](https://t.me/shenkey) 172 | 173 | - [原消息](https://t.me/ZGQincLiqun/1239) 174 | 175 | 176 | 177 | ## RSS 178 | 179 | - [**Pluma**下载地址](http://a.ruansky.com/up/261336/)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 180 | 181 | - [**Fluent 阅读器**下载地址](https://www.microsoft.com/store/productId/9P71FC94LRH8)![Windows](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+V2luZG93czwvdGl0bGU+PHBhdGggZmlsbD0iIzAwNzhENiIgZD0iTTAsMEgxMS4zNzdWMTEuMzcySDBaTTEyLjYyMywwSDI0VjExLjM3MkgxMi42MjNaTTAsMTIuNjIzSDExLjM3N1YyNEgwWm0xMi42MjMsMEgyNFYyNEgxMi42MjMiLz48L3N2Zz4=&logoColor=0078D6) 182 | 183 | - RSSHub 184 | 185 | [docs.rsshub.app](https://docs.rsshub.app/) 186 | 187 | - RSS资讯 188 | 189 | 电报频道: 190 | 191 | [@aboutrss](https://t.me/aboutrss) 192 | 193 | ## 异次元(已停更) 194 | 195 | - [**异次元漫画**下载地址](https://www.ghxi.com/ycymh.html)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 196 | 197 | - 590个图源 198 | 199 | 网络导入: 200 | 201 | ``` 202 | https://source-repo.zgqinc.gq/cospa/2023-02-01_590.txt 203 | ``` 204 | 205 | 206 | 207 | ## 海阔视界(已停更) 208 | 209 | - [**海阔视界**下载地址](https://www.ghxi.com/andhksj.html)![Android](https://img.shields.io/badge/--FFFFFF?style=flat-square&logo=Android&logoColor=3DDC84) 210 | 211 | - 288个规则 212 | 213 | 文件导入: 214 | 215 | [点击下载json文件](https://source-repo.zgqinc.gq/hiker/share-home-rules_288.json) 216 | 217 | - 应用数据 218 | 219 | 文件导入: 220 | 221 | [点击下载zip文件](https://source-repo.zgqinc.gq/hiker/hiker_data.zip) 222 | 223 | *** 224 | 225 | > *以上所有源**失效不补** 226 | > 227 | > *包含NSFW内容。 228 | 229 | *** 230 | 231 | ## 许可证 232 | 233 | ![CC](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png) 234 | 235 | 本作品采用[知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-sa/4.0/) 🄯 进行许可。 236 | -------------------------------------------------------------------------------- /package.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | --------------------------------------------------------------------------------