5e7adfb38d6737b6ec1959e8821192ce80d49f1a
4
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e6eba7a2b7 |
fix(profile): align the decorations, and make the effects actually look like something
CI / Build & test (Node 20) (push) Canceled after 0s
CI / Build & test (Node 24) (push) Canceled after 0s
CI / Build & test (push) Canceled after 0s
CodeQL / Analyze (javascript-typescript) (push) Canceled after 0s
Security / Secret scan (gitleaks) (push) Canceled after 0s
Security / Dependency scan (OSV-Scanner) (push) Canceled after 0s
Security / IaC/config scan (Trivy) (push) Canceled after 0s
Security / License compliance scan (Trivy) (push) Canceled after 0s
OpenSSF Scorecard / Scorecard analysis (push) Canceled after 0s
Three complaints, three causes. Decorations sat off-centre. <Avatar>'s box is `size + 2 × ringWidth`, but the overlay was positioned with a percentage inset of that box — so it drifted by exactly the ring whenever one was present. That is why the crown floated above the head on the profile card while looking fine on the editor tiles, which have no ring. DecoratedAvatar now takes `size` and `ringWidth` and computes the inset in pixels, so the picture's edge always lands at a known radius in the SVG viewBox and every decoration is drawn against it. The ugly ones were ugly. Flames were a blob with a black circle punched out of it; they are now fourteen tongues of alternating height on a gradient. The crown's band sits ON the picture's top edge instead of hovering above it. Frost, stars and hearts were placed by eye and are now on a computed ring. Nine more: holo disc (a conic gradient — the honest way to draw one, and CSS has it where SVG does not), chain, cyber brackets, lightning, spikes, butterflies, sakura, bubbles, flower. Twenty in total. Name effects were thin. Gradient was a two-stop ramp; it now has a lit middle. Neon was one shadow, now five layered with a buzz. Glitch was a keyframed text-shadow, now a real RGB split duplicated through ::before/::after from data-text. Added chrome and gold (banded metal with a specular line — the y2k look the reference is after), holo, rainbow, ice, 3D extrude, and outline. Sixteen effects, thirteen fonts with Audiowide, Bungee and Monoton added. The editor tiles now sample the user's own name rather than "Gg" or the effect label: an effect reads differently on a short word than on the name it will carry. Two per row instead of three, and section rows gained an icon. One test failed on the catalog growth and was right to: it used 'rainbow' as an example of an unknown id, and rainbow is now a real effect. It uses an absurd id instead, and a new test walks every catalog id through the normaliser so a catalog and the normaliser can never drift apart silently. Verified: shared build, web build, server typecheck, 518 web tests (1 new). Not verified: pixels — no browser here; the geometry is now computed rather than guessed, but a screenshot decides. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
ef9c73501c |
feat(profile): a full identity system — name styles, decorations, effects, nameplates, tag, links, board
CI / Build & test (Node 20) (push) Canceled after 0s
CI / Build & test (Node 24) (push) Canceled after 0s
CI / Build & test (push) Canceled after 0s
CodeQL / Analyze (javascript-typescript) (push) Canceled after 0s
Security / Secret scan (gitleaks) (push) Canceled after 0s
Security / Dependency scan (OSV-Scanner) (push) Canceled after 0s
Security / IaC/config scan (Trivy) (push) Canceled after 0s
Security / License compliance scan (Trivy) (push) Canceled after 0s
OpenSSF Scorecard / Scorecard analysis (push) Canceled after 0s
The owner asked for profile customisation that is "completo e FODA", pointing
at Discord's profile editor. This is the whole thing, end to end, with a live
preview.
What a user can now set, and where it shows:
- Display name style: 10 fonts × 9 effects (solid, gradient, neon, toon,
pop, gummy, prism, glitch, fire) × two colours. Popout and full profile.
- Avatar decoration: 10 (ring, neon, flames, stars, halo, vines, pixel,
hearts, frost, crown). Inline SVG — no image assets, scales to any size.
- Profile effect over the banner: 9 (sparkles, rain, snow, matrix,
confetti, aurora, embers, bubbles, hearts). CSS particles with seeded
positions so re-renders do not change the weather.
- Nameplate behind the member-list row: 10 presets + custom two-colour.
- Theme: two colours washed behind the card, and the banner fallback.
- Pronouns, and a clan-style tag (emoji + 2–4 letters) beside the name,
also on the member row.
- Links, up to 5, with the brand icon picked from the host.
- Board: favourite game, up to 5 in rotation, up to 10 wanted, a quote.
Games come from Steam search through a small server proxy (cached,
10 min) or are typed by hand; covers only load from Steam's CDN.
- Badges, derived rather than stored: instance admin, server owner,
founder (joined in the space's first month), veteran (a year), OG (six
months), stylist. Nothing to grant, revoke or migrate.
Storage is one JSON column, users.profile_style (migration 0019), and one
normaliser in shared/profile.ts that both the server (on write and on read)
and the client (on render) run. It never throws: unknown ids fall back,
strings are cut to their limits, colours must be #rrggbb, link URLs must be
https, cover URLs must be a Steam CDN host. Kept out of the federation
durable-field set on purpose — peers on older builds do not know the field,
and it is cosmetic.
The editor is a new Settings > Profile tab. Its preview is the same
ProfileCard component the popout renders, with the draft style swapped in —
what you see while editing is, by construction, what others see.
Fonts are OFL builds self-hosted from public/fonts alongside DM Sans, latin
subsets only, ~120 KB in total.
Verified: web build, 517 web tests (11 new: normaliser bounds and fallbacks,
link icon detection, badge derivation), server typecheck, 804 server tests.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
||
|
|
8dd76f3435 | Public-release prep: ELv2 license, README/CLA/NOTICE, SSRF safeFetch, identifier genericization, export tooling | ||
|
|
07ef49eac0 |
feat: channel permissions UI, DM Sans font, private channel filtering, migration fix
- Rewrite ChannelSettingsModal with full tri-state permission override UI for roles and members (allow/neutral/deny per permission bit) - Switch font from Inter to self-hosted DM Sans (woff2 variable fonts) - Add client-side VIEW_CHANNEL filtering in ChannelSidebar for private channels - Broadcast isPrivate flag on channel override changes - Fix voice permission bit migration: gate behind persistent flag to prevent repeated re-runs that stripped STREAM from @everyone roles - Add speakingUserIds set to voice store for efficient user-level lookups - Clear current channel view when a channel is deleted - Move .glass-strip to @layer utilities for proper CSS specificity - Simplify avatar initials font size to proportional formula |