Commit Graph
1794 Commits
Author SHA1 Message Date
openhands bf5b9918d9 feat(site): structured landing sections with eyebrow headings
Give the home page a clear, professional information hierarchy:
- Add eyebrow labels + headings for Features, Live stats and Community
  sections using reusable, theme-aware .eyebrow / .section-title styles.
- Loosen the vertical rhythm (gap-8/10) so each block breathes.
- New messages resolve via the existing English fallback for all locales.
2026-09-12 16:44:21 +02:00
openhands 3265cf1fad feat(site): consistent card radius and remove duplicate login CTAs
Professional tidy-up of the landing experience:
- SurfaceCard: unified rounded-xl radius for a crisper, consistent look.
- Hero: matches the new card radius and gains a dual-direction title
  shadow so the headline stays readable over the header artwork.
- Login/register: drop the duplicated "no account / have an account"
  paragraphs — the forms already ship an inline footer, so one clear CTA
  cluster remains and the side column is cleaner.
2026-09-12 16:35:28 +02:00
openhands 29b9a4b0dc feat(site): professional card system and tidy landing layout
Refine the public UI for a cleaner, more professional and scannable
landing experience without leaving the classic Habbo style:

- SurfaceCard: softer layered shadow, gradient accent hairline on the top
  edge and a bolder header title across all public cards.
- Home: gradient hotel-name in the hero headline, shine effect on the
  primary CTA, hairline on the top bar.
- Login/register: consistent avatar tiles with rounded corners, subtle
  borders and a gentle hover lift; uniform username sizing.
- Add reusable theme-aware .card-hairline and .gradient-text utilities.
2026-09-12 16:29:55 +02:00
openhands d755ab7ce1 revert(site): restore classic Habbo landing with soft theme polish
Replace the premium dark-gaming redesign of home, login and register with
the original classic landing (Habbo sky background, AuthTopBar, SurfaceCard
layout). Keeps the theme background visible again and adds a subtle
theme-aware brand halo behind the hero/Frank plus a soft primary glow on
card hover.

Also upgrades dependencies: next 16.3.5, vite 8.3.0 (typescript 7.0.2 was
already latest). Temporarily lowers pnpm minimumReleaseAge to 60 min so the
fresh 16.3.5 release can be installed; restore to 1440 once it is 24h old.
2026-09-12 16:14:21 +02:00
openhands cc58f16230 fix(site): satisfy theme-color and avatar contract tests for landing redesign 2026-09-12 15:51:22 +02:00
openhands 741f01e897 feat(site): redesign home, login and register with premium dark gaming theme
Replaced the classic Habbo landing style on the home, login and register pages with a modern premium dark-gaming look: always-dark hero canvas with brand glows, grid overlay and ambient orbs, glass panels, gradient text and floating art. Adds shared LandingTopBar, AuthShell and BrandFrank components plus reusable premium CSS utilities. Build, typecheck and lint pass.
2026-09-12 15:40:54 +02:00
openhands 4d720ee03c fix(furni): generate scale 32 from bundles with .png frame keys
resolveNitroFrame now matches spritesheet frame keys that carry a .png
suffix or namespaced naming, and isScale/scaleName preserve that suffix.
Broken source sprites (missing frames or references to icon artwork) are
skipped and reported instead of aborting the whole generation, and the
studio UI surfaces the skipped count.
2026-09-12 12:46:17 +02:00
openhands 0842788a28 fix(studio): resolve hardcoded color violation in organize imports dialog 2026-09-11 23:57:31 +02:00
openhands fdc7a48ef4 feat(studio): add 'only unplaced items' filter toggle to organize imports dialog 2026-09-11 23:49:58 +02:00
openhands 0f1da6c178 feat(studio): add reset all overrides action to organize imports dialog 2026-09-11 23:46:37 +02:00
openhands e47bee16bb feat(studio): add visual layout previews, automated unit tests and polish organize imports 2026-09-11 23:41:23 +02:00
openhands eb3dc4e88c feat(studio): add batch actions, group search filter and smart unit category rules 2026-09-11 23:35:13 +02:00
openhands 669e20a35c refactor: add and use isValidCatalogLayout type guard for robust layout assignment 2026-09-11 23:28:22 +02:00
openhands 683fee3bd9 fix: resolve layout type errors in organize-imports-dialog 2026-09-11 23:25:53 +02:00
openhands caeb4eb0b3 feat(studio): allow moving imports into an existing page instead of creating ones
Adds a second mode to the organize-imports dialog: instead of creating
one new page per approved group (which could produce dozens of tiny
pages), the user can pick an existing destination page and have every
approved item moved into it.  No catalog page is created in this mode.

