Skip to content

feat(associations): honest logo fallback and a steadier accordion - #210

Merged
BIA3IA merged 14 commits into
feat/home-visual-refinementfrom
feat/associations-visual-refinement
Nov 2, 2026
Merged

BIA3IA merged 14 commits into
feat/home-visual-refinementfrom
feat/associations-visual-refinement

Conversation

@viganogabriele

Copy link
Copy Markdown
Contributor

Part of the stacked visual-refinement series. Base is #209 (/matricole); merge after it. This PR covers /associations (Figma desktop 2306:5313, mobile 3498:2836) and one shared fix to Hero.

What changes

Logos are honest

  • An association without a logo used to show ESN's logo: associations-list.tsx fell back to the logo from the Figma example (audit R10).
  • It now shows its initials ("Lista Aperta…" → LA) in the same white circle real logos sit in.
  • The unused placeholder public/logos/esn.svg is removed.
  • Logos are decorative (alt="") because the name is right next to them.

Accordion

  • Padding stays the same open or closed. Before, opening an item animated the padding from 24 to 64 px and the name jumped sideways. The height animation stays.
  • Name sizes: 20 px on phones, 22 on small tablets and 28 from md, all Poppins. Before it was 22 px, then 45 px from md; at 768 px the longer names wrapped onto three lines.
  • Logo sizes: 40 / 48 / 64 px.
  • Description:
    • from md it lines up with the name;
    • it is capped at a readable measure (max-w-3xl);
    • on phones it uses the full card width (before, a 64 px inset left about 140 px of text per line at 320).
  • Social links:
    • "Segui l'associazione" loses its blue text gradient: the style guide allows a decorated background or coloured text, not both;
    • the block is shown only when there are links;
    • the icon links get accessible names, 40 px targets, rel="noopener noreferrer" and a focus ring.
  • Hover means clickable. The header is the clickable part: hovering brightens the item. Keyboard focus rings the whole item; the trigger had outline-none and no visible focus at all.

Page

  • The page uses the shared container, hero and rhythm from layout/page.ts, and the list keeps Figma's 1200 px column.
  • If the list is empty or the backend can't be reached (the query returns [] for both), the page shows a dashed placeholder with the same style as /projects. Before it was a line of small text in a large empty area.

Shared: Hero title fits its longest word

  • A word can't wrap, so "Associazioni" overflowed the screen at 320–360 px and from 640 to 768 px; "Contattaci" overflowed at 320 and 640 px. The browser clipped it, so there was no horizontal scrollbar.
  • The title size is now capped so the longest word fits the content width: min(Figma size, (100vw − gutters) / (letters × 0.55em)).
  • Titles that already fit keep the Figma sizes (57 / 120 px). Everything from about 800 px up is unchanged.
Hero title 320 390 640 768 1440
Associazioni (before) 57 overflow 57 120 overflow 120 overflow 120
Associazioni (after) 41 52 85 104 120
Contattaci (after) 49 57 102 120 120
Collabora, Matricole (after) 55 57 113 120 120
Team, Unisciti, Progetti, Struttura, FAQ unchanged

Shared changes and their reach

