From 13384031324030fe8a7b0be9901302482314535b Mon Sep 17 00:00:00 2001 From: Owais Jamil Date: Sun, 14 Jun 2026 01:45:17 -0500 Subject: [PATCH] feat: change font & icons --- assets/css/base.css | 5 +- assets/css/components/core.css | 5 +- assets/css/components/doc-viewer.css | 77 +++++++--- assets/css/components/shell.css | 28 +++- assets/css/tokens.css | 21 ++- assets/fonts/IBM-Plex-Sans-VF.woff2 | Bin 0 -> 45712 bytes docs/reference/README.md | 10 +- lib/tempest_web/components/core_components.ex | 86 ++++++++++++ lib/tempest_web/live/doc_live.ex | 131 ++++++++++-------- lib/tempest_web/live/home_live.ex | 115 ++++++--------- priv/static/images/icons/vim.svg | 39 ++++++ .../controllers/page_controller_test.exs | 3 +- 12 files changed, 359 insertions(+), 161 deletions(-) create mode 100644 assets/fonts/IBM-Plex-Sans-VF.woff2 create mode 100644 priv/static/images/icons/vim.svg diff --git a/assets/css/base.css b/assets/css/base.css index a7f6024..891eb9f 100644 --- a/assets/css/base.css +++ b/assets/css/base.css @@ -1,6 +1,9 @@ body { color: var(--text); - background: var(--win-desktop); + background-color: var(--win-desktop); + background-image: var(--win-desktop-texture); + background-position: var(--win-desktop-texture-position); + background-size: var(--win-desktop-texture-size); font-family: var(--font-ui); font-size: var(--step-0); line-height: var(--leading-copy); diff --git a/assets/css/components/core.css b/assets/css/components/core.css index a01401a..bd28521 100644 --- a/assets/css/components/core.css +++ b/assets/css/components/core.css @@ -1,6 +1,9 @@ .app-shell { min-height: 100vh; - background: var(--win-desktop); + background-color: var(--win-desktop); + background-image: var(--win-desktop-texture); + background-position: var(--win-desktop-texture-position); + background-size: var(--win-desktop-texture-size); } .app-header { diff --git a/assets/css/components/doc-viewer.css b/assets/css/components/doc-viewer.css index a4a4b1c..c66e79a 100644 --- a/assets/css/components/doc-viewer.css +++ b/assets/css/components/doc-viewer.css @@ -3,24 +3,26 @@ --doc-page-pad: clamp(0.75rem, 2vw, 1.35rem); --doc-taskbar-height: 2.7rem; - min-height: 100vh; padding: var(--doc-page-pad); background-color: var(--win-desktop); - background-image: - linear-gradient(45deg, rgb(255 255 255 / 0.07) 25%, transparent 25%), - linear-gradient(-45deg, rgb(0 0 0 / 0.08) 25%, transparent 25%), - linear-gradient(45deg, transparent 75%, rgb(0 0 0 / 0.08) 75%), - linear-gradient(-45deg, transparent 75%, rgb(255 255 255 / 0.07) 75%); - background-position: - 0 0, - 0 0.25rem, - 0.25rem -0.25rem, - -0.25rem 0; - background-size: 0.5rem 0.5rem; + background-image: var(--win-desktop-texture); + background-position: var(--win-desktop-texture-position); + background-size: var(--win-desktop-texture-size); +} + +html:has(.doc-viewer-page), +body:has(.doc-viewer-page) { + height: 100%; + overflow: hidden; +} + +.doc-viewer { + min-height: 100vh; } .doc-viewer-page { - height: 100vh; + height: 100dvh; + min-height: 0; overflow: hidden; padding-block-start: calc(var(--doc-taskbar-height) + var(--doc-page-pad)); } @@ -32,7 +34,8 @@ } .doc-viewer-page .tempest-home__desktop { - height: calc(100vh - var(--doc-taskbar-height) - var(--doc-page-pad) - var(--doc-page-pad)); + width: 100%; + height: 100%; padding-bottom: 0; } @@ -42,7 +45,7 @@ .doc-viewer-page__windows { height: 100%; - margin-inline-end: 0; + margin-inline: 6.5rem 0; } .doc-browser { @@ -96,7 +99,9 @@ align-items: center; padding: var(--space-2); background: var(--surface); - box-shadow: inset 0 -1px 0 var(--win-shadow), inset 0 1px 0 var(--win-light); + box-shadow: + inset 0 -1px 0 var(--win-shadow), + inset 0 1px 0 var(--win-light); } .doc-browser__tool, @@ -176,6 +181,34 @@ border-block: 1px solid var(--win-shadow); } +.doc-browser__toast { + position: fixed; + right: var(--space-3); + bottom: calc(var(--doc-taskbar-height) + var(--space-3)); + z-index: 2; + max-width: min(28rem, calc(100vw - 2rem)); + min-width: 14rem; + padding: 0.58rem 0.8rem; + overflow-wrap: anywhere; + border: 1px solid var(--win-shadow); + background: var(--web-yellow); + box-shadow: var(--shadow-window); + color: var(--text); + font-size: var(--step--1); + font-weight: 700; + opacity: 0; + transform: translateY(8px); + pointer-events: none; + transition-property: opacity, transform; + transition-duration: 120ms; + transition-timing-function: ease-out; +} + +.doc-browser__toast.is-visible { + opacity: 1; + transform: translateY(0); +} + .doc-browser__bookmarks { display: grid; grid-template-rows: auto minmax(0, 1fr); @@ -183,7 +216,9 @@ min-height: 0; padding: var(--space-2); background: var(--surface-raised); - box-shadow: inset -1px 0 0 var(--win-shadow), inset 1px 0 0 var(--win-light); + box-shadow: + inset -1px 0 0 var(--win-shadow), + inset 1px 0 0 var(--win-light); } .doc-browser__bookmarks nav { @@ -464,13 +499,19 @@ } @media (max-width: 55rem) { + .doc-viewer-page__windows { + margin-inline: 0; + } + .doc-browser__workspace { grid-template-columns: 1fr; grid-template-rows: minmax(9rem, 28vh) minmax(0, 1fr); } .doc-browser__bookmarks { - box-shadow: inset 0 -1px 0 var(--win-shadow), inset 0 1px 0 var(--win-light); + box-shadow: + inset 0 -1px 0 var(--win-shadow), + inset 0 1px 0 var(--win-light); } .doc-browser__bookmark-list { diff --git a/assets/css/components/shell.css b/assets/css/components/shell.css index 61a39e8..c21222a 100644 --- a/assets/css/components/shell.css +++ b/assets/css/components/shell.css @@ -2,7 +2,10 @@ .operator-account { min-height: 100vh; padding: clamp(0.75rem, 2vw, 1.35rem); - background: var(--win-desktop); + background-color: var(--win-desktop); + background-image: var(--win-desktop-texture); + background-position: var(--win-desktop-texture-position); + background-size: var(--win-desktop-texture-size); } .tempest-home { @@ -87,12 +90,28 @@ image-rendering: pixelated; } -.tempest-home__hero { +.tempest-home__hero, +.tempest-home__hero-main { display: grid; align-items: stretch; gap: var(--space-5); } +.tempest-home__hero-main { + grid-template-columns: 1fr; +} + +.tempest-home__status-grid { + padding-block-start: var(--space-4); + border-top: 1px dotted var(--win-shadow); +} + +@media (min-width: 54rem) { + .tempest-home__hero-main { + grid-template-columns: minmax(0, 1fr) minmax(18rem, 0.45fr); + } +} + .tempest-home__intro { align-self: center; } @@ -621,7 +640,10 @@ min-height: 100vh; padding: clamp(0.75rem, 2vw, 1.35rem); padding-block-start: calc(2.7rem + clamp(0.75rem, 2vw, 1.35rem)); - background: var(--win-desktop); + background-color: var(--win-desktop); + background-image: var(--win-desktop-texture); + background-position: var(--win-desktop-texture-position); + background-size: var(--win-desktop-texture-size); } .stats-dashboard__desktop { diff --git a/assets/css/tokens.css b/assets/css/tokens.css index 9eefccf..774c298 100644 --- a/assets/css/tokens.css +++ b/assets/css/tokens.css @@ -11,6 +11,17 @@ --color-gray-9: #212529; --win-desktop: #0b7f7f; + --win-desktop-texture: + linear-gradient(45deg, rgb(255 255 255 / 0.07) 25%, transparent 25%), + linear-gradient(-45deg, rgb(0 0 0 / 0.08) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgb(0 0 0 / 0.08) 75%), + linear-gradient(-45deg, transparent 75%, rgb(255 255 255 / 0.07) 75%); + --win-desktop-texture-position: + 0 0, + 0 0.25rem, + 0.25rem -0.25rem, + -0.25rem 0; + --win-desktop-texture-size: 0.5rem 0.5rem; --win-face: #c6c6c6; --win-face-soft: #deded8; --win-light: #ffffff; @@ -41,8 +52,16 @@ src: url("/fonts/MonaspaceNeonVar.woff2") format("woff2"); } +@font-face { + font-family: "IBM Plex Sans"; + font-style: normal; + font-weight: 100 700; + font-display: swap; + src: url("/fonts/IBM-Plex-Sans-VF.woff2") format("woff2"); +} + :root { - --font-ui: "MS Sans Serif", Tahoma, Arial, sans-serif; + --font-ui: "IBM Plex Sans", "MS Sans Serif", Tahoma, Arial, sans-serif; --font-display: "Arial Black", "Franklin Gothic Heavy", Impact, sans-serif; --font-mono: "Monaspace Neon", "Lucida Console", monospace; diff --git a/assets/fonts/IBM-Plex-Sans-VF.woff2 b/assets/fonts/IBM-Plex-Sans-VF.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b757bc5ca2d8845a5b8d5349c860553f1772dd69 GIT binary patch literal 45712 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�>qto_aFWZ-|K2#n*aV95SQa3i{ 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 Wri9-AF=O+}$-Hk;q)#<$hz0;U)qv~( literal 0 HcmV?d00001 diff --git a/docs/reference/README.md b/docs/reference/README.md index 2988cfb..730264a 100644 --- a/docs/reference/README.md +++ b/docs/reference/README.md @@ -3,9 +3,10 @@ title: Reference Documentation updated: 2026-06-13 --- -These docs describe current, verified behavior of Tempest. They explain the -implementation at a high level and introduce the AT Protocol/PDS concepts needed -to understand that implementation. +These docs describe current, verified behavior of Tempest. + +They explain the implementation at a high level and introduce the AT Protocol/PDS +concepts needed to understand that implementation. Graduated reference docs: @@ -36,6 +37,3 @@ Additional reference notes: - [Identity Troubleshooting](identity-troubleshooting.md) - [Sync and Firehose](./sync-firehose.md) - -When a spec graduates, `docs/specs/.md` becomes a short pointer to the -reference doc and its verification commands. diff --git a/lib/tempest_web/components/core_components.ex b/lib/tempest_web/components/core_components.ex index e1734aa..84ee1f2 100644 --- a/lib/tempest_web/components/core_components.ex +++ b/lib/tempest_web/components/core_components.ex @@ -7,6 +7,92 @@ defmodule TempestWeb.CoreComponents do alias Phoenix.LiveView.JS + use Phoenix.VerifiedRoutes, + endpoint: TempestWeb.Endpoint, + router: TempestWeb.Router, + statics: TempestWeb.static_paths() + + @doc """ + Renders the shared desktop shortcut column. + """ + def desktop_shortcuts(assigns) do + ~H""" + + """ + end + + attr :app_version, :any, required: true + attr :host, :string, required: true + attr :rendered_at, :string, required: true + + def about_computer_modal(assigns) do + ~H""" + + """ + end + + attr :app_label, :string, required: true + attr :host, :string, required: true + attr :rendered_at, :string, required: true + + def taskbar(assigns) do + ~H""" +
+ <.link class="taskbar__start" navigate={~p"/"}> + Start + + {@app_label} / {@host} + {@rendered_at} +
+ """ + end + @doc """ Renders flash notices. """ diff --git a/lib/tempest_web/live/doc_live.ex b/lib/tempest_web/live/doc_live.ex index 0277c00..2386369 100644 --- a/lib/tempest_web/live/doc_live.ex +++ b/lib/tempest_web/live/doc_live.ex @@ -42,27 +42,10 @@ defmodule TempestWeb.DocLive do @impl true def render(assigns) do ~H""" -
+
- + <.desktop_shortcuts />
@@ -117,10 +100,17 @@ defmodule TempestWeb.DocLive do Search - +
@@ -166,6 +156,7 @@ defmodule TempestWeb.DocLive do
{raw(@document.html)}
+
- - -
- <.link class="taskbar__start" navigate={~p"/"}> - Start - - tempest docs / {@host} - {@rendered_at} -
+ <.about_computer_modal app_version={@app_version} host={@host} rendered_at={@rendered_at} /> + <.taskbar app_label="tempest docs" host={@host} rendered_at={@rendered_at} />
+ + """ end diff --git a/lib/tempest_web/live/home_live.ex b/lib/tempest_web/live/home_live.ex index 382c816..7f88a15 100644 --- a/lib/tempest_web/live/home_live.ex +++ b/lib/tempest_web/live/home_live.ex @@ -36,63 +36,60 @@ defmodule TempestWeb.HomeLive do
- + <.desktop_shortcuts />
- LIVE_STATS.EXE + WELCOME.EXE
-
- -

Personal Data Server

-

Live node snapshot for {@host}

-

Refreshed {@rendered_at} · every 15s while connected

+
+
+ +

Personal Data Server

+

Live node snapshot for {@host}

+

Refreshed {@rendered_at}

+
+ +
- +
+
+

{card.label}

+

+ + {card.state} +

+

{card.value}

+

{card.note}

+
+
-
+
{@center_title}
@@ -157,40 +154,8 @@ defmodule TempestWeb.HomeLive do
- - -
- <.link class="taskbar__start" navigate={~p"/"}> - Start - - tempest pds / {@host} - {@rendered_at} -
+ <.about_computer_modal app_version={@app_version} host={@host} rendered_at={@rendered_at} /> + <.taskbar app_label="tempest pds" host={@host} rendered_at={@rendered_at} />
diff --git a/priv/static/images/icons/vim.svg b/priv/static/images/icons/vim.svg new file mode 100644 index 0000000..dc27e78 --- /dev/null +++ b/priv/static/images/icons/vim.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/tempest_web/controllers/page_controller_test.exs b/test/tempest_web/controllers/page_controller_test.exs index 21aba78..2954b28 100644 --- a/test/tempest_web/controllers/page_controller_test.exs +++ b/test/tempest_web/controllers/page_controller_test.exs @@ -7,7 +7,8 @@ defmodule TempestWeb.PageControllerTest do assert html =~ ~s(id="tempest-home") assert html =~ "Personal Data Server" - assert html =~ "Live Status" + assert html =~ "WELCOME.EXE" + assert html =~ ~s(id="home-status-cards") assert html =~ "Protocol Surface" refute html =~ "Public Stats" refute html =~ "Endpoint Surface" -- 2.51.2