diff --git a/examples/app_hub/assets/fonts/Clockopia.ttf b/examples/app_hub/assets/fonts/Clockopia.ttf
new file mode 100644
index 0000000..123ea4f
Binary files /dev/null and b/examples/app_hub/assets/fonts/Clockopia.ttf differ
diff --git a/examples/app_hub/assets/hub-logo-fragment-globe-snapshot-20260530b.svg b/examples/app_hub/assets/hub-logo-fragment-globe-snapshot-20260530b.svg
new file mode 100644
index 0000000..4fd8c26
--- /dev/null
+++ b/examples/app_hub/assets/hub-logo-fragment-globe-snapshot-20260530b.svg
@@ -0,0 +1,4 @@
+
diff --git a/examples/app_hub/hub.css b/examples/app_hub/hub.css
index 19cd534..0bac3a3 100644
--- a/examples/app_hub/hub.css
+++ b/examples/app_hub/hub.css
@@ -1,5 +1,13 @@
/* Project hub — matches crash console tokens (app.css) */
+@font-face {
+ font-family: "Clockopia";
+ src: url("assets/fonts/Clockopia.ttf") format("truetype");
+ font-weight: normal;
+ font-style: normal;
+ font-display: swap;
+}
+
.hub-page {
min-height: 100vh;
display: flex;
@@ -21,7 +29,7 @@
display: flex;
flex-direction: column;
align-items: center;
- justify-content: center;
+ justify-content: flex-start;
min-height: calc(100vh - 40px);
padding: 32px 28px 48px;
box-sizing: border-box;
@@ -87,6 +95,84 @@
justify-content: center;
}
+.hub-nav-dock,
+#hub-nav-dock {
+ position: fixed;
+ z-index: 2;
+ display: flex !important;
+ flex-direction: column !important;
+ flex-wrap: nowrap !important;
+ justify-content: flex-end;
+ align-items: stretch;
+ gap: 5px;
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ pointer-events: none;
+ grid-template-columns: none !important;
+ grid-auto-flow: row !important;
+ max-width: none;
+ width: auto;
+}
+
+/* app.css .cards { display:grid } must not flatten the dock if classes linger */
+#hub-nav-dock.cards,
+#hub-nav-dock.hub-cards,
+.hub-nav-dock.cards,
+.hub-nav-dock.hub-cards {
+ display: flex !important;
+ flex-direction: column !important;
+ grid-template-columns: none !important;
+}
+
+.hub-nav-dock .hub-card,
+#hub-nav-dock .hub-card,
+#hub-nav-dock > a {
+ display: flex !important;
+ flex-direction: row !important;
+ align-items: center;
+ gap: 14px;
+ padding: 14px 16px;
+ width: 100% !important;
+ max-width: 100%;
+ flex: 0 0 auto !important;
+ margin: 0 !important;
+ opacity: 0.85;
+ pointer-events: auto;
+ color: var(--text);
+ text-decoration: none;
+ cursor: pointer;
+ transition: transform 0.22s ease, box-shadow 0.22s ease, border-color 0.22s ease, filter 0.22s ease;
+}
+
+#hub-nav-dock > .hub-card + .hub-card,
+.hub-nav-dock > .hub-card + .hub-card {
+ margin-top: 0 !important;
+}
+
+.hub-nav-dock .hub-card:hover,
+.hub-nav-dock .hub-card:focus-visible {
+ opacity: 1;
+ color: var(--text);
+ text-decoration: none;
+ outline: none;
+ transform: translateY(-2px);
+ border-color: rgba(160, 220, 255, 0.95);
+ box-shadow:
+ 0 0 18px rgba(120, 200, 255, 0.55),
+ 0 0 36px rgba(90, 170, 255, 0.35),
+ 0 10px 28px rgba(0, 0, 0, 0.42);
+ filter: drop-shadow(0 0 10px rgba(140, 210, 255, 0.45));
+}
+
+[data-theme="light"] .hub-nav-dock .hub-card:hover,
+[data-theme="light"] .hub-nav-dock .hub-card:focus-visible {
+ box-shadow:
+ 0 0 16px rgba(70, 130, 210, 0.45),
+ 0 0 30px rgba(60, 120, 200, 0.28),
+ 0 10px 24px rgba(26, 35, 50, 0.22);
+}
+
.hub-cards {
display: grid;
grid-template-columns: repeat(3, minmax(200px, 1fr));
@@ -182,6 +268,26 @@
box-sizing: border-box;
}
+.nav-icon--builder {
+ width: 18px;
+ height: 18px;
+ border: 2px solid currentColor;
+ border-radius: 3px;
+ box-sizing: border-box;
+ position: relative;
+}
+
+.nav-icon--builder::before {
+ content: "";
+ position: absolute;
+ left: 3px;
+ top: 7px;
+ width: 10px;
+ height: 2px;
+ background: currentColor;
+ box-shadow: 0 -4px 0 currentColor, 0 4px 0 currentColor;
+}
+
.hub-page .bottom-bar {
position: relative;
z-index: 1;
@@ -199,16 +305,17 @@
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.48);
border-radius: 18px;
overflow: visible;
- background: rgba(226, 34, 34, 0.5);
+ background: rgba(18, 24, 34, 0.88);
backdrop-filter: blur(1.5px);
transition: transform 0.2s ease, box-shadow 0.2s ease, filter 0.2s ease;
cursor: move;
user-select: none;
touch-action: none;
- padding: 40px;
+ padding: 28px 32px;
box-sizing: border-box;
display: flex;
flex-direction: column;
+ font-family: "Clockopia", "DS-Digital", "Consolas", monospace;
}
.cw-clock-inner {
@@ -251,7 +358,7 @@
align-content: start;
row-gap: 0;
overflow: hidden;
- background: rgba(0, 180, 80, 0.35);
+ background: transparent;
}
.cw-row {
@@ -284,26 +391,43 @@
}
.cw-time-main {
- display: grid;
- grid-template-columns: auto auto auto auto;
- align-items: end;
+ display: inline-flex;
+ align-items: baseline;
justify-content: center;
- column-gap: 6px;
+ column-gap: 4px;
line-height: 1;
- font-weight: 700;
+ font-weight: 400;
width: fit-content;
max-width: 100%;
margin: 0 auto;
overflow: hidden;
- border: 1px solid rgba(170, 255, 200, 0.95);
- border-radius: 8px;
- padding: 4px 6px;
+ border: 0;
+ border-radius: 0;
+ padding: 0;
+ font-family: "Clockopia", "DS-Digital", "Consolas", monospace;
+ font-variant-numeric: tabular-nums;
+ color: #d8f6b8;
+ text-shadow: 0 0 10px rgba(190, 240, 150, 0.42);
+}
+
+#cw-hm-lcd {
+ font-size: clamp(2.4rem, 4.8vw, 3.6rem);
+ letter-spacing: 0.04em;
+}
+
+#cw-colon-lcd,
+#cw-ss-lcd {
+ font-size: clamp(1.6rem, 3.2vw, 2.4rem);
+}
+
+#cw-tz-text {
+ font-size: clamp(0.95rem, 1.6vw, 1.15rem);
+ margin-left: 10px;
+ opacity: 0.92;
}
.ot-lcd-line {
- display: inline-flex;
- align-items: flex-end;
- gap: 2px;
+ display: inline;
}
#cw-hm-lcd .ot-glyph {
@@ -404,18 +528,20 @@
.cw-line-region {
color: #b8c2d4;
- font-size: 12px;
+ font-size: clamp(0.62rem, 1vw, 0.75rem);
letter-spacing: 0.16em;
- font-weight: 300;
+ font-weight: 400;
text-transform: uppercase;
+ font-family: "Clockopia", "Consolas", monospace;
}
.cw-line-date {
color: #c5d0e2;
- font-size: 24px;
+ font-size: clamp(0.95rem, 1.6vw, 1.15rem);
letter-spacing: 0.12em;
font-weight: 400;
text-transform: uppercase;
+ font-family: "Clockopia", "Consolas", monospace;
}
.cw-separator {
@@ -438,7 +564,7 @@
max-width: 100%;
border-top: 0;
justify-items: center;
- background: rgba(40, 110, 255, 0.35);
+ background: transparent;
}
.cw-world-cell {
@@ -465,6 +591,7 @@
letter-spacing: 0.12em;
margin-top: 0;
margin-bottom: 8px;
+ font-family: "Clockopia", "Consolas", monospace;
}
.cw-dial {
@@ -782,13 +909,19 @@
width: min(94vw, 567px);
min-width: 0;
}
- .hub-cards {
- grid-template-columns: 1fr;
- max-width: 420px;
+ .hub-nav-dock .hub-card {
+ padding: 14px 16px;
}
}
@media (prefers-reduced-motion: reduce) {
+ .hub-nav-dock .hub-card {
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
+ }
+ .hub-nav-dock .hub-card:hover,
+ .hub-nav-dock .hub-card:focus-visible {
+ transform: none;
+ }
.hub-cards .hub-card {
transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
diff --git a/examples/app_hub/index.html b/examples/app_hub/index.html
index 305ec26..d0cad9e 100644
--- a/examples/app_hub/index.html
+++ b/examples/app_hub/index.html
@@ -11,7 +11,7 @@
})();
-
+
@@ -72,29 +72,72 @@
-
+
+