├── .gitignore
├── 404.html
├── CNAME
├── LICENSE.txt
├── README.md
├── _config.yml
├── _includes
├── footer.html
└── header.html
├── _layouts
└── default.html
├── assets
├── appstore.svg
├── black-star.svg
├── css
│ ├── cayman
│ │ ├── jekyll-theme-cayman.css
│ │ ├── normalize.css
│ │ ├── rouge-github.css
│ │ └── variables.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
├── googleplay.svg
├── image
│ ├── 20220409_114620.jpg
│ ├── 20220410_121354.jpg
│ ├── AUB-NETWORK_logo.png
│ ├── AUB-NETWORK_speedtest.jpg
│ ├── EdNovasCloud_logo.gif
│ ├── EdNovasCloud_speedtest.jpg
│ ├── EteralNetwork_logo.png
│ ├── EteralNetwork_speedtest.jpg
│ ├── FUTURE-NETWORK_logo.png
│ ├── FUTURE-NETWORK_speedtest.png
│ ├── Nanocloud_logo.png
│ ├── RDT_20220410_1332237515022397726360175.jpg
│ ├── SPCLOUD_logo.ico
│ ├── SPCLOUD_speedtest.jpg
│ ├── SausageCloud_logo.ico
│ ├── SausageCloud_speedtest.jpg
│ ├── Screenshot_20220406-225445.jpg
│ ├── VMSSR_logo.png
│ ├── VMSSR_speedtest.jpg
│ ├── YUNCUN_logo.ico
│ ├── YUNCUN_speedtest.jpg
│ ├── YunGcun_logo.svg
│ ├── aoyoufei.png
│ ├── aoyoufei_speedtest.png
│ ├── baimituanzi_logo.jpg
│ ├── baimituanzi_speedtest.jpg
│ ├── ctzcloud_logo.jpg
│ ├── ctzcloud_speedtest.png
│ ├── iocone_logo.png
│ ├── iocone_speedtest.jpg
│ ├── qingwuyun_logo.png
│ ├── qingwuyun_speedtest.png
│ ├── qingyunti_logo.png
│ ├── qingyunti_speedtest.jpg
│ ├── sci-lab_speedtest.png
│ ├── tshl_cover.jpg
│ ├── tshl_logo.png
│ ├── vpnclient.png
│ └── vpnclient_black.png
├── min-oss.svg
└── min-tuijian.svg
├── blacklist-Wiki.html
├── favicon.ico
├── giveaway.html
├── index.md
├── internet.svg
├── sponsor
├── sponsor.html
├── sponsor_10.html
├── sponsor_11.html
├── sponsor_12.html
├── sponsor_13.html
├── sponsor_14.html
├── sponsor_15.html
├── sponsor_2.html
├── sponsor_3.html
├── sponsor_4.html
├── sponsor_5.html
├── sponsor_6.html
├── sponsor_7.html
├── sponsor_8.html
└── sponsor_9.html
└── sukka.html
/.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 |
--------------------------------------------------------------------------------
/CNAME:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 | > [!NOTE]
16 | >
17 | > 别忘了点个
18 |
19 | > [!NOTE]
20 | >
21 | > 欢迎提交`Issues`
22 |
23 | # To do(备忘录)
24 |
25 | - [ ] ~~更新Shadowrocket在线安装IPA版本,解决iOS15以上闪退的问题。~~
26 |
27 | - [x] 添加Clash Meta(Android)。
28 |
29 | - [ ] ~~添加Clash for Android重制版。~~
30 |
31 | - [x] 添加更多Android客户端。
32 |
33 | - [x] 添加更多Windows客户端。
34 |
35 | - [x] 添加更多iOS客户端(Quantumult, Surge, Kitsunebi, Potatso Lite)。
36 |
37 | - [x] 更新破解版VPN版本(1.1.1.1,vpnify)。
38 |
39 | - [ ] ~~再次更新破解版VPN版本。~~
40 |
41 | - [x] 更新安卓Speedtest。
42 |
43 | - [ ] ~~再次更新安卓Speedtest。~~
44 |
45 | - [ ] ~~添加更多可用的用于免费获取Shadowrocket的账号。~~
46 |
47 | - [x] 更新Android软件。
48 |
49 | - [ ] ~~再次更新Android软件。~~
50 |
51 | - [ ] ~~添加BlockaNet bot和IP tools bot。~~
52 |
53 | - [x] 由于Openit创始人疑似被抓,服务即将失效,考虑移除。
54 |
55 | - [x] 添加一些TG频道&群组(项目作者是频道管理)。
56 |
--------------------------------------------------------------------------------
/_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/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/_includes/footer.html
--------------------------------------------------------------------------------
/_includes/header.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/_includes/header.html
--------------------------------------------------------------------------------
/_layouts/default.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 节点订阅 β By ZGQ Inc.
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
33 |
34 |
35 |
36 | {{ content }}
37 |
38 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/assets/appstore.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/black-star.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/assets/css/cayman/jekyll-theme-cayman.css:
--------------------------------------------------------------------------------
1 | @import "normalize";
2 | @import "rouge-github";
3 | @import "variables";
4 | @import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700&display=swap');
5 |
6 | @mixin large {
7 | @media screen and (min-width: #{$large-breakpoint}) {
8 | @content;
9 | }
10 | }
11 |
12 | @mixin medium {
13 | @media screen and (min-width: #{$medium-breakpoint}) and (max-width: #{$large-breakpoint}) {
14 | @content;
15 | }
16 | }
17 |
18 | @mixin small {
19 | @media screen and (max-width: #{$medium-breakpoint}) {
20 | @content;
21 | }
22 | }
23 |
24 | * {
25 | box-sizing: border-box;
26 | }
27 |
28 | body {
29 | padding: 0;
30 | margin: 0;
31 | font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
32 | font-size: 16px;
33 | line-height: 1.5;
34 | color: $body-text-color;
35 | }
36 |
37 | #skip-to-content {
38 | height: 1px;
39 | width: 1px;
40 | position: absolute;
41 | overflow: hidden;
42 | top: -10px;
43 |
44 | &:focus {
45 | position: fixed;
46 | top: 10px;
47 | left: 10px;
48 | height: auto;
49 | width: auto;
50 | background: invert($body-link-color);
51 | outline: thick solid invert($body-link-color);
52 | }
53 | }
54 |
55 | a {
56 | color: $body-link-color;
57 | text-decoration: none;
58 |
59 | &:hover {
60 | text-decoration: underline;
61 | }
62 | }
63 |
64 | .btn {
65 | display: inline-block;
66 | margin-bottom: 1rem;
67 | color: rgba(255, 255, 255, 0.7);
68 | background-color: rgba(255, 255, 255, 0.08);
69 | border-color: rgba(255, 255, 255, 0.2);
70 | border-style: solid;
71 | border-width: 1px;
72 | border-radius: 0.3rem;
73 | transition: color 0.2s, background-color 0.2s, border-color 0.2s;
74 |
75 | &:hover {
76 | color: rgba(255, 255, 255, 0.8);
77 | text-decoration: none;
78 | background-color: rgba(255, 255, 255, 0.2);
79 | border-color: rgba(255, 255, 255, 0.3);
80 | }
81 |
82 | + .btn {
83 | margin-left: 1rem;
84 | }
85 |
86 | @include large {
87 | padding: 0.75rem 1rem;
88 | }
89 |
90 | @include medium {
91 | padding: 0.6rem 0.9rem;
92 | font-size: 0.9rem;
93 | }
94 |
95 | @include small {
96 | display: block;
97 | width: 100%;
98 | padding: 0.75rem;
99 | font-size: 0.9rem;
100 |
101 | + .btn {
102 | margin-top: 1rem;
103 | margin-left: 0;
104 | }
105 | }
106 | }
107 |
108 | .page-header {
109 | color: $header-heading-color;
110 | text-align: center;
111 | background-color: $header-bg-color;
112 | background-image: linear-gradient(120deg, $header-bg-color-secondary, $header-bg-color);
113 |
114 | @include large {
115 | padding: 5rem 6rem;
116 | }
117 |
118 | @include medium {
119 | padding: 3rem 4rem;
120 | }
121 |
122 | @include small {
123 | padding: 2rem 1rem;
124 | }
125 | }
126 |
127 | .project-name {
128 | margin-top: 0;
129 | margin-bottom: 0.1rem;
130 |
131 | @include large {
132 | font-size: 3.25rem;
133 | }
134 |
135 | @include medium {
136 | font-size: 2.25rem;
137 | }
138 |
139 | @include small {
140 | font-size: 1.75rem;
141 | }
142 | }
143 |
144 | .project-tagline {
145 | margin-bottom: 2rem;
146 | font-weight: normal;
147 | opacity: 0.7;
148 |
149 | @include large {
150 | font-size: 1.25rem;
151 | }
152 |
153 | @include medium {
154 | font-size: 1.15rem;
155 | }
156 |
157 | @include small {
158 | font-size: 1rem;
159 | }
160 | }
161 |
162 | .main-content {
163 | word-wrap: break-word;
164 |
165 | :first-child {
166 | margin-top: 0;
167 | }
168 |
169 | @include large {
170 | max-width: 64rem;
171 | padding: 2rem 6rem;
172 | margin: 0 auto;
173 | font-size: 1.1rem;
174 | }
175 |
176 | @include medium {
177 | padding: 2rem 4rem;
178 | font-size: 1.1rem;
179 | }
180 |
181 | @include small {
182 | padding: 2rem 1rem;
183 | font-size: 1rem;
184 | }
185 |
186 | kbd {
187 | background-color: #fafbfc;
188 | border: 1px solid #c6cbd1;
189 | border-bottom-color: #959da5;
190 | border-radius: 3px;
191 | box-shadow: inset 0 -1px 0 #959da5;
192 | color: #444d56;
193 | display: inline-block;
194 | font-size: 11px;
195 | line-height: 10px;
196 | padding: 3px 5px;
197 | vertical-align: middle;
198 | }
199 |
200 | img {
201 | max-width: 100%;
202 | }
203 |
204 | h1,
205 | h2,
206 | h3,
207 | h4,
208 | h5,
209 | h6 {
210 | margin-top: 2rem;
211 | margin-bottom: 1rem;
212 | font-weight: normal;
213 | color: $section-headings-color;
214 | }
215 |
216 | p {
217 | margin-bottom: 1em;
218 | }
219 |
220 | code {
221 | padding: 2px 4px;
222 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
223 | font-size: 0.9rem;
224 | color: $code-text-color;
225 | background-color: $code-bg-color;
226 | border-radius: 0.3rem;
227 | }
228 |
229 | pre {
230 | padding: 0.8rem;
231 | margin-top: 0;
232 | margin-bottom: 1rem;
233 | font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace;
234 | color: $code-text-color;
235 | word-wrap: normal;
236 | background-color: $code-bg-color;
237 | border: solid 1px $border-color;
238 | border-radius: 0.3rem;
239 |
240 | > code {
241 | padding: 0;
242 | margin: 0;
243 | font-size: 0.9rem;
244 | color: $code-text-color;
245 | word-break: normal;
246 | white-space: pre;
247 | background: transparent;
248 | border: 0;
249 | }
250 | }
251 |
252 | .highlight {
253 | margin-bottom: 1rem;
254 |
255 | pre {
256 | margin-bottom: 0;
257 | word-break: normal;
258 | }
259 | }
260 |
261 | .highlight pre,
262 | pre {
263 | padding: 0.8rem;
264 | overflow: auto;
265 | font-size: 0.9rem;
266 | line-height: 1.45;
267 | border-radius: 0.3rem;
268 | -webkit-overflow-scrolling: touch;
269 | }
270 |
271 | pre code,
272 | pre tt {
273 | display: inline;
274 | max-width: initial;
275 | padding: 0;
276 | margin: 0;
277 | overflow: initial;
278 | line-height: inherit;
279 | word-wrap: normal;
280 | background-color: transparent;
281 | border: 0;
282 |
283 | &:before,
284 | &:after {
285 | content: normal;
286 | }
287 | }
288 |
289 | ul,
290 | ol {
291 | margin-top: 0;
292 | }
293 |
294 | blockquote {
295 | padding: 0 1rem;
296 | margin-left: 0;
297 | color: $blockquote-text-color;
298 | border-left: 0.3rem solid $border-color;
299 |
300 | > :first-child {
301 | margin-top: 0;
302 | }
303 |
304 | > :last-child {
305 | margin-bottom: 0;
306 | }
307 | }
308 |
309 | table {
310 | display: block;
311 | width: 100%;
312 | overflow: auto;
313 | word-break: normal;
314 | word-break: keep-all; // For Firefox to horizontally scroll wider tables.
315 | -webkit-overflow-scrolling: touch;
316 |
317 | th {
318 | font-weight: bold;
319 | }
320 |
321 | th,
322 | td {
323 | padding: 0.5rem 1rem;
324 | border: 1px solid $table-border-color;
325 | }
326 | }
327 |
328 | dl {
329 | padding: 0;
330 |
331 | dt {
332 | padding: 0;
333 | margin-top: 1rem;
334 | font-size: 1rem;
335 | font-weight: bold;
336 | }
337 |
338 | dd {
339 | padding: 0;
340 | margin-bottom: 1rem;
341 | }
342 | }
343 |
344 | hr {
345 | height: 2px;
346 | padding: 0;
347 | margin: 1rem 0;
348 | background-color: $hr-border-color;
349 | border: 0;
350 | }
351 | }
352 |
353 | .site-footer {
354 | padding-top: 2rem;
355 | margin-top: 2rem;
356 | border-top: solid 1px $hr-border-color;
357 |
358 | @include large {
359 | font-size: 1rem;
360 | }
361 |
362 | @include medium {
363 | font-size: 1rem;
364 | }
365 |
366 | @include small {
367 | font-size: 0.9rem;
368 | }
369 | }
370 |
371 | .site-footer-owner {
372 | display: block;
373 | font-weight: bold;
374 | }
375 |
376 | .site-footer-credits {
377 | color: $blockquote-text-color;
378 | }
379 |
--------------------------------------------------------------------------------
/assets/css/cayman/normalize.css:
--------------------------------------------------------------------------------
1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */
2 |
3 | /**
4 | * 1. Set default font family to sans-serif.
5 | * 2. Prevent iOS text size adjust after orientation change, without disabling
6 | * user zoom.
7 | */
8 |
9 | html {
10 | font-family: sans-serif; /* 1 */
11 | -ms-text-size-adjust: 100%; /* 2 */
12 | -webkit-text-size-adjust: 100%; /* 2 */
13 | }
14 |
15 | /**
16 | * Remove default margin.
17 | */
18 |
19 | body {
20 | margin: 0;
21 | }
22 |
23 | /* HTML5 display definitions
24 | ========================================================================== */
25 |
26 | /**
27 | * Correct `block` display not defined for any HTML5 element in IE 8/9.
28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11
29 | * and Firefox.
30 | * Correct `block` display not defined for `main` in IE 11.
31 | */
32 |
33 | article,
34 | aside,
35 | details,
36 | figcaption,
37 | figure,
38 | footer,
39 | header,
40 | hgroup,
41 | main,
42 | menu,
43 | nav,
44 | section,
45 | summary {
46 | display: block;
47 | }
48 |
49 | /**
50 | * 1. Correct `inline-block` display not defined in IE 8/9.
51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
52 | */
53 |
54 | audio,
55 | canvas,
56 | progress,
57 | video {
58 | display: inline-block; /* 1 */
59 | vertical-align: baseline; /* 2 */
60 | }
61 |
62 | /**
63 | * Prevent modern browsers from displaying `audio` without controls.
64 | * Remove excess height in iOS 5 devices.
65 | */
66 |
67 | audio:not([controls]) {
68 | display: none;
69 | height: 0;
70 | }
71 |
72 | /**
73 | * Address `[hidden]` styling not present in IE 8/9/10.
74 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
75 | */
76 |
77 | [hidden],
78 | template {
79 | display: none;
80 | }
81 |
82 | /* Links
83 | ========================================================================== */
84 |
85 | /**
86 | * Remove the gray background color from active links in IE 10.
87 | */
88 |
89 | a {
90 | background-color: transparent;
91 | }
92 |
93 | /**
94 | * Improve readability when focused and also mouse hovered in all browsers.
95 | */
96 |
97 | a:active,
98 | a:hover {
99 | outline: 0;
100 | }
101 |
102 | /* Text-level semantics
103 | ========================================================================== */
104 |
105 | /**
106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
107 | */
108 |
109 | abbr[title] {
110 | border-bottom: 1px dotted;
111 | }
112 |
113 | /**
114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
115 | */
116 |
117 | b,
118 | strong {
119 | font-weight: bold;
120 | }
121 |
122 | /**
123 | * Address styling not present in Safari and Chrome.
124 | */
125 |
126 | dfn {
127 | font-style: italic;
128 | }
129 |
130 | /**
131 | * Address variable `h1` font-size and margin within `section` and `article`
132 | * contexts in Firefox 4+, Safari, and Chrome.
133 | */
134 |
135 | h1 {
136 | font-size: 2em;
137 | margin: 0.67em 0;
138 | }
139 |
140 | /**
141 | * Address styling not present in IE 8/9.
142 | */
143 |
144 | mark {
145 | background: #ff0;
146 | color: #000;
147 | }
148 |
149 | /**
150 | * Address inconsistent and variable font size in all browsers.
151 | */
152 |
153 | small {
154 | font-size: 80%;
155 | }
156 |
157 | /**
158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers.
159 | */
160 |
161 | sub,
162 | sup {
163 | font-size: 75%;
164 | line-height: 0;
165 | position: relative;
166 | vertical-align: baseline;
167 | }
168 |
169 | sup {
170 | top: -0.5em;
171 | }
172 |
173 | sub {
174 | bottom: -0.25em;
175 | }
176 |
177 | /* Embedded content
178 | ========================================================================== */
179 |
180 | /**
181 | * Remove border when inside `a` element in IE 8/9/10.
182 | */
183 |
184 | img {
185 | border: 0;
186 | }
187 |
188 | /**
189 | * Correct overflow not hidden in IE 9/10/11.
190 | */
191 |
192 | svg:not(:root) {
193 | overflow: hidden;
194 | }
195 |
196 | /* Grouping content
197 | ========================================================================== */
198 |
199 | /**
200 | * Address margin not present in IE 8/9 and Safari.
201 | */
202 |
203 | figure {
204 | margin: 1em 40px;
205 | }
206 |
207 | /**
208 | * Address differences between Firefox and other browsers.
209 | */
210 |
211 | hr {
212 | box-sizing: content-box;
213 | height: 0;
214 | }
215 |
216 | /**
217 | * Contain overflow in all browsers.
218 | */
219 |
220 | pre {
221 | overflow: auto;
222 | }
223 |
224 | /**
225 | * Address odd `em`-unit font size rendering in all browsers.
226 | */
227 |
228 | code,
229 | kbd,
230 | pre,
231 | samp {
232 | font-family: monospace, monospace;
233 | font-size: 1em;
234 | }
235 |
236 | /* Forms
237 | ========================================================================== */
238 |
239 | /**
240 | * Known limitation: by default, Chrome and Safari on OS X allow very limited
241 | * styling of `select`, unless a `border` property is set.
242 | */
243 |
244 | /**
245 | * 1. Correct color not being inherited.
246 | * Known issue: affects color of disabled elements.
247 | * 2. Correct font properties not being inherited.
248 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
249 | */
250 |
251 | button,
252 | input,
253 | optgroup,
254 | select,
255 | textarea {
256 | color: inherit; /* 1 */
257 | font: inherit; /* 2 */
258 | margin: 0; /* 3 */
259 | }
260 |
261 | /**
262 | * Address `overflow` set to `hidden` in IE 8/9/10/11.
263 | */
264 |
265 | button {
266 | overflow: visible;
267 | }
268 |
269 | /**
270 | * Address inconsistent `text-transform` inheritance for `button` and `select`.
271 | * All other form control elements do not inherit `text-transform` values.
272 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
273 | * Correct `select` style inheritance in Firefox.
274 | */
275 |
276 | button,
277 | select {
278 | text-transform: none;
279 | }
280 |
281 | /**
282 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
283 | * and `video` controls.
284 | * 2. Correct inability to style clickable `input` types in iOS.
285 | * 3. Improve usability and consistency of cursor style between image-type
286 | * `input` and others.
287 | */
288 |
289 | button,
290 | html input[type="button"], /* 1 */
291 | input[type="reset"],
292 | input[type="submit"] {
293 | -webkit-appearance: button; /* 2 */
294 | cursor: pointer; /* 3 */
295 | }
296 |
297 | /**
298 | * Re-set default cursor for disabled elements.
299 | */
300 |
301 | button[disabled],
302 | html input[disabled] {
303 | cursor: default;
304 | }
305 |
306 | /**
307 | * Remove inner padding and border in Firefox 4+.
308 | */
309 |
310 | button::-moz-focus-inner,
311 | input::-moz-focus-inner {
312 | border: 0;
313 | padding: 0;
314 | }
315 |
316 | /**
317 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in
318 | * the UA stylesheet.
319 | */
320 |
321 | input {
322 | line-height: normal;
323 | }
324 |
325 | /**
326 | * It's recommended that you don't attempt to style these elements.
327 | * Firefox's implementation doesn't respect box-sizing, padding, or width.
328 | *
329 | * 1. Address box sizing set to `content-box` in IE 8/9/10.
330 | * 2. Remove excess padding in IE 8/9/10.
331 | */
332 |
333 | input[type="checkbox"],
334 | input[type="radio"] {
335 | box-sizing: border-box; /* 1 */
336 | padding: 0; /* 2 */
337 | }
338 |
339 | /**
340 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain
341 | * `font-size` values of the `input`, it causes the cursor style of the
342 | * decrement button to change from `default` to `text`.
343 | */
344 |
345 | input[type="number"]::-webkit-inner-spin-button,
346 | input[type="number"]::-webkit-outer-spin-button {
347 | height: auto;
348 | }
349 |
350 | /**
351 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
352 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
353 | * (include `-moz` to future-proof).
354 | */
355 |
356 | input[type="search"] {
357 | -webkit-appearance: textfield; /* 1 */ /* 2 */
358 | box-sizing: content-box;
359 | }
360 |
361 | /**
362 | * Remove inner padding and search cancel button in Safari and Chrome on OS X.
363 | * Safari (but not Chrome) clips the cancel button when the search input has
364 | * padding (and `textfield` appearance).
365 | */
366 |
367 | input[type="search"]::-webkit-search-cancel-button,
368 | input[type="search"]::-webkit-search-decoration {
369 | -webkit-appearance: none;
370 | }
371 |
372 | /**
373 | * Define consistent border, margin, and padding.
374 | */
375 |
376 | fieldset {
377 | border: 1px solid #c0c0c0;
378 | margin: 0 2px;
379 | padding: 0.35em 0.625em 0.75em;
380 | }
381 |
382 | /**
383 | * 1. Correct `color` not being inherited in IE 8/9/10/11.
384 | * 2. Remove padding so people aren't caught out if they zero out fieldsets.
385 | */
386 |
387 | legend {
388 | border: 0; /* 1 */
389 | padding: 0; /* 2 */
390 | }
391 |
392 | /**
393 | * Remove default vertical scrollbar in IE 8/9/10/11.
394 | */
395 |
396 | textarea {
397 | overflow: auto;
398 | }
399 |
400 | /**
401 | * Don't inherit the `font-weight` (applied by a rule above).
402 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
403 | */
404 |
405 | optgroup {
406 | font-weight: bold;
407 | }
408 |
409 | /* Tables
410 | ========================================================================== */
411 |
412 | /**
413 | * Remove most spacing between table cells.
414 | */
415 |
416 | table {
417 | border-collapse: collapse;
418 | border-spacing: 0;
419 | }
420 |
421 | td,
422 | th {
423 | padding: 0;
424 | }
425 |
--------------------------------------------------------------------------------
/assets/css/cayman/rouge-github.css:
--------------------------------------------------------------------------------
1 | .highlight table td { padding: 5px; }
2 | .highlight table pre { margin: 0; }
3 | .highlight .cm {
4 | color: #999988;
5 | font-style: italic;
6 | }
7 | .highlight .cp {
8 | color: #999999;
9 | font-weight: bold;
10 | }
11 | .highlight .c1 {
12 | color: #999988;
13 | font-style: italic;
14 | }
15 | .highlight .cs {
16 | color: #999999;
17 | font-weight: bold;
18 | font-style: italic;
19 | }
20 | .highlight .c, .highlight .cd {
21 | color: #999988;
22 | font-style: italic;
23 | }
24 | .highlight .err {
25 | color: #a61717;
26 | background-color: #e3d2d2;
27 | }
28 | .highlight .gd {
29 | color: #000000;
30 | background-color: #ffdddd;
31 | }
32 | .highlight .ge {
33 | color: #000000;
34 | font-style: italic;
35 | }
36 | .highlight .gr {
37 | color: #aa0000;
38 | }
39 | .highlight .gh {
40 | color: #999999;
41 | }
42 | .highlight .gi {
43 | color: #000000;
44 | background-color: #ddffdd;
45 | }
46 | .highlight .go {
47 | color: #888888;
48 | }
49 | .highlight .gp {
50 | color: #555555;
51 | }
52 | .highlight .gs {
53 | font-weight: bold;
54 | }
55 | .highlight .gu {
56 | color: #aaaaaa;
57 | }
58 | .highlight .gt {
59 | color: #aa0000;
60 | }
61 | .highlight .kc {
62 | color: #000000;
63 | font-weight: bold;
64 | }
65 | .highlight .kd {
66 | color: #000000;
67 | font-weight: bold;
68 | }
69 | .highlight .kn {
70 | color: #000000;
71 | font-weight: bold;
72 | }
73 | .highlight .kp {
74 | color: #000000;
75 | font-weight: bold;
76 | }
77 | .highlight .kr {
78 | color: #000000;
79 | font-weight: bold;
80 | }
81 | .highlight .kt {
82 | color: #445588;
83 | font-weight: bold;
84 | }
85 | .highlight .k, .highlight .kv {
86 | color: #000000;
87 | font-weight: bold;
88 | }
89 | .highlight .mf {
90 | color: #009999;
91 | }
92 | .highlight .mh {
93 | color: #009999;
94 | }
95 | .highlight .il {
96 | color: #009999;
97 | }
98 | .highlight .mi {
99 | color: #009999;
100 | }
101 | .highlight .mo {
102 | color: #009999;
103 | }
104 | .highlight .m, .highlight .mb, .highlight .mx {
105 | color: #009999;
106 | }
107 | .highlight .sb {
108 | color: #d14;
109 | }
110 | .highlight .sc {
111 | color: #d14;
112 | }
113 | .highlight .sd {
114 | color: #d14;
115 | }
116 | .highlight .s2 {
117 | color: #d14;
118 | }
119 | .highlight .se {
120 | color: #d14;
121 | }
122 | .highlight .sh {
123 | color: #d14;
124 | }
125 | .highlight .si {
126 | color: #d14;
127 | }
128 | .highlight .sx {
129 | color: #d14;
130 | }
131 | .highlight .sr {
132 | color: #009926;
133 | }
134 | .highlight .s1 {
135 | color: #d14;
136 | }
137 | .highlight .ss {
138 | color: #990073;
139 | }
140 | .highlight .s {
141 | color: #d14;
142 | }
143 | .highlight .na {
144 | color: #008080;
145 | }
146 | .highlight .bp {
147 | color: #999999;
148 | }
149 | .highlight .nb {
150 | color: #0086B3;
151 | }
152 | .highlight .nc {
153 | color: #445588;
154 | font-weight: bold;
155 | }
156 | .highlight .no {
157 | color: #008080;
158 | }
159 | .highlight .nd {
160 | color: #3c5d5d;
161 | font-weight: bold;
162 | }
163 | .highlight .ni {
164 | color: #800080;
165 | }
166 | .highlight .ne {
167 | color: #990000;
168 | font-weight: bold;
169 | }
170 | .highlight .nf {
171 | color: #990000;
172 | font-weight: bold;
173 | }
174 | .highlight .nl {
175 | color: #990000;
176 | font-weight: bold;
177 | }
178 | .highlight .nn {
179 | color: #555555;
180 | }
181 | .highlight .nt {
182 | color: #000080;
183 | }
184 | .highlight .vc {
185 | color: #008080;
186 | }
187 | .highlight .vg {
188 | color: #008080;
189 | }
190 | .highlight .vi {
191 | color: #008080;
192 | }
193 | .highlight .nv {
194 | color: #008080;
195 | }
196 | .highlight .ow {
197 | color: #000000;
198 | font-weight: bold;
199 | }
200 | .highlight .o {
201 | color: #000000;
202 | font-weight: bold;
203 | }
204 | .highlight .w {
205 | color: #bbbbbb;
206 | }
207 | .highlight {
208 | background-color: #f8f8f8;
209 | }
210 |
--------------------------------------------------------------------------------
/assets/css/cayman/variables.css:
--------------------------------------------------------------------------------
1 | // Breakpoints
2 | $large-breakpoint: 64em !default;
3 | $medium-breakpoint: 42em !default;
4 |
5 | // Headers
6 | $header-heading-color: #fff !default;
7 | $header-bg-color: #159957 !default;
8 | $header-bg-color-secondary: #155799 !default;
9 |
10 | // Text
11 | $section-headings-color: #159957 !default;
12 | $body-text-color: #606c71 !default;
13 | $body-link-color: #1e6bb8 !default;
14 | $blockquote-text-color: #819198 !default;
15 |
16 | // Code
17 | $code-bg-color: #f3f6fa !default;
18 | $code-text-color: #567482 !default;
19 |
20 | // Borders
21 | $border-color: #dce6f0 !default;
22 | $table-border-color: #e9ebec !default;
23 | $hr-border-color: #eff0f1 !default;
24 |
--------------------------------------------------------------------------------
/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/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/SamsungSharpSans-Bold.eot
--------------------------------------------------------------------------------
/assets/css/fonts/SamsungSharpSans-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/SamsungSharpSans-Bold.ttf
--------------------------------------------------------------------------------
/assets/css/fonts/SamsungSharpSans-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/SamsungSharpSans-Bold.woff
--------------------------------------------------------------------------------
/assets/css/fonts/SamsungSharpSans-Regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/SamsungSharpSans-Regular.eot
--------------------------------------------------------------------------------
/assets/css/fonts/SamsungSharpSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/SamsungSharpSans-Regular.ttf
--------------------------------------------------------------------------------
/assets/css/fonts/SamsungSharpSans-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/SamsungSharpSans-Regular.woff
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-300-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-300-webfont.woff
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-300-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-300-webfont.woff2
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-600-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-600-webfont.woff
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-600-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-600-webfont.woff2
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-700-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-700-webfont.woff
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-700-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-700-webfont.woff2
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-800-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-800-webfont.ttf
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-800-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-800-webfont.woff
--------------------------------------------------------------------------------
/assets/css/fonts/samsungone-800-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/css/fonts/samsungone-800-webfont.woff2
--------------------------------------------------------------------------------
/assets/css/icons/bluetooth.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/check.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/css/icons/check_white.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/css/icons/handset.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/monitor.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/mute.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/palette.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
--------------------------------------------------------------------------------
/assets/css/icons/peripherals.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/phone.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/plus.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/assets/css/icons/previous.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/search.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/smarthome.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/vertical_ellipsis.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/css/icons/volume.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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/googleplay.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/image/20220409_114620.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/20220409_114620.jpg
--------------------------------------------------------------------------------
/assets/image/20220410_121354.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/20220410_121354.jpg
--------------------------------------------------------------------------------
/assets/image/AUB-NETWORK_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/AUB-NETWORK_logo.png
--------------------------------------------------------------------------------
/assets/image/AUB-NETWORK_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/AUB-NETWORK_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/EdNovasCloud_logo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/EdNovasCloud_logo.gif
--------------------------------------------------------------------------------
/assets/image/EdNovasCloud_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/EdNovasCloud_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/EteralNetwork_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/EteralNetwork_logo.png
--------------------------------------------------------------------------------
/assets/image/EteralNetwork_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/EteralNetwork_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/FUTURE-NETWORK_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/FUTURE-NETWORK_logo.png
--------------------------------------------------------------------------------
/assets/image/FUTURE-NETWORK_speedtest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/FUTURE-NETWORK_speedtest.png
--------------------------------------------------------------------------------
/assets/image/Nanocloud_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/Nanocloud_logo.png
--------------------------------------------------------------------------------
/assets/image/RDT_20220410_1332237515022397726360175.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/RDT_20220410_1332237515022397726360175.jpg
--------------------------------------------------------------------------------
/assets/image/SPCLOUD_logo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/SPCLOUD_logo.ico
--------------------------------------------------------------------------------
/assets/image/SPCLOUD_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/SPCLOUD_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/SausageCloud_logo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/SausageCloud_logo.ico
--------------------------------------------------------------------------------
/assets/image/SausageCloud_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/SausageCloud_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/Screenshot_20220406-225445.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/Screenshot_20220406-225445.jpg
--------------------------------------------------------------------------------
/assets/image/VMSSR_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/VMSSR_logo.png
--------------------------------------------------------------------------------
/assets/image/VMSSR_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/VMSSR_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/YUNCUN_logo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/YUNCUN_logo.ico
--------------------------------------------------------------------------------
/assets/image/YUNCUN_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/YUNCUN_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/YunGcun_logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/image/aoyoufei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/aoyoufei.png
--------------------------------------------------------------------------------
/assets/image/aoyoufei_speedtest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/aoyoufei_speedtest.png
--------------------------------------------------------------------------------
/assets/image/baimituanzi_logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/baimituanzi_logo.jpg
--------------------------------------------------------------------------------
/assets/image/baimituanzi_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/baimituanzi_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/ctzcloud_logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/ctzcloud_logo.jpg
--------------------------------------------------------------------------------
/assets/image/ctzcloud_speedtest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/ctzcloud_speedtest.png
--------------------------------------------------------------------------------
/assets/image/iocone_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/iocone_logo.png
--------------------------------------------------------------------------------
/assets/image/iocone_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/iocone_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/qingwuyun_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/qingwuyun_logo.png
--------------------------------------------------------------------------------
/assets/image/qingwuyun_speedtest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/qingwuyun_speedtest.png
--------------------------------------------------------------------------------
/assets/image/qingyunti_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/qingyunti_logo.png
--------------------------------------------------------------------------------
/assets/image/qingyunti_speedtest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/qingyunti_speedtest.jpg
--------------------------------------------------------------------------------
/assets/image/sci-lab_speedtest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/sci-lab_speedtest.png
--------------------------------------------------------------------------------
/assets/image/tshl_cover.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/tshl_cover.jpg
--------------------------------------------------------------------------------
/assets/image/tshl_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/tshl_logo.png
--------------------------------------------------------------------------------
/assets/image/vpnclient.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/vpnclient.png
--------------------------------------------------------------------------------
/assets/image/vpnclient_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ZGQ-inc/overthefirewall/a365fe84363943aef8ed142f3f096d2b501ba5d8/assets/image/vpnclient_black.png
--------------------------------------------------------------------------------
/assets/min-oss.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/min-tuijian.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/blacklist-Wiki.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 案例
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
2016
13 |
14 | 2016年8月24日,邓杰威因在网上销售用于翻墙的Shadowsocks服务“飞越SS”、“影梭云”被中国公安逮捕,并被东莞市人民检察院以犯“提供侵入、非法控制计算机信息系统程序、工具罪”向东莞市第一人民法院提交公诉,一审判有期徒刑九个月。”[105][106][107]
15 |
16 | 2016年下半年以来,河南籍研究生高搭建VPN,又研发出4个版本的加速器软件并出售相关账号并获利1100万元。后江苏泰州公安海陵分局将其移送至海陵区人民检察院审查并起诉。2019年12月27日该案开庭,没有当庭宣判[108]。
17 |
18 | 2016年夏天起,刘冰洋开始提供基于Shadowsocks的"翻墙"服务。2017年3月30日被河南省新野县公安局逮捕。2017年12月28日,刘冰洋被河南省新野县人民法院一审以提供侵入、非法控制计算机信息系统的程序、工具罪判处有期徒刑三年,缓刑五年,罚金100000元,并没收300000元。[110]
19 |
20 |
2017
21 |
22 | 2017年9月,在南京市某网络企业从事软件开发工作的赵某,因向他人出售翻墙服务,被南京浦口警方根据《中华人民共和国网络安全法》的有关规定处以行政拘留3天、没收相关收入共计1,080元的处罚。[111][112]
23 |
24 | 2017年10月,广西壮族自治区平南县检察院以涉嫌非法经营罪批准逮捕犯罪嫌疑人吴向洋并移送审查起诉[113],最终吴向洋因非法经营罪被法院判处没收经营所得80万元人民币,罚金50万元人民币、有期徒刑五年零六个月[114]。
25 |
26 | 钟祥市人刘小康在Shadowsocks基础上开发,自2017年1月起以名为“天眼通”的网站向网民提供翻墙服务。同年10月13日,刘小康被刑事拘留,11月15日被逮捕。判决书写到,被告人刘小康非法获利2662280.26元。湖北省咸宁市咸安区人民法院于2019年1月29日判决刘小康“有期徒刑三年,缓刑四年,并处罚金500000元,没收全部违法所得”。[115]
27 |
28 | 新密市人孙东洋(doub.io逗比根据地站长)于2016年4月起,使用家中电脑通过租用境外服务器创建网站,在网站上出售翻墙软件账号及引导使用教程,直接获利87704.05元。"到案"后,相关收入已退缴。2018年11月12日,孙东洋被公安机关传唤到案,2018年11月15日被新密市公安局取保候审,2019年3月21日被新密市人民检察院取保候审,2019年4月2日被新密市人民法院取保候审。2019年5月31日新密市人民法院判处孙东洋犯“提供侵入计算机信息系统程序、工具罪”,判处“有期徒刑三年,缓刑四年,并处罚金人民币二万元,退还赃款87704.05元,并将在案扣押的作案工具电脑予以追缴”。[116]
29 |
30 | 2017年10月,江苏无锡新吴警方拘捕包等3名翻墙软件"云梯VPN"制售团队成员,并将“云梯VPN”所有服务器连接切断[117][118]。
31 |
32 |
2018
33 |
34 | 2018年,岳阳人王、孙、欧阳在网上销售能提供"翻墙"服务的名为“粒子云加速器”的VPN软件。同年4月,销售软件行为被岳阳县公安局网技大队发现。同年5月,岳阳警方在岳阳市区抓捕王、孙和欧阳三人并将其行政拘留。截至被捕时,三人共向26人次销售了VPN软件,获利近千元[119]。
35 |
36 | 在某证券管理公司从事软件开发工作的戴,在2016年4月,创建了网站,并在网站上出售VPN翻墙软件的账户。同时租用中国境外服务商的一些服务器,向所出售的账户提供可以访问中国IP不能访问的外国网站服务。戴于2017年10月10日被抓获,截至2017年10月,戴共计向数百人次提供V服务。在法院审理期间,戴退还盈利所得人民币1万元。2018年10月,上海市宝山区人民法院宣判戴提供侵入、非法控制计算机信息系统程序、工具罪一案,判处有期徒刑三年,缓刑三年,并处罚金人民币一万元[120]。
37 |
38 |
2019
39 |
40 | 2019年1月初,一份印有重庆市荣昌区公安局公章的《被传唤人家属通知书》显示重庆荣昌的黄成城因涉嫌“擅自建立、使用非法定信道进行国际联网”被当地警方传唤[121][122][需要较佳来源]。
41 |
42 | 2019年1月4日,广东省南雄市公安局发布《韶雄公(网)行罚决字 [2019]1号》文件[123]。网络上流传的《行政处罚决定书》内容显示,“朱云枫被指控自2018年8月至12月,使用自己的手机安装蓝灯(英语:Lantern Pro)翻墙软件,连接自己的宽带进行翻墙上网”,后被认定为“擅自建立、使用非法定信道进行国际联网”而被警告并被罚款1000元。[121]。
43 |
44 | 2019年3月,自由亚洲电台报道称:四川蓬溪网民庞志勇被当地公安发现使用名为“无界一点通”的软件"翻墙",27日遂溪县公安局依据《计算机信息网络国际联网管理暂行规定》第六条对其施以行政处罚[125][需要较佳来源][126]。
45 |
46 | 2019年4月,山西省大同市浑源县任因“2016年以来多次使用SSR一键式搭建软件访问境外网站,2019年3月至今使用该软件非法获利1800元”被浑源县公安局根据《计算机信息网络国际联网管理暂行规定》第六条、第十四条以及《中华人民共和国计算机信息网络国际联网管理暂行规定实施办法》第七条、第二十二条第一款之规定作出“责令停止联网、警告并处罚款3000元、没收非法所得1800元的行政处罚”[127]。
47 |
48 | 2019年4月,周因“对外租售自己搭建的中国境外VPS服务器,并传授VPN通道搭建、使用方法”,被连云港警方以《中华人民共和国网络安全法》第27条、第63条为由行政拘留2日[129]。
49 |
50 | 2019年5月,浙江省海宁市一外贸企业因“由于业务需要”“使用‘翻墙软件’访问境外网站”而被当地警方认定为“擅自建立、使用非法定信道进行国际联网”并被根据《中华人民共和国计算机信息网络国际联网管理暂行规定》施以行政处罚。该新闻见于浙江日报报业集团旗下的浙江新闻网并被一些媒体转载,但在一段时间后被广泛删除[130]。
51 |
52 | 2019年10月31日,浙江省杭州市拱墅区检察院以提供侵入、非法控制计算机信息系统程序、工具罪,批准对朱某逮捕。检察院指控朱某以易创(济宁)网络科技有限责任公司法人代表身份于2019年4月至9月期间,与刘等人通过“全球服务商贸”“游戏淘卡联盟”等淘宝店提供"翻墙"服务。[131]。
53 |
54 | 2019年至2020年10月期间,浙江舟山市定海区环南街道一男子张韬使用蓝灯访问维基百科,结果被当地警方给予行政处罚[132][133]。
55 |
56 |
2020
57 |
58 | 2020年5月,陕西省安康市汉滨区公安通过新浪微博说他们“发现杨某于2019年9月安装并使用多款VPN翻墙软件“建立非法信道进行国际联网”,依《网络国际联网管理暂行规定》第六条、第十四条规定对其传唤并做出处罚[135]。”
59 |
60 | 2020年7月,重庆市北碚区18岁的吴姓少年在个人网站中发布了有关利用VPN、翻墙软件访问“境外网站”的教程。当局认定为这些文章为“违法有害信息”,以违反《计算机信息网络国际联网安全保护管理办法》第五条而对其“当场训诫”。[136][需要较佳来源]
61 | 2020年7月28日,湖南省常德市津市公安通过其微信公众号说“当地网安大队民警发现一居民陈自2019年2月起利用其购买的“Shadowrocket”"翻墙软件"“接入境外网络并浏览境外色情网站”。当地警察认定陈的行为属于“建立非法信道进行国际联网”,并以《中华人民共和国计算机信息网络国际联网管理暂行规定》第六条、第十四条之规定对陈进行了“警告处罚””。这一案件被归作“净网2020”活动的一部分。[137][138][需要较佳来源]
62 |
63 | 据浙江省政务服务网的行政处罚结果信息显示,自2020年1月1日至2020年9月4日,浙江省因“擅自建立、使用非法定信道进行国际联网”被行政处罚的案件共有58起,其中1起的处罚对象为企业,其余57起均为个人。[139]
64 |
65 | 2020年12月,辽宁省铁岭市开原市一人因传播VPN工具而遭到行政警告处罚[140]。
66 |
67 |
2021
68 |
69 | 2021年11月17日,江西省赣州市中级人民法院的微信公众号通报称,赣州一学生曹某搭建两个网站并提供“翻墙”软件下载,行为构成提供侵入、非法控制计算机信息系统程序、工具罪,被判处有期徒刑二年六个月,缓刑四年。同时江西省赣州市中级人民法院警告,民众“翻墙”到境外网站看综艺节目、查资料也属于违法行为。[141]
70 |
71 | 12月,银川市金凤区公安分局网安大队民警在工作中发现该区一网民利用“翻墙”软件在推特浏览色情内容,将该网民抓获。警方还发现另一网民使用其个人手机,利用shadowrocket软件翻墙注册并使用google邮箱。警方对两人给予警告并处罚款。[142]
72 |
73 |
2022
74 |
75 | 1月12日,河北省南宫市互联网信息办公室通过其微信公众号通报称,民警发现该市一刘姓居民使用非法定信道进行国际联网并浏览境外淫秽色情网站。该居民被“网安大队”处以行政警告。[143]
76 |
77 |