Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
a5bbb80
add new design guidance
meganrm May 5, 2026
18958b9
update styles
meganrm May 5, 2026
1aafdc4
update theme
meganrm May 5, 2026
239193d
apply new styles
meganrm May 5, 2026
ac52005
update file
meganrm May 5, 2026
1e88986
simplifying css
meganrm May 15, 2026
832b524
add images from theme
meganrm May 15, 2026
307c489
feat: add new Allen Institute logo asset
meganrm May 16, 2026
ebb6c97
feat: add logo and sub-label styles to header
meganrm May 16, 2026
fc2e5e3
feat: replace text logotype with new Allen Institute SVG logo
meganrm May 16, 2026
9f05cbc
refactor: remove unused title prop from AppHeader
meganrm May 16, 2026
57fb75d
feat: add hero section styles to index page
meganrm May 16, 2026
44e458e
feat: add Allen Blue hero section to homepage
meganrm May 16, 2026
98c16f6
fix: use section element for hero, improve breadcrumb contrast
meganrm May 16, 2026
e9a45bb
ignore new plugin
meganrm May 17, 2026
675fa98
apply new style
meganrm May 17, 2026
2cf9bc7
docs: add IdeaRoll ListItem redesign spec
meganrm May 17, 2026
38db19c
docs: add IdeaRoll ListItem redesign implementation plan
meganrm May 17, 2026
1a4cde0
feat: add accent color CSS rules to idea-roll list item
meganrm May 17, 2026
37e69d9
feat: add deterministic accent colors to IdeaRoll list items
meganrm May 17, 2026
27c72eb
fix: use item.id as React key on List.Item
meganrm May 17, 2026
a24e836
fix: match avatar color to item accent color
meganrm May 18, 2026
7105050
fix: use uniform Allen Violet for card borders, titles, and avatars
meganrm May 18, 2026
c2ac107
feat: add full brand palette and semantic aliases to theme.ts
meganrm May 19, 2026
4c3981e
fix: replace yarn with npm run in lefthook hooks
meganrm May 19, 2026
6d5dade
refactor: replace direct color refs with semantic tokens in all CSS f…
meganrm May 19, 2026
824c528
remove specs
meganrm May 19, 2026
4e0ed53
ignore docs
meganrm May 19, 2026
f3a951a
revert changes to lefthook
meganrm May 19, 2026
7572bf7
Merge branch 'main' into feature/update-brand
meganrm May 19, 2026
49e7825
use height
meganrm May 19, 2026
395be1c
styles not needed
meganrm May 19, 2026
4a21547
remove unused class
meganrm May 19, 2026
9981c72
feat: add type field to IdeaPost schema
meganrm May 19, 2026
786910b
feat: add program and type fields to idea post query
meganrm May 19, 2026
31bf05d
refactor: add optional className prop to TagPopover
meganrm May 19, 2026
0de9585
refactor: change ResourceItem root element to li for dot-bullet lists
meganrm May 19, 2026
759507b
chore: remove ResourceItem test (testing-library not yet installed)
meganrm May 19, 2026
83bb1e0
style: replace idea-post CSS with new Allen 2025 brand design
meganrm May 19, 2026
bb13c63
feat: restructure idea post header — blue block, metadata strip, tag row
meganrm May 19, 2026
6eaac80
refactor: update MaterialsAndMethods to use ul/li and new CSS class n…
meganrm May 19, 2026
70666c5
style: cap content wrapper at 1200px max-width
meganrm May 19, 2026
a432ecd
style: remove orphaned 1800px media query from contentWrapperFullWidth
meganrm May 19, 2026
76f1713
style: restyle page-nav sider to page background with border
meganrm May 19, 2026
e3db4a1
style: add framing borders to content column on wide viewports
meganrm May 19, 2026
6442a6d
use semantic names
meganrm May 19, 2026
f6a0143
adjust styles
meganrm May 19, 2026
023b7b7
adjust setting
meganrm May 20, 2026
56ef57a
update claude md
meganrm May 20, 2026
831fea2
add index page redesign spec
meganrm May 20, 2026
11b6dcd
use semantic color names in index page redesign spec
meganrm May 20, 2026
171944b
feat: add --content-padding-x layout tokens to colors.css
meganrm May 20, 2026
5c84627
feat: make index page full-width and wrap hero text in constrained in…
meganrm May 20, 2026
76882aa
feat: rewrite index-page styles for full-bleed hero and token-based p…
meganrm May 20, 2026
482ec66
feat: replace antd List with native editorial ul/li in IdeaRoll
meganrm May 20, 2026
247185e
fix: remove gap:0 no-op, explicit count check, delete dead IconText c…
meganrm May 20, 2026
42eed6d
fix: use --color-primary token and document antd Tag override in eyeb…
meganrm May 20, 2026
07f5556
small style tweaks
meganrm May 20, 2026
126007d
rename colors
meganrm May 20, 2026
6146ef5
use max width vars
meganrm May 20, 2026
ce8f09a
uncomment out the breakpoints
meganrm May 20, 2026
75d758e
Merge branch 'feature/update-brand' of https://github.com/AllenCell/i…
meganrm May 20, 2026
2dd1e51
update color names
meganrm May 20, 2026
373d200
use border color
meganrm May 20, 2026
c4fbfa9
clean up styles
meganrm May 20, 2026
353cb9c
Merge branch 'main' of https://github.com/AllenCell/idea-board into f…
meganrm May 21, 2026
b26e274
pull in changes from upstream
meganrm May 21, 2026
b66a99d
use new color name
meganrm May 21, 2026
0259de3
use variable
meganrm May 21, 2026
04f627c
update comment
meganrm May 21, 2026
dc4bab1
dont make a link if it's missing
meganrm May 21, 2026
2dac9b7
add index page redesign spec
meganrm May 20, 2026
c842408
use semantic color names in index page redesign spec
meganrm May 20, 2026
0189832
feat: add --content-padding-x layout tokens to colors.css
meganrm May 20, 2026
79e72a6
feat: make index page full-width and wrap hero text in constrained in…
meganrm May 20, 2026
e55d053
feat: rewrite index-page styles for full-bleed hero and token-based p…
meganrm May 20, 2026
e81af9c
feat: replace antd List with native editorial ul/li in IdeaRoll
meganrm May 20, 2026
bdd7880
fix: remove gap:0 no-op, explicit count check, delete dead IconText c…
meganrm May 20, 2026
c3a0c49
fix: use --color-primary token and document antd Tag override in eyeb…
meganrm May 20, 2026
48536b6
small style tweaks
meganrm May 20, 2026
108bc1e
use new color name
meganrm May 21, 2026
ef24dfa
Merge branch 'fix/replace-list' of https://github.com/AllenCell/idea-…
meganrm May 21, 2026
b9d0aaf
fix color
meganrm May 27, 2026
6ed5da0
Merge branch 'main' of https://github.com/AllenCell/idea-board into f…
meganrm May 27, 2026
abbeb2b
fix merge mistake
meganrm May 27, 2026
1c4f231
Potential fix for pull request finding
meganrm May 28, 2026
440da44
Potential fix for pull request finding
meganrm May 28, 2026
926bf05
Potential fix for pull request finding
meganrm May 28, 2026
0702f23
Potential fix for pull request finding
meganrm May 28, 2026
3098ca8
Potential fix for pull request finding
meganrm May 28, 2026
d39754c
format
meganrm May 28, 2026
eac49b7
changes based on comments
meganrm Jun 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions docs/design/specs/2026-05-20-index-page-redesign.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# Index Page Redesign

