mirror of
https://github.com/nexu-io/open-design.git
synced 2026-05-31 19:04:39 +07:00
* feat(skills): open-design-landing rename, kami skills, landing OG - Rename editorial-collage skills to open-design-landing and -deck; refresh examples and compose script layout - Add kami-deck and kami-landing skills with HTML examples - Landing page: og.astro, index wiring, and style tweaks; package.json bump - Web i18n: German and Russian copy for renamed and new skills - Daemon test: update skill-asset-rewrite expectations for new paths - Design systems: README and atelier-zero doc touch-ups - Cross-skill SKILL.md reference updates Co-authored-by: Cursor <cursoragent@cursor.com> * docs(landing-page): document version-slot invariant and deprecation timeline Address P3 review notes on PR #428: - Note the `data-github-version` wrapper invariant (version string only) near the canonical URL block in `app/page.tsx`. - Expand the `formatVersion` helper comment in `app/pages/index.astro` with concrete `release.name` / `tag_name` example shapes for each branch of the regex fallback. - Tighten the `EditorialCollageDeckInputs` deprecation in `skills/open-design-landing-deck/schema.ts` to a specific removal version (v0.4.0) and add a "Migrating from editorial-collage-deck" section to the skill README. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * docs(landing-page, skills): clarify version slot script and rename migrations - Describe GitHub version slots as driven by the inline enhancement script, not React hydration. - Add editorial-collage → open-design-landing migration notes; fix README link copy (Astro static landing app). - Extend deck README migration table with shared asset path renames. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(daemon): alias deprecated editorial-collage skill ids The PR renames the editorial-collage / editorial-collage-deck skills to open-design-landing / open-design-landing-deck, but the daemon persists exact skill_id strings on projects and resolves them via listSkills().find((s) => s.id === storedId). After the rename, any project saved against an old id silently composes without the intended skill prompt because the listing no longer exposes that id. Add a SKILL_ID_ALIASES map in skills.ts plus a findSkillById() helper that rewrites deprecated ids to their current canonical form, then route every server-side lookup (skill detail, example HTML, asset proxy, system-prompt composer) through it. Cover the alias map, the resolver, and end-to-end resolution against a temp skills directory with a regression test. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * fix(kami-deck): route host od:slide messages through local go() The host bridge classifies kami-deck as class-driven because go() toggles .slide.active, but the visible slide is moved by deck.style.transform which the bridge cannot drive. Listen for od:slide messages and dispatch them through the local go() so toolbar next/prev and initialSlideIndex restore actually shift the deck. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * fix(kami-deck): sync deck transform with host-driven .active changes The previous fix added a local od:slide listener but the host bridge in apps/web/src/runtime/srcdoc.ts also listens for the same message and calls setActive() (toggles .slide.active) without driving the deck transform. Both listeners fired, the bridge re-read the just-toggled active class, and overshot by one — and the bridge's restoreInitialSlide path could move .active without a message at all, leaving the deck on the original transform. Stop the bridge from double-handling by calling stopImmediatePropagation in the local listener (registered first because the bridge script is appended to </body>), and add a MutationObserver that pulls the deck transform onto whichever slide currently carries .active so the bridge's direct setActive calls (notably the initial-slide restore) move the deck too. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * fix(i18n): align French content with renamed/new skills PR #434 (French localization) merged into main with French copy for the old editorial-collage / editorial-collage-deck skill ids; this branch renamed those to open-design-landing / open-design-landing-deck and added kami-deck and kami-landing. Update content.fr.ts to track the rename and add French copy for the new kami skills so the LOCALIZED_CONTENT_IDS coverage test passes once main is merged. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * fix(open-design-landing-deck): sync deck transform with host-driven .active changes Apply the same fix that landed in skills/kami-deck/example.html (commits96b255b,8cbca30) to the open-design-landing-deck composer runtime: the host bridge classifies this deck as class-driven because go() toggles .slide.active, but the visible slide is moved by deck.style.transform which the bridge can't drive. Add an od:slide message listener that calls stopImmediatePropagation() and routes nav through the local go(), plus a MutationObserver that pulls the deck transform onto whichever slide carries .active so the bridge's direct setActive calls (notably restoreInitialSlide) move the deck too. Regenerates example.html via scripts/compose.ts; the regeneration also picks up upstream nav-cta and brand-meta CSS additions in the sister open-design-landing styles.css that the example had drifted from. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * docs(open-design-landing): align deploy story with Astro landing app - Update SKILL contract: apps/landing-page is Astro static; clarify nextjs-app output_format as a historical enum label and <out>/nextjs as a legacy folder name. - Replace optional-deploy section with fork + pnpm --filter landing-page build. - Fix styles.css header and regenerate landing + deck example.html so inlined comments match. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(deck-runtime): bypass interaction lock for host/observer slide sync The slide deck runtimes for kami-deck and open-design-landing-deck gate go() behind a 700ms `lock` so wheel/key/touch input bursts can't overshoot the transform transition. But applying the same gate to the host bridge's od:slide messages and the MutationObserver watching `.slide.active` creates a startup race: go(0) at the end of init sets lock=true, and any host-driven `.active` change inside that window (notably restoreInitialSlide) fires the observer, which calls go(i), which exits at the lock guard — leaving the visible deck on slide 1 while the host counter advances to N. Split the actual state update into an unthrottled `applySlide(n)` helper that updates transform, `.active`, dot nav, and the progress bar. Keep `lock` only on the user-input path through `go()`. Route the message listener, the MutationObserver, and the initial render through `applySlide` directly so host-driven sync always reaches the deck transform regardless of the throttle state. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) --------- Co-authored-by: Cursor <cursoragent@cursor.com>
3.8 KiB
3.8 KiB
| name | description | triggers | od | ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dating-web | A consumer-feeling dating / matchmaking dashboard — left rail navigation, ticker bar of community signals, headline KPIs, a 30-day mutual-matches bar chart, and a match-rate trend block. Editorial typography, restrained accent. Use when the brief asks for a "dating site", "matchmaking", "community dashboard", "social network dashboard", or any consumer product where the data is the story. |
|
|
Dating Web Skill
Produce a single-screen consumer dashboard that feels like a Sunday-paper dating column rendered as software. Editorial type, single restrained accent, lots of negative space, no swipe deck or hookup tropes.
Workflow
- Read the active DESIGN.md (injected above). Lean into a serif display token for the metric numerals — these screens live or die on numerals.
- Pick a brand voice — wry, observational, slightly literary. Generate real, specific copy. Examples: "the people who'd text back within a day", "manageable. two are now friends.", "your single greatest compatibility asset."
- Layout, in order:
- Top ticker — single-row horizontal strip across the top in a sans-serif eyebrow style: tagline left, "NEXT TIER AT 2,080 MUTUALS" right, both in mono caps with letter-spacing. Thin rule below.
- Left rail — 220–260px sidebar. Brand wordmark in serif italic at top. User card (avatar / handle / ratio / tier). Three groups of nav: "TODAY" (specimen, inbox, queue, notifications), "YOU" (your stats, mutuals & communities, blocked, settings), "ARCHIVE" (past issues, expired matches). Active item gets accent text + accent dot.
- Main content:
- KPI grid — 3 columns × 3 rows (or 9 cells). Each cell: small caps mono label, an oversized serif numeral (use accent or muted green for positive, muted red for caution), one-line italic footnote. Plausible specifics — "1,842 ↑ 41 this wk · healthy growth.", "14% above median for your cohort.", "4 / exes in your circle · manageable. two are now friends."
- Bar chart panel — "mutuals — last 30 days". Tall thin black bars, last two days highlighted in accent. Caption above with "↑ TRENDING UP · +3 CLOSE MUTUALS THIS MONTH · TWO VIA THE SAME OFFSITE" in mono.
- Trend panel — "match rate — last 12 weeks". One line of body copy below ("STEADY CLIMB FROM 8% → 14%. ATTRIBUTABLE TO ONE COMMUNITY JOIN…"). Footer rule.
- Write a single HTML document:
<!doctype html>through</html>, CSS inline.- Background creamy off-white, body serif, mono labels everywhere.
- Use
font-feature-settings: 'tnum'on the metric numerals. - SVG bar chart with ~30 bars, varied heights.
data-od-idon ticker, sidebar, kpi grid, chart, trend.
- Self-check:
- Reads as restrained, editorial, slightly funny — not horny.
- Single accent token used in 3–4 places max (one KPI, two highlight bars, one nav active state).
- No swipe deck, no hearts, no fire emoji.
Output contract
Emit between <artifact> tags:
<artifact identifier="dating-slug" type="text/html" title="Dating Dashboard — Title">
<!doctype html>
<html>...</html>
</artifact>
One sentence before the artifact, nothing after.