Commit Graph

941 Commits

Author SHA1 Message Date
simoleo89 d7fabcd777 fix(friendbar): auto-fit visible friend count so the bar stops clipping
The online-friends bar is portaled into the right toolbar nav, which sits
inside `tb-nav-clip` (fixed, `max-w-[calc(50vw-242px)]`, `overflow-x: clip`).
Each online friend adds a fixed `w-[132px]` chip, so the bar grew with every
friend up to MAX_DISPLAY_COUNT (3). Once it exceeded the clip width the right
edge was silently cut off - the scroll arrow and part of the search button
disappeared. The portal slot is `shrink-0`, so the chips never compressed;
they just overflowed and got clipped. Net effect: "more friends online =
broken bar".

Measure the room actually available between the bar's left edge and the
viewport's right edge (re-measured on resize / ResizeObserver) and derive an
effective visible count clamped 1..3, always reserving space for both arrows
and the search chip so nothing clips at any width or friend count. The bar's
left edge is stable (it follows fixed-width toolbar icons), so changing the
chip count never moves it - no measurement feedback loop.

Scroll offset now derives a clamped safeOffset used by every read, so a
stale indexOffset after the list shrinks / the fit grows renders correctly
and self-corrects on the next arrow click (no write-back effect).
2026-06-06 19:01:19 +02:00
DuckieTM b88f9b2483 Merge pull request #204 from duckietm/Dev
Dev
2026-06-06 18:58:50 +02:00
DuckieTM 110363ab1c 🆙 Scrollbar 100% habbo 2026-06-06 18:58:23 +02:00
simoleo89 df7060b391 feat(furni-editor): read-only FurniData.json view (resolved-from-json)
Show the furni's resolved furnidata JSON entry (the editable display
name's source of truth) in a collapsible read-only section under Basic
Info. Uses furniDataEntry already available client-side — no extra
packet. Supersedes the old read-only resolver-preview slice.
2026-06-06 18:00:47 +02:00
simoleo89 f24585b60a feat(furni-editor): read-only FurniData.json view (resolved-from-json)
Show the furni's resolved furnidata JSON entry (the editable display
name's source of truth) in a collapsible read-only section under Basic
Info. Uses furniDataEntry already available client-side — no extra
packet. Supersedes the old read-only resolver-preview slice.
2026-06-06 18:00:41 +02:00
simoleo89 0af8c8932b fix(furni-editor): clear CopyValue reset timer on unmount
Move the 'copied!' 1s reset into a useEffect with cleanup so the timer
can't fire setState after the component unmounts.
2026-06-06 17:42:43 +02:00
simoleo89 3d1f1103a3 feat(furni-editor): 'Import from Habbo' button to fetch official texts
useFurniEditor gains importText(id) + importResult (10049 round-trip); the
edit view shows an 'Import from Habbo' button that fills Display Name/
Description with the official text for review before Save (nonce-guarded,
classname-matched), with an inline result note.
2026-06-06 17:42:43 +02:00
simoleo89 08976f0ab4 fix(furni-editor): clearer search icon (was note-like)
The search-bar magnifier had a too-short handle relative to the lens, so
at 16px it read like a musical note. Use a proportioned lens + longer
handle so it reads unmistakably as a magnifying glass.
2026-06-06 17:42:43 +02:00
simoleo89 4570244b48 feat(furni-editor): modernize search/list view + live search + server sort
- Restyle to match the editor: slate palette, rounded card, search bar
  with icon + focus ring, teal filter chips, larger furni thumbnails,
  loading skeleton + empty state.
- Live search (350ms debounce) with clear button; filters/sort apply
  immediately.
- Pagination: first/prev/next/last + page-jump input + 'Showing X-Y of Z'
  (was Prev/Next only across 3002 pages).
- Header sort now queries the server (sortField/sortDir) instead of
  reordering only the 20 visible rows; useFurniEditor.searchItems passes
  the sort through.
