Add Oasis-Mobile-UX theme with hexagon navigation

- Move mobile styles into a selectable Oasis-Mobile-UX theme; mobile.css kept intact
- Hexagon category launcher on home (10 categories with expandable modules)
- Customizable bottom bar (up to 4 shortcuts, Peers/Invites fixed)
- Gold-outlined hexagons
This commit is contained in:
s1to 2026-07-17 12:12:55 +02:00
parent 6c816bab94
commit 8aaba6585a
18 changed files with 1008 additions and 740 deletions

View file

@ -7892,9 +7892,22 @@ router
})
.post("/settings/bottombar", koaBody(), async (ctx) => {
const cfg = getConfig();
cfg.bottomBarPin = String(ctx.request.body.pin || '').trim();
const MAX = 4;
const body = ctx.request.body || {};
const action = String(body.action || '').trim();
const key = String(body.key || '').trim();
const catalog = require("../views/main_views").PINNABLE_MODULES || [];
let pins = Array.isArray(cfg.bottomBarPins) ? cfg.bottomBarPins.slice() : [];
if (action === 'add') {
if (key && catalog.some(m => m.key === key) && !pins.includes(key) && pins.length < MAX) pins.push(key);
} else if (action === 'remove') {
pins = pins.filter(k => k !== key);
} else if (action === 'clear') {
pins = [];
}
cfg.bottomBarPins = pins.slice(0, MAX);
saveConfig(cfg);
ctx.redirect('/activity');
ctx.redirect('/settings/bottombar');
})
.post("/settings/ai", koaBody(), async (ctx) => {
const aiPrompt = String(ctx.request.body.ai_prompt || "").trim();

View file

@ -1,9 +1,7 @@
html {
-webkit-text-size-adjust: 100%;
box-sizing: border-box;
overflow-x: clip !important;
overflow-y: visible !important;
height: auto !important;
overflow-x: hidden !important;
}
*, *::before, *::after {
@ -12,8 +10,7 @@ html {
body {
font-size: 15px;
overflow-x: clip !important;
overflow-y: visible !important;
overflow-x: hidden;
max-width: 100vw;
}
@ -917,682 +914,3 @@ a.create-button {
.peers-technical-block .block-info-table td[data-label=""]::before { content: none !important; }
.peers-list .block-info-table td .peer-key,
.peers-technical-block .block-info-table td .peer-key { text-align: right !important; }
.oasis-bottombar {
display: flex !important;
position: fixed !important;
left: 0 !important; right: 0 !important; bottom: 0 !important;
z-index: 1000 !important;
justify-content: space-around !important;
align-items: center !important;
gap: 4px !important;
background: #1F1F1F !important;
border-top: 1px solid #333 !important;
padding: 8px 6px calc(8px + env(safe-area-inset-bottom, 0px)) !important;
}
.oasis-bottombar .bb-item {
position: relative !important;
display: flex !important;
flex-direction: column !important;
align-items: center !important;
gap: 3px !important;
flex: 1 1 0 !important;
min-width: 0 !important;
padding: 2px 0 !important;
text-decoration: none !important;
}
.oasis-bottombar .bb-ico { font-size: 18px !important; line-height: 1 !important; color: #FFA500 !important; }
.oasis-bottombar .bb-lbl { font-size: 9px !important; color: #ccc !important; white-space: nowrap !important; }
.oasis-bottombar .bb-badge {
position: absolute !important;
top: -4px !important;
left: calc(50% + 6px) !important;
min-width: 15px !important; height: 15px !important;
padding: 0 3px !important;
border-radius: 8px !important;
background: #FFA500 !important;
color: #121212 !important;
font-size: 9px !important; font-weight: bold !important;
display: flex !important; align-items: center !important; justify-content: center !important;
}
body { padding-bottom: calc(64px + env(safe-area-inset-bottom, 0px)) !important; }
.oasis-mobile-topbar {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
width: 100% !important;
padding: 8px 12px !important;
background: transparent !important;
box-shadow: none !important; border: 0 !important;
}
.oasis-mobile-topbar .omt-logo img,
.oasis-mobile-topbar .omt-avatar img {
width: 32px !important; height: 32px !important;
border-radius: 50% !important;
border: 2px solid #FFA500 !important;
object-fit: cover !important; display: block !important;
}
.oasis-mobile-topbar .omt-title {
flex: 1 1 auto !important;
text-align: center !important;
font-size: 26px !important; font-weight: bold !important;
letter-spacing: 10px !important; text-indent: 10px !important;
color: #FFD700 !important; text-decoration: none !important;
white-space: nowrap !important;
background: transparent !important; border: 0 !important; box-shadow: none !important; padding: 0 !important;
}
.header .top-bar-left > a.logo-icon { display: none !important; }
.oasis-mobile-menus { display: flex !important; gap: 8px !important; padding: 0 10px 6px !important; }
.oasis-mobile-menus .oasis-menu-ico { display: none !important; }
.oasis-mobile-menus .oasis-menu-btn {
flex: 1 1 0 !important;
display: flex !important; align-items: center !important; justify-content: center !important;
padding: 12px !important;
border: 1.5px solid #333 !important; border-radius: 10px !important;
background: #121212 !important; color: #ccc !important;
font-weight: bold !important; letter-spacing: 1px !important; cursor: pointer !important;
}
#nav-left-toggle:checked ~ .header .oasis-menu-btn[for="nav-left-toggle"] {
background: #FFA500 !important; color: #121212 !important; border-color: #FFA500 !important;
}
#nav-right-toggle:checked ~ .header .oasis-menu-btn[for="nav-right-toggle"] {
background: #FFD700 !important; color: #121212 !important; border-color: #FFD700 !important;
}
:root {
--space-1: 4px; --space-2: 8px; --space-3: 16px; --space-4: 24px; --space-5: 32px;
--fs-caption: 12px; --fs-body: 14px; --fs-body-lg: 16px; --fs-title: 20px;
--lh-body: 1.5; --measure: 66ch;
--c-muted: #8c8c8c; --radius-md: 12px;
}
.oasis-bottombar .bb-fab .bb-ico {
width: 46px !important; height: 46px !important;
margin-top: -22px !important;
border-radius: 50% !important;
background: #FFA500 !important; color: #121212 !important;
display: flex !important; align-items: center !important; justify-content: center !important;
font-size: 22px !important;
box-shadow: 0 2px 8px rgba(0,0,0,.4) !important;
}
.oasis-bottombar .bb-fab .bb-lbl { color: #FFA500 !important; font-weight: bold !important; }
.main-column, .main-column p, .main-column li, .main-column a,
.main-column span, .main-column td, .main-column h1, .main-column h2, .main-column h3 {
overflow-wrap: anywhere !important;
word-break: break-word !important;
}
.main-column { padding: var(--space-3) !important; }
.main-column p { line-height: var(--lh-body) !important; }
.main-column > * + * { margin-top: var(--space-3) !important; }
.main-column img, .main-column video, .main-column table, .main-column pre, .main-column iframe {
max-width: 100% !important; height: auto !important;
}
.main-column pre { white-space: pre-wrap !important; }
.oasis-nav-group {
list-style: none !important;
background: #1c1c1c !important;
border: 1px solid #333 !important;
border-radius: var(--radius-md) !important;
overflow: hidden !important;
margin-bottom: var(--space-2) !important;
}
.oasis-nav-header {
display: flex !important; align-items: center !important; gap: var(--space-2) !important;
min-height: 48px !important; padding: 0 var(--space-3) !important;
cursor: pointer !important;
color: #FFD700 !important; font-weight: bold !important;
text-transform: uppercase !important; letter-spacing: .04em !important;
font-size: var(--fs-caption) !important;
}
.oasis-nav-header .nav-text { flex: 1 1 auto !important; }
.oasis-nav-header .oasis-nav-arrow { color: var(--c-muted) !important; transition: transform 150ms ease !important; }
.oasis-nav-toggle:checked + .oasis-nav-header .oasis-nav-arrow { transform: rotate(180deg) !important; }
.oasis-nav-header:active { background: #262626 !important; }
.oasis-nav-list { list-style: none !important; padding: 0 !important; margin: 0 !important; }
.oasis-nav-list li a {
display: flex !important; align-items: center !important; gap: var(--space-3) !important;
min-height: 48px !important; padding: 0 var(--space-3) !important;
color: #e8e8e8 !important; text-decoration: none !important;
border-top: 1px solid #262626 !important;
}
.oasis-nav-list li a .emoji { flex: 0 0 auto !important; width: 22px !important; text-align: center !important; color: #FFA500 !important; }
.oasis-nav-list li a .nav-text { font-size: var(--fs-body) !important; }
.oasis-nav-list li a:active { background: #262626 !important; }
.oasis-nav-list li a.current { color: #FFA500 !important; font-weight: bold !important; }
.main-column h1 { font-size: var(--fs-title) !important; font-weight: 700 !important; line-height: 1.25 !important; margin: 0 0 var(--space-2) !important; }
.main-column h2 { font-size: 18px !important; font-weight: 700 !important; line-height: 1.3 !important; margin: 0 0 var(--space-2) !important; }
.main-column h3 { font-size: var(--fs-body-lg) !important; font-weight: 600 !important; margin: 0 0 var(--space-1) !important; }
.main-column p { font-size: var(--fs-body-lg) !important; }
.main-column .created-at, .main-column .small, .main-column .time,
.main-column .meta, .main-column .author-meta, .main-column .subtitle {
color: var(--c-muted) !important; font-size: var(--fs-caption) !important;
}
.main-column article,
.main-column [class*="-card"] {
background: #1c1c1c !important;
border: 1px solid #333 !important;
border-radius: var(--radius-md) !important;
padding: var(--space-3) !important;
}
.main-column article:active,
.main-column [class*="-card"]:active { background: #202020 !important; }
.btn, button, input[type="submit"], input[type="button"], .submit-button,
.filter-btn, .create-button, .edit-btn, .delete-btn, .join-btn, .leave-btn, .buy-btn {
min-height: 48px !important;
}
button:active, input[type="submit"]:active, .submit-button:active,
.filter-btn:active, .create-button:active, .edit-btn:active,
.delete-btn:active, .join-btn:active, .leave-btn:active, .buy-btn:active {
filter: brightness(.85) !important;
}
.main-column a:active { opacity: .6 !important; }
* { -webkit-tap-highlight-color: transparent !important; }
a, button, label, .tap, .oasis-menu-btn, .bb-item, .oasis-nav-header, .oasis-nav-list li a {
touch-action: manipulation !important;
}
body { overscroll-behavior: none !important; }
.main-content, .main-column, .header,
.sidebar-left, .sidebar-right { overflow: visible !important; }
.sidebar-left, .sidebar-right { display: none !important; }
#nav-left-toggle:checked ~ .main-content .sidebar-left { display: block !important; }
#nav-right-toggle:checked ~ .main-content .sidebar-right { display: block !important; }
.header .top-bar-left nav,
.header .top-bar-right nav { display: none !important; }
.oasis-mobile-topbar { padding-top: calc(env(safe-area-inset-top, 0px) + 10px) !important; }
.oasis-bottombar .bb-pair {
display: flex !important; align-items: center !important;
flex: 0 0 auto !important;
gap: 2px !important; padding: 3px !important;
background: #262626 !important;
border: 1px solid #3a3a3a !important;
border-radius: 999px !important;
}
.oasis-bottombar .bb-pair .bb-item { flex: 0 0 auto !important; padding: 2px 8px !important; }
.oasis-bottombar .bb-pair .bb-lbl { font-size: 8px !important; }
.oasis-bottombar a.bb-item.current .bb-ico {
background: #FFA500 !important; color: #121212 !important;
border-radius: 999px !important; padding: 4px 12px !important;
}
.oasis-bottombar a.bb-item.current .bb-lbl { color: #FFA500 !important; font-weight: bold !important; }
.oasis-bottombar a.bb-item.current .bb-badge { background: #121212 !important; color: #FFA500 !important; }
.main-column, .main-column p, .main-column li, .main-column a,
.main-column span, .main-column td, .main-column th, .main-column label,
.main-column h1, .main-column h2, .main-column h3, .main-column h4,
.main-column strong, .main-column em, .main-column small,
.created-at, .post-meta, .feed-post-meta,
.feed-row .small, .feed-row .time, .feed-row .created-at,
.profile-sensors-box > *,
.card-field .card-value, .card-field .card-label {
overflow-wrap: break-word !important;
word-break: normal !important;
-webkit-hyphens: none !important;
hyphens: none !important;
}
.main-column pre, .main-column code, kbd, samp,
.peer-key, .user-link.peer-key, .oasis-id-copy, .search-oasis-id,
.pm-sent-key-value, .kpi__value,
.block-info-table td .peer-key, .block-info-table td .user-link,
.pm-info-table td .user-link,
.main-column a[href*="ed25519"], .main-column a[href^="ssb:"],
.main-column a[href^="/author/"] {
overflow-wrap: anywhere !important;
word-break: break-all !important;
}
button, input[type="submit"], input[type="button"],
.filter-btn, a.filter-btn, .create-button, .edit-btn, .delete-btn,
.join-btn, .leave-btn, .buy-btn, .submit-button, .btn,
.conn-actions button, .peers-conn-actions button,
.mode-buttons button, .mode-buttons .filter-btn,
.filter-group button, .filter-group .filter-btn,
.main-column button, .main-column input[type="submit"] {
white-space: normal !important;
word-break: normal !important;
overflow-wrap: break-word !important;
-webkit-hyphens: none !important;
hyphens: none !important;
}
.conn-actions, .peers-conn-actions {
display: flex !important;
flex-direction: row !important;
flex-wrap: wrap !important;
justify-content: center !important;
align-items: stretch !important;
gap: 8px !important;
width: 100% !important;
max-width: 100% !important;
overflow-x: hidden !important;
}
.conn-actions > form, .peers-conn-actions > form {
flex: 0 1 auto !important;
width: auto !important;
min-width: 0 !important;
margin: 0 !important;
display: flex !important;
}
.pm-info-table, .pm-info-table tbody,
.block-info-table, .block-info-table tbody {
display: block !important;
width: 100% !important;
max-width: 100% !important;
border: 0 !important;
background: transparent !important;
box-shadow: none !important;
table-layout: auto !important;
}
.pm-info-table thead, .block-info-table thead { display: none !important; }
.pm-info-table tr, .block-info-table tr {
display: block !important;
width: 100% !important;
box-sizing: border-box !important;
border: 0 !important;
border-bottom: 1px solid rgba(255,165,0,0.18) !important;
border-radius: 0 !important;
margin: 0 0 8px 0 !important;
padding: 6px 0 !important;
background: transparent !important;
}
.pm-info-table td, .block-info-table td {
display: block !important;
width: 100% !important;
max-width: 100% !important;
box-sizing: border-box !important;
border: 0 !important;
background: transparent !important;
padding: 1px 0 !important;
text-align: left !important;
overflow-wrap: break-word !important;
word-break: normal !important;
}
.pm-info-table td.card-label, .block-info-table td.card-label {
color: var(--c-muted, #8c8c8c) !important;
font-size: 11px !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: .03em !important;
margin-bottom: 2px !important;
padding-bottom: 0 !important;
}
.pm-info-table td.card-value, .block-info-table td.card-value {
font-size: 15px !important;
line-height: 1.5 !important;
margin-bottom: 6px !important;
}
.block-info-table tr:first-child:has(> td.card-label) { display: none !important; }
.block-info-table td[data-label]:not([data-label=""])::before {
content: attr(data-label);
display: block !important;
color: var(--c-muted, #8c8c8c) !important;
font-size: 10px !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: .03em !important;
margin-bottom: 1px !important;
white-space: nowrap !important;
word-break: normal !important;
}
.block-info-table td[data-label=""]::before { content: none !important; }
.peers-list .block-info-table td,
.peers-technical-block .block-info-table td,
.gov-overview tbody td {
word-break: normal !important;
overflow-wrap: break-word !important;
}
.pm-info-table td .user-link, .pm-info-table td .peer-key, .pm-info-table td a[href],
.block-info-table td .peer-key, .block-info-table td .user-link, .block-info-table td a[href] {
display: inline-block !important;
max-width: 100% !important;
overflow-wrap: anywhere !important;
word-break: break-all !important;
}
.pm-info-table td form, .block-info-table td form,
.pm-info-table td button, .block-info-table td button {
width: 100% !important;
margin: 0 !important;
}
.main-content { width: 100% !important; max-width: 100% !important; }
.main-column {
width: 100% !important; max-width: 100% !important;
padding: 16px !important; box-sizing: border-box !important;
}
.main-column .card-field {
flex-direction: column !important;
align-items: stretch !important;
gap: 2px !important;
}
.main-column .card-field .card-value {
width: 100% !important; max-width: 100% !important; font-size: 15px !important;
}
.main-column .card-field .card-label {
color: var(--c-muted, #8c8c8c) !important; font-size: 11px !important;
}
.main-column img, .main-column video, .main-column iframe, .main-column canvas {
max-width: 100% !important; height: auto !important;
}
.main-column hr {
width: 100% !important; border: 0 !important;
border-top: 1px solid #333 !important; margin: 16px 0 !important;
}
.activity-filter-acc { width: 100% !important; margin-bottom: 8px !important; }
.activity-quick-modes {
display: flex !important; flex-wrap: nowrap !important; gap: 6px !important; margin-bottom: 8px !important;
}
.activity-quick-modes form { flex: 1 1 0 !important; min-width: 0 !important; margin: 0 !important; display: flex !important; }
.activity-quick-modes .filter-btn {
flex: 1 1 0 !important; width: 100% !important; min-height: 44px !important;
white-space: nowrap !important; word-break: keep-all !important; overflow-wrap: normal !important;
padding-left: 6px !important; padding-right: 6px !important; font-size: 14px !important;
}
.activity-groups { list-style: none !important; padding: 0 !important; margin: 0 !important; }
.activity-groups .oasis-nav-header .emoji { display: none !important; }
.activity-groups .oasis-nav-header .nav-text { flex: 1 1 auto !important; }
.activity-groups .act-count {
flex: 0 0 auto !important; min-width: 20px !important; text-align: center !important;
font-size: 11px !important; font-weight: 700 !important; color: #121212 !important;
background: #FFA500 !important; border-radius: 999px !important; padding: 1px 7px !important;
margin: 0 8px 0 0 !important;
}
.activity-groups .oasis-nav-list li { list-style: none !important; margin: 0 !important; padding: 0 !important; }
.activity-groups .oasis-nav-list form { margin: 0 !important; display: block !important; width: 100% !important; }
.activity-groups .oasis-nav-list .filter-btn {
display: block !important; width: 100% !important; text-align: left !important;
min-height: 44px !important; margin: 2px 0 !important; box-sizing: border-box !important;
}
.activity-groups .oasis-nav-list .filter-btn.active {
outline: 2px solid #FFA500 !important; outline-offset: -2px !important;
}
.message-list { display: flex !important; flex-direction: column !important; gap: 4px !important; width: 100% !important; }
.message-list .pm-thread { display: flex !important; flex-direction: column !important; width: 100% !important; align-self: stretch !important; }
.pm-thread-replies { display: flex !important; flex-direction: column !important; gap: 4px !important; }
.pm-card.pm-bubble {
max-width: 82% !important; width: fit-content !important; min-width: 0 !important;
box-sizing: border-box !important; padding: 8px 12px !important; margin: 2px 0 !important;
border-radius: 16px !important; border: 1px solid #333 !important;
background: #1e1e1e !important; box-shadow: none !important; cursor: default !important;
}
.pm-card.pm-bubble.pm-recv {
align-self: flex-start !important; margin-left: 0 !important; margin-right: auto !important;
border-bottom-left-radius: 4px !important; background: #1e1e1e !important; border-color: #343434 !important;
}
.pm-card.pm-bubble.pm-sent {
align-self: flex-end !important; margin-left: auto !important; margin-right: 0 !important;
border-bottom-right-radius: 4px !important; background: #2a2413 !important; border-color: #5c4c1f !important;
}
.pm-bubble .pm-bubble-sender { font-size: 11px !important; font-weight: 700 !important; color: #FFA500 !important; margin-bottom: 3px !important; }
.pm-bubble .pm-bubble-sender a { color: #FFA500 !important; }
.pm-bubble .message-text { font-size: 15px !important; line-height: 1.42 !important; color: #ececec !important; margin: 0 !important; }
.pm-bubble .message-text a { color: #FFD700 !important; }
.pm-bubble .pm-bubble-meta {
display: flex !important; flex-wrap: wrap !important; align-items: center !important;
gap: 6px !important; margin-top: 4px !important; font-size: 10px !important; color: var(--c-muted, #8c8c8c) !important;
}
.pm-card.pm-sent .pm-bubble-meta { justify-content: flex-end !important; }
.pm-card.pm-recv .pm-bubble-meta { justify-content: flex-start !important; }
.pm-bubble .pm-bubble-subject { font-style: italic !important; opacity: .75 !important; max-width: 50% !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; }
.pm-bubble .pm-bubble-lock { opacity: .85 !important; }
.pm-bubble .pm-bubble-eco { font-size: 9px !important; opacity: .9 !important; }
.pm-bubble .pm-bubble-eco * { font-size: 9px !important; }
.pm-bubble .pm-actions { margin-top: 6px !important; display: flex !important; gap: 6px !important; }
.pm-card.pm-sent .pm-actions { justify-content: flex-end !important; }
.pm-bubble .pm-actions .pm-btn { font-size: 10px !important; padding: 3px 8px !important; min-height: 28px !important; }
.pm-bubble .pm-actions form { margin: 0 !important; }
.pm-bubble .pm-info-table { display: none !important; }
.pm-thread .pm-thread-details { width: 100% !important; }
.pm-thread .pm-thread-toggle { font-size: 12px !important; color: var(--c-muted, #8c8c8c) !important; padding: 4px 0 !important; cursor: pointer !important; }
.main-column h1, .main-column h2, .main-column h3, .main-column h4,
.tags-header h2, .tags-header h3, .title-with-chip h2, .pm-title, h2.pm-title,
.cn-name, h1.cn-name, .cn-section, h2.cn-section, .profile-side-name, h2.profile-side-name {
text-wrap: balance !important;
overflow-wrap: break-word !important;
word-break: keep-all !important;
-webkit-hyphens: none !important; hyphens: none !important;
text-align: left !important;
}
.main-column h1, .tags-header h2, .cn-name {
font-size: var(--fs-title, 20px) !important; font-weight: 700 !important;
line-height: 1.22 !important; letter-spacing: -0.01em !important;
margin: 0 0 var(--space-2, 8px) !important;
}
.main-column h2, .pm-title, .title-with-chip h2, .cn-section {
font-size: 18px !important; font-weight: 700 !important;
line-height: 1.28 !important; margin: var(--space-1, 4px) 0 var(--space-2, 8px) !important;
}
.main-column h3 {
font-size: var(--fs-body-lg, 16px) !important; font-weight: 600 !important;
line-height: 1.35 !important; margin: var(--space-1, 4px) 0 !important;
}
.main-column h1, .main-column h2, .main-column h3,
.tags-header h2, .pm-title, .cn-name, .cn-section {
max-width: 40ch !important; width: auto !important; min-width: 0 !important;
}
.main-column h1 code, .main-column h2 code, .main-column h3 code,
.tags-header h2 code, .pm-title code,
.main-column h1 a[href*="ed25519"], .main-column h2 a[href*="ed25519"],
.main-column h1 a[href^="ssb:"], .main-column h2 a[href^="ssb:"] {
word-break: break-all !important; overflow-wrap: anywhere !important;
}
.main-column .tags-header {
display: flex !important; flex-direction: column !important; align-items: flex-start !important;
gap: var(--space-1, 4px) !important; width: 100% !important; max-width: 100% !important;
margin: 0 0 var(--space-2, 8px) !important;
}
.main-column .tags-header h2 { margin: 0 !important; }
.main-column .title-with-chip {
display: flex !important; flex-wrap: wrap !important; align-items: center !important;
gap: var(--space-2, 8px) !important; width: 100% !important; max-width: 100% !important;
}
.main-column .title-with-chip h2 { flex: 1 1 auto !important; min-width: 0 !important; margin: 0 !important; max-width: none !important; }
.main-column .title-with-chip > :not(h2) { flex: 0 0 auto !important; }
.main-column p, .main-column li,
.tags-header p, .tags-header .prefs-help, .indexing-note, .indexing-percent,
.error-page-message, .welcome-text, .message-text, .pm-bubble .message-text {
text-wrap: pretty !important;
line-height: 1.55 !important;
max-width: min(66ch, 100%) !important;
overflow-wrap: anywhere !important;
word-break: normal !important;
min-width: 0 !important;
-webkit-hyphens: none !important; hyphens: none !important;
}
.main-column p + p { margin-top: var(--space-3, 16px) !important; }
.tags-header p, .tags-header .prefs-help, .indexing-note { line-height: 1.5 !important; margin: 4px 0 0 0 !important; }
.pm-bubble .message-text { line-height: 1.45 !important; max-width: 100% !important; }
[style*="auto-fill"],
[style*="minmax(240px"], [style*="minmax(280px"], [style*="minmax(300px"],
[style*="minmax( 240px"], [style*="minmax( 280px"], [style*="minmax( 300px"],
.trending-container, .cn-hub-grid, .cn-products {
display: grid !important; grid-template-columns: 1fr !important; gap: 12px !important;
width: 100% !important; max-width: 100% !important;
}
.trending-container > *, .games-grid > *, .market-grid > *, .tribe-grid > *,
.feed-container, .feed-card, .trending-card,
.main-column article, .main-column [class*="-card"], .main-column [class*="-item"],
.main-column [class*="-entry"], .main-column .card {
width: 100% !important; max-width: 100% !important; min-width: 0 !important;
box-sizing: border-box !important; margin-left: 0 !important; margin-right: 0 !important;
}
.feed-card .feed-text, .trending-card .feed-text,
.main-column article p, .main-column [class*="-card"] p { max-width: var(--measure, 66ch) !important; }
.main-column form, .comment-form, .comment-form-wrapper, .market-form,
.new-message-form, .project-control-form, .filter-box {
display: block !important; width: 100% !important; max-width: 100% !important;
min-width: 0 !important; box-sizing: border-box !important;
}
.main-column input:not([type="checkbox"]):not([type="radio"]):not(.oasis-nav-toggle):not(.oasis-nav-side-toggle),
.main-column textarea, .main-column select {
width: 100% !important; max-width: 100% !important; min-width: 0 !important; box-sizing: border-box !important;
}
.main-column form > button:only-of-type, .main-column form > .create-button,
.comment-form button[type="submit"], .market-form button[type="submit"],
.new-message-form button[type="submit"] {
display: block !important; width: 100% !important; max-width: 100% !important;
box-sizing: border-box !important; margin-top: 8px !important;
}
[style*="width:33%"], [style*="width: 33%"], [style*="width:25%"], [style*="width: 25%"],
[style*="width:60%"], [style*="width: 60%"], [style*="width:40%"], [style*="width: 40%"] {
width: 100% !important; max-width: 100% !important;
}
.main-column [style*="max-width: 800px"], .main-column [style*="max-width:800px"],
.ai-response, .ai-train-bar {
max-width: 100% !important; width: 100% !important; margin-left: 0 !important; margin-right: 0 !important; box-sizing: border-box !important;
}
.message-list, .pm-thread, .pm-thread-replies { width: 100% !important; max-width: 100% !important; box-sizing: border-box !important; }
.main-column p .user-link, .main-column p a[href^="/author/"],
.main-column li .user-link, .main-column span .user-link,
.main-column .message-text .user-link, .main-column .message-text a[href^="/author/"],
.pm-bubble .message-text .user-link, .pm-bubble .message-text a[href^="/author/"],
.pm-quote a[href^="/author/"] {
display: inline !important; white-space: normal !important;
overflow-wrap: anywhere !important; word-break: keep-all !important;
-webkit-hyphens: none !important; hyphens: none !important;
}
.peer-key, .user-link.peer-key, .block-info-table td .peer-key, .pm-info-table td .peer-key,
.pm-info-table td .user-link, .block-info-table td .user-link,
.search-oasis-id, .pm-sent-key-value, .kpi__value {
display: inline-block !important; max-width: 100% !important;
overflow-wrap: anywhere !important; word-break: break-all !important;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important;
font-variant-numeric: tabular-nums !important; line-height: 1.45 !important;
}
.oasis-id-copy {
display: block !important; width: 100% !important; white-space: nowrap !important;
overflow: hidden !important; text-overflow: ellipsis !important;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important;
}
.invites-list .user-link.peer-key, .peers-list .block-info-table td .peer-key {
display: block !important; max-width: 100% !important; white-space: nowrap !important;
overflow: hidden !important; text-overflow: ellipsis !important; word-break: normal !important;
}
.main-column .message-text a[href^="http"], .main-column p a[href^="http"],
.pm-bubble .message-text a[href^="http"], .main-column .message-text a.oasis-path-link,
.main-column .message-text a.job-link, .main-column .message-text a.project-link,
.main-column .message-text a.market-link {
overflow-wrap: anywhere !important; word-break: keep-all !important;
-webkit-hyphens: none !important; hyphens: none !important;
}
.main-column code:not(pre code), .pm-bubble .message-text code {
display: inline !important; max-width: 100% !important;
overflow-wrap: anywhere !important; word-break: break-word !important; white-space: pre-wrap !important;
}
.main-column .tags-header { margin-bottom: 6px !important; gap: 2px !important; }
.main-column .tags-header h2, .tags-header h2 {
font-size: 17px !important; line-height: 1.2 !important; letter-spacing: 0 !important;
}
.main-column .tags-header p { font-size: 13px !important; line-height: 1.35 !important; margin: 0 !important; }
.main-column { padding: 10px 12px 16px 12px !important; }
.activity-filter-acc { margin-bottom: 4px !important; }
.empty-state {
display: flex !important; flex-direction: column !important; align-items: center !important;
justify-content: center !important; text-align: center !important;
padding: 40px 16px !important; gap: 8px !important; width: 100% !important; box-sizing: border-box !important;
}
.empty-state-icon { font-size: 44px !important; line-height: 1 !important; opacity: 0.55 !important; }
.empty-state-title { font-size: 16px !important; font-weight: 700 !important; margin: 4px 0 0 0 !important; color: #eee !important; }
.empty-state-text { color: var(--c-muted, #8c8c8c) !important; font-size: 14px !important; line-height: 1.4 !important; max-width: 40ch !important; margin: 0 !important; }
.empty-state-cta { margin-top: 10px !important; min-height: 48px !important; display: inline-flex !important; align-items: center !important; }
.activity-filter-collapsed {
display: flex !important; align-items: center !important; gap: 10px !important;
flex-wrap: wrap !important; margin-bottom: 8px !important; width: 100% !important;
}
.activity-back {
display: inline-flex !important; align-items: center !important; gap: 4px !important;
min-height: 44px !important; padding: 6px 14px 6px 10px !important; flex: 0 0 auto !important;
}
.activity-back-arrow { font-size: 22px !important; line-height: 1 !important; font-weight: bold !important; }
.activity-active-filter {
font-weight: 700 !important; color: #FFA500 !important; text-transform: uppercase !important;
font-size: 13px !important; letter-spacing: .03em !important;
}
.oasis-bottombar .bb-item { min-height: 48px !important; }
.oasis-bottombar .bb-pair .bb-item { min-height: 44px !important; padding: 4px 10px !important; }
.oasis-mobile-menus .oasis-menu-btn { min-height: 48px !important; }
.pm-bubble .pm-actions .pm-btn { min-height: 40px !important; padding: 6px 12px !important; }
.score-btn, .vote-btn, .feed-action-btn {
min-height: 44px !important; min-width: 44px !important;
display: inline-flex !important; align-items: center !important; justify-content: center !important;
}
.score-btn:active, .vote-btn:active, .feed-action-btn:active { filter: brightness(.85) !important; }
.oasis-bottombar .bb-add .bb-ico {
background: #FFA500 !important; color: #121212 !important; border-radius: 999px !important;
width: 30px !important; height: 30px !important; display: inline-flex !important;
align-items: center !important; justify-content: center !important;
font-weight: bold !important; font-size: 20px !important; line-height: 1 !important;
}
.bb-pick-grid {
display: grid !important; grid-template-columns: repeat(3, 1fr) !important;
gap: 8px !important; width: 100% !important; margin-top: 8px !important;
}
.bb-pick-form { margin: 0 !important; display: block !important; }
.bb-pick-btn {
display: flex !important; flex-direction: column !important; align-items: center !important;
justify-content: center !important; gap: 6px !important; width: 100% !important;
min-height: 76px !important; padding: 10px 6px !important; box-sizing: border-box !important;
background: #1c1c1c !important; border: 1px solid #333 !important; border-radius: 12px !important; color: #eee !important;
}
.bb-pick-btn.active { border-color: #FFA500 !important; background: #2a2412 !important; }
.bb-pick-ico { font-size: 26px !important; color: #FFA500 !important; line-height: 1 !important; }
.bb-pick-lbl { font-size: 11px !important; text-align: center !important; line-height: 1.2 !important; }

View file

@ -0,0 +1,777 @@
html { overflow-x: clip !important; overflow-y: visible !important; height: auto !important; }
body { overflow-x: clip !important; overflow-y: visible !important; }
.oasis-bottombar {
display: flex !important;
position: fixed !important;
left: 0 !important; right: 0 !important; bottom: 0 !important;
z-index: 1000 !important;
justify-content: space-around !important;
align-items: center !important;
gap: 4px !important;
background: #1F1F1F !important;
border-top: 1px solid #333 !important;
padding: 8px 6px calc(8px + env(safe-area-inset-bottom, 0px)) !important;
}
.oasis-bottombar .bb-item {
position: relative !important;
display: flex !important;
flex-direction: column !important;
align-items: center !important;
gap: 3px !important;
flex: 1 1 0 !important;
min-width: 0 !important;
padding: 2px 0 !important;
text-decoration: none !important;
}
.oasis-bottombar .bb-ico { font-size: 18px !important; line-height: 1 !important; color: #FFA500 !important; }
.oasis-bottombar .bb-lbl { font-size: 9px !important; color: #ccc !important; white-space: nowrap !important; }
.oasis-bottombar .bb-badge {
position: absolute !important;
top: -4px !important;
left: calc(50% + 6px) !important;
min-width: 15px !important; height: 15px !important;
padding: 0 3px !important;
border-radius: 8px !important;
background: #FFA500 !important;
color: #121212 !important;
font-size: 9px !important; font-weight: bold !important;
display: flex !important; align-items: center !important; justify-content: center !important;
}
body { padding-bottom: calc(64px + env(safe-area-inset-bottom, 0px)) !important; }
.oasis-mobile-topbar {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
width: 100% !important;
padding: 8px 12px !important;
background: transparent !important;
box-shadow: none !important; border: 0 !important;
}
.oasis-mobile-topbar .omt-logo img,
.oasis-mobile-topbar .omt-avatar img {
width: 32px !important; height: 32px !important;
border-radius: 50% !important;
border: 2px solid #FFA500 !important;
object-fit: cover !important; display: block !important;
}
.oasis-mobile-topbar .omt-title {
flex: 1 1 auto !important;
text-align: center !important;
font-size: 26px !important; font-weight: bold !important;
letter-spacing: 10px !important; text-indent: 10px !important;
color: #FFD700 !important; text-decoration: none !important;
white-space: nowrap !important;
background: transparent !important; border: 0 !important; box-shadow: none !important; padding: 0 !important;
}
.header .top-bar-left > a.logo-icon { display: none !important; }
.oasis-mobile-menus { display: flex !important; gap: 8px !important; padding: 0 10px 6px !important; }
.oasis-mobile-menus .oasis-menu-ico { display: none !important; }
.oasis-mobile-menus .oasis-menu-btn {
flex: 1 1 0 !important;
display: flex !important; align-items: center !important; justify-content: center !important;
padding: 12px !important;
border: 1.5px solid #333 !important; border-radius: 10px !important;
background: #121212 !important; color: #ccc !important;
font-weight: bold !important; letter-spacing: 1px !important; cursor: pointer !important;
}
#nav-left-toggle:checked ~ .header .oasis-menu-btn[for="nav-left-toggle"] {
background: #FFA500 !important; color: #121212 !important; border-color: #FFA500 !important;
}
#nav-right-toggle:checked ~ .header .oasis-menu-btn[for="nav-right-toggle"] {
background: #FFD700 !important; color: #121212 !important; border-color: #FFD700 !important;
}
:root {
--space-1: 4px; --space-2: 8px; --space-3: 16px; --space-4: 24px; --space-5: 32px;
--fs-caption: 12px; --fs-body: 14px; --fs-body-lg: 16px; --fs-title: 20px;
--lh-body: 1.5; --measure: 66ch;
--c-muted: #8c8c8c; --radius-md: 12px;
}
.oasis-bottombar .bb-fab .bb-ico {
width: 46px !important; height: 46px !important;
margin-top: -22px !important;
border-radius: 50% !important;
background: #FFA500 !important; color: #121212 !important;
display: flex !important; align-items: center !important; justify-content: center !important;
font-size: 22px !important;
box-shadow: 0 2px 8px rgba(0,0,0,.4) !important;
}
.oasis-bottombar .bb-fab .bb-lbl { color: #FFA500 !important; font-weight: bold !important; }
.main-column, .main-column p, .main-column li, .main-column a,
.main-column span, .main-column td, .main-column h1, .main-column h2, .main-column h3 {
overflow-wrap: anywhere !important;
word-break: break-word !important;
}
.main-column { padding: var(--space-3) !important; }
.main-column p { line-height: var(--lh-body) !important; }
.main-column > * + * { margin-top: var(--space-3) !important; }
.main-column img, .main-column video, .main-column table, .main-column pre, .main-column iframe {
max-width: 100% !important; height: auto !important;
}
.main-column pre { white-space: pre-wrap !important; }
.oasis-nav-group {
list-style: none !important;
background: #1c1c1c !important;
border: 1px solid #333 !important;
border-radius: var(--radius-md) !important;
overflow: hidden !important;
margin-bottom: var(--space-2) !important;
}
.oasis-nav-header {
display: flex !important; align-items: center !important; gap: var(--space-2) !important;
min-height: 48px !important; padding: 0 var(--space-3) !important;
cursor: pointer !important;
color: #FFD700 !important; font-weight: bold !important;
text-transform: uppercase !important; letter-spacing: .04em !important;
font-size: var(--fs-caption) !important;
}
.oasis-nav-header .nav-text { flex: 1 1 auto !important; }
.oasis-nav-header .oasis-nav-arrow { color: var(--c-muted) !important; transition: transform 150ms ease !important; }
.oasis-nav-toggle:checked + .oasis-nav-header .oasis-nav-arrow { transform: rotate(180deg) !important; }
.oasis-nav-header:active { background: #262626 !important; }
.oasis-nav-list { list-style: none !important; padding: 0 !important; margin: 0 !important; }
.oasis-nav-list li a {
display: flex !important; align-items: center !important; gap: var(--space-3) !important;
min-height: 48px !important; padding: 0 var(--space-3) !important;
color: #e8e8e8 !important; text-decoration: none !important;
border-top: 1px solid #262626 !important;
}
.oasis-nav-list li a .emoji { flex: 0 0 auto !important; width: 22px !important; text-align: center !important; color: #FFA500 !important; }
.oasis-nav-list li a .nav-text { font-size: var(--fs-body) !important; }
.oasis-nav-list li a:active { background: #262626 !important; }
.oasis-nav-list li a.current { color: #FFA500 !important; font-weight: bold !important; }
.main-column h1 { font-size: var(--fs-title) !important; font-weight: 700 !important; line-height: 1.25 !important; margin: 0 0 var(--space-2) !important; }
.main-column h2 { font-size: 18px !important; font-weight: 700 !important; line-height: 1.3 !important; margin: 0 0 var(--space-2) !important; }
.main-column h3 { font-size: var(--fs-body-lg) !important; font-weight: 600 !important; margin: 0 0 var(--space-1) !important; }
.main-column p { font-size: var(--fs-body-lg) !important; }
.main-column .created-at, .main-column .small, .main-column .time,
.main-column .meta, .main-column .author-meta, .main-column .subtitle {
color: var(--c-muted) !important; font-size: var(--fs-caption) !important;
}
.main-column article,
.main-column [class*="-card"] {
background: #1c1c1c !important;
border: 1px solid #333 !important;
border-radius: var(--radius-md) !important;
padding: var(--space-3) !important;
}
.main-column article:active,
.main-column [class*="-card"]:active { background: #202020 !important; }
.btn, button, input[type="submit"], input[type="button"], .submit-button,
.filter-btn, .create-button, .edit-btn, .delete-btn, .join-btn, .leave-btn, .buy-btn {
min-height: 48px !important;
}
button:active, input[type="submit"]:active, .submit-button:active,
.filter-btn:active, .create-button:active, .edit-btn:active,
.delete-btn:active, .join-btn:active, .leave-btn:active, .buy-btn:active {
filter: brightness(.85) !important;
}
.main-column a:active { opacity: .6 !important; }
* { -webkit-tap-highlight-color: transparent !important; }
a, button, label, .tap, .oasis-menu-btn, .bb-item, .oasis-nav-header, .oasis-nav-list li a {
touch-action: manipulation !important;
}
body { overscroll-behavior: none !important; }
.main-content, .main-column, .header,
.sidebar-left, .sidebar-right { overflow: visible !important; }
.sidebar-left, .sidebar-right { display: none !important; }
#nav-left-toggle:checked ~ .main-content .sidebar-left { display: block !important; }
#nav-right-toggle:checked ~ .main-content .sidebar-right { display: block !important; }
.bb-manage { margin: 8px 0 16px !important; }
.bb-manage h3, .bb-manage-add h3 {
font-size: 13px !important; text-transform: uppercase !important; letter-spacing: .05em !important;
color: #FFA500 !important; margin: 14px 0 8px !important;
}
.bb-manage-list { display: flex !important; flex-direction: column !important; gap: 8px !important; }
.bb-manage-form { margin: 0 !important; width: 100% !important; }
.bb-manage-btn {
width: 100% !important;
display: flex !important; align-items: center !important; gap: 12px !important;
min-height: 52px !important; padding: 0 14px !important;
background: #1c1c1c !important; border: 1px solid #333 !important; border-radius: 10px !important;
color: #eee !important; cursor: pointer !important; text-align: left !important;
}
.bb-manage-ico { font-size: 20px !important; color: #FFA500 !important; width: 26px !important; text-align: center !important; }
.bb-manage-lbl { flex: 1 1 auto !important; font-size: 15px !important; }
.bb-manage-x { font-size: 16px !important; color: #ff6b6b !important; font-weight: bold !important; }
.bb-manage-empty, .bb-manage-full { color: #999 !important; font-size: 14px !important; padding: 8px 2px !important; }
.bb-manage-done {
display: block !important; text-align: center !important;
margin-top: 16px !important; min-height: 48px !important; line-height: 48px !important;
}
.hive-nav { --hx: min(64px, calc((100vw - 40px) / 4)); --hxm: min(58px, calc((100vw - 36px) / 5)); margin: 8px 0 16px !important; overflow: visible !important; background: transparent !important; padding: 0 !important; border: 0 !important; box-shadow: none !important; }
.hive-radio { position: absolute !important; opacity: 0 !important; width: 0 !important; height: 0 !important; pointer-events: none !important; }
.hive-grid { display: flex !important; flex-direction: column !important; align-items: center !important; overflow: visible !important; background: transparent !important; padding: 0 !important; margin: 0 !important; box-shadow: none !important; }
.hive-row { display: flex !important; justify-content: center !important; gap: 3px !important; overflow: visible !important; background: transparent !important; padding: 0 !important; margin: 0 !important; box-shadow: none !important; }
.hive-cats .hive-row + .hive-row { margin-top: calc(var(--hx) * -0.30) !important; }
.hex-cat, .hex-mod {
position: relative !important;
-webkit-clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%) !important;
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%) !important;
display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; gap: 2px !important;
text-decoration: none !important; cursor: pointer !important; box-sizing: border-box !important;
background: #D9A400 !important;
filter: drop-shadow(0 1px 2px rgba(0,0,0,.6)) !important;
}
.hex-cat::before, .hex-mod::before {
content: '' !important; position: absolute !important; inset: 1.5px !important; z-index: 0 !important;
-webkit-clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%) !important;
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%) !important;
background: #161616 !important;
}
.hex-cat { width: var(--hx) !important; height: calc(var(--hx) * 1.15) !important; }
.hex-mod { width: var(--hxm) !important; height: calc(var(--hxm) * 1.15) !important; }
.hex-cat .hx-ico, .hex-mod .hx-ico { color: #FFA500 !important; line-height: 1 !important; position: relative !important; z-index: 1 !important; }
.hex-cat .hx-ico { font-size: 17px !important; }
.hex-mod .hx-ico { font-size: 16px !important; }
.hex-cat .hx-lbl, .hex-mod .hx-lbl { color: #d8d8d8 !important; text-align: center !important; line-height: 1 !important; font-weight: bold !important; overflow: hidden !important; position: relative !important; z-index: 1 !important; }
.hex-cat .hx-lbl { font-size: 8px !important; max-width: 88% !important; }
.hex-mod .hx-lbl { font-size: 8px !important; max-width: 92% !important; }
.hex-cat:active::before, .hex-mod:active::before { background: #242424 !important; }
#hive-personal:checked ~ .hive-grid .hex-cat[for="hive-personal"],
#hive-governance:checked ~ .hive-grid .hex-cat[for="hive-governance"],
#hive-office:checked ~ .hive-grid .hex-cat[for="hive-office"],
#hive-economy:checked ~ .hive-grid .hex-cat[for="hive-economy"],
#hive-tools:checked ~ .hive-grid .hex-cat[for="hive-tools"],
#hive-network:checked ~ .hive-grid .hex-cat[for="hive-network"],
#hive-blogs:checked ~ .hive-grid .hex-cat[for="hive-blogs"],
#hive-creative:checked ~ .hive-grid .hex-cat[for="hive-creative"],
#hive-media:checked ~ .hive-grid .hex-cat[for="hive-media"],
#hive-fediverse:checked ~ .hive-grid .hex-cat[for="hive-fediverse"] { background: #FFA500 !important; }
#hive-personal:checked ~ .hive-grid .hex-cat[for="hive-personal"]::before,
#hive-governance:checked ~ .hive-grid .hex-cat[for="hive-governance"]::before,
#hive-office:checked ~ .hive-grid .hex-cat[for="hive-office"]::before,
#hive-economy:checked ~ .hive-grid .hex-cat[for="hive-economy"]::before,
#hive-tools:checked ~ .hive-grid .hex-cat[for="hive-tools"]::before,
#hive-network:checked ~ .hive-grid .hex-cat[for="hive-network"]::before,
#hive-blogs:checked ~ .hive-grid .hex-cat[for="hive-blogs"]::before,
#hive-creative:checked ~ .hive-grid .hex-cat[for="hive-creative"]::before,
#hive-media:checked ~ .hive-grid .hex-cat[for="hive-media"]::before,
#hive-fediverse:checked ~ .hive-grid .hex-cat[for="hive-fediverse"]::before { background: #FFA500 !important; }
#hive-personal:checked ~ .hive-grid .hex-cat[for="hive-personal"] :is(.hx-ico,.hx-lbl),
#hive-governance:checked ~ .hive-grid .hex-cat[for="hive-governance"] :is(.hx-ico,.hx-lbl),
#hive-office:checked ~ .hive-grid .hex-cat[for="hive-office"] :is(.hx-ico,.hx-lbl),
#hive-economy:checked ~ .hive-grid .hex-cat[for="hive-economy"] :is(.hx-ico,.hx-lbl),
#hive-tools:checked ~ .hive-grid .hex-cat[for="hive-tools"] :is(.hx-ico,.hx-lbl),
#hive-network:checked ~ .hive-grid .hex-cat[for="hive-network"] :is(.hx-ico,.hx-lbl),
#hive-blogs:checked ~ .hive-grid .hex-cat[for="hive-blogs"] :is(.hx-ico,.hx-lbl),
#hive-creative:checked ~ .hive-grid .hex-cat[for="hive-creative"] :is(.hx-ico,.hx-lbl),
#hive-media:checked ~ .hive-grid .hex-cat[for="hive-media"] :is(.hx-ico,.hx-lbl),
#hive-fediverse:checked ~ .hive-grid .hex-cat[for="hive-fediverse"] :is(.hx-ico,.hx-lbl) { color: #121212 !important; }
.hive-panel { display: none !important; margin: 12px auto 0 !important; max-width: 340px !important; background: #101010 !important; border: 1px solid #242424 !important; border-radius: 16px !important; padding: 12px 8px !important; overflow: visible !important; box-shadow: none !important; }
#hive-personal:checked ~ #hive-panel-personal,
#hive-governance:checked ~ #hive-panel-governance,
#hive-office:checked ~ #hive-panel-office,
#hive-economy:checked ~ #hive-panel-economy,
#hive-tools:checked ~ #hive-panel-tools,
#hive-network:checked ~ #hive-panel-network,
#hive-blogs:checked ~ #hive-panel-blogs,
#hive-creative:checked ~ #hive-panel-creative,
#hive-media:checked ~ #hive-panel-media,
#hive-fediverse:checked ~ #hive-panel-fediverse { display: block !important; }
.hive-mods { display: flex !important; flex-wrap: wrap !important; justify-content: center !important; gap: 4px !important; margin: 0 !important; padding: 0 !important; background: transparent !important; overflow: visible !important; }
.header .top-bar-left nav,
.header .top-bar-right nav { display: none !important; }
.oasis-mobile-topbar { padding-top: calc(env(safe-area-inset-top, 0px) + 10px) !important; }
.oasis-bottombar .bb-pair {
display: flex !important; align-items: center !important;
flex: 0 0 auto !important;
gap: 2px !important; padding: 3px !important;
background: #262626 !important;
border: 1px solid #3a3a3a !important;
border-radius: 999px !important;
}
.oasis-bottombar .bb-pair .bb-item { flex: 0 0 auto !important; padding: 2px 8px !important; }
.oasis-bottombar .bb-pair .bb-lbl { font-size: 8px !important; }
.oasis-bottombar a.bb-item.current .bb-ico {
background: #FFA500 !important; color: #121212 !important;
border-radius: 999px !important; padding: 4px 12px !important;
}
.oasis-bottombar a.bb-item.current .bb-lbl { color: #FFA500 !important; font-weight: bold !important; }
.oasis-bottombar a.bb-item.current .bb-badge { background: #121212 !important; color: #FFA500 !important; }
.main-column, .main-column p, .main-column li, .main-column a,
.main-column span, .main-column td, .main-column th, .main-column label,
.main-column h1, .main-column h2, .main-column h3, .main-column h4,
.main-column strong, .main-column em, .main-column small,
.created-at, .post-meta, .feed-post-meta,
.feed-row .small, .feed-row .time, .feed-row .created-at,
.profile-sensors-box > *,
.card-field .card-value, .card-field .card-label {
overflow-wrap: break-word !important;
word-break: normal !important;
-webkit-hyphens: none !important;
hyphens: none !important;
}
.main-column pre, .main-column code, kbd, samp,
.peer-key, .user-link.peer-key, .oasis-id-copy, .search-oasis-id,
.pm-sent-key-value, .kpi__value,
.block-info-table td .peer-key, .block-info-table td .user-link,
.pm-info-table td .user-link,
.main-column a[href*="ed25519"], .main-column a[href^="ssb:"],
.main-column a[href^="/author/"] {
overflow-wrap: anywhere !important;
word-break: break-all !important;
}
button, input[type="submit"], input[type="button"],
.filter-btn, a.filter-btn, .create-button, .edit-btn, .delete-btn,
.join-btn, .leave-btn, .buy-btn, .submit-button, .btn,
.conn-actions button, .peers-conn-actions button,
.mode-buttons button, .mode-buttons .filter-btn,
.filter-group button, .filter-group .filter-btn,
.main-column button, .main-column input[type="submit"] {
white-space: normal !important;
word-break: normal !important;
overflow-wrap: break-word !important;
-webkit-hyphens: none !important;
hyphens: none !important;
}
.conn-actions, .peers-conn-actions {
display: flex !important;
flex-direction: row !important;
flex-wrap: wrap !important;
justify-content: center !important;
align-items: stretch !important;
gap: 8px !important;
width: 100% !important;
max-width: 100% !important;
overflow-x: hidden !important;
}
.conn-actions > form, .peers-conn-actions > form {
flex: 0 1 auto !important;
width: auto !important;
min-width: 0 !important;
margin: 0 !important;
display: flex !important;
}
.pm-info-table, .pm-info-table tbody,
.block-info-table, .block-info-table tbody {
display: block !important;
width: 100% !important;
max-width: 100% !important;
border: 0 !important;
background: transparent !important;
box-shadow: none !important;
table-layout: auto !important;
}
.pm-info-table thead, .block-info-table thead { display: none !important; }
.pm-info-table tr, .block-info-table tr {
display: block !important;
width: 100% !important;
box-sizing: border-box !important;
border: 0 !important;
border-bottom: 1px solid rgba(255,165,0,0.18) !important;
border-radius: 0 !important;
margin: 0 0 8px 0 !important;
padding: 6px 0 !important;
background: transparent !important;
}
.pm-info-table td, .block-info-table td {
display: block !important;
width: 100% !important;
max-width: 100% !important;
box-sizing: border-box !important;
border: 0 !important;
background: transparent !important;
padding: 1px 0 !important;
text-align: left !important;
overflow-wrap: break-word !important;
word-break: normal !important;
}
.pm-info-table td.card-label, .block-info-table td.card-label {
color: var(--c-muted, #8c8c8c) !important;
font-size: 11px !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: .03em !important;
margin-bottom: 2px !important;
padding-bottom: 0 !important;
}
.pm-info-table td.card-value, .block-info-table td.card-value {
font-size: 15px !important;
line-height: 1.5 !important;
margin-bottom: 6px !important;
}
.block-info-table tr:first-child:has(> td.card-label) { display: none !important; }
.block-info-table td[data-label]:not([data-label=""])::before {
content: attr(data-label);
display: block !important;
color: var(--c-muted, #8c8c8c) !important;
font-size: 10px !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: .03em !important;
margin-bottom: 1px !important;
white-space: nowrap !important;
word-break: normal !important;
}
.block-info-table td[data-label=""]::before { content: none !important; }
.peers-list .block-info-table td,
.peers-technical-block .block-info-table td,
.gov-overview tbody td {
word-break: normal !important;
overflow-wrap: break-word !important;
}
.pm-info-table td .user-link, .pm-info-table td .peer-key, .pm-info-table td a[href],
.block-info-table td .peer-key, .block-info-table td .user-link, .block-info-table td a[href] {
display: inline-block !important;
max-width: 100% !important;
overflow-wrap: anywhere !important;
word-break: break-all !important;
}
.pm-info-table td form, .block-info-table td form,
.pm-info-table td button, .block-info-table td button {
width: 100% !important;
margin: 0 !important;
}
.main-content { width: 100% !important; max-width: 100% !important; }
.main-column {
width: 100% !important; max-width: 100% !important;
padding: 16px !important; box-sizing: border-box !important;
}
.main-column .card-field {
flex-direction: column !important;
align-items: stretch !important;
gap: 2px !important;
}
.main-column .card-field .card-value {
width: 100% !important; max-width: 100% !important; font-size: 15px !important;
}
.main-column .card-field .card-label {
color: var(--c-muted, #8c8c8c) !important; font-size: 11px !important;
}
.main-column img, .main-column video, .main-column iframe, .main-column canvas {
max-width: 100% !important; height: auto !important;
}
.main-column hr {
width: 100% !important; border: 0 !important;
border-top: 1px solid #333 !important; margin: 16px 0 !important;
}
.activity-filter-acc { width: 100% !important; margin-bottom: 8px !important; }
.activity-quick-modes {
display: flex !important; flex-wrap: nowrap !important; gap: 6px !important; margin-bottom: 8px !important;
}
.activity-quick-modes form { flex: 1 1 0 !important; min-width: 0 !important; margin: 0 !important; display: flex !important; }
.activity-quick-modes .filter-btn {
flex: 1 1 0 !important; width: 100% !important; min-height: 44px !important;
white-space: nowrap !important; word-break: keep-all !important; overflow-wrap: normal !important;
padding-left: 6px !important; padding-right: 6px !important; font-size: 14px !important;
}
.activity-groups { list-style: none !important; padding: 0 !important; margin: 0 !important; }
.activity-groups .oasis-nav-header .emoji { display: none !important; }
.activity-groups .oasis-nav-header .nav-text { flex: 1 1 auto !important; }
.activity-groups .act-count {
flex: 0 0 auto !important; min-width: 20px !important; text-align: center !important;
font-size: 11px !important; font-weight: 700 !important; color: #121212 !important;
background: #FFA500 !important; border-radius: 999px !important; padding: 1px 7px !important;
margin: 0 8px 0 0 !important;
}
.activity-groups .oasis-nav-list li { list-style: none !important; margin: 0 !important; padding: 0 !important; }
.activity-groups .oasis-nav-list form { margin: 0 !important; display: block !important; width: 100% !important; }
.activity-groups .oasis-nav-list .filter-btn {
display: block !important; width: 100% !important; text-align: left !important;
min-height: 44px !important; margin: 2px 0 !important; box-sizing: border-box !important;
}
.activity-groups .oasis-nav-list .filter-btn.active {
outline: 2px solid #FFA500 !important; outline-offset: -2px !important;
}
.message-list { display: flex !important; flex-direction: column !important; gap: 4px !important; width: 100% !important; }
.message-list .pm-thread { display: flex !important; flex-direction: column !important; width: 100% !important; align-self: stretch !important; }
.pm-thread-replies { display: flex !important; flex-direction: column !important; gap: 4px !important; }
.pm-card.pm-bubble {
max-width: 82% !important; width: fit-content !important; min-width: 0 !important;
box-sizing: border-box !important; padding: 8px 12px !important; margin: 2px 0 !important;
border-radius: 16px !important; border: 1px solid #333 !important;
background: #1e1e1e !important; box-shadow: none !important; cursor: default !important;
}
.pm-card.pm-bubble.pm-recv {
align-self: flex-start !important; margin-left: 0 !important; margin-right: auto !important;
border-bottom-left-radius: 4px !important; background: #1e1e1e !important; border-color: #343434 !important;
}
.pm-card.pm-bubble.pm-sent {
align-self: flex-end !important; margin-left: auto !important; margin-right: 0 !important;
border-bottom-right-radius: 4px !important; background: #2a2413 !important; border-color: #5c4c1f !important;
}
.pm-bubble .pm-bubble-sender { font-size: 11px !important; font-weight: 700 !important; color: #FFA500 !important; margin-bottom: 3px !important; }
.pm-bubble .pm-bubble-sender a { color: #FFA500 !important; }
.pm-bubble .message-text { font-size: 15px !important; line-height: 1.42 !important; color: #ececec !important; margin: 0 !important; }
.pm-bubble .message-text a { color: #FFD700 !important; }
.pm-bubble .pm-bubble-meta {
display: flex !important; flex-wrap: wrap !important; align-items: center !important;
gap: 6px !important; margin-top: 4px !important; font-size: 10px !important; color: var(--c-muted, #8c8c8c) !important;
}
.pm-card.pm-sent .pm-bubble-meta { justify-content: flex-end !important; }
.pm-card.pm-recv .pm-bubble-meta { justify-content: flex-start !important; }
.pm-bubble .pm-bubble-subject { font-style: italic !important; opacity: .75 !important; max-width: 50% !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; }
.pm-bubble .pm-bubble-lock { opacity: .85 !important; }
.pm-bubble .pm-bubble-eco { font-size: 9px !important; opacity: .9 !important; }
.pm-bubble .pm-bubble-eco * { font-size: 9px !important; }
.pm-bubble .pm-actions { margin-top: 6px !important; display: flex !important; gap: 6px !important; }
.pm-card.pm-sent .pm-actions { justify-content: flex-end !important; }
.pm-bubble .pm-actions .pm-btn { font-size: 10px !important; padding: 3px 8px !important; min-height: 28px !important; }
.pm-bubble .pm-actions form { margin: 0 !important; }
.pm-bubble .pm-info-table { display: none !important; }
.pm-thread .pm-thread-details { width: 100% !important; }
.pm-thread .pm-thread-toggle { font-size: 12px !important; color: var(--c-muted, #8c8c8c) !important; padding: 4px 0 !important; cursor: pointer !important; }
.main-column h1, .main-column h2, .main-column h3, .main-column h4,
.tags-header h2, .tags-header h3, .title-with-chip h2, .pm-title, h2.pm-title,
.cn-name, h1.cn-name, .cn-section, h2.cn-section, .profile-side-name, h2.profile-side-name {
text-wrap: balance !important;
overflow-wrap: break-word !important;
word-break: keep-all !important;
-webkit-hyphens: none !important; hyphens: none !important;
text-align: left !important;
}
.main-column h1, .tags-header h2, .cn-name {
font-size: var(--fs-title, 20px) !important; font-weight: 700 !important;
line-height: 1.22 !important; letter-spacing: -0.01em !important;
margin: 0 0 var(--space-2, 8px) !important;
}
.main-column h2, .pm-title, .title-with-chip h2, .cn-section {
font-size: 18px !important; font-weight: 700 !important;
line-height: 1.28 !important; margin: var(--space-1, 4px) 0 var(--space-2, 8px) !important;
}
.main-column h3 {
font-size: var(--fs-body-lg, 16px) !important; font-weight: 600 !important;
line-height: 1.35 !important; margin: var(--space-1, 4px) 0 !important;
}
.main-column h1, .main-column h2, .main-column h3,
.tags-header h2, .pm-title, .cn-name, .cn-section {
max-width: 40ch !important; width: auto !important; min-width: 0 !important;
}
.main-column h1 code, .main-column h2 code, .main-column h3 code,
.tags-header h2 code, .pm-title code,
.main-column h1 a[href*="ed25519"], .main-column h2 a[href*="ed25519"],
.main-column h1 a[href^="ssb:"], .main-column h2 a[href^="ssb:"] {
word-break: break-all !important; overflow-wrap: anywhere !important;
}
.main-column .tags-header {
display: flex !important; flex-direction: column !important; align-items: flex-start !important;
gap: var(--space-1, 4px) !important; width: 100% !important; max-width: 100% !important;
margin: 0 0 var(--space-2, 8px) !important;
}
.main-column .tags-header h2 { margin: 0 !important; }
.main-column .title-with-chip {
display: flex !important; flex-wrap: wrap !important; align-items: center !important;
gap: var(--space-2, 8px) !important; width: 100% !important; max-width: 100% !important;
}
.main-column .title-with-chip h2 { flex: 1 1 auto !important; min-width: 0 !important; margin: 0 !important; max-width: none !important; }
.main-column .title-with-chip > :not(h2) { flex: 0 0 auto !important; }
.main-column p, .main-column li,
.tags-header p, .tags-header .prefs-help, .indexing-note, .indexing-percent,
.error-page-message, .welcome-text, .message-text, .pm-bubble .message-text {
text-wrap: pretty !important;
line-height: 1.55 !important;
max-width: min(66ch, 100%) !important;
overflow-wrap: anywhere !important;
word-break: normal !important;
min-width: 0 !important;
-webkit-hyphens: none !important; hyphens: none !important;
}
.main-column p + p { margin-top: var(--space-3, 16px) !important; }
.tags-header p, .tags-header .prefs-help, .indexing-note { line-height: 1.5 !important; margin: 4px 0 0 0 !important; }
.pm-bubble .message-text { line-height: 1.45 !important; max-width: 100% !important; }
[style*="auto-fill"],
[style*="minmax(240px"], [style*="minmax(280px"], [style*="minmax(300px"],
[style*="minmax( 240px"], [style*="minmax( 280px"], [style*="minmax( 300px"],
.trending-container, .cn-hub-grid, .cn-products {
display: grid !important; grid-template-columns: 1fr !important; gap: 12px !important;
width: 100% !important; max-width: 100% !important;
}
.trending-container > *, .games-grid > *, .market-grid > *, .tribe-grid > *,
.feed-container, .feed-card, .trending-card,
.main-column article, .main-column [class*="-card"], .main-column [class*="-item"],
.main-column [class*="-entry"], .main-column .card {
width: 100% !important; max-width: 100% !important; min-width: 0 !important;
box-sizing: border-box !important; margin-left: 0 !important; margin-right: 0 !important;
}
.feed-card .feed-text, .trending-card .feed-text,
.main-column article p, .main-column [class*="-card"] p { max-width: var(--measure, 66ch) !important; }
.main-column form, .comment-form, .comment-form-wrapper, .market-form,
.new-message-form, .project-control-form, .filter-box {
display: block !important; width: 100% !important; max-width: 100% !important;
min-width: 0 !important; box-sizing: border-box !important;
}
.main-column input:not([type="checkbox"]):not([type="radio"]):not(.oasis-nav-toggle):not(.oasis-nav-side-toggle),
.main-column textarea, .main-column select {
width: 100% !important; max-width: 100% !important; min-width: 0 !important; box-sizing: border-box !important;
}
.main-column form > button:only-of-type, .main-column form > .create-button,
.comment-form button[type="submit"], .market-form button[type="submit"],
.new-message-form button[type="submit"] {
display: block !important; width: 100% !important; max-width: 100% !important;
box-sizing: border-box !important; margin-top: 8px !important;
}
[style*="width:33%"], [style*="width: 33%"], [style*="width:25%"], [style*="width: 25%"],
[style*="width:60%"], [style*="width: 60%"], [style*="width:40%"], [style*="width: 40%"] {
width: 100% !important; max-width: 100% !important;
}
.main-column [style*="max-width: 800px"], .main-column [style*="max-width:800px"],
.ai-response, .ai-train-bar {
max-width: 100% !important; width: 100% !important; margin-left: 0 !important; margin-right: 0 !important; box-sizing: border-box !important;
}
.message-list, .pm-thread, .pm-thread-replies { width: 100% !important; max-width: 100% !important; box-sizing: border-box !important; }
.main-column p .user-link, .main-column p a[href^="/author/"],
.main-column li .user-link, .main-column span .user-link,
.main-column .message-text .user-link, .main-column .message-text a[href^="/author/"],
.pm-bubble .message-text .user-link, .pm-bubble .message-text a[href^="/author/"],
.pm-quote a[href^="/author/"] {
display: inline !important; white-space: normal !important;
overflow-wrap: anywhere !important; word-break: keep-all !important;
-webkit-hyphens: none !important; hyphens: none !important;
}
.peer-key, .user-link.peer-key, .block-info-table td .peer-key, .pm-info-table td .peer-key,
.pm-info-table td .user-link, .block-info-table td .user-link,
.search-oasis-id, .pm-sent-key-value, .kpi__value {
display: inline-block !important; max-width: 100% !important;
overflow-wrap: anywhere !important; word-break: break-all !important;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important;
font-variant-numeric: tabular-nums !important; line-height: 1.45 !important;
}
.oasis-id-copy {
display: block !important; width: 100% !important; white-space: nowrap !important;
overflow: hidden !important; text-overflow: ellipsis !important;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important;
}
.invites-list .user-link.peer-key, .peers-list .block-info-table td .peer-key {
display: block !important; max-width: 100% !important; white-space: nowrap !important;
overflow: hidden !important; text-overflow: ellipsis !important; word-break: normal !important;
}
.main-column .message-text a[href^="http"], .main-column p a[href^="http"],
.pm-bubble .message-text a[href^="http"], .main-column .message-text a.oasis-path-link,
.main-column .message-text a.job-link, .main-column .message-text a.project-link,
.main-column .message-text a.market-link {
overflow-wrap: anywhere !important; word-break: keep-all !important;
-webkit-hyphens: none !important; hyphens: none !important;
}
.main-column code:not(pre code), .pm-bubble .message-text code {
display: inline !important; max-width: 100% !important;
overflow-wrap: anywhere !important; word-break: break-word !important; white-space: pre-wrap !important;
}
.main-column .tags-header { margin-bottom: 6px !important; gap: 2px !important; }
.main-column .tags-header h2, .tags-header h2 {
font-size: 17px !important; line-height: 1.2 !important; letter-spacing: 0 !important;
}
.main-column .tags-header p { font-size: 13px !important; line-height: 1.35 !important; margin: 0 !important; }
.main-column { padding: 10px 12px 16px 12px !important; }
.activity-filter-acc { margin-bottom: 4px !important; }
.empty-state {
display: flex !important; flex-direction: column !important; align-items: center !important;
justify-content: center !important; text-align: center !important;
padding: 40px 16px !important; gap: 8px !important; width: 100% !important; box-sizing: border-box !important;
}
.empty-state-icon { font-size: 44px !important; line-height: 1 !important; opacity: 0.55 !important; }
.empty-state-title { font-size: 16px !important; font-weight: 700 !important; margin: 4px 0 0 0 !important; color: #eee !important; }
.empty-state-text { color: var(--c-muted, #8c8c8c) !important; font-size: 14px !important; line-height: 1.4 !important; max-width: 40ch !important; margin: 0 !important; }
.empty-state-cta { margin-top: 10px !important; min-height: 48px !important; display: inline-flex !important; align-items: center !important; }
.activity-filter-collapsed {
display: flex !important; align-items: center !important; gap: 10px !important;
flex-wrap: wrap !important; margin-bottom: 8px !important; width: 100% !important;
}
.activity-back {
display: inline-flex !important; align-items: center !important; gap: 4px !important;
min-height: 44px !important; padding: 6px 14px 6px 10px !important; flex: 0 0 auto !important;
}
.activity-back-arrow { font-size: 22px !important; line-height: 1 !important; font-weight: bold !important; }
.activity-active-filter {
font-weight: 700 !important; color: #FFA500 !important; text-transform: uppercase !important;
font-size: 13px !important; letter-spacing: .03em !important;
}
.oasis-bottombar .bb-item { min-height: 48px !important; }
.oasis-bottombar .bb-pair .bb-item { min-height: 44px !important; padding: 4px 10px !important; }
.oasis-mobile-menus .oasis-menu-btn { min-height: 48px !important; }
.pm-bubble .pm-actions .pm-btn { min-height: 40px !important; padding: 6px 12px !important; }
.score-btn, .vote-btn, .feed-action-btn {
min-height: 44px !important; min-width: 44px !important;
display: inline-flex !important; align-items: center !important; justify-content: center !important;
}
.score-btn:active, .vote-btn:active, .feed-action-btn:active { filter: brightness(.85) !important; }
.oasis-bottombar .bb-add .bb-ico {
background: #FFA500 !important; color: #121212 !important; border-radius: 999px !important;
width: 30px !important; height: 30px !important; display: inline-flex !important;
align-items: center !important; justify-content: center !important;
font-weight: bold !important; font-size: 20px !important; line-height: 1 !important;
}
.bb-pick-grid {
display: grid !important; grid-template-columns: repeat(3, 1fr) !important;
gap: 8px !important; width: 100% !important; margin-top: 8px !important;
}
.bb-pick-form { margin: 0 !important; display: block !important; }
.bb-pick-btn {
display: flex !important; flex-direction: column !important; align-items: center !important;
justify-content: center !important; gap: 6px !important; width: 100% !important;
min-height: 76px !important; padding: 10px 6px !important; box-sizing: border-box !important;
background: #1c1c1c !important; border: 1px solid #333 !important; border-radius: 12px !important; color: #eee !important;
}
.bb-pick-btn.active { border-color: #FFA500 !important; background: #2a2412 !important; }
.bb-pick-ico { font-size: 26px !important; color: #FFA500 !important; line-height: 1 !important; }
.bb-pick-lbl { font-size: 11px !important; text-align: center !important; line-height: 1.2 !important; }

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "تثبيت وحدة",
bbPickDesc: "اختر وحدة لخانة + في الشريط السفلي.",
bbPickNone: "لا شيء",
bbManage: "تعديل",
bbYourBar: "شريطك",
bbRemove: "إزالة",
bbFull: "تم بلوغ الحد الأقصى",
bbDone: "تم",
activityChangeFilter: "تغيير التصفية",
emptyConnectHint: "اتصل بـ pub للمزامنة مع الشبكة.",
emptyConnectCta: "الاتصال بـ pub",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "Modul anheften",
bbPickDesc: "Wähle ein Modul für den +-Platz in der unteren Leiste.",
bbPickNone: "Keins",
bbManage: "Bearbeiten",
bbYourBar: "Deine Leiste",
bbRemove: "Entfernen",
bbFull: "Maximum erreicht",
bbDone: "Fertig",
activityChangeFilter: "Filter ändern",
emptyConnectHint: "Verbinde dich mit einem Pub, um dich mit dem Netzwerk zu synchronisieren.",
emptyConnectCta: "Mit einem Pub verbinden",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "Pin a module",
bbPickDesc: "Choose a module for the + slot in the bottom bar.",
bbPickNone: "None",
bbManage: "Edit",
bbYourBar: "Your bar",
bbRemove: "Remove",
bbFull: "Maximum reached",
bbDone: "Done",
activityChangeFilter: "Change filter",
emptyConnectHint: "Connect to a pub to sync with the network.",
emptyConnectCta: "Connect to a pub",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "Fijar un módulo",
bbPickDesc: "Elige un módulo para el hueco + de la barra inferior.",
bbPickNone: "Ninguno",
bbManage: "Editar",
bbYourBar: "Tu barra",
bbRemove: "Quitar",
bbFull: "Máximo alcanzado",
bbDone: "Hecho",
activityChangeFilter: "Cambiar filtro",
emptyConnectHint: "Conéctate a un pub para sincronizar con la red.",
emptyConnectCta: "Conéctate a un pub",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "Ainguratu modulu bat",
bbPickDesc: "Aukeratu modulu bat beheko barrako + hutsunerako.",
bbPickNone: "Bat ere ez",
bbManage: "Editatu",
bbYourBar: "Zure barra",
bbRemove: "Kendu",
bbFull: "Gehienekora iritsi da",
bbDone: "Eginda",
activityChangeFilter: "Aldatu iragazkia",
emptyConnectHint: "Konektatu pub batera sarearekin sinkronizatzeko.",
emptyConnectCta: "Konektatu pub batera",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "Épingler un module",
bbPickDesc: "Choisis un module pour l'emplacement + de la barre inférieure.",
bbPickNone: "Aucun",
bbManage: "Modifier",
bbYourBar: "Ta barre",
bbRemove: "Retirer",
bbFull: "Maximum atteint",
bbDone: "Terminé",
activityChangeFilter: "Changer de filtre",
emptyConnectHint: "Connecte-toi à un pub pour synchroniser avec le réseau.",
emptyConnectCta: "Se connecter à un pub",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "एक मॉड्यूल पिन करें",
bbPickDesc: "नीचे की बार में + स्लॉट के लिए एक मॉड्यूल चुनें।",
bbPickNone: "कोई नहीं",
bbManage: "संपादित करें",
bbYourBar: "आपकी बार",
bbRemove: "हटाएँ",
bbFull: "अधिकतम पहुँच गया",
bbDone: "हो गया",
activityChangeFilter: "फ़िल्टर बदलें",
emptyConnectHint: "नेटवर्क से सिंक करने के लिए किसी pub से जुड़ें।",
emptyConnectCta: "pub से जुड़ें",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "Fissa un modulo",
bbPickDesc: "Scegli un modulo per lo spazio + nella barra inferiore.",
bbPickNone: "Nessuno",
bbManage: "Modifica",
bbYourBar: "La tua barra",
bbRemove: "Rimuovi",
bbFull: "Massimo raggiunto",
bbDone: "Fatto",
activityChangeFilter: "Cambia filtro",
emptyConnectHint: "Connettiti a un pub per sincronizzarti con la rete.",
emptyConnectCta: "Connettiti a un pub",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "Fixar um módulo",
bbPickDesc: "Escolhe um módulo para o espaço + da barra inferior.",
bbPickNone: "Nenhum",
bbManage: "Editar",
bbYourBar: "Sua barra",
bbRemove: "Remover",
bbFull: "Máximo atingido",
bbDone: "Concluído",
activityChangeFilter: "Mudar filtro",
emptyConnectHint: "Liga-te a um pub para sincronizar com a rede.",
emptyConnectCta: "Ligar a um pub",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "Закрепить модуль",
bbPickDesc: "Выберите модуль для слота + в нижней панели.",
bbPickNone: "Нет",
bbManage: "Изменить",
bbYourBar: "Ваша панель",
bbRemove: "Убрать",
bbFull: "Достигнут максимум",
bbDone: "Готово",
activityChangeFilter: "Сменить фильтр",
emptyConnectHint: "Подключитесь к пабу для синхронизации с сетью.",
emptyConnectCta: "Подключиться к пабу",

View file

@ -6,6 +6,11 @@ module.exports = {
bbPickTitle: "固定一个模块",
bbPickDesc: "为底部栏的 + 位置选择一个模块。",
bbPickNone: "无",
bbManage: "编辑",
bbYourBar: "你的工具栏",
bbRemove: "移除",
bbFull: "已达上限",
bbDone: "完成",
activityChangeFilter: "更改筛选",
emptyConnectHint: "连接到一个 pub 以与网络同步。",
emptyConnectCta: "连接到 pub",

View file

@ -78,6 +78,7 @@ if (!fs.existsSync(configFilePath)) {
"limit": 2000
},
"homePage": "activity",
"bottomBarPins": ["search", "inbox", "publish"],
"language": "en",
"wish": "whole",
"pmVisibility": "whole",
@ -96,6 +97,15 @@ const getConfig = () => {
if (cfg.ux.current === 'menus') cfg.ux.current = 'blocks';
if (cfg.ux.current !== 'blocks' && cfg.ux.current !== 'ainav') cfg.ux.current = 'blocks';
if (cfg.ux.current === 'ainav' && cfg.modules && cfg.modules.aiNavMod !== 'on') cfg.ux.current = 'blocks';
let pins = Array.isArray(cfg.bottomBarPins)
? cfg.bottomBarPins
: (typeof cfg.bottomBarPin === 'string'
? (cfg.bottomBarPin ? [cfg.bottomBarPin] : [])
: ['search', 'inbox', 'publish']);
pins = pins.filter(k => typeof k === 'string' && k);
pins = pins.filter((k, i) => pins.indexOf(k) === i).slice(0, 4);
cfg.bottomBarPins = pins;
delete cfg.bottomBarPin;
return cfg;
};

View file

@ -1,5 +1,5 @@
const { div, h2, p, section, button, form, a, input, img, textarea, br, span, video: videoHyperaxe, audio: audioHyperaxe, table, tr, td, th, details, summary, ul, li, label } = require("../server/node_modules/hyperaxe");
const { template, i18n, userLink, userLinkLabel, renderSpreadButton, renderContentActions, emptyState } = require('./main_views');
const { template, i18n, userLink, userLinkLabel, renderSpreadButton, renderContentActions, emptyState, renderHiveNav } = require('./main_views');
const opinionCategories = require('../backend/opinion_categories');
const OPINION_TYPES = new Set(['bookmark','votes','feed','image','audio','video','document','torrent','transfer']);
@ -1841,6 +1841,7 @@ exports.activityView = (actions, filter, userId, q = '', extras = {}) => {
h2(i18n.activityList),
p(desc)
),
renderHiveNav(),
(() => {
const labelOf = {};
activityTypes.forEach(t => { labelOf[t.type] = t.label; });
@ -1849,14 +1850,6 @@ exports.activityView = (actions, filter, userId, q = '', extras = {}) => {
button({ type: 'submit', class: filter === type ? 'filter-btn active' : 'filter-btn' }, labelOf[type] || type)
);
const QUICK = ['recent', 'all', 'mine'];
const GROUPS = [
{ id: 'act-comunidad', emoji: '👥', title: i18n.activityGroupCommunity || 'Community & Governance', types: ['inhabitants', 'tribe', 'larp', 'parliament', 'courts', 'votes', 'report'] },
{ id: 'act-organizacion', emoji: '🗓', title: i18n.activityGroupOrg || 'Organization', types: ['event', 'calendar', 'task', 'project', 'job'] },
{ id: 'act-comunicacion', emoji: '💬', title: i18n.activityGroupComm || 'Communication', types: ['post', 'feed', 'chat', 'pad', 'forum'] },
{ id: 'act-economia', emoji: '💰', title: i18n.activityGroupEconomy || 'Economy', types: ['banking', 'market', 'shop', 'transfer'] },
{ id: 'act-media', emoji: '🎬', title: i18n.activityGroupMedia || 'Content & Media', types: ['audio', 'bookmark', 'document', 'image', 'torrent', 'video'] },
{ id: 'act-otros', emoji: '⋯', title: i18n.activityGroupOther || 'Others', types: ['map', 'curriculum'] },
];
const isTypeFilter = filter && !QUICK.includes(filter) && labelOf[filter];
if (isTypeFilter) {
return div({ class: 'activity-filter-collapsed' },
@ -1868,24 +1861,7 @@ exports.activityView = (actions, filter, userId, q = '', extras = {}) => {
);
}
return div({ class: 'activity-filter-acc' },
div({ class: 'activity-quick-modes' }, QUICK.map(mkBtn)),
ul({ class: 'oasis-nav-groups activity-groups' },
GROUPS.map(g => {
const openByFilter = g.types.includes(filter);
return li({ class: 'oasis-nav-group' },
input({ type: 'checkbox', id: `oasis-nav-group-${g.id}`, class: 'oasis-nav-toggle', ...(openByFilter ? { checked: true } : {}) }),
label({ for: `oasis-nav-group-${g.id}`, class: 'oasis-nav-header' },
span({ class: 'emoji' }, g.emoji),
span({ class: 'nav-text' }, g.title),
span({ class: 'act-count' }, String(g.types.length)),
span({ class: 'oasis-nav-arrow' }, '▾')
),
ul({ class: 'oasis-nav-list' },
g.types.map(t => li(mkBtn(t)))
)
);
})
)
div({ class: 'activity-quick-modes' }, QUICK.map(mkBtn))
);
})(),
sub

View file

@ -124,26 +124,51 @@ exports.emptyState = emptyState;
exports.bottomBarPickerView = () => {
const cfg = getConfig();
const modOn = (m) => !m || cfg.modules[m] === 'on' || cfg.modules[m] === undefined;
const current = cfg.bottomBarPin || '';
const pick = (key, glyph, labelText) => form({ method: 'POST', action: '/settings/bottombar', class: 'bb-pick-form' },
input({ type: 'hidden', name: 'pin', value: key }),
button({ type: 'submit', class: current === key ? 'bb-pick-btn active' : 'bb-pick-btn' },
span({ class: 'bb-pick-ico' }, glyph),
span({ class: 'bb-pick-lbl' }, labelText)
const MAX = 4;
const pinnedKeys = cfg.bottomBarPins || [];
const pinned = pinnedKeys
.map(key => exports.PINNABLE_MODULES.find(m => m.key === key))
.filter(Boolean);
const full = pinned.length >= MAX;
const actionForm = (action, key, cls, node) => form({ method: 'POST', action: '/settings/bottombar', class: cls },
input({ type: 'hidden', name: 'action', value: action }),
input({ type: 'hidden', name: 'key', value: key }),
node
);
const pinnedRow = (m) => actionForm('remove', m.key, 'bb-manage-form',
button({ type: 'submit', class: 'bb-manage-btn', 'aria-label': i18n.bbRemove || 'Remove' },
span({ class: 'bb-manage-ico' }, m.glyph),
span({ class: 'bb-manage-lbl' }, i18n[m.labelKey] || m.key),
span({ class: 'bb-manage-x' }, '✕')
)
);
const items = exports.PINNABLE_MODULES.filter(m => modOn(m.mod)).map(m => pick(m.key, m.glyph, i18n[m.labelKey] || m.key));
const addBtn = (m) => actionForm('add', m.key, 'bb-pick-form',
button({ type: 'submit', class: 'bb-pick-btn' },
span({ class: 'bb-pick-ico' }, m.glyph),
span({ class: 'bb-pick-lbl' }, i18n[m.labelKey] || m.key)
)
);
const addable = exports.PINNABLE_MODULES.filter(m => modOn(m.mod) && !pinnedKeys.includes(m.key));
return template(
i18n.bbPickTitle || 'Pin a module',
i18n.bbManage || 'Edit bar',
section(
div({ class: 'tags-header' },
h2(i18n.bbPickTitle || 'Pin a module'),
p(i18n.bbPickDesc || 'Choose a module for the + slot in the bottom bar.')
h2(i18n.bbPickTitle || 'Customize the bar'),
p(i18n.bbPickDesc || 'Choose up to 4 shortcuts for the bottom bar.')
),
div({ class: 'bb-pick-grid' },
pick('', '✕', i18n.bbPickNone || 'None'),
...items
)
div({ class: 'bb-manage' },
h3(`${i18n.bbYourBar || 'Your bar'} (${pinned.length}/${MAX})`),
pinned.length
? div({ class: 'bb-manage-list' }, ...pinned.map(pinnedRow))
: p({ class: 'bb-manage-empty' }, i18n.bbPickNone || 'None')
),
div({ class: 'bb-manage-add' },
h3(i18n.bbAdd || 'Add'),
full
? p({ class: 'bb-manage-full' }, i18n.bbFull || 'Maximum reached')
: div({ class: 'bb-pick-grid' }, ...addable.map(addBtn))
),
a({ class: 'filter-btn bb-manage-done', href: '/activity' }, i18n.bbDone || 'Done')
)
);
};
@ -1117,6 +1142,10 @@ const renderMobileTopbar = () => div(
);
const PINNABLE_MODULES = [
{ key: 'search', href: '/search', glyph: 'ꔅ', labelKey: 'searchTitle', mod: null },
{ key: 'inbox', href: '/inbox', glyph: '☂', labelKey: 'inbox', mod: null },
{ key: 'publish', href: '/publish', glyph: '❂', labelKey: 'publish', mod: null },
{ key: 'activity', href: '/activity', glyph: 'ꔙ', labelKey: 'activityTitle', mod: null },
{ key: 'tribes', href: '/tribes', glyph: 'ꖥ', labelKey: 'tribesTitle', mod: 'tribesMod' },
{ key: 'chats', href: '/chats', glyph: 'ꖒ', labelKey: 'chatsTitle', mod: 'chatsMod' },
{ key: 'market', href: '/market', glyph: 'ꕻ', labelKey: 'marketTitle', mod: 'marketMod' },
@ -1171,31 +1200,113 @@ const renderBottomBar = () => {
(badge && badge > 0) ? span({ class: "bb-badge" }, String(badge)) : "",
span({ class: "bb-lbl" }, label)
);
const pinned = PINNABLE_MODULES.find(m => m.key === (cfg.bottomBarPin || '') && modOn(m.mod));
const pinSlot = pinned
? bbLink(pinned.href, pinned.glyph, i18n[pinned.labelKey] || pinned.key)
: a({ class: "bb-item bb-add", href: "/settings/bottombar" },
span({ class: "bb-ico" }, ""),
span({ class: "bb-lbl" }, i18n.bbAdd || "Add"));
const MAX = 4;
const pins = (cfg.bottomBarPins || [])
.map(key => PINNABLE_MODULES.find(m => m.key === key))
.filter(m => m && modOn(m.mod))
.slice(0, MAX);
const slots = pins.map(m => bbLink(
m.href, m.glyph, i18n[m.labelKey] || m.key, m.key === 'inbox' ? inboxN : 0
));
const editSlot = a(
{ class: "bb-item bb-add", href: "/settings/bottombar" },
span({ class: "bb-ico" }, pins.length < MAX ? "" : "✎"),
span({ class: "bb-lbl" }, pins.length < MAX ? (i18n.bbAdd || "Add") : (i18n.bbManage || "Edit"))
);
const pair = [ bbLink("/peers", "⧖", i18n.peers || "Peers") ];
if (modOn('invitesMod')) pair.push(bbLink("/invites", "ꔮ", i18n.invites || "Invites"));
return nav(
{ class: "oasis-bottombar", style: "display:none", "aria-label": i18n.bbQuickActions || "Quick actions" },
bbLink("/search", "ꔅ", i18n.searchTitle || "Search"),
bbLink("/inbox", "☂", i18n.inbox || "Inbox", inboxN),
bbLink("/publish", "❂", i18n.publish || "Write"),
pinSlot,
...slots,
editSlot,
div({ class: "bb-pair" }, ...pair)
);
};
const RADIAL_ITEMS = [
{ key: 'search', href: '/search', glyph: 'ꔅ', labelKey: 'searchTitle', mod: null },
{ key: 'chats', href: '/chats', glyph: 'ꖒ', labelKey: 'chatsTitle', mod: 'chatsMod' },
{ key: 'tribes', href: '/tribes', glyph: 'ꖥ', labelKey: 'tribesTitle', mod: 'tribesMod' },
{ key: 'market', href: '/market', glyph: 'ꕻ', labelKey: 'marketTitle', mod: 'marketMod' },
{ key: 'events', href: '/events', glyph: 'ꕆ', labelKey: 'eventsLabel', mod: 'eventsMod' },
{ key: 'forum', href: '/forum', glyph: 'ꕒ', labelKey: 'forumTitle', mod: 'forumMod' },
{ key: 'agenda', href: '/agenda', glyph: 'ꗤ', labelKey: 'agendaTitle', mod: 'agendaMod' },
];
const renderHiveNav = () => {
if (process.env.OASIS_MOBILE !== '1') return "";
const cfg = getConfig();
const modOn = (m) => !m || cfg.modules[m] === 'on' || cfg.modules[m] === undefined;
const CATS = [
{ id: 'personal', emoji: '⚉', title: i18n.menuPersonal, mods: [
{ href: '/profile', glyph: '⚉', labelKey: 'profile', mod: null }, { href: '/cv', glyph: 'ꕛ', labelKey: 'cvTitle', mod: null },
{ href: '/agenda', glyph: 'ꗤ', labelKey: 'agendaTitle', mod: 'agendaMod' }, { href: '/favorites', glyph: 'ꘝ', labelKey: 'favoritesTitle', mod: 'favoritesMod' },
{ href: '/logs', glyph: 'ꗯ', labelKey: 'logsTitle', mod: 'logsMod' }, { href: '/wallet', glyph: '❄', labelKey: 'wallet', mod: 'walletMod' },
{ href: '/modules', glyph: 'ꗣ', labelKey: 'modules', mod: null }, { href: '/settings', glyph: '⚙', labelKey: 'settings', mod: null } ] },
{ id: 'governance', emoji: '⚖', title: i18n.menuGovernance, mods: [
{ href: '/inhabitants', glyph: 'ꖘ', labelKey: 'inhabitantsLabel', mod: null }, { href: '/tribes', glyph: 'ꖥ', labelKey: 'tribesTitle', mod: 'tribesMod' },
{ href: '/larp', glyph: '✦', labelKey: 'larpTitle', mod: 'larpMod' }, { href: '/parliament', glyph: 'ꗞ', labelKey: 'parliamentTitle', mod: 'parliamentMod' },
{ href: '/courts', glyph: 'ꖻ', labelKey: 'courtsTitle', mod: 'courtsMod' } ] },
{ id: 'office', emoji: '⌂', title: i18n.menuOffice, mods: [
{ href: '/votes', glyph: 'ꔰ', labelKey: 'votationsTitle', mod: 'votesMod' }, { href: '/events', glyph: 'ꕆ', labelKey: 'eventsLabel', mod: 'eventsMod' },
{ href: '/calendars', glyph: 'ꖯ', labelKey: 'calendarsTitle', mod: 'calendarsMod' }, { href: '/tasks', glyph: 'ꖧ', labelKey: 'tasksTitle', mod: 'tasksMod' },
{ href: '/reports', glyph: 'ꕥ', labelKey: 'reportsTitle', mod: 'reportsMod' } ] },
{ id: 'economy', emoji: '¤', title: i18n.menuEconomy, mods: [
{ href: '/banking', glyph: 'ꗴ', labelKey: 'bankingTitle', mod: 'bankingMod' }, { href: '/market', glyph: 'ꕻ', labelKey: 'marketTitle', mod: 'marketMod' },
{ href: '/projects', glyph: 'ꕧ', labelKey: 'projectsTitle', mod: 'projectsMod' }, { href: '/jobs', glyph: 'ꗒ', labelKey: 'jobsTitle', mod: 'jobsMod' },
{ href: '/shops', glyph: 'ꔜ', labelKey: 'shopsTitle', mod: 'shopsMod' }, { href: '/transfers', glyph: 'ꘉ', labelKey: 'transfersTitle', mod: 'transfersMod' } ] },
{ id: 'tools', emoji: '⚒', title: i18n.menuTools, mods: [
{ href: '/ai', glyph: 'ꘜ', labelKey: 'ai', mod: 'aiMod' }, { href: '/blockexplorer', glyph: 'ꖸ', labelKey: 'blockchain', mod: null },
{ href: '/cipher', glyph: 'ꗄ', labelKey: 'cipher', mod: 'cipherMod' }, { href: '/invites', glyph: 'ꔹ', labelKey: 'invites', mod: 'invitesMod' },
{ href: '/legacy', glyph: 'ꖤ', labelKey: 'legacy', mod: 'legacyMod' }, { href: '/stats', glyph: 'ꕷ', labelKey: 'statistics', mod: null } ] },
{ id: 'network', emoji: '☍', title: i18n.menuNetwork, mods: [
{ href: '/activity', glyph: 'ꔙ', labelKey: 'activityTitle', mod: null }, { href: '/tags', glyph: 'ꖶ', labelKey: 'tagsLabel', mod: 'tagsMod' },
{ href: '/trending', glyph: 'ꗝ', labelKey: 'trendingLabel', mod: 'trendingMod' }, { href: '/opinions', glyph: 'ꔍ', labelKey: 'opinionsTitle', mod: 'opinionsMod' },
{ href: '/pads', glyph: 'ꔗ', labelKey: 'padsTitle', mod: 'padsMod' }, { href: '/forum', glyph: 'ꕒ', labelKey: 'forumTitle', mod: 'forumMod' },
{ href: '/maps', glyph: 'ꔌ', labelKey: 'mapsLabel', mod: 'mapsMod' }, { href: '/chats', glyph: 'ꖒ', labelKey: 'chatsTitle', mod: 'chatsMod' } ] },
{ id: 'blogs', emoji: '✦', title: i18n.menuBlogs, mods: [
{ href: '/mentions', glyph: '✺', labelKey: 'mentions', mod: null }, { href: '/public/latest', glyph: '☄', labelKey: 'latest', mod: 'latestMod' },
{ href: '/public/latest/threads', glyph: '♺', labelKey: 'threads', mod: 'threadsMod' }, { href: '/public/latest/topics', glyph: 'ϟ', labelKey: 'topics', mod: 'topicsMod' },
{ href: '/public/latest/summaries', glyph: '※', labelKey: 'summaries', mod: 'summariesMod' }, { href: '/public/popular/day', glyph: '⌘', labelKey: 'popular', mod: 'popularMod' },
{ href: '/public/latest/extended', glyph: '∞', labelKey: 'multiverse', mod: 'multiverseMod' } ] },
{ id: 'creative', emoji: '✎', title: i18n.menuCreative, mods: [
{ href: '/feed', glyph: 'ꕿ', labelKey: 'feedTitle', mod: 'feedMod' }, { href: '/games', glyph: 'ꕇ', labelKey: 'gamesTitle', mod: 'gamesMod' },
{ href: '/pixelia', glyph: 'ꔘ', labelKey: 'pixeliaTitle', mod: 'pixeliaMod' }, { href: '/melody', glyph: '♪', labelKey: 'melodyTitle', mod: 'melodyMod' } ] },
{ id: 'media', emoji: '▤', title: i18n.menuMedia, mods: [
{ href: '/audios', glyph: 'ꔿ', labelKey: 'audiosLabel', mod: 'audiosMod' }, { href: '/bookmarks', glyph: 'ꔪ', labelKey: 'bookmarksLabel', mod: 'bookmarksMod' },
{ href: '/documents', glyph: 'ꕨ', labelKey: 'docsLabel', mod: 'docsMod' }, { href: '/images', glyph: 'ꕥ', labelKey: 'imagesLabel', mod: 'imagesMod' },
{ href: '/torrents', glyph: 'ꖅ', labelKey: 'torrentsLabel', mod: 'torrentsMod' }, { href: '/videos', glyph: 'ꗟ', labelKey: 'videosLabel', mod: 'videosMod' } ] },
{ id: 'fediverse', emoji: '⌬', title: i18n.fediverse, mods: [
{ href: '/fediverse', glyph: 'ꗵ', labelKey: 'fediverseTimeline', mod: 'fediverseMod' } ] },
];
const catHex = (c) => label({ for: `hive-${c.id}`, class: 'hex-cat' },
span({ class: 'hx-ico' }, c.emoji), span({ class: 'hx-lbl' }, c.title));
const modHex = (m) => a({ class: 'hex-mod', href: m.href },
span({ class: 'hx-ico' }, m.glyph), span({ class: 'hx-lbl' }, i18n[m.labelKey] || ''));
const radios = CATS.map(c => input({ type: 'radio', name: 'hive-cat', id: `hive-${c.id}`, class: 'hive-radio' }));
const catRows = [];
let idx = 0;
for (const size of [3, 4, 3]) { catRows.push(div({ class: 'hive-row' }, ...CATS.slice(idx, idx + size).map(catHex))); idx += size; }
const grid = div({ class: 'hive-grid hive-cats' }, ...catRows);
const panels = CATS.map(c => div({ class: 'hive-panel', id: `hive-panel-${c.id}` },
div({ class: 'hive-mods' }, ...c.mods.filter(m => modOn(m.mod)).map(modHex))
));
return div({ class: 'hive-nav' }, ...radios, grid, ...panels);
};
exports.renderHiveNav = renderHiveNav;
const template = (titlePrefix, ...elements) => {
const currentConfig = getConfig();
const theme = currentConfig.themes.current || "Dark-SNH";
const uxMode = currentConfig.ux?.current === "ainav" ? "ainav" : "blocks";
const baseTheme = theme === "OasisMobileUX" ? "Dark-SNH" : theme;
const mobileUXActive = process.env.OASIS_MOBILE === '1' ? theme !== "OasisMobile" : theme === "OasisMobileUX";
const mobileUXLink = mobileUXActive
? link({ rel: "stylesheet", href: "/assets/themes/OasisMobileUX.css", ...(process.env.OASIS_MOBILE === '1' ? {} : { media: "(max-width: 768px)" }) })
: "";
const themeLink = link({
rel: "stylesheet",
href: `/assets/themes/${theme}.css`
href: `/assets/themes/${baseTheme}.css`
});
const nodes = html(
{ lang: "en" },
@ -1204,6 +1315,7 @@ const template = (titlePrefix, ...elements) => {
link({ rel: "stylesheet", href: "/assets/styles/style.css" }),
themeLink,
link({ rel: "stylesheet", href: "/assets/styles/mobile.css", ...(process.env.OASIS_MOBILE === '1' ? {} : { media: "(max-width: 768px)" }) }),
mobileUXLink,
link({ rel: "icon", href: "/assets/images/favicon.svg" }),
meta({ charset: "utf-8" }),
meta({ name: "description", content: i18n.oasisDescription }),
@ -1519,14 +1631,20 @@ exports.template = template;
exports.ainavHomeView = ({ recentTags = [] } = {}) => {
const currentConfig = getConfig();
const theme = currentConfig.themes.current || "Dark-SNH";
const baseTheme = theme === "OasisMobileUX" ? "Dark-SNH" : theme;
const mobileUXActive = process.env.OASIS_MOBILE === '1' ? theme !== "OasisMobile" : theme === "OasisMobileUX";
const mobileUXLink = mobileUXActive
? link({ rel: "stylesheet", href: "/assets/themes/OasisMobileUX.css", ...(process.env.OASIS_MOBILE === '1' ? {} : { media: "(max-width: 768px)" }) })
: "";
const placeholder = i18n.aiNavPlaceholder || 'Where do you want to go?';
const nodes = html(
{ lang: "en" },
head(
title(placeholder, " | Oasis"),
link({ rel: "stylesheet", href: "/assets/styles/style.css" }),
link({ rel: "stylesheet", href: `/assets/themes/${theme}.css` }),
link({ rel: "stylesheet", href: `/assets/themes/${baseTheme}.css` }),
link({ rel: "stylesheet", href: "/assets/styles/mobile.css", ...(process.env.OASIS_MOBILE === '1' ? {} : { media: "(max-width: 768px)" }) }),
mobileUXLink,
link({ rel: "icon", href: "/assets/images/favicon.svg" }),
meta({ charset: "utf-8" }),
meta({ name: "description", content: i18n.oasisDescription }),

View file

@ -37,7 +37,8 @@ const settingsView = ({ version, aiPrompt, fediverseAccount, fediverseError }) =
option({ value: "Clear-SNH", selected: theme === "Clear-SNH" ? true : undefined }, "Clear-SNH"),
option({ value: "Purple-SNH", selected: theme === "Purple-SNH" ? true : undefined }, "Purple-SNH"),
option({ value: "Matrix-SNH", selected: theme === "Matrix-SNH" ? true : undefined }, "Matrix-SNH"),
option({ value: "OasisMobile", selected: theme === "OasisMobile" ? true : undefined }, "Oasis-Mobile")
option({ value: "OasisMobile", selected: theme === "OasisMobile" ? true : undefined }, "Oasis-Mobile"),
option({ value: "OasisMobileUX", selected: theme === "OasisMobileUX" ? true : undefined }, "Oasis-Mobile-UX")
];
const languageOption = (longName, shortName) => {