Service Showcase
ComponentsService Showcase
SectionsNew

Service Showcase

A clear, considered way to explain what you do. Switch between services, capabilities, and the work behind them.

USE IT FORAgency servicesProduct featuresCapabilities
React + CSS

Good ideas. Built together.

Find the clearest expression of who you are, what you do, and why it matters to the people you want to reach.

  • Positioning
  • Audience insight
  • Brand narrative
See the Kin story

Choose a service to see what’s included.

ANTICRAFT / EXAMPLE JOURNAL
Live component. Go ahead, interact.
01

Installation

Run this in your shadcn-configured React project. The component and stylesheet are added together.

TERMINAL
npx shadcn@latest add http://localhost:5173/r/service-showcase.json

This command uses the current site address. For localhost, keep this preview running on the same computer. Files follow your configured components alias.

02

Usage

Import the component and make the details your own.

TypeScript
import { ServiceShowcase } from '@/components/anticraft/ServiceShowcase';

export function Example() {
  return (
    <ServiceShowcase
      title="Good ideas. Built together."
      defaultValue="strategy"
      items={[
        {
          id: 'strategy', title: 'Strategy',
          description: 'A clear position, a useful story, and a shared direction for your next chapter.',
          capabilities: ['Positioning', 'Audience research', 'Brand narrative'],
          media: <img src="/images/strategy.jpg" alt="" />,
          href: '/services/strategy', linkLabel: 'Explore our strategy practice',
        },
        {
          id: 'design', title: 'Digital design',
          description: 'Distinctive websites and products that feel considered at every step.',
          capabilities: ['Website design', 'User experience', 'Design systems'],
          media: <img src="/images/digital-design.jpg" alt="" />,
          href: '/services/design', linkLabel: 'Explore digital design',
        },
        {
          id: 'development', title: 'Development',
          description: 'Fast, accessible websites that your team can keep growing after launch.',
          capabilities: ['Creative development', 'CMS integration', 'Accessibility'],
          media: <img src="/images/development.jpg" alt="" />,
          href: '/services/development', linkLabel: 'Explore development',
        },
      ]}
    />
  );
}
03

Props

PropTypeDefaultDescription
itemsServiceShowcaseItem[]RequiredService records with unique id, title, description, a capabilities string array, and decorative ReactNode media. Add optional href and linkLabel for a separate call to action. An empty array renders nothing.
items[].mediaReactNodeRequiredDecorative service imagery, rendered inert and hidden from assistive technology. Keep essential information in the visible description; do not put links or controls inside media. Supply your own image files for the example paths.
items[].hrefstringundefinedOptional destination for a real service or case study page. Omitting it removes the call to action. Replace example URLs with pages in your project.
items[].linkLabelstring'Explore ' + titleThe visible and accessible text of the optional call to action.
titlestring'How we can help'Visible section heading and accessible name of the service tab list.
defaultValuestringFirst itemThe id of the initial service. If the selected id no longer exists, the first current item is shown.
onValueChange(id: string) => voidundefinedCalled when a visitor selects a different service with a click, tap, or tab-list keyboard shortcut.
classNamestring''Additional classes. Theme with --ac-service-surface, --ac-service-ink, --ac-service-muted, --ac-service-accent, --ac-service-line, and --ac-service-font on this element.
04

Motion & accessibility

Considered by default.

Click or tap a service to replace its description, capabilities, artwork, and optional call to action. The vertical tab list uses a single Tab stop; Up/Down, Home, and End select and focus services. Tab then reaches the active panel and its link. Inactive panels remain hidden and cannot receive focus. Content enters once on selection; reduced motion removes the transition. A container query stacks the tabs and content below 500px, so it works inside a narrow column as well as a full-width section.

Use semantic content and meaningful labels in your composition. Check contrast and keyboard behavior with your own styles and content.

05

Inspiration

Whipsaw’s expertise pages group an offering with a description, capabilities, and related work. That useful content structure informed this original, compact services section. The tab interaction and artwork are an independent Anticraft design.

Visit Whipsaw — Expertise

The component source and demo artwork are original to Anticraft UI. The linked site is the design or content reference.