2026-06-06 17:42:43 +02:00
simoleo89 310fa06db7 fix(furni-editor): render field tooltips in a portal (no clipping)
The Tip bubble was still clipped by the card's overflow-auto scroll
container when a section was scrolled near the viewport top. Render the
tooltip via createPortal to document.body with position:fixed computed
from the icon rect, so it escapes every overflow/transform ancestor.
2026-06-06 17:42:43 +02:00
simoleo89 63c41b4d5c fix(furni-editor): tooltips wrap + no longer clipped
Tip tooltips were whitespace-nowrap (one very wide line) and clipped by
the Section card's overflow-hidden. Bound the bubble width with wrapping
(w-44, whitespace-normal, centered) and drop overflow-hidden from Section
(keeping rounded corners via rounded-t/b-xl on the header) so long tips
like Custom Params render fully.
2026-06-06 17:42:43 +02:00
simoleo89 caeb24a603 fix(furni-editor): disable furnidata Save unless name/desc changed
Saving an unchanged name made the server writer return false, which the
handler misreports as 'Classname not found in furnidata'. Gate the
'Save name/desc' button on a real diff (furnidataDirty) so an unchanged
save can no longer fire that misleading error.
2026-06-06 17:42:43 +02:00
simoleo89 752badd361 feat(furni-editor): compact permissions + upgraded meta chips
- Merge the lone Inventory permission (allowInventoryStack) into the
  Gameplay group, dropping the separate Inventory header+row to save
  vertical space.
- Rework the header meta row: ID/Sprite as label+monospace-value pills,
  'in use' tinted green with a dot when placed instances exist (grey at
  0), 'Unsaved' as an amber pill with a dot.
