Import the client, server, skills, tests, and build scripts as the starting point for the rebuild, then trim the surfaces this project does not ship: Electron desktop packaging, the marketing website, and the ESP32 firmware tree. CI keeps the web build, e2e, lockfile, release, and Docker workflows. Rename the package and CLI entry points to hermes-ui, drop the prepare hook so npm ci no longer triggers a build, and drop the removed tsconfig and nodemon references. Rewrite AGENTS.md, ARCHITECTURE.md, DEVELOPMENT.md, and the READMEs so the documented package map and hard rules match this repository. reference_code/ is ignored: it is a read-only snapshot, not an input to the build.
309 lines
5.6 KiB
SCSS
309 lines
5.6 KiB
SCSS
@use 'variables' as *;
|
|
@use 'code-block';
|
|
|
|
@font-face {
|
|
font-family: 'Comic Neue';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url('/fonts/ComicNeue-Bold.ttf') format('truetype');
|
|
}
|
|
|
|
@font-face {
|
|
font-family: 'ZCOOL KuaiLe';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url('/fonts/ZCOOLKuaiLe-Regular.ttf') format('truetype');
|
|
}
|
|
|
|
@font-face {
|
|
font-family: 'Zen Maru Gothic';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url('/fonts/ZenMaruGothic-Regular.ttf') format('truetype');
|
|
}
|
|
|
|
@font-face {
|
|
font-family: 'Zen Maru Gothic';
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
font-display: swap;
|
|
src: url('/fonts/ZenMaruGothic-Bold.ttf') format('truetype');
|
|
}
|
|
|
|
@font-face {
|
|
font-family: 'Gaegu';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: url('/fonts/Gaegu-Regular.ttf') format('truetype');
|
|
}
|
|
|
|
@font-face {
|
|
font-family: 'Gaegu';
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
font-display: swap;
|
|
src: url('/fonts/Gaegu-Bold.ttf') format('truetype');
|
|
}
|
|
|
|
*,
|
|
*::before,
|
|
*::after {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
button,
|
|
input,
|
|
select,
|
|
textarea {
|
|
font-family: inherit;
|
|
}
|
|
|
|
:root {
|
|
--vh: 1vh;
|
|
}
|
|
|
|
// Fix mobile viewport height (address bar)
|
|
@supports (height: 100dvh) {
|
|
:root {
|
|
--vh: 1dvh;
|
|
}
|
|
}
|
|
|
|
// Theme transition (applied programmatically on toggle, not on load)
|
|
html.theme-transitioning,
|
|
html.theme-transitioning *,
|
|
html.theme-transitioning *::before,
|
|
html.theme-transitioning *::after {
|
|
transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease,
|
|
box-shadow 0.3s ease, fill 0.3s ease, stroke 0.3s ease !important;
|
|
}
|
|
|
|
html, body {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
overflow: hidden;
|
|
}
|
|
|
|
#app {
|
|
height: 100%;
|
|
width: 100%;
|
|
overflow: hidden;
|
|
}
|
|
|
|
body {
|
|
font-family: $font-ui;
|
|
background-color: $bg-primary;
|
|
color: $text-primary;
|
|
font-size: 14px;
|
|
line-height: 1.6;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
}
|
|
|
|
// Chat input route CSS is code-split; keep the footer color stable before the
|
|
// component-scoped chunk arrives so entering chat does not flash the page bg.
|
|
.chat-input-area,
|
|
.chat-input-area .input-wrapper {
|
|
background-color: $bg-card;
|
|
}
|
|
|
|
.settings-check {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 16px;
|
|
min-width: 16px;
|
|
height: 16px;
|
|
color: transparent;
|
|
font-size: 13px;
|
|
line-height: 16px;
|
|
}
|
|
|
|
.settings-check.active {
|
|
color: $accent-primary;
|
|
}
|
|
|
|
.hermes-desktop-pet-window,
|
|
.hermes-desktop-pet-window body,
|
|
.hermes-desktop-pet-window #app {
|
|
background: transparent !important;
|
|
background-color: transparent !important;
|
|
}
|
|
|
|
// Teleported overlays must remain clickable above Electron drag regions.
|
|
.hermes-desktop-shell {
|
|
.n-drawer,
|
|
.n-drawer *,
|
|
.n-modal,
|
|
.n-modal *,
|
|
.n-dialog,
|
|
.n-dialog *,
|
|
.n-popover,
|
|
.n-popover *,
|
|
.n-dropdown,
|
|
.n-dropdown *,
|
|
.n-select-menu,
|
|
.n-select-menu *,
|
|
.n-base-select-menu,
|
|
.n-base-select-menu *,
|
|
.n-message-container,
|
|
.n-message-container *,
|
|
.n-notification-container,
|
|
.n-notification-container *,
|
|
.drawer-overlay,
|
|
.drawer-panel,
|
|
.drawer-panel * {
|
|
-webkit-app-region: no-drag;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
code, pre, .mono {
|
|
font-family: $font-code;
|
|
}
|
|
|
|
a {
|
|
color: $accent-primary;
|
|
text-decoration: none;
|
|
|
|
&:hover {
|
|
color: $accent-hover;
|
|
}
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 6px;
|
|
height: 6px;
|
|
background: transparent;
|
|
}
|
|
|
|
::-webkit-scrollbar-track,
|
|
::-webkit-scrollbar-track-piece {
|
|
background: transparent;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: $border-color;
|
|
border-radius: 3px;
|
|
|
|
&:hover {
|
|
background: $text-muted;
|
|
}
|
|
}
|
|
|
|
::-webkit-scrollbar-corner {
|
|
background: transparent;
|
|
}
|
|
|
|
* {
|
|
scrollbar-width: thin;
|
|
scrollbar-color: $border-color transparent;
|
|
}
|
|
|
|
::selection {
|
|
background: rgba(var(--accent-primary-rgb), 0.3);
|
|
}
|
|
|
|
// Shared page header
|
|
.page-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 12px;
|
|
min-height: 64px;
|
|
padding: 14px 20px;
|
|
border-bottom: 1px solid $border-color;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.header-title {
|
|
margin: 0;
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
line-height: 1.4;
|
|
color: $text-primary;
|
|
}
|
|
|
|
.page-header > .header-actions {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: flex-end;
|
|
gap: 8px;
|
|
}
|
|
|
|
// Responsive utility classes for inline width replacement
|
|
.input-sm { width: 90px; }
|
|
.input-md { width: 200px; }
|
|
.input-lg { width: 300px; }
|
|
|
|
// Mobile drawer backdrop
|
|
.mobile-backdrop {
|
|
display: none;
|
|
position: fixed;
|
|
inset: 0;
|
|
background: rgba(0, 0, 0, 0.4);
|
|
z-index: 999;
|
|
}
|
|
|
|
// Hamburger button (mobile only)
|
|
.hamburger-btn {
|
|
display: none;
|
|
position: fixed;
|
|
top: calc(10px + env(safe-area-inset-top, 0px));
|
|
left: 12px;
|
|
z-index: 99;
|
|
width: 36px;
|
|
height: 36px;
|
|
border: none;
|
|
background: $bg-card;
|
|
border-radius: $radius-sm;
|
|
cursor: pointer;
|
|
align-items: center;
|
|
justify-content: center;
|
|
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
// Mobile responsive
|
|
@media (max-width: $breakpoint-mobile) {
|
|
.mobile-backdrop {
|
|
display: block;
|
|
}
|
|
|
|
.hamburger-btn {
|
|
display: flex;
|
|
}
|
|
|
|
.page-header {
|
|
padding: calc(16px + env(safe-area-inset-top, 0px)) 12px 16px 52px !important;
|
|
}
|
|
|
|
.input-sm,
|
|
.input-md,
|
|
.input-lg {
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
// Prevent iOS Safari auto-zoom on input focus by ensuring font-size is at least 16px
|
|
@media (max-width: 768px) {
|
|
input,
|
|
textarea,
|
|
select,
|
|
.n-input,
|
|
.n-input__input-element,
|
|
.n-input__textarea-el,
|
|
.n-input__textarea-element {
|
|
font-size: 16px !important;
|
|
}
|
|
}
|