- organizeImportFurni: groups accept destinationPageId; when set, the
  existing page is reused, new offers append after its current highest
  order, moved offers keep their original name, and the real page
  caption is used for logging and results
- OrganizeImportsDialog: mode toggle (create pages / move into page),
  searchable destination picker via /api/admin/catalog/tree?search=,
  name/icon/layout editors hidden in move mode, button shows a move
  count, and the success toast reports moved/added instead of pages
- en + nl translations for the new mode, destination, and move keys
2026-09-11 20:44:26 +02:00
openhands 61c7519bea fix(studio): show all offers in the imported-furniture tree
The organize-imports route defaulted to a 500-item limit, silently
hiding offers beyond the first batch of imported pages.  Remove the
effective cap (limit now means 'all', guarded only by a 50k lint cap)
so every offer already sitting in the import tree is returned and
grouped.
2026-09-11 20:33:27 +02:00
openhands 19dc0347df fix(studio): harden organize-imports against long-running queries and hangs
The original GET route used a correlated NOT EXISTS / FIND_IN_SET
subquery over the entire catalog_items table for every recent import
audit entry, causing server timeouts when the audit log or catalog
grew large.  The per-item host-page validation inside the create
action also issued one SELECT + one UPDATE per moved offer.

Changes:
- GET /api/admin/import/organize: replace the correlated subquery
  with a bounded candidate list and a JS-side placed-set check, then
  resolve all needed base items in a single indexed SELECT.  This
  bounds the query cost regardless of catalog or audit log size.
- organizeImportFurni action: validate mover ids in one SELECT, then
  batch every move per group into a single UPDATE with a CASE
  expression instead of one UPDATE per item.
- OrganizeImportsDialog: add a 45-second abort timeout on the fetch
  and a distinct load-error state so the UI never silently hangs.
- Add 'loadError' translation key (en + nl).
2026-09-11 20:24:38 +02:00
openhands 01a85ebcd0 feat(studio): add organize-imports tool with suggestion review and approval
Adds a Studio 'Organize imports' dialog that groups recently imported
furniture and furniture already sitting in the auto-created import
pages into suggested catalog categories.  Each group is presented with
its suggested name, icon, and layout which can be overridden before
approval; approved groups are turned into real catalog pages in a
single atomic export run.  Offers already inside the import subtree are
moved to the new pages; brand-new furniture gets a fresh offer.

- groupSuggestedCategories: generic pure helper reusing the same
  per-item label heuristic that drives suggestCategoryName; items with
  no label land in a 'Other Furni' remainder bucket
- GET /api/admin/import/organize: returns items from the imported
  furniture tree (catalog_items JOIN items_base via page id set from
  the imported-furniture root) union audit-logged but not-yet-placed
  recent imports; marks alreadyPlaced vs new
- organizeImportFurni server action: validates import-page membership
  before moving any offer, creates pages + inserts/moves items in one
  withCatalogExport snapshot, logs activity
- OrganizeImportsDialog: full-featured Studio dialog with price panel
  (applies to new offers only), parent select, per-group approval,
  editable name/icon/layout with suggestion reset chips, source tags
- import-pages.ts server helper: locates the imported-furniture tree
- Studio nav: 'Organize imports' button with FolderTree icon,
  gated on CATALOG_EDIT, wired next to the catalog manager
- en + nl translations for organizeImports.* keys with ICU plurals
- groupSuggestedCategories unit tests (deterministic grouping,
  remainder handling, size+alpha ordering, label consistency)
2026-09-11 19:38:18 +02:00
openhands f5c2c05f6e feat(studio): surface the Visual Catalog Manager in the Studio nav
The catalog manager (with auto-category wizard) now lives inside the Studio
navigation for teams that manage furniture inline. The button is gated on
CATALOG_EDIT; only users with that permission see the launcher.

