-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
135 lines (133 loc) · 24.3 KB
/
Copy pathindex.html
File metadata and controls
135 lines (133 loc) · 24.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<!doctype html>
<html lang="en" class="h-full">
<head>
<script>
try {
const raw = localStorage.getItem('stroke:settings')
const parsed = raw ? JSON.parse(raw) : null
// Keep both lists in sync with src/lib/themes/registry.js. They were
// already a theme behind: obsidian and clay were missing, so choosing
// either meant booting into the OS default and repainting once the app
// loaded.
const valid = [
'light', 'parchment', 'clay', 'claude-light', 'moss-light', 'orchid-light',
'ice', 'github-light', 'light-high-contrast',
'dark', 'obsidian', 'matte', 'claude', 'moss', 'orchid', 'graphite', 'midnight',
'vitesse', 'slate', 'forest', 'mono', 'rose-pine', 'catppuccin',
'solarized', 'dark-high-contrast', 'hotdog',
]
const lightThemes = [
'light', 'parchment', 'clay', 'claude-light', 'moss-light', 'orchid-light',
'ice', 'github-light', 'light-high-contrast',
]
let theme = parsed?.theme
if (!valid.includes(theme)) {
// No saved preference - follow the OS
const prefersDark = window.matchMedia?.('(prefers-color-scheme: dark)').matches !== false
theme = prefersDark ? 'dark' : 'light'
}
document.documentElement.dataset.theme = theme
const isLight = lightThemes.includes(theme)
if (!isLight) document.documentElement.classList.add('dark')
// The page boots at opacity 0 and stays there until the first finished
// screen, so <html> must carry a painted background of its own - with
// nothing but the transition below, a transparent root shows the
// webview's white backdrop for the whole of startup. Inline, because the
// theme stylesheet arrives with the bundle, well after the first paint.
// These two are the base light/dark --background, and they match
// LIGHT_SURFACE / DARK_SURFACE in src-tauri/src/lib.rs so the window,
// the webview and the page all come up the same colour.
// The theme's own background when a previous run recorded it (see
// rememberBootSurface in settings.js); the base colours only on a first
// launch or a theme never shown before.
let surface = isLight ? '#f7f7f7' : '#080808'
try {
const boot = JSON.parse(localStorage.getItem('stroke:boot-surface') || 'null')
if (boot && boot.theme === theme && typeof boot.color === 'string') surface = boot.color
} catch (_) {}
document.documentElement.style.backgroundColor = surface
let zoom = 1
if (parsed?.zoom != null) zoom = Number(parsed.zoom)
else if (parsed?.fontSize != null) zoom = Number(parsed.fontSize) / 14
if (Number.isFinite(zoom) && zoom > 0) {
const fontPx = Math.round(13 * zoom)
const root = document.documentElement
root.style.setProperty('--app-zoom', String(zoom))
root.style.setProperty('--app-font-size', fontPx + 'px')
}
} catch (_) {
const prefersDark = window.matchMedia?.('(prefers-color-scheme: dark)').matches !== false
document.documentElement.dataset.theme = prefersDark ? 'dark' : 'light'
if (prefersDark) document.documentElement.classList.add('dark')
document.documentElement.style.backgroundColor = prefersDark ? '#080808' : '#f7f7f7'
}
;(function () {
var ua = navigator.userAgent || ''
var platform = (navigator.userAgentData && navigator.userAgentData.platform) || navigator.platform || ''
var os = 'linux'
if (/Win/i.test(platform) || /Windows/i.test(ua)) os = 'windows'
else if (/Mac/i.test(platform) || /Macintosh|Mac OS/i.test(ua)) os = 'macos'
document.documentElement.dataset.os = os
})()
</script>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/stroke_light.png" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<meta name="format-detection" content="telephone=no, email=no, address=no" />
<title>DB Studio</title>
<style>
/* The page boots at opacity 0 and JS reveals it - but the window is shown
from Rust on its own timer, so anything that stops the bundle before
armRevealFailsafe() runs (a throw at module scope, an import that never
resolves, a JavaScriptCore crash) leaves a painted black rectangle on
screen with no way out but killing the app. That happened.
This is the floor, and it needs no JS to work: after 8s the page shows
itself. Longer than the 2.5s JS failsafe so a healthy boot always wins
and this is never what reveals the app. */
/* The app is hidden until the first finished screen marks the root.
Nothing times this: revealApp() sets the attribute the moment it has
something worth showing, and until then what is on screen is the mark
below rather than an empty rectangle. Because the splash is what shows
while the app is not ready, there is no failure that ends in a black
window, and so nothing here needs a timer to rescue it. */
#app { opacity: 0 }
html[data-revealed] #app { opacity: 1 }
html[data-revealed] #splash { display: none }
/* The mark and the name, and nothing that moves. Startup has no progress
to report, so there is nothing a spinner could say that the mark does
not already say by being on screen. Inline and asset-light on purpose:
it has to draw when the bundle is the thing that failed, so it depends
on nothing the bundle provides. */
#splash {
position: fixed; inset: 0; z-index: 0;
display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
color: #080808;
}
html.dark #splash { color: #f7f7f7 }
/* The mark is inline, not fetched. Served off the dev server it drew as a
72px hole in WebKitGTK - the box reserved, nothing painted - and a
request is exactly the dependency a boot screen cannot have, since the
whole point of it is to be on screen when other things have failed.
160px of source for a 72px box, so it stays sharp on a HiDPI screen. */
#splash img { width: 72px; height: 72px; object-fit: contain; user-select: none; -webkit-user-drag: none }
#splash span {
font: 600 15px/1 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
letter-spacing: 0.02em;
}
/* The mark that stays visible against the surface behind it. The theme is
only known to the head script, which has already set `.dark` by now. */
#splash .mark-dark { display: none }
html.dark #splash .mark-dark { display: block }
html.dark #splash .mark-light { display: none }
</style>
</head>
<body class="h-full" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">
<div id="splash" aria-hidden="true">
<img class="mark-dark" alt="" src="data:image/png;base64,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" />
<img class="mark-light" alt="" src="data:image/png;base64,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" />
<span>Stroke</span>
</div>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>