Upgrade mobile UX to Oasis 0.9.0

Rebase onto upstream 0.9.0. Mobile topbar (logo->home, avatar->profile),
hexagon category nav (hive) and bottom bar; remove the six top-bar
buttons (inbox/pm/publish/search/graphos/peers) that cluttered the header.
Theme OasisMobileUX carries topbar/hexagon/bottombar styles.
This commit is contained in:
s1to 2026-08-01 13:41:09 +02:00
parent de36b38851
commit 8d21216362
69 changed files with 8974 additions and 820 deletions

View file

@ -411,6 +411,7 @@ exports.marketView = async (items, filter, itemToEdit = null, params = {}) => {
form(
{ action: filter === "edit" ? `/market/update/${encodeURIComponent(itemEdit.id)}` : "/market/create", method: "POST", enctype: "multipart/form-data" },
input({ type: "hidden", name: "returnTo", value: "/market?filter=mine" }),
((itemEdit && itemEdit.industry) || params.industry) ? input({ type: "hidden", name: "industry", value: (itemEdit && itemEdit.industry) || params.industry }) : null,
label(i18n.marketItemType),
br(),
select(
@ -422,12 +423,12 @@ exports.marketView = async (items, filter, itemToEdit = null, params = {}) => {
br(),
label(i18n.marketItemTitle),
br(),
input({ type: "text", name: "title", id: "title", value: (itemEdit && itemEdit.title) || "", required: true }),
input({ type: "text", name: "title", id: "title", value: (itemEdit && itemEdit.title) || params.title || "", required: true }),
br(),
br(),
label(i18n.marketItemDescription),
br(),
textarea({ name: "description", id: "description", placeholder: i18n.marketItemDescriptionPlaceholder, rows: "6", required: true }, (itemEdit && itemEdit.description) || ""),
textarea({ name: "description", id: "description", placeholder: i18n.marketItemDescriptionPlaceholder, rows: "6", required: true }, (itemEdit && itemEdit.description) || params.description || ""),
br(),
br(),
label(i18n.marketCreateFormImageLabel),
@ -447,7 +448,7 @@ exports.marketView = async (items, filter, itemToEdit = null, params = {}) => {
br(),
label(i18n.marketItemStock),
br(),
input({ type: "number", name: "stock", id: "stock", value: (itemEdit && itemEdit.stock) || 1, required: true, min: "1", step: "1" }),
input({ type: "number", name: "stock", id: "stock", value: (itemEdit && itemEdit.stock) || params.stock || 1, required: true, min: "1", step: "1" }),
br(),
br(),
label(i18n.mapLocationTitle || "Map Location"),
@ -466,12 +467,12 @@ exports.marketView = async (items, filter, itemToEdit = null, params = {}) => {
br(),
label(i18n.marketItemPrice),
br(),
input({ type: "number", name: "price", id: "price", value: (itemEdit && itemEdit.price) || "", required: true, step: "0.000001", min: "0.000001" }),
input({ type: "number", name: "price", id: "price", value: (itemEdit && itemEdit.price) || params.price || "", required: true, step: "0.000001", min: "0.000001" }),
br(),
br(),
label(i18n.marketItemTags),
br(),
input({ type: "text", name: "tags", id: "tags", placeholder: i18n.marketItemTagsPlaceholder, value: (itemEdit && itemEdit.tags && itemEdit.tags.join(", ")) || "" }),
input({ type: "text", name: "tags", id: "tags", placeholder: i18n.marketItemTagsPlaceholder, value: (itemEdit && itemEdit.tags && itemEdit.tags.join(", ")) || params.tags || "" }),
br(),
br(),
label(i18n.marketItemDeadline),
@ -549,6 +550,7 @@ exports.marketView = async (items, filter, itemToEdit = null, params = {}) => {
item.item_status ? renderStateChip("whole", "", String(item.item_status).toUpperCase()) : null,
String(item.visibility || "PUBLIC").toUpperCase() === "HIDDEN" ? renderVisibilityChip("HIDDEN", i18n) : null,
item.includesShipping ? renderStateChip("mutuals", "📦", String(i18n.marketItemIncludesShipping || "Shipping").replace(/\?$/, "").toUpperCase()) : null,
item.industry ? a({ href: `/industry/${encodeURIComponent(item.industry)}` }, renderStateChip("whole", "🏭", String(i18n.industryTitle || "Industry").toUpperCase())) : null,
renderLifespanChip(item.lifetime, i18n)
),
div({ class: "market-card-price card-date-highlight" }, `${item.price} ECO`),
@ -618,6 +620,7 @@ exports.singleMarketView = async (item, filter, comments = [], params = {}) => {
item.item_status ? renderStateChip("whole", "", String(item.item_status).toUpperCase()) : null,
item.includesShipping ? renderStateChip("mutuals", "📦", String(i18n.marketItemIncludesShipping || "Shipping").replace(/\?$/, "").toUpperCase()) : null,
isHidden ? renderVisibilityChip("HIDDEN", i18n) : null,
item.industry ? a({ href: `/industry/${encodeURIComponent(item.industry)}` }, renderStateChip("whole", "🏭", String(i18n.industryTitle || "Industry").toUpperCase())) : null,
renderLifespanChip(item.lifetime, i18n),
renderEcoTax(item.msgSize, item.id)
].filter(Boolean)