**Date:** 2026-05-20
**Status:** Approved

## Goals

1. Make the index page hero background truly full-viewport-width.
2. Align hero text and list content to the same horizontal position.
3. Match the list content max-width to idea-post pages (1200px via `contentWrapper`).
4. Replace the deprecated `antd/List` component with native HTML.
5. Redesign list items in an editorial style — bold typographic, no avatars, no placeholder counts.
6. Introduce a shared CSS token so hero text and list content are guaranteed to stay aligned.

## Layout Structure

The index page will set `fullWidthPage: true` via `useSetLayoutConfig()`. This removes the `max-width: 1200px` cap and side borders from `contentWrapper`, allowing the hero background to bleed edge-to-edge.

Within the now-unconstrained page, both the hero text and the IdeaRoll use the same inner wrapper:

```
max-width: 1200px
margin: 0 auto
padding: 32px var(--content-padding-x)
```

This guarantees horizontal alignment regardless of viewport width.

### Shared token

Add to `src/style/colors.css`:

```css
/* Layout */
--content-padding-x: 48px;
--content-padding-x-sm: 24px;
```

Used in `index-page.module.css` for both `.heroInner` and `.listWrapper`. `--content-padding-x-sm` replaces `--content-padding-x` at `@media (max-width: 768px)`.

