From 40f77982b698b0ca1d6af10d41595880894154e6 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Tue, 6 Oct 2026 02:51:09 +1100 Subject: [PATCH 1/2] feat(trending): use the /skills shell with a range sidebar Harlan asked for the trending board to run full width like /skills, with the week, month, and all time switch in a left sidebar and no right aside. The sidebar carries the range links, the weekly CTA, and the skilld install on wide screens. Narrow screens keep the range row above the board and the CTA after the fifth row. Rows now switch on their own width, so the posts sit beside the Skill only when both fit, and the carousel shows two posts where it has room. "Earlier on this board" stays under the board. It lists Skills that left the ranking, not earlier weeks, and it is the crawl path to every Skill the trending sitemap lists. --- DESIGN.md | 1 + .../app/components/TrendingBoardItem.vue | 135 ++-- .../app/components/TrendingPostCarousel.vue | 22 +- .../app/components/TrendingWeeklyCta.vue | 65 +- .../marketing/app/pages/skills/trending.vue | 604 ++++++++++-------- shared/trending-range.ts | 15 +- 6 files changed, 481 insertions(+), 361 deletions(-) diff --git a/DESIGN.md b/DESIGN.md index 2633144a..6698a7f9 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -458,3 +458,4 @@ These are editorial sets, not necessarily database collections yet. If a set has - **The lockup dot is an OG card's one rose element**: the 4px rose top bar, the rose quote rails and the rose avatar ring went stone. On the Splash card, the braille field radiates from the lockup's dot, so the texture spends no second rose. Confirmed 2026-10-06. - **The braille spark replaces the trending flame**: seven braille bars for seven days of mentions, today in rose. The emoji exception for Trending is retired. The spark keeps the sourced mention count beside it, which the flame never carried. Confirmed 2026-10-06. - **Run and install read as different materials**: run is a dashed border with a hollow dot, because nothing stays; install is a solid border with a filled dot, because files land. Run is preselected. Confirmed 2026-10-06. +- **Trending shares the /skills shell**: `/skills/trending` uses the full-width layout from `/skills`. Its heading replaces `CompactPageHeader` and lines up with the results column. A sticky 14rem sidebar holds the range links, then the weekly CTA and the skilld install. Nothing sits right of the board, so the board takes every column the sidebar leaves. Rows switch on their own width, and the post carousel shows two cards where it has room. On narrow screens the ranges are a compact row above the board, and the CTA stays after the fifth row. Harlan asked for this on 2026-10-06. It supersedes the 2026-10-01 call that dropped the 9/3 sidebar for taking a quarter of the board's width: that sidebar sat right of a 64rem board, and this one sits left of a board that runs the full page width. diff --git a/layers/marketing/app/components/TrendingBoardItem.vue b/layers/marketing/app/components/TrendingBoardItem.vue index b15e7918..ca13d8ed 100644 --- a/layers/marketing/app/components/TrendingBoardItem.vue +++ b/layers/marketing/app/components/TrendingBoardItem.vue @@ -43,73 +43,84 @@ const mentions = computed(() => { diff --git a/shared/trending-range.ts b/shared/trending-range.ts index faef26bc..2b267e8f 100644 --- a/shared/trending-range.ts +++ b/shared/trending-range.ts @@ -43,11 +43,11 @@ const SITE_ORIGIN = 'https://skilld.dev' /** * The category noun, held on one line. * - * The space is U+00A0. `.compact-page-header__title` caps at 15ch and sets - * `text-wrap: balance`, which balances line lengths without regard for where - * a phrase ends: it broke "Trending agent / skills, August 2026" across the - * noun itself. The non-breaking space moves the break to the comma. Measured - * against the rendered heading, not assumed. + * The space is U+00A0. The heading sets `text-wrap: balance`, which balances + * line lengths without regard for where a phrase ends: at phone width it broke + * "Trending agent / skills, August 2026" across the noun itself. The + * non-breaking space moves the break to the comma. Measured against the + * rendered heading, not assumed. */ export const SKILLS_NOUN = 'agent\u00A0skills' @@ -55,6 +55,8 @@ export interface TrendingRangeMeta { readonly id: TrendingRange /** Switcher label. Short verb-free noun, per the UI chrome register. */ readonly label: string + /** The line under the label in the sidebar: what the range covers. */ + readonly hint: string /** * Hours of history the feed endpoint is asked for, or null for `all`, which * reads a different endpoint and has no window at all. @@ -90,6 +92,7 @@ export const TRENDING_RANGES: readonly TrendingRangeMeta[] = [ { id: 'week', label: 'Week', + hint: 'Last 7 days', windowHours: 24 * 7, windowDays: 7, path: '/skills/trending?range=week', @@ -101,6 +104,7 @@ export const TRENDING_RANGES: readonly TrendingRangeMeta[] = [ { id: 'month', label: 'Month', + hint: 'Last 30 days', windowHours: 24 * 30, windowDays: 30, path: '/skills/trending', @@ -116,6 +120,7 @@ export const TRENDING_RANGES: readonly TrendingRangeMeta[] = [ // noun is now "Agent Skill", matching the heading and the rest of the site. id: 'all', label: 'All time', + hint: 'By GitHub stars', windowHours: null, windowDays: null, path: '/skills/trending?range=all', From 4d1e65a186d0eb2243d933c435144053e3760715 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Tue, 6 Oct 2026 02:51:55 +1100 Subject: [PATCH 2/2] style(trending): indent the reason comment inside the row wrapper --- layers/marketing/app/components/TrendingBoardItem.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/layers/marketing/app/components/TrendingBoardItem.vue b/layers/marketing/app/components/TrendingBoardItem.vue index ca13d8ed..d4c55fcf 100644 --- a/layers/marketing/app/components/TrendingBoardItem.vue +++ b/layers/marketing/app/components/TrendingBoardItem.vue @@ -76,10 +76,10 @@ const mentions = computed(() => { Updated {{ row.reason.updated }} + The two reasons with no post say why the row is here in words, since + nothing beside them does. A surge has only its stars; filler has to + say it is filler, or a popular repository passes for a trending one. + --> {{ `Star surge: +${row.reason.gain.toLocaleString()} stars in a day` }}