Change Other pages affected
ui/hero.tsx: title capped to fit its longest word Every page with Hero, only at widths where a long word would overflow (table above). Page heights at 320/390/768/1440 are identical on /collabora, /matricole, /team, /join, /projects, /about, /faqs and /guides; /contact at 320 is +2 px.
accordion-association/*: padding, typography, hover/focus /about "Organi associativi" on phones. association-bodies.tsx now passes its padding and title size explicitly, so it renders as before (screenshot below, heights identical).

Screenshots

Locally the backend is unreachable, so the "before" and "after" lists come from the same temporary fixture: 8 associations with and without logos, a very long name, a long description, and one item without links. The fixture was not committed. The one difference: the first item's "before" logo is the removed esn.svg.

Desktop 1440
desktop

Tablet 768
tablet

Mobile 390 and 320
390
320

Empty / unreachable list (1440)
empty

Idle → hover → keyboard focus
states

/about association bodies on mobile, before | after (unchanged)
bodies

Verification

  • pnpm check: clean.
  • pnpm build: passes.
  • pnpm typecheck: clean.
  • node --test tests/*.test.mjs: 3/3 pass.
  • /associations was checked at 320, 390, 768, 1024, 1279, 1280, 1440, 1728 and 1920 px, with no horizontal overflow.

Trade-offs

  • Very long single words in an association name can break mid-word on the narrowest phones (overflow-wrap: break-word) rather than run under the chevron. With the fixture this never triggers at 320 px.
  • The Hero cap is a heuristic (0.55 em per letter, measured on DM Sans "Contattaci"). It is conservative: titles shrink a little before they would actually overflow.
  • The first item is still open by default, as before. Figma shows the list closed, but an open item shows what the list contains.

Deliberately left out

  • Search and alphabetical index for long lists, which the audit suggests at 50+ associations: not needed at today's volume, and it is a product decision.
  • Ordering follows the backend.
  • The English description (descriptionEn) waits on the language switch, which is an open decision.
  • No "Sei un'associazione? Scrivici" CTA in the empty state, because that copy and its destination don't exist.

Housekeeping

The screenshots live on pr-assets/associations-visual-refinement so the diff stays code-only; delete that branch after review.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 8e836aab-e243-4bce-ad4f-12e58553692d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@viganogabriele
viganogabriele marked this pull request as ready for review October 31, 2026 17:54
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch from 15232a3 to a60acbb Compare November 2, 2026 13:53
@BIA3IA
BIA3IA force-pushed the feat/matricole-visual-refinement branch 2 times, most recently from 6917b00 to 3e84d00 Compare November 2, 2026 14:06
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch from a60acbb to 4c9461a Compare November 2, 2026 14:06
@BIA3IA
BIA3IA force-pushed the feat/matricole-visual-refinement branch from 3e84d00 to ca0ab5c Compare November 2, 2026 14:20
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch 2 times, most recently from 2deef4c to 7da2add Compare November 2, 2026 14:32
@BIA3IA
BIA3IA force-pushed the feat/matricole-visual-refinement branch from ca0ab5c to 30dbd99 Compare November 2, 2026 14:32
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch 2 times, most recently from e39b2dc to e1d628d Compare November 2, 2026 14:56
@BIA3IA
BIA3IA force-pushed the feat/matricole-visual-refinement branch from 00e2654 to aa7f521 Compare November 2, 2026 14:56
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch from e1d628d to e3e2508 Compare November 2, 2026 15:00
@BIA3IA
BIA3IA force-pushed the feat/matricole-visual-refinement branch 2 times, most recently from 5df0b9e to 9704412 Compare November 2, 2026 15:02
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch 2 times, most recently from 52640bf to c83b028 Compare November 2, 2026 15:14
@BIA3IA
BIA3IA force-pushed the feat/matricole-visual-refinement branch 2 times, most recently from 4cd1a9a to 9c83b71 Compare November 2, 2026 15:18
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch from c83b028 to 6ac92c4 Compare November 2, 2026 15:19
viganogabriele and others added 3 commits November 2, 2026 15:25
…rd grid

- Page uses the shared container, title/lead styles and vertical rhythm of
  the other redesigned pages instead of ad-hoc paddings and a 1616px
  breakpoint.
- Email cards: four in a row from xl as in Figma, 2×2 below, one column on
  phones, so a card is never left alone on a row; cards size to content
  instead of the fixed 264×312 box.
- "Trova il tuo gruppo" had no action: it now links to /groups, like the
  inline link in the same paragraph.
- Group photo keeps Figma's crop next to the text from xl and is capped
  when stacked; text is left-aligned at every width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The group photo is 512x246: it was declared 721x342 and stretched up to
  768px wide. It now shows at its real size at most.
- "Candidature" linked to /join with the label "Struttura"; the label now
  matches the page it opens.
- The inline links use INLINE_LINK, with a visible focus ring.
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch from 6ac92c4 to ed94238 Compare November 2, 2026 15:26
@BIA3IA
BIA3IA force-pushed the feat/matricole-visual-refinement branch from 9c83b71 to 7df8918 Compare November 2, 2026 15:26
BIA3IA and others added 2 commits November 2, 2026 15:28
…search

- One ProjectCard for the three lists: the project's logo replaces Figma's
  placeholder icons (crop / upload), the title gets a per-line gradient, and
  the footer says what the project page offers (web app or source code).
- One ProjectList: cards in a min/max-bounded auto-fill grid instead of
  fixed 312x264 boxes at fixed breakpoints; on phones a carousel with the
  next card peeking in.
- The collection search box now filters by name and description (it had no
  handler), with an explicit "no match" state.
- Empty lists render a dashed placeholder that points to "Hai un'idea?".
- "Hai un'idea?" sits as text + two reference cards side by side, with a
  readable lead and a real mailto link.
- /projects and /projects/[id] use the shared container, titles and
  rhythm; the detail page drops its gradient panels and closes on the
  background like the other pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BIA3IA and others added 9 commits November 2, 2026 15:28
- ProjectCard is now a CardCaption with a logo, a clamped caption and
  a footer, instead of a second copy of its link, hover, focus and
  footer logic. CardCaption gains `image`, `titleClassName` and
  `captionClassName` for it.
- The search looks through every project on the page, novelties and
  deprecated ones included, matches each word separately and announces
  the number of results.
- PeekCarousel replaces the two copies of the phone carousel (homepage
  and project lists).
- SECTION_STACK moves to layout/page and also serves /about.
- t.me links are labelled Telegram, not Web.
- The project page shows no placeholder icon when there is no logo, and
  "Hai un'idea?" sits on the container's left edge like the other
  sections.
- Long search queries wrap inside the empty state.
…with any project

CardCaption draws its title gradient per line, as ProjectCard did before
it moved onto CardCaption: a wrapped title no longer fades on its second
line. The search box shows whenever the page has projects to search,
not only when the collection itself has some.
- Results and extra pages: one ~1024px column (Figma's list width) with a
  shared header component (back, centred title, close) laid out on a
  three-column grid, so long course names no longer run under the buttons
  on phones.
- The general groups (site, school, level, course) were squeezed four per
  row with their names overlapping the platform buttons; they now sit one
  per row, two per row from lg, as in Figma.
- Group rows: name and buttons share a row; when the card is narrower than
  20rem the name gets its own line instead of breaking word by word. The
  `stacked` variant is gone.
- Hover only where there is a link: the platform buttons darken, the report
  flags darken, course rows lighten and nudge their chevron, the landing
  cards get the identity hover. Keyboard focus rings on all of them.
- Wizard: no wasted 16px inset on phones, where the glass panel is
  invisible, so the step labels fit at 320px.
- Landing title uses the fluid display size and is the page's h1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…offline

- The four actions in a group row are 6px apart on phones too: 2px left
  the WhatsApp link and its report flag too easy to mistake.
- The general groups get a visually hidden heading, so the outline no
  longer jumps from h1 to h3.
- getVisibleGroups returns an empty list when the backend fails, like
  the other queries, so /groups/extra shows its empty state instead of
  a 500.
CardIcon's responsive `size` ({ base, sm, md, lg }) builds "sm:…" classes at
runtime, so Tailwind never generated the ones not written literally elsewhere
(e.g. sm:px-8 for the homepage material shortcuts). Generate every prefixed
variant of the size maps with @source inline(), and add a test that fails if
classes.ts gains a class missing from that list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rids

- Hero, sections and FAQ use the shared container, hero offset, rhythm and
  section titles; the featured resources close the hero.
- "Guide e Utility" is a section title (it was 22px on phones, smaller than
  the Telegram Hub card title) and sits closer to its own content.
- Large resource cards: descriptions capped at 448px instead of 240px.
- The large guide sits beside the 2x2 small guides only from xl, on a 5/7
  split repeated by Materiali / Tech Tools, so "Mappa Microonde" no longer
  wraps; the four small guides use 20px titles.
- Telegram Hub: two columns until xl (four columns clipped "Mercatino" at
  1024px); the group has 24px padding on phones instead of 48px, so its
  links span the width as in the Figma mobile frame.
- Resources with a link react to hover, the others don't.
- Resources hidden on phones stay hidden: that's the Figma mobile frame,
  an open design decision.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The school tiles of the groups wizard use the sm size on phones, now
  that responsive CardIcon sizes are generated: at 320px they were about
  400px tall each.
- Materiali and Tech Tools sit side by side from lg: below xl the
  full-width card left half its width empty.
- CardIcon's hover defaults to whether the card has an href, so callers
  no longer repeat Boolean(href).
- The intro uses PAGE_HERO_TOP instead of cancelling PAGE_HERO's bottom
  padding at every breakpoint.
- Associations without a logo show their initials instead of ESN's logo,
  which came from the Figma example; the unused placeholder asset is gone.
- Page on the shared container, hero and rhythm; the list keeps Figma's
  1200px column.
- Accordion: constant padding open or closed (the name no longer jumps),
  description aligned with the name from md and capped at a readable
  measure, names at 20/22/28px instead of 22/45px, smaller logos on phones.
- The clickable header brightens on hover and rings the item on keyboard
  focus; social links get accessible names, 40px targets and rel=noopener;
  "Segui l'associazione" drops its blue gradient and only shows with links.
- Empty or unreachable list: a dashed placeholder like /projects.
- Shared Hero: the title size is capped so its longest word fits the
  content width; "Associazioni" and "Contattaci" overflowed phones and
  tablets. Titles that already fit keep the Figma sizes.
- /about association bodies keep their look on the new accordion padding.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This PR sets the title size on Hero's inner span, so /storia's
[&_h2]:typo-display-fluid-extralarge override stopped having any effect.
It is removed, and the description width /storia needs goes through a
new descriptionClassName prop. Hero's comments are cut to the reason
behind the size cap.
@BIA3IA
BIA3IA force-pushed the feat/matricole-visual-refinement branch from 7df8918 to 56a596e Compare November 2, 2026 15:28
@BIA3IA
BIA3IA force-pushed the feat/associations-visual-refinement branch from ed94238 to 0c68c21 Compare November 2, 2026 15:28
Base automatically changed from feat/matricole-visual-refinement to feat/home-visual-refinement November 2, 2026 15:54
@BIA3IA
BIA3IA merged commit 320e93a into feat/home-visual-refinement Nov 2, 2026
3 checks passed
@BIA3IA
BIA3IA deleted the feat/associations-visual-refinement branch November 2, 2026 15:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants