Marketing
Presentational page sections that follow the active identity, so a public site and the console share one look. Strings are props.
Live stock
Counts follow every sale, without a refresh.
Personal offers
Each visitor sees the offer that fits them.
Fast launches
Try a new page next to the shop you already run.
- Who is it for?
- Teams building a public landing page or pricing page on the same tokens and identities as their app.
- When should I use it?
- For a signed-out home, pricing or product page built from the kit's tokens (frosted under the glass identity, plain cards elsewhere).
- When should I pick something else?
- For app screens — use `Card`, `PageHeader` and `Section` instead; for full-page bands use `Section` with `bleed`.
Install or copy
This ships on npm only; there is no copy-source brick for it.
- You get
- Every component from one import, with the theme tokens included. Updates arrive with your package manager.
- You need
- React 19 and Tailwind CSS 4, for example a Next.js app created with the Tailwind option.
Install
Terminal pnpm add @zedtech/zedkit-uiLoad the styles
Tailwind does not scan node_modules, so the @source line points it at the kit's class names. The path is relative to this file.
src/app/globals.cssReplace the contents@import "tailwindcss"; @import "@zedtech/zedkit-ui/styles.css"; @source "../../node_modules/@zedtech/zedkit-ui/src/**/*.{ts,tsx}";Import and render
src/app/page.tsxReplace the contentsimport { GlassSurface } from "@zedtech/zedkit-ui/marketing"; export default function Page() { return ( <main className="p-8"> <GlassSurface as="section" aria-label="Plans" tone="raised" padding="lg"> Plans </GlassSurface>; </main> ); }
Package version 1.6.2.
Usage and states
import { GlassSurface } from "@zedtech/zedkit-ui/marketing";
<GlassSurface as="section" aria-label="Plans" tone="raised" padding="lg">
Plans
</GlassSurface>;Hero
Harbor Studio
Keep your shop. Add live updates.
Stock, orders and offers change on the page without a refresh.
import { Hero } from "@zedtech/zedkit-ui/marketing";
<Hero
title="Keep your shop. Add live updates."
description="Stock, orders and offers update without a refresh."
actions={<a href="/signup">Create an account</a>}
/>;Closing call to action
Try it on a staging key
Sign up, create a key and see your first event in minutes.
import { CtaBand } from "@zedtech/zedkit-ui/marketing";
<CtaBand
title="Try it on a staging key"
actions={<a href="/signup">Create an account</a>}
/>;Feature grid
Built for the shop you already run
Add live features next to it, without replatforming.
Live stock
Counts follow every sale.
Personal offers
Each visitor sees what fits.
Shopping assistant
Answers from your catalog.
import { FeatureGrid } from "@zedtech/zedkit-ui/marketing";
<FeatureGrid
title="Built for the shop you already run"
features={[
{ title: "Live stock", description: "Counts follow every sale." },
{ title: "Personal offers", description: "Each visitor sees what fits." },
]}
/>;Steps
Live in three steps
Create an account
No card needed.
Create a key
A staging key takes a minute.
See your first event
It shows up in the console.
import { HowItWorks } from "@zedtech/zedkit-ui/marketing";
<HowItWorks
title="Live in three steps"
steps={[{ title: "Create an account" }, { title: "Create a key" }, { title: "See your first event" }]}
/>;Header and footer
Menu
import { MarketingFooter, MarketingHeader } from "@zedtech/zedkit-ui/marketing";
<MarketingHeader
brand={<a href="/">Harbor</a>}
links={[<a key="docs" href="/docs">Docs</a>]}
actions={<a href="/signup">Create an account</a>}
/>;
<MarketingFooter brand="Harbor" columns={[{ title: "Product", links: [<a key="docs" href="/docs">Docs</a>] }]} />;Language switch
import { MediaSection } from "@zedtech/zedkit-ui/marketing";
<MediaSection
title="An assistant that knows your catalog"
points={["Reads your products", "Never changes an order"]}
media={<img src="/assistant.png" alt="The assistant answering a question about stock" />}
/>;Use case
An assistant that knows your catalog
Visitors ask in plain words and get answers from your products.
- Reads your products and stock
- Never changes an order
Demo goes here
import { LogoBand } from "@zedtech/zedkit-ui/marketing";
<LogoBand
title="Works with the shops you know"
logos={[{ name: "Harbor Studio", logo: <img src="/harbor.svg" alt="" /> }]}
/>;Logo band
Works with the shops you know
- Harbor
- North
- Linen
import { Testimonials } from "@zedtech/zedkit-ui/marketing";
<Testimonials
title="What shops say"
items={[{ quote: "We launched a new offer in a day.", name: "Ada Lovelace", role: "Head of e-commerce" }]}
/>;Testimonials
What shops say
We launched a new offer in a day.
Ada LovelaceHead of e-commerce, Harbor Studio Stock on the page is always right.
Grace HopperFounder, North Shop
import { Pricing } from "@zedtech/zedkit-ui/marketing";
<Pricing
title="Simple pricing"
plans={[
{ name: "Starter", price: "€0", period: "per month", features: ["1 staging key"], action: <a href="/signup">Start free</a> },
{ name: "Growth", price: "€29", period: "per month", features: ["5 keys"], highlighted: true, badge: "Most popular" },
]}
/>;Pricing
Simple pricing
Start on a staging key. Pay when you go live.
Starter
€0per month
- 1 staging key
- Community support
Growth
Most popular€29per month
- 5 keys
- Email support
import { Faq } from "@zedtech/zedkit-ui/marketing";
<Faq
title="Questions"
items={[{ question: "Do I need to change my shop?", answer: "No. It runs next to it." }]}
/>;Questions
Questions
Do I need to change my shop?
No. It runs next to the shop you already have.
How long does a key take?
About a minute on staging.
import { LocaleSwitch } from "@zedtech/zedkit-ui/marketing";
<LocaleSwitch
current="en"
locales={[
{ code: "en", label: "English", href: "/en" },
{ code: "fr", label: "Français", href: "/fr" },
]}
/>;Wraps: class-variance-authority
Props
Prop
Type
Show inherited HTML attributes
Standard attributes from the underlying element. See MDN.
Prop
Type
Accessibility
Hero and CtaBand are section regions named by their own heading (Hero renders the page h1; pass headingLevel={2} when the page already has one); calls to action are links or buttons you pass in, full width on phones. FeatureGrid and HowItWorks are regions named by a level-2 title with level-3 item titles; feature icons are decorative (aria-hidden), steps are an ordered list whose numbers are added for you. MarketingHeader is a banner with a named main navigation; below md its links and actions open from a native details disclosure (a 44px summary labelled by menu). MarketingFooter gives each link column its own labelled navigation. MediaSection is a region named by its level-2 title: text first in reading order, the framed media after it (reverse only changes the visual side from lg); pass alt text or a caption with the media. LogoBand reads each company name instead of its logo (the logo is aria-hidden). Testimonials renders each quote as a figure with a figcaption; quotation marks come from the browser for the page lang. Only pass quotes you may publish. Pricing lists plans as a list of surfaces: each name is a level-3 heading, features are a list, and the highlighted plan carries a visible badge (never colour alone). Faq uses native details/summary: keyboard and screen readers work without script, and browser find-in-page opens matches; add FAQPage structured data with @zedtech/zedkit-seo if the page should carry it. LocaleSwitch is a named navigation whose items carry lang, with aria-current on the active language. Surfaces render a plain element (div, section, article or li); pass aria-label or a heading inside when it is a landmark. Text sits on the card colour, so contrast follows the identity tokens; under prefers-reduced-transparency the glass identity turns surfaces near-solid.
Troubleshooting
Menu, navigation and language labels stay English — wrap the tree in `ZedkitUiProvider` with `zedkitUiMessagesFr` (or your own bundle). Router links reload the page — pass your router's link elements in `links`, they are rendered as given. Surfaces look flat — the identity in use is not `glass`; set `data-identity="glass"` on `<html>`. Classes missing — the `@source` line must scan the kit's `src/**` (the marketing folder is included).