From 0f2e574c09590edeac6e6e43cdadc69f9aa61ed0 Mon Sep 17 00:00:00 2001 From: Tomasz Cichocinski Date: Thu, 22 Oct 2026 18:27:55 +0200 Subject: [PATCH 1/8] feat: add agent skills banner to utilities Promote github.com/jamdotdev/skills with one banner rendered inside both existing CTA components (JamCallToAction and CallToActionGrid) and below the tool grid on the utilities index. --- components/CallToActionGrid.tsx | 2 ++ components/JamCallToAction.tsx | 3 +++ components/SkillsBanner.tsx | 38 +++++++++++++++++++++++++++++++++ components/utils/jam-cta.ts | 2 ++ pages/utilities/index.tsx | 5 +++++ 5 files changed, 50 insertions(+) create mode 100644 components/SkillsBanner.tsx diff --git a/components/CallToActionGrid.tsx b/components/CallToActionGrid.tsx index e9c13b6d..84f53078 100644 --- a/components/CallToActionGrid.tsx +++ b/components/CallToActionGrid.tsx @@ -1,4 +1,5 @@ import SquareCard from "./SquareCard"; +import SkillsBanner from "./SkillsBanner"; export default function CallToActionGrid() { return ( @@ -15,6 +16,7 @@ export default function CallToActionGrid() { buttonText="Try Jam" href="https://jam.dev?ref=utils" /> + ); } diff --git a/components/JamCallToAction.tsx b/components/JamCallToAction.tsx index b9783073..16f9f587 100644 --- a/components/JamCallToAction.tsx +++ b/components/JamCallToAction.tsx @@ -1,5 +1,6 @@ import { GitHubLogoIcon } from "@radix-ui/react-icons"; import { getBannerCopy, JAM_URL } from "./utils/jam-cta"; +import SkillsBanner from "./SkillsBanner"; interface JamCallToActionProps { // Page slug under /utilities, used to pick the banner copy. @@ -37,6 +38,8 @@ export default function JamCallToAction({ tool }: JamCallToActionProps) { + +

diff --git a/components/SkillsBanner.tsx b/components/SkillsBanner.tsx new file mode 100644 index 00000000..2e3c871b --- /dev/null +++ b/components/SkillsBanner.tsx @@ -0,0 +1,38 @@ +import { GitHubLogoIcon } from "@radix-ui/react-icons"; +import { cn } from "@/lib/utils"; +import { SKILLS_URL } from "./utils/jam-cta"; + +interface SkillsBannerProps { + className?: string; +} + +export default function SkillsBanner({ className }: SkillsBannerProps) { + return ( +

+
+

Agent skills for Jam

+

+ Let your coding agent read Jams and record proof. +

+ + npx skills add jamdotdev/skills + +
+ + + + View on GitHub + +
+ ); +} diff --git a/components/utils/jam-cta.ts b/components/utils/jam-cta.ts index 74dba963..2b5a2c6e 100644 --- a/components/utils/jam-cta.ts +++ b/components/utils/jam-cta.ts @@ -4,6 +4,8 @@ export interface JamBannerCopy { } export const JAM_URL = "https://jam.dev?ref=utils-banner"; +export const SKILLS_URL = + "https://github.com/jamdotdev/skills?ref=utils-banner"; export const defaultBannerCopy: JamBannerCopy = { title: "Fix your next bug faster", diff --git a/pages/utilities/index.tsx b/pages/utilities/index.tsx index 74283a96..b20e2a6e 100644 --- a/pages/utilities/index.tsx +++ b/pages/utilities/index.tsx @@ -4,6 +4,7 @@ import { CMDK } from "@/components/CMDK"; import { tools } from "@/components/utils/tools-list"; import { JamLogo64x64 } from "@/components/JamLogo64x64"; import Meta from "@/components/Meta"; +import SkillsBanner from "@/components/SkillsBanner"; export default function Home() { return ( @@ -39,6 +40,10 @@ export default function Home() { /> ))} + +
+ +
); } From 778eb17a012ac9042337ff5aab2ec4ed29c50b00 Mon Sep 17 00:00:00 2001 From: Tomasz Cichocinski Date: Thu, 22 Oct 2026 21:34:50 +0200 Subject: [PATCH 2/8] feat: redesign skills banner and update copy Dark terminal-style card so the banner stands out from the Jam card. The install command is the primary action: whole row copies on click with press feedback, GitHub becomes a text link. New copy sells the skills roadmap. Command wraps at 375px instead of truncating. --- components/SkillsBanner.tsx | 69 ++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/components/SkillsBanner.tsx b/components/SkillsBanner.tsx index 2e3c871b..8a7b7381 100644 --- a/components/SkillsBanner.tsx +++ b/components/SkillsBanner.tsx @@ -1,38 +1,75 @@ import { GitHubLogoIcon } from "@radix-ui/react-icons"; +import { Check, Copy, Terminal } from "lucide-react"; import { cn } from "@/lib/utils"; +import { useCopyToClipboard } from "./hooks/useCopyToClipboard"; import { SKILLS_URL } from "./utils/jam-cta"; +const INSTALL_COMMAND = "npx skills add jamdotdev/skills"; + interface SkillsBannerProps { className?: string; } export default function SkillsBanner({ className }: SkillsBannerProps) { + const { buttonText, handleCopy } = useCopyToClipboard(); + const copied = buttonText !== "Copy"; + + const githubLink = ( + + + ); + return (
- ); } From 03baf83ea2d79b51a8a1fb62df76f0073f4d0991 Mon Sep 17 00:00:00 2001 From: Tomasz Cichocinski Date: Thu, 22 Oct 2026 21:45:37 +0200 Subject: [PATCH 3/8] feat: light theme and new copy for skills banner Keep the site's light card instead of the inverted dark one. Title 'Teach your coding agent to show its work' ties to the repo tagline. Subtitle lists the four outcomes as verbs and drops the skill count. --- components/SkillsBanner.tsx | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/components/SkillsBanner.tsx b/components/SkillsBanner.tsx index 8a7b7381..2c186db9 100644 --- a/components/SkillsBanner.tsx +++ b/components/SkillsBanner.tsx @@ -19,7 +19,7 @@ export default function SkillsBanner({ className }: SkillsBannerProps) { href={SKILLS_URL} target="_blank" rel="noopener noreferrer" - className="inline-flex shrink-0 items-center gap-1.5 text-sm text-primary-foreground/70 transition-colors hover:text-primary-foreground" + className="inline-flex shrink-0 items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground" >
- +
diff --git a/pages/utilities/json-to-csv.tsx b/pages/utilities/json-to-csv.tsx index 92eb753d..6659b3ba 100644 --- a/pages/utilities/json-to-csv.tsx +++ b/pages/utilities/json-to-csv.tsx @@ -7,7 +7,7 @@ import { Label } from "@/components/ds/LabelComponent"; import Header from "@/components/Header"; import { CMDK } from "@/components/CMDK"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "@/components/Meta"; import { convertJSONtoCSV } from "@/components/utils/json-to-csv.utils"; import JsonToCsvSEO from "@/components/seo/JsonToCsvSEO"; @@ -77,7 +77,7 @@ export default function JSONtoCSV() {
- +
diff --git a/pages/utilities/json-to-tsv.tsx b/pages/utilities/json-to-tsv.tsx index 706cbd37..29931790 100644 --- a/pages/utilities/json-to-tsv.tsx +++ b/pages/utilities/json-to-tsv.tsx @@ -7,7 +7,7 @@ import { Label } from "@/components/ds/LabelComponent"; import Header from "@/components/Header"; import { CMDK } from "@/components/CMDK"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "@/components/Meta"; import { convertJSONtoTSV } from "@/components/utils/json-to-tsv.utils"; import JsonToTsvSEO from "@/components/seo/JsonToTsvSEO"; @@ -77,7 +77,7 @@ export default function JSONtoTSV() {
- +
diff --git a/pages/utilities/json-to-yaml.tsx b/pages/utilities/json-to-yaml.tsx index 7a2e3832..a2d405a8 100644 --- a/pages/utilities/json-to-yaml.tsx +++ b/pages/utilities/json-to-yaml.tsx @@ -8,7 +8,7 @@ import Header from "@/components/Header"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; import yaml from "js-yaml"; import { CMDK } from "@/components/CMDK"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "@/components/Meta"; import JsonToYamlSEO from "@/components/seo/JsonToYaml"; @@ -69,7 +69,7 @@ export default function JSONtoYAML() {
- +
diff --git a/pages/utilities/jsonl-validator.tsx b/pages/utilities/jsonl-validator.tsx index 6118f37a..ff681d74 100644 --- a/pages/utilities/jsonl-validator.tsx +++ b/pages/utilities/jsonl-validator.tsx @@ -1,4 +1,4 @@ -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import { CMDK } from "@/components/CMDK"; import { Button } from "@/components/ds/ButtonComponent"; import { Card } from "@/components/ds/CardComponent"; @@ -344,7 +344,7 @@ export default function JsonlValidator() {
- +
diff --git a/pages/utilities/jwt-parser.tsx b/pages/utilities/jwt-parser.tsx index 7aca7276..e47d3831 100644 --- a/pages/utilities/jwt-parser.tsx +++ b/pages/utilities/jwt-parser.tsx @@ -7,7 +7,7 @@ import { Label } from "@/components/ds/LabelComponent"; import Header from "@/components/Header"; import { CMDK } from "@/components/CMDK"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "@/components/Meta"; import { decodeJWT } from "@/components/utils/jwt-parser.utils"; import GitHubContribution from "@/components/GitHubContribution"; @@ -123,7 +123,7 @@ export default function JWTParser() {
- + ); } diff --git a/pages/utilities/lorem-ipsum-generator.tsx b/pages/utilities/lorem-ipsum-generator.tsx index 70f99234..8eaca624 100644 --- a/pages/utilities/lorem-ipsum-generator.tsx +++ b/pages/utilities/lorem-ipsum-generator.tsx @@ -1,6 +1,6 @@ import { useCallback, useEffect, useState } from "react"; import { generateLoremIpsum } from "@/components/utils/lorem-ipsum-generator"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import { CMDK } from "@/components/CMDK"; import { Button } from "@/components/ds/ButtonComponent"; import { Card } from "@/components/ds/CardComponent"; @@ -138,7 +138,7 @@ export default function LoremIpsumGenerator() { - +
diff --git a/pages/utilities/number-base-changer.tsx b/pages/utilities/number-base-changer.tsx index f5c83008..d5b4f530 100644 --- a/pages/utilities/number-base-changer.tsx +++ b/pages/utilities/number-base-changer.tsx @@ -7,7 +7,7 @@ import { Label } from "@/components/ds/LabelComponent"; import Header from "@/components/Header"; import { CMDK } from "@/components/CMDK"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "@/components/Meta"; import { Combobox } from "@/components/ds/ComboboxComponent"; import NumberBaseChangerSEO from "@/components/seo/NumberBaseChangerSEO"; @@ -105,7 +105,7 @@ export default function NumberBaseChanger() {
- +
diff --git a/pages/utilities/query-params-to-json.tsx b/pages/utilities/query-params-to-json.tsx index cdbff954..b3c617a4 100644 --- a/pages/utilities/query-params-to-json.tsx +++ b/pages/utilities/query-params-to-json.tsx @@ -8,7 +8,7 @@ import Header from "@/components/Header"; import { CMDK } from "@/components/CMDK"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; import QueryParamsToJsonSEO from "@/components/seo/QueryParamsToJsonSEO"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "../../components/Meta"; import { convertQueryParamsToJSON } from "../../components/utils/query-params-to-json.utils"; @@ -73,7 +73,7 @@ export default function QueryParamsToJSON() {
- +
diff --git a/pages/utilities/random-string-generator.tsx b/pages/utilities/random-string-generator.tsx index cf2b512f..dff4aae0 100644 --- a/pages/utilities/random-string-generator.tsx +++ b/pages/utilities/random-string-generator.tsx @@ -8,7 +8,7 @@ import Header from "@/components/Header"; import { Checkbox } from "@/components/ds/CheckboxComponent"; import { CMDK } from "@/components/CMDK"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "@/components/Meta"; import { Input } from "@/components/ds/InputComponent"; import { PasswordBuilder } from "@/components/utils/password-generator.utils"; @@ -203,7 +203,7 @@ export default function PasswordGenerator() {
- +
diff --git a/pages/utilities/regex-tester.tsx b/pages/utilities/regex-tester.tsx index b73a4409..28b5806a 100644 --- a/pages/utilities/regex-tester.tsx +++ b/pages/utilities/regex-tester.tsx @@ -15,7 +15,7 @@ import { getPatternBody, RegexFlags, } from "@/components/utils/regex-tester.utils"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import GitHubContribution from "@/components/GitHubContribution"; import RegexFlagToggle from "@/components/regex/RegexFlagToggle"; import RegexPresetPatterns from "@/components/regex/RegexPresetPatterns"; @@ -296,7 +296,7 @@ export default function RegexTester() {
- + ); } diff --git a/pages/utilities/sql-minifier.tsx b/pages/utilities/sql-minifier.tsx index 5009e392..420f9461 100644 --- a/pages/utilities/sql-minifier.tsx +++ b/pages/utilities/sql-minifier.tsx @@ -7,7 +7,7 @@ import { Label } from "@/components/ds/LabelComponent"; import Header from "@/components/Header"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; import { CMDK } from "@/components/CMDK"; -import CallToActionGrid from "../../components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "@/components/Meta"; import SQLMinifierSEO from "@/components/seo/SQLMinifierSEO"; import { @@ -99,7 +99,7 @@ export default function SQLMinifier() { - +
diff --git a/pages/utilities/tsv-to-json.tsx b/pages/utilities/tsv-to-json.tsx index 6bd635ec..c1f01d64 100644 --- a/pages/utilities/tsv-to-json.tsx +++ b/pages/utilities/tsv-to-json.tsx @@ -8,7 +8,7 @@ import Header from "@/components/Header"; import { Checkbox } from "@/components/ds/CheckboxComponent"; import { CMDK } from "@/components/CMDK"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import TsvToJsonSEO from "@/components/seo/TsvToJsonSEO"; import Meta from "@/components/Meta"; import { convertTSVtoJSON } from "@/components/utils/tsv-to-json.utils"; @@ -258,7 +258,7 @@ Bob\t35\tUK`;
- +
diff --git a/pages/utilities/unserializer.tsx b/pages/utilities/unserializer.tsx index 5558269b..8d541555 100644 --- a/pages/utilities/unserializer.tsx +++ b/pages/utilities/unserializer.tsx @@ -7,7 +7,7 @@ import { Label } from "@/components/ds/LabelComponent"; import Header from "@/components/Header"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; import { CMDK } from "@/components/CMDK"; -import CallToActionGrid from "../../components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import GitHubContribution from "@/components/GitHubContribution"; import UnserializerSEO from "@/components/seo/UnserializerSEO"; import Meta from "@/components/Meta"; @@ -154,7 +154,7 @@ export default function Unserializer() {
- +
diff --git a/pages/utilities/uuid-generator.tsx b/pages/utilities/uuid-generator.tsx index 8688faac..c724582d 100644 --- a/pages/utilities/uuid-generator.tsx +++ b/pages/utilities/uuid-generator.tsx @@ -4,7 +4,7 @@ import { Card } from "@/components/ds/CardComponent"; import { Button } from "@/components/ds/ButtonComponent"; import Header from "@/components/Header"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import Meta from "@/components/Meta"; import { CMDK } from "@/components/CMDK"; import { Input } from "@/components/ds/InputComponent"; @@ -55,7 +55,7 @@ export default function UuidGenerator() {
- + ); } diff --git a/pages/utilities/wcag-color-contrast-checker.tsx b/pages/utilities/wcag-color-contrast-checker.tsx index 0a3f0c3d..9bf58a12 100644 --- a/pages/utilities/wcag-color-contrast-checker.tsx +++ b/pages/utilities/wcag-color-contrast-checker.tsx @@ -7,7 +7,7 @@ import { CMDK } from "@/components/CMDK"; import { Input } from "@/components/ds/InputComponent"; import { ColorPicker } from "@/components/ds/ColorPickerComponent"; import WcagColorContrastCheckerSEO from "@/components/seo/WcagColorContrastCheckerSEO"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import GitHubContribution from "@/components/GitHubContribution"; import Meta from "@/components/Meta"; import { @@ -236,7 +236,7 @@ export default function WcagColorContrastChecker() { - +
diff --git a/pages/utilities/xml-to-json.tsx b/pages/utilities/xml-to-json.tsx index abd301bd..200c8752 100644 --- a/pages/utilities/xml-to-json.tsx +++ b/pages/utilities/xml-to-json.tsx @@ -1,4 +1,4 @@ -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import { CMDK } from "@/components/CMDK"; import { Button } from "@/components/ds/ButtonComponent"; import { Card } from "@/components/ds/CardComponent"; @@ -82,7 +82,7 @@ export default function XMLtoJSON() { - +
diff --git a/pages/utilities/yaml-to-json.tsx b/pages/utilities/yaml-to-json.tsx index 34a180a9..57a0f54e 100644 --- a/pages/utilities/yaml-to-json.tsx +++ b/pages/utilities/yaml-to-json.tsx @@ -8,7 +8,7 @@ import Header from "@/components/Header"; import { useCopyToClipboard } from "@/components/hooks/useCopyToClipboard"; import yaml from "js-yaml"; import { CMDK } from "@/components/CMDK"; -import CallToActionGrid from "@/components/CallToActionGrid"; +import JamCallToAction from "@/components/JamCallToAction"; import YamlToJsonSEO from "@/components/seo/YamlToJsonSEO"; import Meta from "../../components/Meta"; @@ -69,7 +69,7 @@ export default function YAMLtoJSON() {
- +
From f298e937a24819329f95cf430d27ac31238b2823 Mon Sep 17 00:00:00 2001 From: Tomasz Cichocinski Date: Thu, 22 Oct 2026 22:19:31 +0200 Subject: [PATCH 5/8] feat: skills promo as third card in the utilities grid Replace the full-width banner below the index grid with a SkillsCard in slot 3, using the same Card shell as the tool cards. The install command and copy become a shared InstallCommand export. --- components/SkillsBanner.tsx | 70 +++++++++++++++++++++---------------- components/SkillsCard.tsx | 39 +++++++++++++++++++++ pages/utilities/index.tsx | 23 ++++++------ 3 files changed, 90 insertions(+), 42 deletions(-) create mode 100644 components/SkillsCard.tsx diff --git a/components/SkillsBanner.tsx b/components/SkillsBanner.tsx index 2c186db9..b2bb472a 100644 --- a/components/SkillsBanner.tsx +++ b/components/SkillsBanner.tsx @@ -6,14 +6,48 @@ import { SKILLS_URL } from "./utils/jam-cta"; const INSTALL_COMMAND = "npx skills add jamdotdev/skills"; +export const SKILLS_TITLE = "Teach your coding agent to show its work"; +export const SKILLS_DESCRIPTION = + "Open-source Jam skills: record a demo, attach proof to the PR, mark up a screenshot, fix a bug from a recording. More on the way."; + +export function InstallCommand({ className }: { className?: string }) { + const { buttonText, handleCopy } = useCopyToClipboard(); + const copied = buttonText !== "Copy"; + + return ( + + ); +} + interface SkillsBannerProps { className?: string; } export default function SkillsBanner({ className }: SkillsBannerProps) { - const { buttonText, handleCopy } = useCopyToClipboard(); - const copied = buttonText !== "Copy"; - const githubLink = ( + + + + ); +} diff --git a/pages/utilities/index.tsx b/pages/utilities/index.tsx index b20e2a6e..f78dd33d 100644 --- a/pages/utilities/index.tsx +++ b/pages/utilities/index.tsx @@ -4,7 +4,8 @@ import { CMDK } from "@/components/CMDK"; import { tools } from "@/components/utils/tools-list"; import { JamLogo64x64 } from "@/components/JamLogo64x64"; import Meta from "@/components/Meta"; -import SkillsBanner from "@/components/SkillsBanner"; +import SkillsCard from "@/components/SkillsCard"; +import { Fragment } from "react"; export default function Home() { return ( @@ -31,19 +32,17 @@ export default function Home() {
- {tools.map((card) => ( - + {tools.map((card, i) => ( + + {i === 2 && } + + ))}
- -
- -
); } From d711fefb3ffc958b919568e70755c414d453d988 Mon Sep 17 00:00:00 2001 From: Tomasz Cichocinski Date: Fri, 23 Oct 2026 10:52:29 +0200 Subject: [PATCH 6/8] refactor: drop skills promo from the utilities index Keep the skills banner on tool pages only. Removes SkillsCard and the InstallCommand/copy exports it needed. --- components/SkillsBanner.tsx | 70 ++++++++++++++++--------------------- components/SkillsCard.tsx | 39 --------------------- pages/utilities/index.tsx | 18 ++++------ 3 files changed, 37 insertions(+), 90 deletions(-) delete mode 100644 components/SkillsCard.tsx diff --git a/components/SkillsBanner.tsx b/components/SkillsBanner.tsx index b2bb472a..2c186db9 100644 --- a/components/SkillsBanner.tsx +++ b/components/SkillsBanner.tsx @@ -6,48 +6,14 @@ import { SKILLS_URL } from "./utils/jam-cta"; const INSTALL_COMMAND = "npx skills add jamdotdev/skills"; -export const SKILLS_TITLE = "Teach your coding agent to show its work"; -export const SKILLS_DESCRIPTION = - "Open-source Jam skills: record a demo, attach proof to the PR, mark up a screenshot, fix a bug from a recording. More on the way."; - -export function InstallCommand({ className }: { className?: string }) { - const { buttonText, handleCopy } = useCopyToClipboard(); - const copied = buttonText !== "Copy"; - - return ( - - ); -} - interface SkillsBannerProps { className?: string; } export default function SkillsBanner({ className }: SkillsBannerProps) { + const { buttonText, handleCopy } = useCopyToClipboard(); + const copied = buttonText !== "Copy"; + const githubLink = ( - - - - ); -} diff --git a/pages/utilities/index.tsx b/pages/utilities/index.tsx index f78dd33d..74283a96 100644 --- a/pages/utilities/index.tsx +++ b/pages/utilities/index.tsx @@ -4,8 +4,6 @@ import { CMDK } from "@/components/CMDK"; import { tools } from "@/components/utils/tools-list"; import { JamLogo64x64 } from "@/components/JamLogo64x64"; import Meta from "@/components/Meta"; -import SkillsCard from "@/components/SkillsCard"; -import { Fragment } from "react"; export default function Home() { return ( @@ -32,15 +30,13 @@ export default function Home() {
- {tools.map((card, i) => ( - - {i === 2 && } - - + {tools.map((card) => ( + ))}
From b7c9f65b6ce9e2d14691f22184896bb7fcb5012c Mon Sep 17 00:00:00 2001 From: Tomasz Cichocinski Date: Fri, 23 Oct 2026 10:57:14 +0200 Subject: [PATCH 7/8] fix: align skills chip with Jam logo, show Copied next to copy icon Chip is now 40px with an 8px gap so both cards' text starts at the same x. The $ prompt no longer swaps for a checkmark; the copy icon slot shows a check and "Copied" instead, on all viewports. --- components/SkillsBanner.tsx | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/components/SkillsBanner.tsx b/components/SkillsBanner.tsx index 2c186db9..1ed31ec1 100644 --- a/components/SkillsBanner.tsx +++ b/components/SkillsBanner.tsx @@ -28,9 +28,9 @@ export default function SkillsBanner({ className }: SkillsBannerProps) { return (
-
- -