2026-06-06 17:42:43 +02:00
simoleo89 071a7c9436 fix(furni-editor): guard name editing when furni has no furnidata entry
~1.4k items_base rows (pets, custom items) have no matching furnidata
classname, so saving their name returned the cryptic server error
'Classname not found in furnidata'. Detect this client-side via the
resolved furniDataEntry (entry + classname match) and, when absent,
hide the Display Name/Description inputs + Save behind a clear
'NO FURNIDATA' notice instead of letting the save fail. In-furnidata
furni (~97.6%) are unchanged.
2026-06-06 17:42:43 +02:00
simoleo89 9341970eed fix(furni-editor): green/red status dot on permission toggles
Replace the white/grey dot with a green (ON) / red (OFF) traffic-light
badge + a subtle ring so it reads on both the teal and grey chip
backgrounds.
2026-06-06 17:42:42 +02:00
simoleo89 d45a0fb8b0 feat(furni-editor): optimistically reflect mirrored public_name on save
The server now mirrors the furnidata display name into
items_base.public_name, so on updateFurnidata patch selectedItem.publicName
immediately; the auto detail re-fetch that follows agrees with the DB
value (no flicker). Not applied to revertFurnidata (revert restores the
previous DB name).
2026-06-06 17:42:42 +02:00
simoleo89 e988a5d8b0 fix(furni-editor): make permission toggles clearly show on/off state
Enabled chips now use a solid teal fill (bg-[#1E7295]) with white
text + a white status dot; disabled chips are muted grey with a grey
dot. The old bg-primary/10 + text-primary 'on' state was nearly
indistinguishable from 'off'. Adds aria-pressed + title for a11y.
2026-06-06 17:42:42 +02:00
simoleo89 8862041a4e fix(furni-editor): make confirm modals opaque (solid bg + alpha backdrop)
Replace bg-white/bg-black palette classes with explicit hex
(bg-[#ffffff] panel, bg-[#00000080] backdrop) so the Delete and
Furnidata confirm dialogs render solidly instead of letting editor
content bleed through; bump overlay z-index to z-[60].
2026-06-06 17:42:42 +02:00
simoleo89 13cfbd3cd8 feat(furni-editor): one-click copy on Basic Info read-only fields (CopyValue w/ copied feedback) 2026-06-06 17:42:42 +02:00
simoleo89 642e4f8eb7 fix(furni-editor): remove nested inner scroller so NitroCardContentView's styled scrollbar is restored 2026-06-06 17:42:42 +02:00
simoleo89 3e5ad58f0e style(furni-editor): space optimization — name+description side-by-side (2-col), tighter card/section padding, compact header 2026-06-06 17:42:42 +02:00
simoleo89 2ba0f5ea6f style(furni-editor): modern/sleek redesign — slate canvas, flat rounded-xl cards, clean header, toggle-chip permissions, teal as restrained accent 2026-06-06 17:42:42 +02:00
simoleo89 2d93fc9220 style(furni-editor): graphical reskin — teal hero header w/ big preview + dynamic name + chips, soft card sections, LIVE pulse on display-name card, page bg 2026-06-06 17:42:42 +02:00
simoleo89 02f549827c feat(furni-editor): make Sprite ID + Type read-only (all Basic Info now read-only) 2026-06-06 17:42:42 +02:00
simoleo89 a520fc73af style(furni-editor): move display-name edit to top + unify theme (neutral labels, matched selects, single teal accent) 2026-06-06 17:42:42 +02:00
simoleo89 0affad752c style(furni-editor): theme-token typography refresh (labels, inputs focus ring, mono read-only) 2026-06-06 17:42:41 +02:00
simoleo89 d7e294b343 feat(furni-editor): editable furnidata name/desc section + read-only classname/public_name + diff-confirm + revert 2026-06-06 17:42:41 +02:00
simoleo89 7e72e34088 feat(furni-editor): updateFurnidata/revertFurnidata hook actions 2026-06-06 17:42:41 +02:00
simoleo89 b35caf24f2 fix(furni-editor): clear CopyValue reset timer on unmount
Move the 'copied!' 1s reset into a useEffect with cleanup so the timer
can't fire setState after the component unmounts.
2026-06-06 15:48:19 +02:00
simoleo89 de922334b7 feat(furni-editor): 'Import from Habbo' button to fetch official texts
useFurniEditor gains importText(id) + importResult (10049 round-trip); the
edit view shows an 'Import from Habbo' button that fills Display Name/
Description with the official text for review before Save (nonce-guarded,
classname-matched), with an inline result note.
2026-06-06 15:26:24 +02:00
simoleo89 0d5af81838 fix(furni-editor): clearer search icon (was note-like)
The search-bar magnifier had a too-short handle relative to the lens, so
at 16px it read like a musical note. Use a proportioned lens + longer
handle so it reads unmistakably as a magnifying glass.
2026-06-06 15:16:06 +02:00
simoleo89 d699964542 feat(furni-editor): modernize search/list view + live search + server sort
- Restyle to match the editor: slate palette, rounded card, search bar
  with icon + focus ring, teal filter chips, larger furni thumbnails,
  loading skeleton + empty state.
- Live search (350ms debounce) with clear button; filters/sort apply
  immediately.
- Pagination: first/prev/next/last + page-jump input + 'Showing X-Y of Z'
  (was Prev/Next only across 3002 pages).
- Header sort now queries the server (sortField/sortDir) instead of
  reordering only the 20 visible rows; useFurniEditor.searchItems passes
  the sort through.
2026-06-06 15:08:47 +02:00
simoleo89 e44b828eaf fix(furni-editor): render field tooltips in a portal (no clipping)
The Tip bubble was still clipped by the card's overflow-auto scroll
container when a section was scrolled near the viewport top. Render the
tooltip via createPortal to document.body with position:fixed computed
from the icon rect, so it escapes every overflow/transform ancestor.
2026-06-06 15:00:36 +02:00
simoleo89 bf4e1d664f fix(furni-editor): tooltips wrap + no longer clipped
Tip tooltips were whitespace-nowrap (one very wide line) and clipped by
the Section card's overflow-hidden. Bound the bubble width with wrapping
(w-44, whitespace-normal, centered) and drop overflow-hidden from Section
(keeping rounded corners via rounded-t/b-xl on the header) so long tips
like Custom Params render fully.
2026-06-06 14:51:23 +02:00
simoleo89 5c3b5ede4e fix(furni-editor): disable furnidata Save unless name/desc changed
Saving an unchanged name made the server writer return false, which the
handler misreports as 'Classname not found in furnidata'. Gate the
'Save name/desc' button on a real diff (furnidataDirty) so an unchanged
save can no longer fire that misleading error.
2026-06-06 14:32:42 +02:00
simoleo89 16512c634b feat(furni-editor): compact permissions + upgraded meta chips
- Merge the lone Inventory permission (allowInventoryStack) into the
  Gameplay group, dropping the separate Inventory header+row to save
  vertical space.
- Rework the header meta row: ID/Sprite as label+monospace-value pills,
  'in use' tinted green with a dot when placed instances exist (grey at
  0), 'Unsaved' as an amber pill with a dot.
2026-06-06 14:21:43 +02:00
simoleo89 e982f50395 fix(furni-editor): guard name editing when furni has no furnidata entry
~1.4k items_base rows (pets, custom items) have no matching furnidata
classname, so saving their name returned the cryptic server error
'Classname not found in furnidata'. Detect this client-side via the
resolved furniDataEntry (entry + classname match) and, when absent,
hide the Display Name/Description inputs + Save behind a clear
'NO FURNIDATA' notice instead of letting the save fail. In-furnidata
furni (~97.6%) are unchanged.
2026-06-06 14:20:12 +02:00
simoleo89 c4ddd4bfc2 fix(furni-editor): green/red status dot on permission toggles
Replace the white/grey dot with a green (ON) / red (OFF) traffic-light
badge + a subtle ring so it reads on both the teal and grey chip
backgrounds.
2026-06-06 14:11:48 +02:00
simoleo89 7384a12b92 feat(furni-editor): optimistically reflect mirrored public_name on save
The server now mirrors the furnidata display name into
items_base.public_name, so on updateFurnidata patch selectedItem.publicName
immediately; the auto detail re-fetch that follows agrees with the DB
value (no flicker). Not applied to revertFurnidata (revert restores the
previous DB name).
2026-06-06 14:03:59 +02:00
simoleo89 ca937aa8cd fix(furni-editor): make permission toggles clearly show on/off state
Enabled chips now use a solid teal fill (bg-[#1E7295]) with white
text + a white status dot; disabled chips are muted grey with a grey
dot. The old bg-primary/10 + text-primary 'on' state was nearly
indistinguishable from 'off'. Adds aria-pressed + title for a11y.
2026-06-06 13:56:26 +02:00
simoleo89 82b0642b99 fix(furni-editor): make confirm modals opaque (solid bg + alpha backdrop)
Replace bg-white/bg-black palette classes with explicit hex
(bg-[#ffffff] panel, bg-[#00000080] backdrop) so the Delete and
Furnidata confirm dialogs render solidly instead of letting editor
content bleed through; bump overlay z-index to z-[60].
2026-06-06 13:54:22 +02:00
simoleo89 f0b6a29373 feat(furni-editor): one-click copy on Basic Info read-only fields (CopyValue w/ copied feedback) 2026-06-06 13:47:27 +02:00
simoleo89 c55672761c fix(furni-editor): remove nested inner scroller so NitroCardContentView's styled scrollbar is restored 2026-06-06 13:44:29 +02:00
simoleo89 f4eef9d1a4 style(furni-editor): space optimization — name+description side-by-side (2-col), tighter card/section padding, compact header 2026-06-06 13:35:53 +02:00
simoleo89 746c10b4a9 style(furni-editor): modern/sleek redesign — slate canvas, flat rounded-xl cards, clean header, toggle-chip permissions, teal as restrained accent 2026-06-06 13:32:00 +02:00
simoleo89 e292cc3758 style(furni-editor): graphical reskin — teal hero header w/ big preview + dynamic name + chips, soft card sections, LIVE pulse on display-name card, page bg 2026-06-06 13:26:15 +02:00
simoleo89 7526b8a169 feat(furni-editor): make Sprite ID + Type read-only (all Basic Info now read-only) 2026-06-06 13:08:19 +02:00
simoleo89 9831f662ef style(furni-editor): move display-name edit to top + unify theme (neutral labels, matched selects, single teal accent) 2026-06-06 13:02:56 +02:00
simoleo89 c09b748d06 style(furni-editor): theme-token typography refresh (labels, inputs focus ring, mono read-only) 2026-06-06 12:50:59 +02:00
DuckieTM 0a6aeafe11 🆙 Small visual updates 2026-06-06 11:35:02 +02:00