- Split server/client Studio layout to derive permissions server-side
- Add optional triggerLabel prop to CatalogManagerDialog for custom labels
- Wire the Catalog manager button in the Studio nav right cluster
- Keep existing /admin/catalog entry points unchanged
2026-09-11 18:54:52 +02:00
openhands f832479e52 feat(catalog): add auto-category wizard with live preview and smart suggestions
- Add AutoCategoryDialog: pick furni (or empty page), suggest caption/icon/layout, live preview
- Add createAutoCategory server action (page + offers in one export) with CatalogKind
- Extend furni search API with interactionType
- Share ShopTile and refactor inline-editor/items-shop-preview to use it
- Add suggestion heuristics (suggestCategoryName/dIcon/layout) with tests
- Add autoCategory translations (en/nl)
2026-09-11 18:47:31 +02:00
Simo baeb54aeb5 feat(devops): separate public page server timing diagnostics 2026-09-11 10:49:08 +02:00
Simo d5091d1a73 fix(hk): protect unsaved editors and await prefix save results 2026-09-11 10:48:34 +02:00
Simo 89af4eb1f6 feat(studio): preserve work position and guide import completion 2026-09-11 10:48:09 +02:00
Simo c5a2b44807 feat(catalog): undo bulk offer edits with guarded history restoration 2026-09-11 10:47:46 +02:00
Simo 13bd3695cb feat(studio): recover matching Nitro sources and persist import phases 2026-09-11 10:22:06 +02:00
Simo 00e33623f7 feat(devops): diagnose slow HK requests and dependency timings 2026-09-11 09:48:19 +02:00
Simo 3b76d063a6 perf(studio): defer optional panels and trim validator imports 2026-09-11 09:25:21 +02:00
Simo a45d792563 ci: enforce reviewed Linux visual regression baselines 2026-09-11 09:09:05 +02:00
Simo fe1b358ed2 fix(ui): contain mobile article fields and stabilize history checks 2026-09-11 09:05:19 +02:00
Simo 88790d1a0d feat(cms): recover drafts and failed imports with verified UI workflows 2026-09-11 08:58:10 +02:00
Simo 410a1e466c fix(ci): keep optional report extraction non-blocking 2026-09-11 08:42:33 +02:00
Simo cc714b427a ci: report per-route JavaScript budgets from Docker build 2026-09-11 08:41:31 +02:00
Simo 445ef13846 fix(public): distinguish unavailable data from empty results and missing pages 2026-09-11 00:39:53 +02:00
Simo db4acbb46e feat(editorial): validate publications and preserve partial event updates 2026-09-11 00:36:55 +02:00
Simo 76f0420d64 feat(import): run catalog synchronizations as durable jobs 2026-09-11 00:36:22 +02:00
Simo a2954e4408 feat(diagnostics): correlate staff operations errors and audit records 2026-09-11 00:34:49 +02:00
Simo 440ce4e556 test(me): use committed translations in dashboard tests 2026-09-11 00:34:21 +02:00
Simo a647b5451f feat(hk): persist named table views for staff accounts 2026-09-11 00:32:15 +02:00
Simo 74223984dc feat(profile): add privacy controls and progressive photo gallery 2026-09-11 00:31:29 +02:00
Simo ba9c61d808 feat(search): search public news events users and open rooms 2026-09-11 00:29:54 +02:00
Simo 506e14783c test(i18n): validate nested housekeeping translation groups 2026-09-11 00:28:26 +02:00
Simo 96d3e3f602 feat(events): add weekly browsing and personal registrations 2026-09-11 00:27:41 +02:00
Simo 25d0a13050 feat(support): filter waiting tickets and staff assignments 2026-09-11 00:20:54 +02:00
Simo 5d18af932d feat(news): add searchable paginated publication archive 2026-09-11 00:19:12 +02:00
Simo a537c55793 feat(me): show actionable personal tasks with unavailable states 2026-09-11 00:15:46 +02:00
Simo d9ea93a2e7 test(docker): derive image contract from pinned Node version 2026-09-11 00:14:43 +02:00
Simo fec8dd3c5d fix(docker): enforce Node version alignment across build stages 2026-09-11 00:11:18 +02:00
openhands bcefb0f8ff build: update node engine range in package.json to match .nvmrc 2026-09-10 21:50:03 +02:00
openhands 8baf151d84 build: update node version in .nvmrc to match active runner version 26.8.2 2026-09-10 21:49:12 +02:00
openhands 9a8c721111 fix: add avatar imager cache-buster for instant clothing updates
CI / check (push) Failing after 18s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-10 21:42:30 +02:00