+2
-2
.github/workflows/golang-test-lint.yml
+2
-2
.github/workflows/golang-test-lint.yml
···
21
21
with:
22
22
go-version: '1.22'
23
23
- name: Dummy Static Files
24
-
run: touch bskyweb/static/js/blah.js && touch bskyweb/static/media/blah.txt
24
+
run: touch bskyweb/static/js/blah.js && touch bskyweb/static/css/blah.txt && touch bskyweb/static/media/blah.txt
25
25
- name: Check
26
26
run: cd bskyweb/ && make check
27
27
- name: Build (binary)
···
38
38
with:
39
39
go-version: '1.22'
40
40
- name: Dummy Static Files
41
-
run: touch bskyweb/static/js/blah.js && touch bskyweb/static/media/blah.txt
41
+
run: touch bskyweb/static/js/blah.js && touch bskyweb/static/css/blah.txt && touch bskyweb/static/media/blah.txt
42
42
- name: Lint
43
43
run: cd bskyweb/ && make lint
+3
-1
.prettierignore
+3
-1
.prettierignore
+1
Dockerfile.embedr
+1
Dockerfile.embedr
+4
bskyweb/.gitignore
+4
bskyweb/.gitignore
bskyweb/static/css/.gitkeep
bskyweb/static/css/.gitkeep
This is a binary file and will not be displayed.
-381
bskyweb/templates/base.html
-381
bskyweb/templates/base.html
···
32
32
<link rel="preload" as="font" type="font/otf" href="/static/media/Inter-BlackItalic.27b9f0ad06fd13a7b9da.otf">
33
33
-->
34
34
35
-
<style>
36
-
@font-face {
37
-
font-family: "Inter-Regular";
38
-
src: local("Inter-Regular"), url(/static/media/Inter-Regular.1f5ed03b6dd9fd1f9982.otf) format("font/otf");
39
-
font-weight: 400;
40
-
font-style: normal;
41
-
font-display: swap;
42
-
}
43
-
@font-face {
44
-
font-family: "Inter-Italic";
45
-
src: local("Inter-Italic"), url(/static/media/Inter-Italic.95778eb0c75dc956257e.otf) format("font/otf");
46
-
font-weight: 400;
47
-
font-style: italic;
48
-
font-display: swap;
49
-
}
50
-
/*
51
-
@font-face {
52
-
font-family: "Inter-Medium";
53
-
src: local("Inter-Medium"), url(/static/media/Inter-Medium.296aa2d65964269836b3.otf) format("font/otf");
54
-
font-weight: 500;
55
-
font-style: normal;
56
-
font-display: swap;
57
-
}
58
-
@font-face {
59
-
font-family: "Inter-MediumItalic";
60
-
src: local("Inter-MediumItalic"), url(/static/media/Inter-MediumItalic.0e57e17a6311368e2114.otf) format("font/otf");
61
-
font-weight: 500;
62
-
font-style: italic;
63
-
font-display: swap;
64
-
}
65
-
*/
66
-
@font-face {
67
-
font-family: "Inter-SemiBold";
68
-
src: local("Inter-SemiBold"), url(/static/media/Inter-SemiBold.2277990330981b8409bb.otf) format("font/otf");
69
-
font-weight: 600;
70
-
font-style: normal;
71
-
font-display: swap;
72
-
}
73
-
@font-face {
74
-
font-family: "Inter-SemiBoldItalic";
75
-
src: local("Inter-SemiBoldItalic"), url(/static/media/Inter-SemiBoldItalic.f62fea3df3a521d6c8a7.otf) format("font/otf");
76
-
font-weight: 600;
77
-
font-style: italic;
78
-
font-display: swap;
79
-
}
80
-
/*
81
-
@font-face {
82
-
font-family: "Inter-Bold";
83
-
src: local("Inter-Bold"), url(/static/media/Inter-Bold.8d330503e1d034ad68de.otf) format("font/otf");
84
-
font-weight: 700;
85
-
font-style: normal;
86
-
font-display: swap;
87
-
}
88
-
@font-face {
89
-
font-family: "Inter-BoldItalic";
90
-
src: local("Inter-BoldItalic"), url(/static/media/Inter-BoldItalic.bb17e63f9baa0d861a20.otf) format("font/otf");
91
-
font-weight: 700;
92
-
font-style: italic;
93
-
font-display: swap;
94
-
}
95
-
*/
96
-
@font-face {
97
-
font-family: "Inter-ExtraBold";
98
-
src: local("Inter-ExtraBold"), url(/static/media/Inter-ExtraBold.ff2581a193bf6b7e0b06.otf) format("font/otf");
99
-
font-weight: 800;
100
-
font-style: normal;
101
-
font-display: swap;
102
-
}
103
-
@font-face {
104
-
font-family: "Inter-ExtraBoldItalic";
105
-
src: local("Inter-ExtraBoldItalic"), url(/static/media/Inter-ExtraBoldItalic.0e50b40728d24d40fdf4.otf) format("font/otf");
106
-
font-weight: 800;
107
-
font-style: italic;
108
-
font-display: swap;
109
-
}
110
-
/*
111
-
@font-face {
112
-
font-family: "Inter-Black";
113
-
src: local("Inter-Black"), url(/static/media/Inter-Black.66e9a87f1c921e844ed4.otf) format("font/otf");
114
-
font-weight: 900;
115
-
font-style: normal;
116
-
font-display: swap;
117
-
}
118
-
@font-face {
119
-
font-family: "Inter-BlackItalic";
120
-
src: local("Inter-BlackItalic"), url(/static/media/Inter-BlackItalic.27b9f0ad06fd13a7b9da.otf) format("font/otf");
121
-
font-weight: 900;
122
-
font-style: italic;
123
-
font-display: swap;
124
-
}
125
-
*/
126
-
127
-
/**
128
-
* Extend the react-native-web reset:
129
-
* https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/StyleSheet/initialRules.js
130
-
*/
131
-
html,
132
-
body,
133
-
#root {
134
-
width: 100%;
135
-
/* To smooth any scrolling behavior */
136
-
-webkit-overflow-scrolling: touch;
137
-
margin: 0px;
138
-
padding: 0px;
139
-
/* Allows content to fill the viewport and go beyond the bottom */
140
-
min-height: 100%;
141
-
}
142
-
#root {
143
-
flex-shrink: 0;
144
-
flex-basis: auto;
145
-
flex-grow: 1;
146
-
display: flex;
147
-
flex: 1;
148
-
}
149
-
150
-
html {
151
-
/* Prevent text size change on orientation change https://gist.github.com/tfausak/2222823#file-ios-8-web-app-html-L138 */
152
-
-webkit-text-size-adjust: 100%;
153
-
height: calc(100% + env(safe-area-inset-top));
154
-
scrollbar-gutter: stable both-edges;
155
-
}
156
-
html, body {
157
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Liberation Sans", Helvetica, Arial, sans-serif;
158
-
}
159
-
160
-
#preload {
161
-
width: 100px;
162
-
position: fixed;
163
-
left: 50%;
164
-
top: 50%;
165
-
transform: translate(-50%, -50%);
166
-
}
167
-
168
-
/* Buttons and inputs have a font set by UA, so we'll have to reset that */
169
-
button, input, textarea {
170
-
font: inherit;
171
-
line-height: inherit;
172
-
}
173
-
174
-
/* Color theming */
175
-
/* Default will always be white */
176
-
:root {
177
-
--text: black;
178
-
--background: white;
179
-
--backgroundLight: hsl(211, 20%, 95%);
180
-
}
181
-
/* This gives us a black background when system is dark and we have not loaded the theme/color scheme values in JS */
182
-
@media (prefers-color-scheme: dark) {
183
-
:root {
184
-
--text: white;
185
-
--background: black;
186
-
--backgroundLight: hsl(211, 20%, 20%);
187
-
color-scheme: dark;
188
-
}
189
-
}
190
-
191
-
/* Overwrite those preferences with the selected theme */
192
-
html.theme--light {
193
-
--text: black;
194
-
--background: white;
195
-
--backgroundLight: hsl(211, 20%, 95%);
196
-
}
197
-
html.theme--dark {
198
-
--text: white;
199
-
--background: black;
200
-
--backgroundLight: hsl(211, 20%, 20%);
201
-
color-scheme: dark;
202
-
}
203
-
html.theme--dim {
204
-
--text: white;
205
-
--background: hsl(211, 20%, 4%);
206
-
--backgroundLight: hsl(211, 20%, 10%);
207
-
color-scheme: dark;
208
-
}
209
-
210
-
/* Remove autofill styles on Webkit */
211
-
input:autofill,
212
-
input:-webkit-autofill,
213
-
input:-webkit-autofill:hover,
214
-
input:-webkit-autofill:focus,
215
-
input:-webkit-autofill:active{
216
-
-webkit-background-clip: text;
217
-
-webkit-text-fill-color: var(--text);
218
-
transition: background-color 5000s ease-in-out 0s;
219
-
box-shadow: inset 0 0 20px 20px var(--background);
220
-
background: var(--background);
221
-
color: var(--text);
222
-
}
223
-
/* Force left-align date/time inputs on iOS mobile */
224
-
input::-webkit-date-and-time-value {
225
-
text-align: left;
226
-
}
227
-
228
-
body {
229
-
display: flex;
230
-
/* Allows you to scroll below the viewport; default value is visible */
231
-
overflow-y: auto;
232
-
overscroll-behavior-y: none;
233
-
text-rendering: optimizeLegibility;
234
-
background-color: var(--background);
235
-
-webkit-font-smoothing: antialiased;
236
-
-moz-osx-font-smoothing: grayscale;
237
-
-ms-overflow-style: scrollbar;
238
-
font-synthesis-weight: none;
239
-
}
240
-
241
-
/* Remove default link styling */
242
-
a {
243
-
color: inherit;
244
-
}
245
-
a[role="link"]:hover {
246
-
text-decoration: underline;
247
-
}
248
-
a[role="link"][data-no-underline="1"]:hover {
249
-
text-decoration: none;
250
-
}
251
-
252
-
/* Styling hacks */
253
-
*[data-word-wrap] {
254
-
word-break: break-word;
255
-
}
256
-
*[data-stable-gutters] {
257
-
scrollbar-gutter: stable both-edges;
258
-
}
259
-
260
-
/* ProseMirror */
261
-
.ProseMirror {
262
-
min-height: 140px;
263
-
}
264
-
.ProseMirror-dark {
265
-
color: white;
266
-
}
267
-
.ProseMirror p {
268
-
margin: 0;
269
-
}
270
-
.ProseMirror p.is-editor-empty:first-child::before {
271
-
color: #8d8e96;
272
-
content: attr(data-placeholder);
273
-
float: left;
274
-
height: 0;
275
-
pointer-events: none;
276
-
}
277
-
.ProseMirror .mention {
278
-
color: #0085ff;
279
-
}
280
-
.ProseMirror a,
281
-
.ProseMirror .autolink {
282
-
color: #0085ff;
283
-
}
284
-
/* OLLIE: TODO -- this is not accessible */
285
-
/* Remove focus state on inputs */
286
-
.ProseMirror-focused {
287
-
outline: 0;
288
-
}
289
-
textarea:focus,
290
-
input:focus {
291
-
outline: 0;
292
-
}
293
-
.tippy-content .items {
294
-
width: fit-content;
295
-
}
296
-
297
-
/* Tooltips */
298
-
[data-tooltip] {
299
-
position: relative;
300
-
z-index: 10;
301
-
}
302
-
[data-tooltip]::after {
303
-
content: attr(data-tooltip);
304
-
display: none;
305
-
position: absolute;
306
-
bottom: 0;
307
-
left: 50%;
308
-
transform: translateY(100%) translateY(8px) translateX(-50%);
309
-
padding: 4px 10px;
310
-
border-radius: 10px;
311
-
background: var(--backgroundLight);
312
-
color: var(--text);
313
-
text-align: center;
314
-
white-space: nowrap;
315
-
font-size: 12px;
316
-
z-index: 10;
317
-
}
318
-
[data-tooltip]::before {
319
-
content: '';
320
-
display: none;
321
-
position: absolute;
322
-
border-bottom: 6px solid var(--backgroundLight);
323
-
border-left: 6px solid transparent;
324
-
border-right: 6px solid transparent;
325
-
bottom: 0;
326
-
left: 50%;
327
-
transform: translateY(100%) translateY(2px) translateX(-50%);
328
-
z-index: 10;
329
-
}
330
-
[data-tooltip]:hover::after,
331
-
[data-tooltip]:hover::before {
332
-
display:block;
333
-
}
334
-
335
-
/* NativeDropdown component */
336
-
.radix-dropdown-item:focus,
337
-
.nativeDropdown-item:focus {
338
-
outline: none;
339
-
}
340
-
341
-
/* Spinner component */
342
-
@keyframes rotate {
343
-
0% {
344
-
transform: rotate(0deg);
345
-
}
346
-
100% {
347
-
transform: rotate(360deg);
348
-
}
349
-
}
350
-
.rotate-500ms {
351
-
position: absolute;
352
-
inset:0;
353
-
animation: rotate 500ms linear infinite;
354
-
}
355
-
356
-
@keyframes avatarHoverFadeIn {
357
-
from { opacity: 0; }
358
-
to { opacity: 1; }
359
-
}
360
-
361
-
@keyframes avatarHoverFadeOut {
362
-
from { opacity: 1; }
363
-
to { opacity: 0; }
364
-
}
365
-
366
-
.force-no-clicks > *,
367
-
.force-no-clicks * {
368
-
pointer-events: none !important;
369
-
}
370
-
371
-
input[type=range][orient=vertical] {
372
-
writing-mode: vertical-lr;
373
-
direction: rtl;
374
-
appearance: slider-vertical;
375
-
width: 16px;
376
-
vertical-align: bottom;
377
-
-webkit-appearance: none;
378
-
appearance: none;
379
-
background: transparent;
380
-
cursor: pointer;
381
-
}
382
-
383
-
input[type="range"][orient=vertical]::-webkit-slider-runnable-track {
384
-
background: white;
385
-
height: 100%;
386
-
width: 4px;
387
-
border-radius: 4px;
388
-
}
389
-
390
-
input[type="range"][orient=vertical]::-moz-range-track {
391
-
background: white;
392
-
height: 100%;
393
-
width: 4px;
394
-
border-radius: 4px;
395
-
}
396
-
397
-
input[type="range"]::-webkit-slider-thumb {
398
-
-webkit-appearance: none;
399
-
appearance: none;
400
-
border-radius: 50%;
401
-
background-color: white;
402
-
height: 16px;
403
-
width: 16px;
404
-
margin-left: -6px;
405
-
}
406
-
407
-
input[type="range"][orient=vertical]::-moz-range-thumb {
408
-
border: none;
409
-
border-radius: 50%;
410
-
background-color: white;
411
-
height: 16px;
412
-
width: 16px;
413
-
margin-left: -6px;
414
-
}
415
-
</style>
416
35
{% include "scripts.html" %}
417
36
<link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png">
418
37
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png">
+1
-1
package.json
+1
-1
package.json
···
15
15
"web": "expo start --web",
16
16
"use-build-number": "./scripts/useBuildNumberEnv.sh",
17
17
"use-build-number-with-bump": "./scripts/useBuildNumberEnvWithBump.sh",
18
-
"build-web": "expo export:web && node ./scripts/post-web-build.js && cp -v ./web-build/static/js/*.* ./bskyweb/static/js/ && cp -v ./web-build/static/media/* ./bskyweb/static/media/",
18
+
"build-web": "expo export:web && node ./scripts/post-web-build.js",
19
19
"build-all": "yarn intl:build && yarn use-build-number-with-bump eas build --platform all",
20
20
"build-ios": "yarn use-build-number-with-bump eas build -p ios",
21
21
"build-android": "yarn use-build-number-with-bump eas build -p android",
+24
-1
scripts/post-web-build.js
+24
-1
scripts/post-web-build.js
···
20
20
const outputFile = entrypoints
21
21
.map(name => {
22
22
const file = path.basename(name)
23
-
return `<script defer="defer" src="/static/js/${file}"></script>`
23
+
const ext = path.extname(file)
24
+
25
+
if (ext === '.js') {
26
+
return `<script defer="defer" src="/static/js/${file}"></script>`
27
+
}
28
+
if (ext === '.css') {
29
+
return `<link rel="stylesheet" href="/static/css/${file}">`
30
+
}
31
+
32
+
return ''
24
33
})
25
34
.join('\n')
26
35
fs.writeFileSync(templateFile, outputFile)
36
+
37
+
function copyFiles(sourceDir, targetDir) {
38
+
const files = fs.readdirSync(path.join(projectRoot, sourceDir))
39
+
files.forEach(file => {
40
+
const sourcePath = path.join(projectRoot, sourceDir, file)
41
+
const targetPath = path.join(projectRoot, targetDir, file)
42
+
fs.copyFileSync(sourcePath, targetPath)
43
+
console.log(`Copied ${sourcePath} to ${targetPath}`)
44
+
})
45
+
}
46
+
47
+
copyFiles('web-build/static/js', 'bskyweb/static/js')
48
+
copyFiles('web-build/static/css', 'bskyweb/static/css')
49
+
copyFiles('web-build/static/media', 'bskyweb/static/media')
+1
src/App.web.tsx
+1
src/App.web.tsx
+403
src/style.css
+403
src/style.css
···
1
+
@font-face {
2
+
font-family: 'Inter-Regular';
3
+
src: local('Inter-Regular'),
4
+
url(/static/media/Inter-Regular.1f5ed03b6dd9fd1f9982.otf) format('font/otf');
5
+
font-weight: 400;
6
+
font-style: normal;
7
+
font-display: swap;
8
+
}
9
+
@font-face {
10
+
font-family: 'Inter-Italic';
11
+
src: local('Inter-Italic'),
12
+
url(/static/media/Inter-Italic.95778eb0c75dc956257e.otf) format('font/otf');
13
+
font-weight: 400;
14
+
font-style: italic;
15
+
font-display: swap;
16
+
}
17
+
/*
18
+
@font-face {
19
+
font-family: "Inter-Medium";
20
+
src: local("Inter-Medium"), url(/static/media/Inter-Medium.296aa2d65964269836b3.otf) format("font/otf");
21
+
font-weight: 500;
22
+
font-style: normal;
23
+
font-display: swap;
24
+
}
25
+
@font-face {
26
+
font-family: "Inter-MediumItalic";
27
+
src: local("Inter-MediumItalic"), url(/static/media/Inter-MediumItalic.0e57e17a6311368e2114.otf) format("font/otf");
28
+
font-weight: 500;
29
+
font-style: italic;
30
+
font-display: swap;
31
+
}
32
+
*/
33
+
@font-face {
34
+
font-family: 'Inter-SemiBold';
35
+
src: local('Inter-SemiBold'),
36
+
url(/static/media/Inter-SemiBold.2277990330981b8409bb.otf)
37
+
format('font/otf');
38
+
font-weight: 600;
39
+
font-style: normal;
40
+
font-display: swap;
41
+
}
42
+
@font-face {
43
+
font-family: 'Inter-SemiBoldItalic';
44
+
src: local('Inter-SemiBoldItalic'),
45
+
url(/static/media/Inter-SemiBoldItalic.f62fea3df3a521d6c8a7.otf)
46
+
format('font/otf');
47
+
font-weight: 600;
48
+
font-style: italic;
49
+
font-display: swap;
50
+
}
51
+
/*
52
+
@font-face {
53
+
font-family: "Inter-Bold";
54
+
src: local("Inter-Bold"), url(/static/media/Inter-Bold.8d330503e1d034ad68de.otf) format("font/otf");
55
+
font-weight: 700;
56
+
font-style: normal;
57
+
font-display: swap;
58
+
}
59
+
@font-face {
60
+
font-family: "Inter-BoldItalic";
61
+
src: local("Inter-BoldItalic"), url(/static/media/Inter-BoldItalic.bb17e63f9baa0d861a20.otf) format("font/otf");
62
+
font-weight: 700;
63
+
font-style: italic;
64
+
font-display: swap;
65
+
}
66
+
*/
67
+
@font-face {
68
+
font-family: 'Inter-ExtraBold';
69
+
src: local('Inter-ExtraBold'),
70
+
url(/static/media/Inter-ExtraBold.ff2581a193bf6b7e0b06.otf)
71
+
format('font/otf');
72
+
font-weight: 800;
73
+
font-style: normal;
74
+
font-display: swap;
75
+
}
76
+
@font-face {
77
+
font-family: 'Inter-ExtraBoldItalic';
78
+
src: local('Inter-ExtraBoldItalic'),
79
+
url(/static/media/Inter-ExtraBoldItalic.0e50b40728d24d40fdf4.otf)
80
+
format('font/otf');
81
+
font-weight: 800;
82
+
font-style: italic;
83
+
font-display: swap;
84
+
}
85
+
/*
86
+
@font-face {
87
+
font-family: "Inter-Black";
88
+
src: local("Inter-Black"), url(/static/media/Inter-Black.66e9a87f1c921e844ed4.otf) format("font/otf");
89
+
font-weight: 900;
90
+
font-style: normal;
91
+
font-display: swap;
92
+
}
93
+
@font-face {
94
+
font-family: "Inter-BlackItalic";
95
+
src: local("Inter-BlackItalic"), url(/static/media/Inter-BlackItalic.27b9f0ad06fd13a7b9da.otf) format("font/otf");
96
+
font-weight: 900;
97
+
font-style: italic;
98
+
font-display: swap;
99
+
}
100
+
*/
101
+
102
+
/**
103
+
* Extend the react-native-web reset:
104
+
* https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/StyleSheet/initialRules.js
105
+
*/
106
+
html,
107
+
body,
108
+
#root {
109
+
width: 100%;
110
+
/* To smooth any scrolling behavior */
111
+
-webkit-overflow-scrolling: touch;
112
+
margin: 0px;
113
+
padding: 0px;
114
+
/* Allows content to fill the viewport and go beyond the bottom */
115
+
min-height: 100%;
116
+
}
117
+
#root {
118
+
flex-shrink: 0;
119
+
flex-basis: auto;
120
+
flex-grow: 1;
121
+
display: flex;
122
+
flex: 1;
123
+
}
124
+
125
+
html {
126
+
/* Prevent text size change on orientation change https://gist.github.com/tfausak/2222823#file-ios-8-web-app-html-L138 */
127
+
-webkit-text-size-adjust: 100%;
128
+
height: calc(100% + env(safe-area-inset-top));
129
+
scrollbar-gutter: stable both-edges;
130
+
}
131
+
html,
132
+
body {
133
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
134
+
'Liberation Sans', Helvetica, Arial, sans-serif;
135
+
}
136
+
137
+
#preload {
138
+
width: 100px;
139
+
position: fixed;
140
+
left: 50%;
141
+
top: 50%;
142
+
transform: translate(-50%, -50%);
143
+
}
144
+
145
+
/* Buttons and inputs have a font set by UA, so we'll have to reset that */
146
+
button,
147
+
input,
148
+
textarea {
149
+
font: inherit;
150
+
line-height: inherit;
151
+
}
152
+
153
+
/* Color theming */
154
+
/* Default will always be white */
155
+
:root {
156
+
--text: black;
157
+
--background: white;
158
+
--backgroundLight: hsl(211, 20%, 95%);
159
+
}
160
+
/* This gives us a black background when system is dark and we have not loaded the theme/color scheme values in JS */
161
+
@media (prefers-color-scheme: dark) {
162
+
:root {
163
+
--text: white;
164
+
--background: black;
165
+
--backgroundLight: hsl(211, 20%, 20%);
166
+
color-scheme: dark;
167
+
}
168
+
}
169
+
170
+
/* Overwrite those preferences with the selected theme */
171
+
html.theme--light {
172
+
--text: black;
173
+
--background: white;
174
+
--backgroundLight: hsl(211, 20%, 95%);
175
+
}
176
+
html.theme--dark {
177
+
--text: white;
178
+
--background: black;
179
+
--backgroundLight: hsl(211, 20%, 20%);
180
+
color-scheme: dark;
181
+
}
182
+
html.theme--dim {
183
+
--text: white;
184
+
--background: hsl(211, 20%, 4%);
185
+
--backgroundLight: hsl(211, 20%, 10%);
186
+
color-scheme: dark;
187
+
}
188
+
189
+
/* Remove autofill styles on Webkit */
190
+
input:autofill,
191
+
input:-webkit-autofill,
192
+
input:-webkit-autofill:hover,
193
+
input:-webkit-autofill:focus,
194
+
input:-webkit-autofill:active {
195
+
-webkit-background-clip: text;
196
+
-webkit-text-fill-color: var(--text);
197
+
transition: background-color 5000s ease-in-out 0s;
198
+
box-shadow: inset 0 0 20px 20px var(--background);
199
+
background: var(--background);
200
+
color: var(--text);
201
+
}
202
+
/* Force left-align date/time inputs on iOS mobile */
203
+
input::-webkit-date-and-time-value {
204
+
text-align: left;
205
+
}
206
+
207
+
body {
208
+
display: flex;
209
+
/* Allows you to scroll below the viewport; default value is visible */
210
+
overflow-y: auto;
211
+
overscroll-behavior-y: none;
212
+
text-rendering: optimizeLegibility;
213
+
background-color: var(--background);
214
+
-webkit-font-smoothing: antialiased;
215
+
-moz-osx-font-smoothing: grayscale;
216
+
-ms-overflow-style: scrollbar;
217
+
font-synthesis-weight: none;
218
+
}
219
+
220
+
/* Remove default link styling */
221
+
a {
222
+
color: inherit;
223
+
}
224
+
a[role='link']:hover {
225
+
text-decoration: underline;
226
+
}
227
+
a[role='link'][data-no-underline='1']:hover {
228
+
text-decoration: none;
229
+
}
230
+
231
+
/* Styling hacks */
232
+
*[data-word-wrap] {
233
+
word-break: break-word;
234
+
}
235
+
*[data-stable-gutters] {
236
+
scrollbar-gutter: stable both-edges;
237
+
}
238
+
239
+
/* ProseMirror */
240
+
.ProseMirror {
241
+
font: 18px -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
242
+
'Liberation Sans', Helvetica, Arial, sans-serif;
243
+
min-height: 140px;
244
+
}
245
+
.ProseMirror-dark {
246
+
color: white;
247
+
}
248
+
.ProseMirror p {
249
+
margin: 0;
250
+
}
251
+
.ProseMirror p.is-editor-empty:first-child::before {
252
+
color: #8d8e96;
253
+
content: attr(data-placeholder);
254
+
float: left;
255
+
height: 0;
256
+
pointer-events: none;
257
+
}
258
+
.ProseMirror .mention {
259
+
color: #0085ff;
260
+
}
261
+
.ProseMirror a,
262
+
.ProseMirror .autolink {
263
+
color: #0085ff;
264
+
}
265
+
/* OLLIE: TODO -- this is not accessible */
266
+
/* Remove focus state on inputs */
267
+
.ProseMirror-focused {
268
+
outline: 0;
269
+
}
270
+
textarea:focus,
271
+
input:focus {
272
+
outline: 0;
273
+
}
274
+
.tippy-content .items {
275
+
width: fit-content;
276
+
}
277
+
278
+
/* Tooltips */
279
+
[data-tooltip] {
280
+
position: relative;
281
+
z-index: 10;
282
+
}
283
+
[data-tooltip]::after {
284
+
content: attr(data-tooltip);
285
+
display: none;
286
+
position: absolute;
287
+
bottom: 0;
288
+
left: 50%;
289
+
transform: translateY(100%) translateY(8px) translateX(-50%);
290
+
padding: 4px 10px;
291
+
border-radius: 10px;
292
+
background: var(--backgroundLight);
293
+
color: var(--text);
294
+
text-align: center;
295
+
white-space: nowrap;
296
+
font-size: 12px;
297
+
z-index: 10;
298
+
}
299
+
[data-tooltip]::before {
300
+
content: '';
301
+
display: none;
302
+
position: absolute;
303
+
border-bottom: 6px solid var(--backgroundLight);
304
+
border-left: 6px solid transparent;
305
+
border-right: 6px solid transparent;
306
+
bottom: 0;
307
+
left: 50%;
308
+
transform: translateY(100%) translateY(2px) translateX(-50%);
309
+
z-index: 10;
310
+
}
311
+
[data-tooltip]:hover::after,
312
+
[data-tooltip]:hover::before {
313
+
display: block;
314
+
}
315
+
316
+
/* NativeDropdown component */
317
+
.radix-dropdown-item:focus,
318
+
.nativeDropdown-item:focus {
319
+
outline: none;
320
+
}
321
+
322
+
/* Spinner component */
323
+
@keyframes rotate {
324
+
0% {
325
+
transform: rotate(0deg);
326
+
}
327
+
100% {
328
+
transform: rotate(360deg);
329
+
}
330
+
}
331
+
.rotate-500ms {
332
+
position: absolute;
333
+
inset: 0;
334
+
animation: rotate 500ms linear infinite;
335
+
}
336
+
337
+
@keyframes avatarHoverFadeIn {
338
+
from {
339
+
opacity: 0;
340
+
}
341
+
to {
342
+
opacity: 1;
343
+
}
344
+
}
345
+
346
+
@keyframes avatarHoverFadeOut {
347
+
from {
348
+
opacity: 1;
349
+
}
350
+
to {
351
+
opacity: 0;
352
+
}
353
+
}
354
+
355
+
.force-no-clicks > *,
356
+
.force-no-clicks * {
357
+
pointer-events: none !important;
358
+
}
359
+
360
+
input[type='range'][orient='vertical'] {
361
+
writing-mode: vertical-lr;
362
+
direction: rtl;
363
+
appearance: slider-vertical;
364
+
width: 16px;
365
+
vertical-align: bottom;
366
+
-webkit-appearance: none;
367
+
appearance: none;
368
+
background: transparent;
369
+
cursor: pointer;
370
+
}
371
+
372
+
input[type='range'][orient='vertical']::-webkit-slider-runnable-track {
373
+
background: white;
374
+
height: 100%;
375
+
width: 4px;
376
+
border-radius: 4px;
377
+
}
378
+
379
+
input[type='range'][orient='vertical']::-moz-range-track {
380
+
background: white;
381
+
height: 100%;
382
+
width: 4px;
383
+
border-radius: 4px;
384
+
}
385
+
386
+
input[type='range']::-webkit-slider-thumb {
387
+
-webkit-appearance: none;
388
+
appearance: none;
389
+
border-radius: 50%;
390
+
background-color: white;
391
+
height: 16px;
392
+
width: 16px;
393
+
margin-left: -6px;
394
+
}
395
+
396
+
input[type='range'][orient='vertical']::-moz-range-thumb {
397
+
border: none;
398
+
border-radius: 50%;
399
+
background-color: white;
400
+
height: 16px;
401
+
width: 16px;
402
+
margin-left: -6px;
403
+
}
-382
web/index.html
-382
web/index.html
···
36
36
<link rel="preload" as="font" type="font/otf" href="/static/media/Inter-Black.66e9a87f1c921e844ed4.otf">
37
37
<link rel="preload" as="font" type="font/otf" href="/static/media/Inter-BlackItalic.27b9f0ad06fd13a7b9da.otf">
38
38
-->
39
-
40
-
<style>
41
-
@font-face {
42
-
font-family: "Inter-Regular";
43
-
src: local("Inter-Regular"), url(/static/media/Inter-Regular.1f5ed03b6dd9fd1f9982.otf) format("font/otf");
44
-
font-weight: 400;
45
-
font-style: normal;
46
-
font-display: swap;
47
-
}
48
-
@font-face {
49
-
font-family: "Inter-Italic";
50
-
src: local("Inter-Italic"), url(/static/media/Inter-Italic.95778eb0c75dc956257e.otf) format("font/otf");
51
-
font-weight: 400;
52
-
font-style: italic;
53
-
font-display: swap;
54
-
}
55
-
/*
56
-
@font-face {
57
-
font-family: "Inter-Medium";
58
-
src: local("Inter-Medium"), url(/static/media/Inter-Medium.296aa2d65964269836b3.otf) format("font/otf");
59
-
font-weight: 500;
60
-
font-style: normal;
61
-
font-display: swap;
62
-
}
63
-
@font-face {
64
-
font-family: "Inter-MediumItalic";
65
-
src: local("Inter-MediumItalic"), url(/static/media/Inter-MediumItalic.0e57e17a6311368e2114.otf) format("font/otf");
66
-
font-weight: 500;
67
-
font-style: italic;
68
-
font-display: swap;
69
-
}
70
-
*/
71
-
@font-face {
72
-
font-family: "Inter-SemiBold";
73
-
src: local("Inter-SemiBold"), url(/static/media/Inter-SemiBold.2277990330981b8409bb.otf) format("font/otf");
74
-
font-weight: 600;
75
-
font-style: normal;
76
-
font-display: swap;
77
-
}
78
-
@font-face {
79
-
font-family: "Inter-SemiBoldItalic";
80
-
src: local("Inter-SemiBoldItalic"), url(/static/media/Inter-SemiBoldItalic.f62fea3df3a521d6c8a7.otf) format("font/otf");
81
-
font-weight: 600;
82
-
font-style: italic;
83
-
font-display: swap;
84
-
}
85
-
/*
86
-
@font-face {
87
-
font-family: "Inter-Bold";
88
-
src: local("Inter-Bold"), url(/static/media/Inter-Bold.8d330503e1d034ad68de.otf) format("font/otf");
89
-
font-weight: 700;
90
-
font-style: normal;
91
-
font-display: swap;
92
-
}
93
-
@font-face {
94
-
font-family: "Inter-BoldItalic";
95
-
src: local("Inter-BoldItalic"), url(/static/media/Inter-BoldItalic.bb17e63f9baa0d861a20.otf) format("font/otf");
96
-
font-weight: 700;
97
-
font-style: italic;
98
-
font-display: swap;
99
-
}
100
-
*/
101
-
@font-face {
102
-
font-family: "Inter-ExtraBold";
103
-
src: local("Inter-ExtraBold"), url(/static/media/Inter-ExtraBold.ff2581a193bf6b7e0b06.otf) format("font/otf");
104
-
font-weight: 800;
105
-
font-style: normal;
106
-
font-display: swap;
107
-
}
108
-
@font-face {
109
-
font-family: "Inter-ExtraBoldItalic";
110
-
src: local("Inter-ExtraBoldItalic"), url(/static/media/Inter-ExtraBoldItalic.0e50b40728d24d40fdf4.otf) format("font/otf");
111
-
font-weight: 800;
112
-
font-style: italic;
113
-
font-display: swap;
114
-
}
115
-
/*
116
-
@font-face {
117
-
font-family: "Inter-Black";
118
-
src: local("Inter-Black"), url(/static/media/Inter-Black.66e9a87f1c921e844ed4.otf) format("font/otf");
119
-
font-weight: 900;
120
-
font-style: normal;
121
-
font-display: swap;
122
-
}
123
-
@font-face {
124
-
font-family: "Inter-BlackItalic";
125
-
src: local("Inter-BlackItalic"), url(/static/media/Inter-BlackItalic.27b9f0ad06fd13a7b9da.otf) format("font/otf");
126
-
font-weight: 900;
127
-
font-style: italic;
128
-
font-display: swap;
129
-
}
130
-
*/
131
-
132
-
/**
133
-
* Extend the react-native-web reset:
134
-
* https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/StyleSheet/initialRules.js
135
-
*/
136
-
html,
137
-
body,
138
-
#root {
139
-
width: 100%;
140
-
/* To smooth any scrolling behavior */
141
-
-webkit-overflow-scrolling: touch;
142
-
margin: 0px;
143
-
padding: 0px;
144
-
/* Allows content to fill the viewport and go beyond the bottom */
145
-
min-height: 100%;
146
-
}
147
-
#root {
148
-
flex-shrink: 0;
149
-
flex-basis: auto;
150
-
flex-grow: 1;
151
-
display: flex;
152
-
flex: 1;
153
-
}
154
-
155
-
html {
156
-
/* Prevent text size change on orientation change https://gist.github.com/tfausak/2222823#file-ios-8-web-app-html-L138 */
157
-
-webkit-text-size-adjust: 100%;
158
-
height: calc(100% + env(safe-area-inset-top));
159
-
scrollbar-gutter: stable both-edges;
160
-
}
161
-
html, body {
162
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Liberation Sans", Helvetica, Arial, sans-serif;
163
-
}
164
-
165
-
#preload {
166
-
width: 100px;
167
-
position: fixed;
168
-
left: 50%;
169
-
top: 50%;
170
-
transform: translate(-50%, -50%);
171
-
}
172
-
173
-
/* Buttons and inputs have a font set by UA, so we'll have to reset that */
174
-
button, input, textarea {
175
-
font: inherit;
176
-
line-height: inherit;
177
-
}
178
-
179
-
/* Color theming */
180
-
/* Default will always be white */
181
-
:root {
182
-
--text: black;
183
-
--background: white;
184
-
--backgroundLight: hsl(211, 20%, 95%);
185
-
}
186
-
/* This gives us a black background when system is dark and we have not loaded the theme/color scheme values in JS */
187
-
@media (prefers-color-scheme: dark) {
188
-
:root {
189
-
--text: white;
190
-
--background: black;
191
-
--backgroundLight: hsl(211, 20%, 20%);
192
-
color-scheme: dark;
193
-
}
194
-
}
195
-
196
-
/* Overwrite those preferences with the selected theme */
197
-
html.theme--light {
198
-
--text: black;
199
-
--background: white;
200
-
--backgroundLight: hsl(211, 20%, 95%);
201
-
}
202
-
html.theme--dark {
203
-
--text: white;
204
-
--background: black;
205
-
--backgroundLight: hsl(211, 20%, 20%);
206
-
color-scheme: dark;
207
-
}
208
-
html.theme--dim {
209
-
--text: white;
210
-
--background: hsl(211, 20%, 4%);
211
-
--backgroundLight: hsl(211, 20%, 10%);
212
-
color-scheme: dark;
213
-
}
214
-
215
-
/* Remove autofill styles on Webkit */
216
-
input:autofill,
217
-
input:-webkit-autofill,
218
-
input:-webkit-autofill:hover,
219
-
input:-webkit-autofill:focus,
220
-
input:-webkit-autofill:active{
221
-
-webkit-background-clip: text;
222
-
-webkit-text-fill-color: var(--text);
223
-
transition: background-color 5000s ease-in-out 0s;
224
-
box-shadow: inset 0 0 20px 20px var(--background);
225
-
background: var(--background);
226
-
color: var(--text);
227
-
}
228
-
/* Force left-align date/time inputs on iOS mobile */
229
-
input::-webkit-date-and-time-value {
230
-
text-align: left;
231
-
}
232
-
233
-
body {
234
-
display: flex;
235
-
/* Allows you to scroll below the viewport; default value is visible */
236
-
overflow-y: auto;
237
-
overscroll-behavior-y: none;
238
-
text-rendering: optimizeLegibility;
239
-
background-color: var(--background);
240
-
-webkit-font-smoothing: antialiased;
241
-
-moz-osx-font-smoothing: grayscale;
242
-
-ms-overflow-style: scrollbar;
243
-
font-synthesis-weight: none;
244
-
}
245
-
246
-
/* Remove default link styling */
247
-
a {
248
-
color: inherit;
249
-
}
250
-
a[role="link"]:hover {
251
-
text-decoration: underline;
252
-
}
253
-
a[role="link"][data-no-underline="1"]:hover {
254
-
text-decoration: none;
255
-
}
256
-
257
-
/* Styling hacks */
258
-
*[data-word-wrap] {
259
-
word-break: break-word;
260
-
}
261
-
*[data-stable-gutters] {
262
-
scrollbar-gutter: stable both-edges;
263
-
}
264
-
265
-
/* ProseMirror */
266
-
.ProseMirror {
267
-
min-height: 140px;
268
-
}
269
-
.ProseMirror-dark {
270
-
color: white;
271
-
}
272
-
.ProseMirror p {
273
-
margin: 0;
274
-
}
275
-
.ProseMirror p.is-editor-empty:first-child::before {
276
-
color: #8d8e96;
277
-
content: attr(data-placeholder);
278
-
float: left;
279
-
height: 0;
280
-
pointer-events: none;
281
-
}
282
-
.ProseMirror .mention {
283
-
color: #0085ff;
284
-
}
285
-
.ProseMirror a,
286
-
.ProseMirror .autolink {
287
-
color: #0085ff;
288
-
}
289
-
/* OLLIE: TODO -- this is not accessible */
290
-
/* Remove focus state on inputs */
291
-
.ProseMirror-focused {
292
-
outline: 0;
293
-
}
294
-
textarea:focus,
295
-
input:focus {
296
-
outline: 0;
297
-
}
298
-
.tippy-content .items {
299
-
width: fit-content;
300
-
}
301
-
302
-
/* Tooltips */
303
-
[data-tooltip] {
304
-
position: relative;
305
-
z-index: 10;
306
-
}
307
-
[data-tooltip]::after {
308
-
content: attr(data-tooltip);
309
-
display: none;
310
-
position: absolute;
311
-
bottom: 0;
312
-
left: 50%;
313
-
transform: translateY(100%) translateY(8px) translateX(-50%);
314
-
padding: 4px 10px;
315
-
border-radius: 10px;
316
-
background: var(--backgroundLight);
317
-
color: var(--text);
318
-
text-align: center;
319
-
white-space: nowrap;
320
-
font-size: 12px;
321
-
z-index: 10;
322
-
}
323
-
[data-tooltip]::before {
324
-
content: '';
325
-
display: none;
326
-
position: absolute;
327
-
border-bottom: 6px solid var(--backgroundLight);
328
-
border-left: 6px solid transparent;
329
-
border-right: 6px solid transparent;
330
-
bottom: 0;
331
-
left: 50%;
332
-
transform: translateY(100%) translateY(2px) translateX(-50%);
333
-
z-index: 10;
334
-
}
335
-
[data-tooltip]:hover::after,
336
-
[data-tooltip]:hover::before {
337
-
display:block;
338
-
}
339
-
340
-
/* NativeDropdown component */
341
-
.radix-dropdown-item:focus,
342
-
.nativeDropdown-item:focus {
343
-
outline: none;
344
-
}
345
-
346
-
/* Spinner component */
347
-
@keyframes rotate {
348
-
0% {
349
-
transform: rotate(0deg);
350
-
}
351
-
100% {
352
-
transform: rotate(360deg);
353
-
}
354
-
}
355
-
.rotate-500ms {
356
-
position: absolute;
357
-
inset:0;
358
-
animation: rotate 500ms linear infinite;
359
-
}
360
-
361
-
@keyframes avatarHoverFadeIn {
362
-
from { opacity: 0; }
363
-
to { opacity: 1; }
364
-
}
365
-
366
-
@keyframes avatarHoverFadeOut {
367
-
from { opacity: 1; }
368
-
to { opacity: 0; }
369
-
}
370
-
371
-
.force-no-clicks > *,
372
-
.force-no-clicks * {
373
-
pointer-events: none !important;
374
-
}
375
-
376
-
input[type=range][orient=vertical] {
377
-
writing-mode: vertical-lr;
378
-
direction: rtl;
379
-
appearance: slider-vertical;
380
-
width: 16px;
381
-
vertical-align: bottom;
382
-
-webkit-appearance: none;
383
-
appearance: none;
384
-
background: transparent;
385
-
cursor: pointer;
386
-
}
387
-
388
-
input[type="range"][orient=vertical]::-webkit-slider-runnable-track {
389
-
background: white;
390
-
height: 100%;
391
-
width: 4px;
392
-
border-radius: 4px;
393
-
}
394
-
395
-
input[type="range"][orient=vertical]::-moz-range-track {
396
-
background: white;
397
-
height: 100%;
398
-
width: 4px;
399
-
border-radius: 4px;
400
-
}
401
-
402
-
input[type="range"]::-webkit-slider-thumb {
403
-
-webkit-appearance: none;
404
-
appearance: none;
405
-
border-radius: 50%;
406
-
background-color: white;
407
-
height: 16px;
408
-
width: 16px;
409
-
margin-left: -6px;
410
-
}
411
-
412
-
input[type="range"][orient=vertical]::-moz-range-thumb {
413
-
border: none;
414
-
border-radius: 50%;
415
-
background-color: white;
416
-
height: 16px;
417
-
width: 16px;
418
-
margin-left: -6px;
419
-
}
420
-
</style>
421
39
</head>
422
40
423
41
<body>