Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions apps/browser-demos/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,38 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kandelo</title>
<link rel="icon" type="image/png" href="./pages/kandelo/assets/favicon.png">
<!-- Fonts are intentionally system-stack only. Cross-origin font hosts
(rsms.me, jsdelivr) get blocked by Cross-Origin-Embedder-Policy:
require-corp, which we need set for SharedArrayBuffer. If we want
Inter/JetBrains Mono we'll need to self-host with @font-face. -->
<script>
(() => {
try {
const raw = window.localStorage.getItem("kandelo.theme");
const parsed = raw ? JSON.parse(raw) : {};
const validStoredPreference = parsed.version === 1 || parsed.version === 2 || parsed.version === 3;
const normalizeFamily = (family) => {
if (family === "playground") return "wordpress";
if (family === "balanced" || family === "terminal") return "kandelo";
return ["ubuntu", "wordpress", "kandelo"].includes(family) ? family : "ubuntu";
};
const family = validStoredPreference ? normalizeFamily(parsed.family) : "ubuntu";
const preference = validStoredPreference && ["auto", "light", "dark"].includes(parsed.mode)
? parsed.mode
: "auto";
const resolvedMode = preference === "auto"
? (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light")
: preference;
document.documentElement.dataset.kTheme = family;
document.documentElement.dataset.kMode = resolvedMode;
document.documentElement.dataset.kModePreference = preference;
document.documentElement.style.colorScheme = resolvedMode;
} catch {
// Preference storage can be unavailable in restricted browser contexts.
}
})();
</script>
<link rel="stylesheet" href="./pages/kandelo/tokens.css">
<link rel="stylesheet" href="./pages/kandelo/styles.css">
</head>
Expand Down
62 changes: 62 additions & 0 deletions apps/browser-demos/lib/init/wordpress-mariadb-readiness.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
export const WORDPRESS_MARIADB_SOCKET_PATH = "/tmp/mysql.sock";
export const WORDPRESS_MARIADB_READY_PATH = "/kandelo-ready.php";
export const WORDPRESS_MARIADB_READY_FILE = `/var/www/html${WORDPRESS_MARIADB_READY_PATH}`;

export const WORDPRESS_MARIADB_READY_PHP = `<?php
mysqli_report(MYSQLI_REPORT_OFF);

$mysqli = mysqli_init();
if (!$mysqli) {
http_response_code(503);
header('Content-Type: text/plain');
echo "mysqli init failed\\n";
exit;
}

if (defined('MYSQLI_OPT_CONNECT_TIMEOUT')) {
mysqli_options($mysqli, MYSQLI_OPT_CONNECT_TIMEOUT, 2);
}

$connected = @mysqli_real_connect(
$mysqli,
'localhost',
'root',
'',
'wordpress',
0,
'${WORDPRESS_MARIADB_SOCKET_PATH}'
);

if (!$connected) {
http_response_code(503);
header('Content-Type: text/plain');
echo "mariadb unavailable: " . mysqli_connect_error() . "\\n";
exit;
}

$result = @mysqli_query(
$mysqli,
"SELECT option_value FROM wp_options WHERE option_name = 'siteurl' LIMIT 1"
);

if (!$result) {
http_response_code(503);
header('Content-Type: text/plain');
echo "wordpress database unavailable: " . mysqli_error($mysqli) . "\\n";
mysqli_close($mysqli);
exit;
}

$row = mysqli_fetch_row($result);
if (!$row || $row[0] === '') {
http_response_code(503);
header('Content-Type: text/plain');
echo "wordpress siteurl missing\\n";
mysqli_close($mysqli);
exit;
}

mysqli_close($mysqli);
header('Content-Type: text/plain');
echo "ready\\n";
`;
Loading
Loading