Repository navigation
Cluster pages: the diagram as the way in, linked reading lists, one colour per cluster #1137
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
LukasWallrich
wants to merge
16
commits into
rebrand-doors
Choose a base branch
from
rebrand/clusters-round
base: rebrand-doors
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+511
−157
Open
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
822d1f6
Link cluster resource titles and show their kind as plain text
LukasWallrich 70405ff
Keep keyboard focus in the cluster reference dialog
LukasWallrich fc2a8a9
Fold the cluster filters on phones, explain counts and say when nothi…
LukasWallrich 07c0ac1
Give each of the 11 clusters its own colour across the spectrum
LukasWallrich 36cd718
Lead /clusters/ with the filters and a linked list of the clusters
LukasWallrich 3ee19d7
Show the cluster side list's links as links and start it at the curre…
LukasWallrich 7829c0c
Make the forrt_clusters term lists searchable and say what they are
LukasWallrich 165348e
Keep the disciplines side list's field names at their weight
LukasWallrich b8ce196
Make the /clusters/ diagram the way into the clusters
LukasWallrich 457e756
Fix contrast, sizes and widths found by the cluster page audit
LukasWallrich 445f782
Rerender the /clusters/ share image with the new cluster colours and …
LukasWallrich 144ab7f
Show the full clusters diagram only where its names read at 15 px
LukasWallrich a64969b
Merge remote-tracking branch 'origin/rebrand-doors' into rebrand/clus…
LukasWallrich 6c1701f
Cluster resource lists: two columns on wide screens
LukasWallrich 52b5096
Merge remote-tracking branch 'origin/rebrand-doors' into rebrand/clus…
LukasWallrich e149036
Clusters: sub-clusters under each cluster, quiet purpose tags, one to…
LukasWallrich File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -952,7 +952,7 @@ | |
| .clusters-map__line { fill: none; stroke: var(--soft); stroke-width: 2; stroke-linecap: round; } | ||
| .clusters-map__seg path:first-of-type, .clusters-map__label rect, .clusters-map__pill rect { fill: var(--c); } | ||
| .clusters-map__icon { fill: #fff; } | ||
| .clusters-map__label text { font-size: 20px; font-weight: 700; } | ||
| .clusters-map__label text { font-size: 32px; font-weight: 700; } | ||
| .clusters-map__pill text { font-size: 17px; font-weight: 400; } | ||
| .clusters-map__disc { fill: #fff; stroke: var(--res); stroke-width: 7; } | ||
| .clusters-map__cluster { transition: opacity 0.15s; } | ||
|
|
@@ -964,13 +964,6 @@ | |
| border: 1px solid var(--line); border-radius: var(--r-small); padding: 0.35rem 0.9rem; cursor: pointer; | ||
| } | ||
| .clusters-map__enlarge:hover, .clusters-map__close:hover { border-color: var(--ink); } | ||
| .clusters-map__list { flex: 1 1 20rem; } | ||
| .clusters-map__list summary { cursor: pointer; color: var(--link); font-size: 0.95rem; } | ||
| .clusters-map__list ol { margin: 0.75rem 0 0; padding-left: 1.4rem; columns: 2 22rem; column-gap: 2rem; font-size: 0.95rem; } | ||
| .clusters-map__list li { break-inside: avoid; margin-bottom: 0.5rem; } | ||
| .clusters-map__list ul { margin: 0.2rem 0 0; padding-left: 1.1rem; font-size: 0.9rem; } | ||
| .clusters-map__list ul li { margin: 0; } | ||
| .clusters-map__list a { color: var(--ink); } | ||
| .clusters-map__dialog { width: 96vw; max-width: none; height: 94vh; max-height: none; padding: 0; border: 0; border-radius: var(--r-large); background: var(--page); } | ||
| .clusters-map__dialog::backdrop { background: rgba(38, 45, 53, 0.6); } | ||
| .clusters-map__close { position: absolute; top: 0.75rem; right: 0.75rem; z-index: 1; box-shadow: 0 1px 4px rgba(38, 45, 53, 0.25); } | ||
|
|
@@ -979,22 +972,15 @@ | |
| .clusters-map__compact { display: none; } | ||
| .clusters-map__hub { display: block; width: min(240px, 70%); margin: 0 auto 1rem; } | ||
| .clusters-map__segment { fill: var(--c); } | ||
| .clusters-map__chips { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.5rem; } | ||
| .clusters-map__chips a { | ||
| display: flex; align-items: center; gap: 0.8rem; padding: 0.55rem 0.9rem; border-radius: 12px; | ||
| background: var(--c); color: #fff; font-weight: 700; line-height: 1.25; text-decoration: none; | ||
| } | ||
| .clusters-map__chips svg { flex: 0 0 1.4rem; height: 1.4rem; fill: currentColor; } | ||
| .clusters-map__chips small { display: block; font-size: 0.85rem; font-weight: 400; } | ||
| /* Phones: the hub and the cluster labels; the pills are in the list and the full-size view. */ | ||
| @media (max-width: 760px) { | ||
| /* Below 1256 px the full drawing would set cluster names under 15 px, so phones, tablets and small laptops get | ||
| the hub, and the clusters in the linked list after it; the pills are in the text list and the full-size view. */ | ||
| @media (max-width: 1255px) { | ||
| .clusters-map__frame { display: none; } | ||
| .clusters-map__compact { display: block; } | ||
| } | ||
| @media (forced-colors: active) { | ||
| .clusters-map__art text, .clusters-map__icon { fill: CanvasText; } | ||
| .clusters-map__seg path:first-of-type, .clusters-map__segment, .clusters-map__label rect, .clusters-map__pill rect { fill: Canvas; stroke: CanvasText; } | ||
| .clusters-map__chips a { border: 1px solid CanvasText; } | ||
| } | ||
|
|
||
| /* Stack on small screens */ | ||
|
|
@@ -2406,3 +2392,131 @@ body.clusters-mobile-nav-open #just-os-widget{display:none} | |
| .disciplines-areas{display:flex;flex-wrap:wrap;gap:6px;margin:-4px 0 14px;padding:0;list-style:none} | ||
| .disciplines-areas li{margin:0} | ||
| .disciplines-areas .badge{padding:4px 10px;border-radius:999px;font:600 15px/1.3 var(--text)} | ||
|
|
||
| /* Resource cards: the kind of resource as quiet text ("Overview · Paper"), not filled chips, and the | ||
| title as an underlined link to the resource. The reference button is a secondary action beside Save. */ | ||
| .card-kind{margin:0 0 6px;font:400 15px/1.35 var(--text);color:var(--soft);letter-spacing:0;text-transform:none} | ||
| .card-purpose{display:inline-block;margin-right:6px;padding:1px 9px;border:1px solid var(--line);border-radius:var(--r-small,6px);background:var(--surface);color:var(--ink);font-weight:600} | ||
| .fc-card .fc-body{min-width:0;flex:1} | ||
| .fc-title a,.fr-title a,.ref-popup-title a{color:var(--link);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px} | ||
| .fc-title a:hover,.fr-title a:hover,.ref-popup-title a:hover{color:var(--ink)} | ||
| .fc-title,.fr-title{margin-bottom:4px} | ||
| .fc-summary a{color:var(--link);text-decoration:underline;text-underline-offset:3px} | ||
| .fr-ref-trigger{color:var(--soft);border:1px solid rgba(0,0,0,.1);border-radius:4px;padding:.2rem .5rem} | ||
| .fr-ref-trigger:hover{color:var(--ink);border-color:var(--ink)} | ||
| .ref-popup .card-kind{margin-bottom:4px} | ||
|
|
||
| /* Filter bar: search, then a Filters disclosure holding Focus, Type and the specialist toggle. From 761 px | ||
| the disclosure is open and its summary hidden, so the bar reads as one row of controls. */ | ||
| .fr-filter-bar{align-items:center} | ||
| .fr-filter-more{flex:1 1 520px;min-width:0} | ||
| .fr-filter-more__body{display:flex;flex-wrap:wrap;align-items:center;gap:12px 20px} | ||
| .fr-filter-more>summary{display:none} | ||
| .fr-filter-group--specialist{flex-direction:column;align-items:flex-start;gap:2px} | ||
| .fr-filter-hint{font-size:15px;line-height:1.35;color:var(--soft);max-width:34em} | ||
| .fr-search-input::-webkit-search-cancel-button{cursor:pointer} | ||
| .fr-filter-result{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 12px} | ||
| .fr-filter-status{margin:0;font-size:16px;color:var(--ink)} | ||
| .fr-filter-status:empty{display:none} | ||
| .fr-filter-result__clear{background:#fff;border:1.5px solid var(--ink);border-radius:999px;padding:8px 16px;font:600 15px/1.3 var(--text);color:var(--ink);cursor:pointer} | ||
| .fr-filter-result__clear:hover{background:var(--ink);color:#fff} | ||
| .fr-filter-result__clear[hidden]{display:none} | ||
| @media (max-width:760px){ | ||
| .fr-filter-bar{flex-direction:column;align-items:stretch;gap:10px;padding:12px} | ||
| .fr-filter-search-group,.fr-filter-search-group .fr-search-input{width:100%;max-width:none} | ||
| .fr-filter-more{flex:none} | ||
| .fr-filter-more>summary{display:flex;align-items:center;gap:8px;min-height:44px;padding:0 16px;border:1.5px solid var(--line);border-radius:999px;background:#fff;font:600 16px/1.3 var(--text);color:var(--ink);cursor:pointer;list-style:none;width:max-content} | ||
| .fr-filter-more>summary::-webkit-details-marker{display:none} | ||
| .fr-filter-more>summary::after{content:"";width:8px;height:8px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);margin:-4px 0 0 4px} | ||
| .fr-filter-more[open]>summary::after{transform:rotate(-135deg);margin-top:4px} | ||
| .fr-filter-more[open]>summary{margin-bottom:12px} | ||
| .fr-filter-more__body{flex-direction:column;align-items:stretch;gap:14px} | ||
| .fr-filter-group{align-items:flex-start;flex-direction:column;gap:6px} | ||
| .fr-clear-btn{margin-left:0;align-self:flex-start} | ||
| } | ||
| /* Tap targets of at least 44 px on phones and touch screens. */ | ||
| @media (max-width:760px),(pointer:coarse){ | ||
| .fr-tag-btn{min-height:44px;padding-inline:14px} | ||
| .fr-search-input{min-height:44px} | ||
| .fr-specificity-toggle{min-height:44px} | ||
| .fr-clear-btn{min-height:44px;padding-inline:14px} | ||
| .fr-filter-result__clear{min-height:44px} | ||
| } | ||
| .fr-filter-result__go{font-size:16px;text-decoration:underline;text-underline-offset:3px} | ||
| .fr-filter-result__go[hidden]{display:none} | ||
|
|
||
| /* /clusters/: the clusters as a plain linked list after the filters, each numbered in its own colour, | ||
| in two columns on a wide screen; then the introduction and diagram, then every cluster in full. */ | ||
| .clusters-section-heading,.clusters-overview__heading{font:var(--display-weight) clamp(26px,2.4vw,32px)/1.2 var(--display);color:var(--ink);margin:36px 0 14px} | ||
| .clusters-overview__heading{margin-top:20px} | ||
| .clusters-overview__list{list-style:none;margin:0 0 8px;padding:0;display:grid;gap:18px 40px} | ||
| @media (min-width:992px){.clusters-overview__list{grid-template-columns:repeat(2,minmax(0,1fr))}} | ||
| .clusters-overview__list li{display:flex;gap:12px;align-items:flex-start;margin:0} | ||
| .clusters-overview__num{flex:0 0 30px;height:30px;border-radius:50%;background:var(--c);color:#fff;font:700 15px/30px var(--text);text-align:center;margin-top:1px} | ||
| .clusters-overview__text{min-width:0} | ||
| .clusters-overview__name{font:600 18px/1.35 var(--text);color:var(--link);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px} | ||
| .clusters-overview__name:hover{color:var(--ink)} | ||
| .clusters-overview__desc{margin:2px 0 0;font-size:16px;line-height:1.45;color:var(--ink);max-width:60ch;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden} | ||
| .clusters-overview__count{margin:2px 0 0;font-size:15px;color:var(--soft)} | ||
| .clusters-intro-section .clusters-intro{margin:0} | ||
| /* Each cluster panel numbers itself in its own colour, and on /clusters/ its name links to its page. */ | ||
| .cluster-section[style*="--c"] .cluster-number{background:var(--c);color:#fff;font-size:15px;width:1.8em;height:1.8em} | ||
| .cluster-title a{color:var(--link);text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px} | ||
| .cluster-title a:hover{color:var(--ink)} | ||
| /* A jump to a cluster or sub-cluster stops below the pinned filters. */ | ||
| .cluster-section,.acc-section{scroll-margin-top:calc(var(--clusters-controls-height,0px) + 90px)} | ||
|
|
||
| /* Side list: the cluster and sub-cluster names are underlined as links; the current cluster is marked by | ||
| weight (and aria-current), not by an underline. A shadow at the top or foot of the box shows that it | ||
| scrolls when there is more above or below. */ | ||
| .cluster-nav-heading:has(.cluster-nav-name){font-weight:400} | ||
| .cluster-nav-name{text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;text-decoration-color:currentColor} | ||
| .cluster-nav-heading[aria-current]{font-weight:700} | ||
| .cluster-nav-heading[aria-current] .cluster-nav-name{text-decoration:none} | ||
| .cluster-nav-subs .nav-link .cluster-nav-name{flex:1 1 auto;min-width:0} | ||
| .cluster-nav-heading:hover .cluster-nav-name,.cluster-nav-subs .nav-link:hover .cluster-nav-name{text-decoration-thickness:2px} | ||
| @media (min-width:992px){ | ||
| .clusters-sidebar-inner{background: | ||
| linear-gradient(var(--surface) 30%,rgba(240,243,245,0)) center top/100% 40px no-repeat local, | ||
| linear-gradient(rgba(240,243,245,0),var(--surface) 70%) center bottom/100% 40px no-repeat local, | ||
| radial-gradient(farthest-side at 50% 0,rgba(38,45,53,.18),rgba(38,45,53,0)) center top/100% 12px no-repeat scroll, | ||
| radial-gradient(farthest-side at 50% 100%,rgba(38,45,53,.18),rgba(38,45,53,0)) center bottom/100% 12px no-repeat scroll, | ||
| var(--surface)} | ||
| } | ||
|
|
||
| /* /clusters/ diagram as the way in: the cluster pointed at, or focused in the list after it, is described | ||
| in a line that sticks to the foot of the window while the drawing runs below it (desktop only; phones | ||
| show the hub and the list). */ | ||
| .clusters-map__info{position:sticky;bottom:0;z-index:3;margin:8px 0 0;padding:10px 16px;min-height:76px;background:var(--surface);border-radius:var(--r-large);display:flex;align-items:center} | ||
| .clusters-map__info[hidden]{display:none} | ||
| .clusters-map__hint{margin:0;font-size:16px;color:var(--soft)} | ||
| .clusters-map__about{display:flex;gap:12px;align-items:flex-start} | ||
| .clusters-map__about[hidden]{display:none} | ||
| .clusters-map__num{flex:0 0 30px;height:30px;border-radius:50%;background:var(--c);color:#fff;font:700 15px/30px var(--text);text-align:center} | ||
| .clusters-map__name{margin:0;font:600 18px/1.3 var(--text);color:var(--ink)} | ||
| .clusters-map__desc{margin:2px 0 0;font-size:16px;line-height:1.4;color:var(--ink);max-width:80ch} | ||
| .clusters-map__count{margin:2px 0 0;font-size:15px;color:var(--soft)} | ||
| @media (max-width:1255px){.clusters-map__info{display:none}} | ||
| .clusters-map__art .clusters-map__label,.clusters-map__art .clusters-map__seg{cursor:pointer} | ||
| .clusters-overview__list li[data-cluster]:hover .clusters-overview__name{color:var(--ink)} | ||
| .clusters-map__info{bottom:var(--banner,0px)} | ||
| .clusters-map__art .clusters-map__label:focus{outline:none} | ||
| .clusters-map__art .clusters-map__label:focus-visible rect{stroke:var(--ink);stroke-width:7px;paint-order:stroke} | ||
| .clusters-map__art .clusters-map__label:focus-visible{outline:3px solid var(--ink);outline-offset:4px} | ||
|
|
||
| /* Cluster cards keep the same inner space at every width (the old theme shrank it to 9 px on phones), | ||
| and the phone "Navigate" button stands clear of the card below it. */ | ||
| .cluster-section.cluster-section{padding:24px 24px 20px} | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P3: This override is not scoped to cluster pages: discipline field panels also use Prompt for AI agents |
||
| @media(max-width:760px){.cluster-section.cluster-section{padding:20px 16px 16px}} | ||
| .clusters-mobile-toggle.clusters-mobile-toggle{margin:0 0 20px} | ||
| /* Each cluster's sub-clusters, behind its counts. */ | ||
| .clusters-overview__subs{margin:2px 0 0} | ||
| .clusters-overview__subs summary{display:inline-flex;align-items:center;gap:8px;min-height:44px;cursor:pointer;color:var(--link);font-size:16px;list-style:none} | ||
| .clusters-overview__subs summary::-webkit-details-marker{display:none} | ||
| .clusters-overview__subs summary::before{content:"";width:0;height:0;border-left:6px solid currentColor;border-top:5px solid transparent;border-bottom:5px solid transparent;transition:transform .15s} | ||
| .clusters-overview__subs[open] summary::before{transform:rotate(90deg)} | ||
| .clusters-overview__subs summary:hover{color:var(--ink)} | ||
| .clusters-overview__subs ul{margin:0 0 8px;padding:0 0 0 18px;list-style:none;border-left:3px solid var(--c)} | ||
| .clusters-overview__subs li{margin:0;padding:4px 0 4px 12px;font-size:16px;line-height:1.4} | ||
| .clusters-overview__subs a{color:var(--link);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px} | ||
| @media(prefers-reduced-motion:reduce){.clusters-overview__subs summary::before{transition:none}} | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P3: This readability breakpoint uses pixels even though it protects a text-size constraint, so text-only zoom can enlarge labels without switching away from the full diagram. Use an equivalent
embreakpoint so the compact layout responds to text zoom.Prompt for AI agents