### Hero restructure

The `<section className={hero}>` gets a full-width background only. Text moves into a new `<div className={heroInner}>` that provides the constrained, centered inner wrapper.

Before:
```
<section className={hero}> ← background + max-width + padding
<p>breadcrumb</p>
<h1>Idea Board</h1>
<p>subtitle</p>
</section>
```

After:
```
<section className={hero}> ← background only, full-width
<div className={heroInner}> ← max-width: 1200px, centered, padded
<p>breadcrumb</p>
<h1>Idea Board</h1>
<p>subtitle</p>
</div>
</section>
```

## IdeaRoll: Editorial Item Design

Replace `antd/List` + `List.Item` + `List.Item.Meta` with a native `<ul>/<li>`.

Each item contains three rows:

1. **Tag eyebrow** — `TagPopover` components inline, restyled as small-caps blue text. Dot separators (`·`) rendered in JSX between tags (never interactive).
2. **Title** — `<a href={slug}>`, large bold dark text, no underline by default.
3. **Byline** — `by [Author · Author] — [Dataset name]` (or `— No public dataset`). Small muted text.

Items separated by a bottom border. No avatars. No star/message counts (removed entirely).

### Tag rendering pattern

```tsx
{item.tags.map((tag, i) => (
<React.Fragment key={tag}>
{i > 0 && <span className={tagSeparator}> · </span>}
<TagPopover tag={tag} currentSlug={item.slug} className={eyebrowTag} />
</React.Fragment>
))}
```

`TagPopover` receives an `eyebrowTag` className that overrides antd `Tag` default styles. The separator `·` is a plain `<span>` between tags.

### Typography spec

| Element | Size | Weight | Color | Other |
| ------------ | ---- | ------ | ----------------------------- | ---------------------------------------------- |
| Tag eyebrow | 10px | 700 | `var(--primary-color)` | uppercase, `letter-spacing: 0.15em` |
| Separator · | 10px | 400 | `var(--border-color)` | `margin: 0 5px` |
| Title | 19px | 800 | `var(--primary-color)` | `letter-spacing: -0.02em`, `line-height: 1.25` |
| Byline | 11px | 400 | `var(--text-secondary-color)` | — |
| Item border | — | — | `var(--border-color)` | bottom only, `1px solid` |
| Item padding | — | — | — | `22px 0` top/bottom |

## Files Changed

| File | Change |
| --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `src/style/colors.css` | `--content-padding-x` and `--content-padding-x-sm` tokens already exist (no code changes required in this PR) |
| `src/templates/index-page.tsx` | Add `useSetLayoutConfig` + `fullWidthPage: true`; restructure hero with `heroInner` wrapper |
| `src/style/index-page.module.css` | Rewrite `.hero` (bg only), add `.heroInner` (constrained wrapper), update `.listWrapper` to use token |
| `src/components/IdeaRoll.tsx` | Replace `antd/List` with native `<ul>/<li>`; editorial item layout; remove `Avatar`, `StarOutlined`, `MessageOutlined` imports |
| `src/style/idea-roll.module.css` | Replace `.container` antd overrides with editorial styles; add `.listItem`, `.tagEyebrow`, `.eyebrowTag`, `.tagSeparator`, `.title`, `.byline` |

## Out of Scope

- `TagPopover.tsx` — no changes to component logic or popover behavior
- `idea-post.tsx` / `idea-post.module.css` — untouched
- Adding new data fields (date, type, program) to the IdeaRoll query
- Any other pages
12 changes: 0 additions & 12 deletions src/components/IconText.tsx

This file was deleted.

132 changes: 58 additions & 74 deletions src/components/IdeaRoll.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@ import React from "react";

import { Link, graphql, useStaticQuery } from "gatsby";

import { MessageOutlined, StarOutlined } from "@ant-design/icons";
import { Avatar, List } from "antd";

import { PRIMARY_COLOR } from "../style/theme";
import { IconText } from "./IconText";
import { TagPopover } from "./TagPopover";

const { container } = require("../style/idea-roll.module.css");
const {
byline,
container,
eyebrowTag,
listItem,
tagEyebrow,
tagSeparator,
title,
} = require("../style/idea-roll.module.css");

type IdeaNode = Queries.IdeaRollQuery["allIdeaPost"]["nodes"][number];

