@zedtech/zedkit-ui

Marketing

alpha

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.

View props table
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.
  1. Install

    Terminal
    pnpm add @zedtech/zedkit-ui
  2. Load 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}";
    
  3. Import and render

    src/app/page.tsxReplace the contents
    import { 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

Simple
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

  1. Create an account

    No card needed.

  2. Create a key

    A staging key takes a minute.

  3. 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
Harbor Studio

Live features for the shop you already run.

© 2026 Harbor Studio
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).

On this page