Files
2026-10-09 12:11:19 +08:00

96 lines
5.2 KiB
HTML

<!doctype html>
<html lang="zh-Hant" dir="ltr" data-warm="pending">
<head>
<meta name="doona-build" content="04c292a116374877">
<script>// Normalize appearance before first paint. The build fills the palette list and default from src/shell/palettes.ts, the
// language locales and reference locale from src/i18n/languages.ts, and the right-to-left scripts from src/i18n/direction.ts.
(function () {
var read = function (key) {
try {
return localStorage.getItem(key);
} catch {
return null;
}
};
var scheme = read('doona-scheme');
var palette = read('doona-palette');
// Before each Glass material was a palette of its own, Glass kept its material in doona-glass. Read it once into the
// palette, then drop it.
var material = read('doona-glass');
if (material !== null)
try {
if (palette === 'glass/glass' && (material === 'frosted' || material === 'tinted'))
localStorage.setItem('doona-palette', (palette = 'glass/' + material));
localStorage.removeItem('doona-glass');
} catch {
// Storage is unavailable; the palette stays as saved.
}
var lang = read('doona-lang');
var d = document.documentElement;
var dark = scheme === 'dark' || (scheme !== 'light' && matchMedia('(prefers-color-scheme: dark)').matches);
var palettes = ["rose-pine/main","rose-pine/moon","catppuccin/frappe","catppuccin/macchiato","catppuccin/mocha","arco/arco","semi/semi","glass/glass","glass/clear","glass/frosted","glass/tinted","nord/nord","kary/kary","antd/antd","qiangguo/qiangguo"];
var parts = (palettes.includes(palette) ? palette : "rose-pine/moon").split('/');
d.dataset.scheme = dark ? 'dark' : 'light';
d.dataset.family = parts[0];
d.dataset.flavour = parts[1];
// Only the Glass palettes load Glass's stylesheet. Written by the parser, it holds the first paint as the main one
// does, and it lands before the main one, where src/shell/glass.ts links it for a palette picked later.
var glass = "./assets/glass-B8ENqf-S.css";
if (parts[0] === 'glass' && glass) document.write('<link rel="stylesheet" data-glass href="' + glass + '">');
d.dataset.wordmark = read('doona-wordmark') === 'plain' ? 'plain' : 'gradient';
var locales = {"zh-TW":"zh-TW","zh-CN":"zh-CN","en":"en-US"};
// No saved language doona has: the browser's preferences, picked as browserLang in src/i18n/languages.ts picks them.
// tools/stamp.test.mjs runs both on the same cases.
if (!Object.hasOwn(locales, lang)) {
var ids = Object.keys(locales);
var wanted = navigator.languages?.length ? navigator.languages : [navigator.language];
lang = null;
for (var preference of wanted) {
var want = preference.toLowerCase();
var primary = want.split('-')[0];
lang = ids.find(id => id.toLowerCase() === want || locales[id].toLowerCase() === want);
if (!lang && primary === 'zh') lang = /-hans\b/.test(want) ? 'zh-CN' : /-(hant|tw|hk|mo)\b/.test(want) ? 'zh-TW' : 'zh-CN';
if (!lang) lang = ids.find(id => id.toLowerCase().split('-')[0] === primary);
if (lang) break;
}
}
d.lang = locales[lang] ?? "en-US";
// The direction as pageDirection in src/i18n/direction.ts decides it: right to left in the mirrored layout, else the
// locale's text info, else its likely script.
var mirrored = read('doona-mirror') === 'on';
var rtlScripts = ["Adlm","Arab","Hebr","Mand","Nkoo","Rohg","Samr","Syrc","Thaa","Yezi"];
var dir = mirrored ? 'rtl' : 'ltr';
if (!mirrored)
try {
var tag = new Intl.Locale(d.lang);
var info = tag.getTextInfo ? tag.getTextInfo() : tag.textInfo;
if (info && info.direction ? info.direction === 'rtl' : rtlScripts.includes(tag.maximize().script)) dir = 'rtl';
} catch {
// Left to right.
}
d.dir = dir;
if (mirrored) d.dataset.mirror = '';
})();
</script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'sha256-tlviH+piYREMqnu+fhWaHgeVf9cfqdUk6kkaYqmgsac='; connect-src 'self' http: https: ws: wss:; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https: http:; font-src 'self'">
<title>doona</title>
<meta name="description" content="Static web UI for the daeuniverse native API.">
<link rel="icon" href="./logo.svg">
<link rel="manifest" href="./manifest.webmanifest">
<!-- Default Rose Pine Dawn (light) and Moon (dark) colours: src/ui/styles/palettes/rose-pine.css. -->
<meta name="theme-color" content="#faf4ed" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#232136" media="(prefers-color-scheme: dark)">
<link rel="apple-touch-icon" sizes="180x180" href="./icons/apple-touch-icon.png">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-title" content="doona">
<script type="module" crossorigin src="./assets/index-HxEUeoab.js"></script>
<link rel="modulepreload" crossorigin href="./assets/_commonjsHelpers-CXUWDbkB.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-react-64fcanlc.js">
<link rel="stylesheet" crossorigin href="./assets/index-CcbWXWDN.css">
</head>
<body><div id="root"></div></body>
</html>