@@ -63,6 +63,7 @@ const isoDate = date;
6363---
6464
6565<article
66+ id ={ id }
6667 class =" changelog-entry"
6768 data-date ={ isoDate }
6869 data-tags ={ tags .join (' ,' )}
@@ -75,11 +76,15 @@ const isoDate = date;
7576 <div class =" changelog-entry__tags" >
7677 { tags .map ((tag ) => <ChangelogTag type = { tag } />)}
7778 </div >
79+ </div >
80+ <div class =" changelog-entry__heading" >
81+ <slot name =" heading" />
7882 <a href ={ ` #${id } ` } class =" changelog-entry__anchor" aria-label ={ ` Link to ${title } ` } >
79- #
83+ <span class =" changelog-entry__anchor-icon" aria-hidden =" true" >
84+ <svg width =" 16" height =" 16" viewBox =" 0 0 24 24" ><path fill =" currentcolor" d =" m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z" ></path ></svg >
85+ </span >
8086 </a >
8187 </div >
82- <slot name =" heading" />
8388 </header >
8489
8590 <div class =" changelog-entry__content" >
@@ -194,36 +199,64 @@ const isoDate = date;
194199 box-sizing: border-box !important;
195200 }
196201
202+ /* Title row: heading text followed by the hover-reveal chain-link anchor,
203+ matching the heading anchor affordance on every other docs page. */
204+ /* Starlight's heading-anchor technique: the title is inline with trailing
205+ padding that reserves room for the icon, and the anchor is pulled back into
206+ that space with a negative margin. So the icon sits right after the last
207+ word and wraps *with* it — never flush-right on a two-line title, never
208+ orphaned onto its own line. */
209+ .changelog-entry__heading {
210+ margin-bottom: 0.375rem;
211+ }
212+
213+ /* The title <h2> is slotted from the MDX, so it doesn't carry this
214+ component's scoped class — target it with :global or the rule won't apply. */
215+ .changelog-entry__heading > :global(.changelog-entry__title) {
216+ display: inline;
217+ padding-inline-end: 1.55rem;
218+ }
219+
197220 .changelog-entry__anchor {
198- opacity: 0;
199- font-size: 1rem;
200- height: 1.75rem;
221+ /* Hidden until the title is hovered/focused, then the icon pops up. */
201222 display: inline-flex;
202223 align-items: center;
203- justify-content: center;
204- flex-shrink: 0;
205- margin: 0;
206- padding: 0;
224+ margin-inline-start: -1.25rem;
225+ opacity: 0;
207226 color: light-dark(#9ca3af, #6b7280);
208227 text-decoration: none;
209- transition: opacity 0.15s ease, color 0.15s ease, outline-color 0.15s ease;
228+ vertical-align: middle;
229+ user-select: none;
230+ -webkit-user-select: none;
231+ transition: opacity 0.15s ease, color 0.15s ease;
210232 }
211233
212- .changelog-entry:hover .changelog-entry__anchor {
213- opacity: 1;
234+ .changelog-entry__anchor-icon {
235+ display: inline-flex;
236+ line-height: 0;
237+ }
238+
239+ .changelog-entry__anchor-icon > svg {
240+ display: block;
241+ width: 1.25rem;
242+ height: 1.25rem;
214243 }
215244
216- .changelog-entry__anchor:hover,
217- .changelog-entry__anchor:focus,
245+ /* Reveal AND turn accent purple whenever the whole title row is hovered
246+ (not just the icon) or the link is focused, matching other pages. */
247+ .changelog-entry__heading:hover .changelog-entry__anchor,
218248 .changelog-entry__anchor:focus-visible {
219249 opacity: 1;
220250 color: light-dark(#6446fb, #f5ff80);
251+ }
252+
253+ .changelog-entry__anchor:focus-visible {
221254 outline: 2px solid light-dark(#6446fb, #f5ff80);
222255 outline-offset: 2px;
223256 }
224257
225258 .changelog-entry__title {
226- margin: 0 0 0.375rem 0 ;
259+ margin: 0;
227260 font-size: 1.375rem;
228261 font-weight: 600;
229262 line-height: 1.25;
0 commit comments