├── .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 |
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 | 
6 |
7 |
8 |
9 |
10 |
11 |
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)(推荐)
12 |
13 | - [**阅读3.0**下载地址](https://github.com/gedoor/legado)
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)
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)
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)
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)
142 |
143 | - [**PotPlayer**下载地址](https://potplayer.daum.net/)
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)
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/)
180 |
181 | - [**Fluent 阅读器**下载地址](https://www.microsoft.com/store/productId/9P71FC94LRH8)
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)
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)
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 | 
234 |
235 | 本作品采用[知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-sa/4.0/) 🄯 进行许可。
236 |
--------------------------------------------------------------------------------
/package.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------