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
10 changes: 10 additions & 0 deletions web/blume.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ export default defineConfig({
// Logo mark beside the wordmark (Blume inlines web/public/logo.svg; the
// same file ships as /favicon.svg for the favicon).
logo: { image: "/logo.svg", text: "Outer" },
// Typography: Geist everywhere, self-hosted (Blume downloads the files
// at build time and serves them locally — no Google Fonts requests at
// runtime). Same two families as the console (see pages/console/console.css).
theme: {
fonts: {
display: "geist",
body: "geist",
mono: "geist-mono",
},
},
// Ilha islands in the console pages (`pages/console/`): Astro renders
// them server-side and hydrates them in the browser (`client:load`).
// The islands use the automatic JSX runtime (`jsxImportSource: ilha`,
Expand Down
6 changes: 6 additions & 0 deletions web/bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
"validate": "bun ./node_modules/blume/bin/blume.mjs validate"
},
"dependencies": {
"@fontsource-variable/geist": "^5.3.0",
"@fontsource-variable/geist-mono": "^5.3.0",
"@ilha/astro": "^0.4.0",
"blume": "^2.2.4",
"daisyui": "^5.7.50",
Expand Down
12 changes: 6 additions & 6 deletions web/pages/console/_islands/console.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1065,7 +1065,7 @@ export function Console() {
aria-hidden="true"
/>
<span class="avatar avatar-placeholder" aria-hidden="true">
<span class="flex h-11 w-11 items-center justify-center text-xl font-bold">
<span class="flex h-11 w-11 items-center justify-center text-lg font-semibold">
{monogram(a.slug)}
</span>
</span>
Expand All @@ -1090,7 +1090,7 @@ export function Console() {
aria-hidden="true"
/>
<span class="avatar avatar-placeholder" aria-hidden="true">
<span class="flex h-11 w-11 items-center justify-center text-xl font-bold">
<span class="flex h-11 w-11 items-center justify-center text-lg font-semibold">
{monogram(active.slug)}
</span>
</span>
Expand Down Expand Up @@ -1163,7 +1163,7 @@ export function Console() {
onclick={() => patchUi({ accountOpen: !ui().accountOpen })}
>
<span class="avatar avatar-placeholder">
<span class="bg-base-300 flex h-11 w-11 items-center justify-center rounded-[14px] text-xl font-bold">
<span class="bg-base-300 flex h-11 w-11 items-center justify-center rounded-[14px] text-lg font-semibold">
<span aria-hidden="true">
{(email() || "?").slice(0, 1).toUpperCase()}
</span>
Expand Down Expand Up @@ -1468,7 +1468,7 @@ export function Console() {
<aside class="side max-md:min-h-dvh min-w-0" aria-label="App navigation">
<div class="side-head">
<div class="side-id">
<p class="m-0 min-w-0 truncate text-[15px] font-semibold" title={active.slug}>
<p class="m-0 min-w-0 truncate text-base font-semibold" title={active.slug}>
{active.slug}
</p>
<p class="m-0 min-w-0 truncate text-xs opacity-60" title={active.url}>
Expand Down Expand Up @@ -1610,7 +1610,7 @@ export function Console() {
<aside class="side max-md:min-h-dvh min-w-0" aria-label="Account navigation">
<div class="side-head">
<div class="side-id">
<p class="m-0 min-w-0 truncate text-[15px] font-semibold" title="Account">
<p class="m-0 min-w-0 truncate text-base font-semibold" title="Account">
Account
</p>
<p class="m-0 min-w-0 truncate text-xs opacity-60" title={email()}>
Expand Down Expand Up @@ -1645,7 +1645,7 @@ export function Console() {
</ul>
<div class="side-foot">
<div class="divider my-2" aria-hidden="true" />
<p class="m-0 min-w-0 truncate font-mono text-xs opacity-60" title={email()}>
<p class="m-0 min-w-0 truncate text-xs opacity-60" title={email()}>
{email()}
</p>
</div>
Expand Down
2 changes: 1 addition & 1 deletion web/pages/console/_islands/data/d1/row-editor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ export const RowEditor = ({
<h3
id={titleId}
tabindex="-1"
class="m-0 text-lg font-bold outline-none"
class="m-0 text-lg font-semibold outline-none"
>
{title}
<span class="font-normal opacity-60"> · {schema.table}</span>
Expand Down
2 changes: 1 addition & 1 deletion web/pages/console/_islands/data/r2/upload.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export function NewFolderButton({
{open() ? (
<div class="modal modal-open" role="dialog" aria-modal="true" aria-label="Create folder">
<div class="modal-box min-w-0">
<h3 class="m-0 text-base font-bold">New folder</h3>
<h3 class="m-0 text-base font-semibold">New folder</h3>
<label class="flex flex-col gap-1 py-3 text-sm" for="r2-new-folder">
Folder name
<input
Expand Down
2 changes: 1 addition & 1 deletion web/pages/console/_islands/data/shared.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ export function ConfirmModal({
return (
<div class="modal modal-open" role="dialog" aria-modal="true" aria-label={title}>
<div class="modal-box min-w-0">
<h3 class="m-0 text-base font-bold">{title}</h3>
<h3 class="m-0 text-base font-semibold">{title}</h3>
<p class="m-0 py-3 text-sm opacity-80">{consequence}</p>
{error === undefined || error === "" ? null : (
<div class="alert alert-error alert-soft mb-3 text-sm" role="alert">
Expand Down
14 changes: 7 additions & 7 deletions web/pages/console/_islands/views.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ function StatCard({
{icon}
<span class="min-w-0 flex-1 truncate" title={label}>{label}</span>
</div>
<div class="stat-value min-w-0 truncate text-3xl font-medium" title={pill ? `${value} ${pill}` : value}>
<div class="stat-value min-w-0 truncate text-lg font-semibold" title={pill ? `${value} ${pill}` : value}>
{value}
{pill != null && pill !== "" && (
<span class="badge badge-soft badge-sm ml-2 shrink-0 align-middle" title={pillTitle}>{pill}</span>
Expand Down Expand Up @@ -608,7 +608,7 @@ export function OverviewView({
<span class={`badge badge-soft ${outcomeBadge(a.outcome)} shrink-0`} title={a.outcome}>
{a.outcome}
</span>
<span class="min-w-0 flex-1 truncate font-mono text-xs" title={a.summary}>
<span class="min-w-0 flex-1 truncate text-xs" title={a.summary}>
{a.summary || a.tool}
</span>
<span class="shrink-0 whitespace-nowrap text-xs opacity-60" title={when(a.at)}>
Expand Down Expand Up @@ -640,7 +640,7 @@ export function OverviewView({
.slice(0, 3)
.map((i) => (
<li key={i.fingerprint} class="list-row min-w-0 text-[13px]">
<span class="min-w-0 flex-1 truncate font-mono text-xs" title={i.message}>
<span class="min-w-0 flex-1 truncate text-xs" title={i.message}>
{i.message}
</span>
<span class="shrink-0 whitespace-nowrap text-xs opacity-60">
Expand Down Expand Up @@ -902,7 +902,7 @@ export function ActionsView({
</td>
<td class="truncate" title={a.by}>{a.by}</td>
<td class="truncate font-mono" title={a.tool}>{a.tool}</td>
<td class="truncate font-mono" title={a.summary}>
<td class="truncate" title={a.summary}>
{a.summary}
</td>
<td class="min-w-0">
Expand Down Expand Up @@ -1836,7 +1836,7 @@ export function DomainsCard({
{domain && (
<div class="mt-3 flex min-w-0 flex-col gap-3">
<div class="flex min-w-0 flex-wrap items-center gap-2">
<span class="min-w-0 flex-1 truncate font-mono text-[15px]" title={domain.hostname}>
<span class="min-w-0 flex-1 truncate font-mono text-base" title={domain.hostname}>
{domain.hostname}
</span>
<span class={`badge badge-soft shrink-0 ${domainBadge(domain.status)}`} title={domain.ssl_status ? `certificate: ${domain.ssl_status}` : domain.status}>
Expand Down Expand Up @@ -2099,7 +2099,7 @@ export function CollaboratorsCard({
{entries.map((entry) => (
<tr key={entry.email}>
<td class="min-w-0">
<span class="block min-w-0 truncate font-mono" title={entry.email}>
<span class="block min-w-0 truncate" title={entry.email}>
{entry.email}
</span>
</td>
Expand Down Expand Up @@ -3403,7 +3403,7 @@ function WaitlistCard({
<tbody>
{entries.map((entry) => (
<tr key={entry.email}>
<td class="min-w-0 truncate font-mono" title={entry.email}>
<td class="min-w-0 truncate" title={entry.email}>
{entry.email}
</td>
<td class="whitespace-nowrap">{entry.attempts}</td>
Expand Down
2 changes: 1 addition & 1 deletion web/pages/console/_islands/views/errors.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ export function ErrorsView({
<span class="loading loading-spinner loading-sm" aria-label="Loading issue detail" />
) : (
<div class="flex min-w-0 flex-col gap-2 py-1">
<p class="m-0 min-w-0 break-words font-mono text-sm" title={detail()?.issue.message}>
<p class="m-0 min-w-0 break-words text-sm" title={detail()?.issue.message}>
{detail()?.issue.message}
</p>
{detail()?.issue.frame && (
Expand Down
38 changes: 28 additions & 10 deletions web/pages/console/console.css
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,27 @@
panel, charts, log viewer) plus the rail-tile frame and the status-dot
inset. No `style=` attributes anywhere: the console CSP only hashes
inline scripts/styles, so every size rides on classes or SVG attrs. */
@import "tailwindcss";

@source ".";
@import "@fontsource-variable/geist";
@import "@fontsource-variable/geist-mono";
@import "tailwindcss";

@source ".";

/* Console type scale (Geist everywhere, self-hosted variable fonts).
Sizes: text-xs (metadata, timestamps, captions, badges) · text-sm
(default UI text; body is 14px) · text-base (emphasized body, important
values) · text-lg (card/section headings at most) · text-xl and above
reserved for .main-title and empty states only.
Weights: normal for body, medium for secondary emphasis (nav labels,
table headers, counts), semibold for headings and primary labels.
font-mono (Geist Mono) is for code/logs/timestamps/hashes and machine
identifiers (slugs, SHAs, paths, URLs, key names) only — never prose.
text-[13px] is a legacy secondary-text step (~30 uses); leave it, do
not extend it. */
@theme {
--font-sans: "Geist Variable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
--font-mono: "Geist Mono Variable", ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;
}

@plugin "daisyui" {
themes: false;
Expand Down Expand Up @@ -107,7 +125,7 @@ body {
body {
background: var(--color-base-200);
color: var(--color-base-content);
font-family: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
font-family: var(--font-sans);
font-size: 14px;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
Expand Down Expand Up @@ -303,7 +321,7 @@ a.rail-tile:hover {

.main-title {
margin: 0;
font-size: 22px;
font-size: 1.25rem; /* text-xl: the only above-base size outside empty states */
font-weight: 600;
letter-spacing: -0.01em;
overflow: hidden;
Expand Down Expand Up @@ -347,8 +365,8 @@ a.rail-tile:hover {
background: var(--color-base-200);
border: 1px solid var(--color-base-300);
border-radius: var(--radius-field);
font-family: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;
font-size: 12px;
font-family: var(--font-mono);
font-size: 0.75rem; /* text-xs */
max-height: 480px;
overflow: auto;
}
Expand Down Expand Up @@ -425,7 +443,7 @@ a.rail-tile:hover {

.console-empty h1 {
margin: 8px 0 0;
font-size: 20px;
font-size: 1.25rem; /* text-xl: empty-state headings share the title step */
}

.console-empty p {
Expand All @@ -435,8 +453,8 @@ a.rail-tile:hover {
}

.console-empty code {
font-family: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;
font-size: 12.5px;
font-family: var(--font-mono);
font-size: 0.75rem; /* text-xs */
}

/* --- Mobile (< 768px): rail stays flush left, drawer overlays ---------- */
Expand Down
Loading