Expand Down Expand Up @@ -42,78 +45,59 @@ const IdeaRoll = ({ count }: IdeaRollProps) => {
}
`);

const filteredNodes = queryData.allIdeaPost.nodes.slice(0, count);
const ideasForIdeaRoll: IdeaListItem[] = filteredNodes.map(
(post: IdeaNode) => ({
...post,
dataset:
post.resources.find((r) => r?.type === "dataset")?.name ?? null,
}),
);
const nodes: IdeaNode[] = queryData.allIdeaPost.nodes.slice(0, count);
const ideas: IdeaListItem[] = nodes.map((post) => ({
...post,
dataset:
post.resources.find((r) => r?.type === "dataset")?.name ?? null,
}));

return (
<List
className={container}
itemLayout="vertical"
dataSource={ideasForIdeaRoll}
footer={
count ? (
<div>
<Link className="btn" to="/">
See more
</Link>
</div>
) : (
""
)
}
renderItem={(item) => (
<List.Item
key={item.id}
actions={[
<IconText
icon={StarOutlined}
text="2"
key="list-vertical-star-o"
/>,
<IconText
icon={MessageOutlined}
text="2"
key="list-vertical-message"
/>,
...item.tags.map((tag) => (
<TagPopover
key={tag}
tag={tag}
currentSlug={item.slug}
/>
)),
]}
>
<List.Item.Meta
title={<a href={item.slug}>{item.title}</a>}
avatar={
<Avatar.Group>
{item.authors.map((author) => (
<Avatar
key={author.name}
style={{
backgroundColor: PRIMARY_COLOR,
color: "#fff",
}}
>
{author.name[0].toUpperCase()}
</Avatar>
<>
<ul className={container}>
{ideas.map((item) => (
<li key={item.id} className={listItem}>
{item.tags.length > 0 && (
<div className={tagEyebrow}>
{item.tags.map((tag, i) => (
<React.Fragment key={tag}>
{i > 0 && (
<span
className={tagSeparator}
aria-hidden="true"
>
·
</span>
)}
<TagPopover
tag={tag}
currentSlug={item.slug}
className={eyebrowTag}
/>
Comment on lines +72 to +76
</React.Fragment>
))}
</Avatar.Group>
}
description={
<span>{item.dataset ?? "No public dataset"}</span>
}
/>
</List.Item>
</div>
)}
<Link to={item.slug} className={title}>
{item.title}
</Link>
<div className={byline}>
by {item.authors.map((a) => a.name).join(" · ")}
{item.dataset
? ` — ${item.dataset}`
: " — No public dataset"}
</div>
</li>
))}
</ul>
{count !== undefined && (
<div>
<Link className="btn" to="/">
See more
</Link>
</div>
)}
/>
</>
);
};

Expand Down
72 changes: 60 additions & 12 deletions src/style/idea-roll.module.css
Original file line number Diff line number Diff line change
@@ -1,18 +1,66 @@
.container {
margin: auto;
list-style: none;
padding: 0;
margin: 0;
background-color: var(--bg-base-color);
}

.listItem {
padding: 22px 0;
border-bottom: 1px solid var(--border-color);
}

:global(.ant-list-item) {
border-left: 3px solid var(--primary-color);
padding-left: 20px;
}
.listItem:last-child {
border-bottom: none;
}

:global(.ant-list-item-meta-title a) {
color: var(--primary-color) !important;
font-weight: 600;
}
.tagEyebrow {
display: flex;
align-items: center;
flex-wrap: wrap;
margin-bottom: 6px;
}

/* Overrides antd Tag's scoped styles, which win without !important */
.eyebrowTag {
font-size: 10px !important;
font-weight: 700 !important;
letter-spacing: 0.15em !important;
text-transform: uppercase !important;
color: var(--primary-color) !important;
background: transparent !important;
border: none !important;
padding: 0 !important;
margin: 0 !important;
line-height: inherit !important;
cursor: pointer;
}

.tagSeparator {
font-size: 10px;
font-weight: 400;
color: var(--border-color);
margin: 0 5px;
user-select: none;
}

.title {
display: block;
font-size: 19px;
font-weight: 800;
color: var(--primary-color);
text-decoration: none;
letter-spacing: -0.02em;
line-height: 1.25;
margin-bottom: 6px;
}

.title:hover {
text-decoration: underline;
}

:global(.ant-list-item-meta-title a:hover) {
color: var(--primary-color);
}
.byline {
font-size: 11px;
font-weight: 400;
color: var(--text-secondary-color);
}
Loading
Loading