Files
zeekayandHanzo Dev d7054fa778 rename(cms): Payload → CMS across all 44 packages (identifiers, slugs, env, i18n, brand)
Complete de-brand of the fork the org owns (unpublished, empty DB — so no external
consumers and no data migration). 1308 files. Applied Payload→CMS / payload→cms /
PAYLOAD→CMS to: type/identifier names (PayloadRequest→CMSRequest, getPayload→getCMS,
BasePayload→BaseCMS, the request property req.payload→req.cms, PayloadComponent→
CMSComponent, usePayloadAPI→useCMSAPI, …); collection/DB slugs (payload-jobs→cms-jobs,
payload-kv, payload-migrations, payload-preferences, payload-locked-documents);
env vars (PAYLOAD_*→CMS_*); i18n key + values (payloadSettings→cmsSettings, 'Payload
Settings'→'CMS Settings' across 44 languages); CSS @layer/classes; comments/docs/UI.

PRESERVED (deliberate — renaming breaks resolution or law):
- MIT LICENSE + 'Copyright (c) 2018-2025 Payload CMS, Inc.' (legal attribution)
- every import/require/export specifier + path literal; on-disk filenames
  (payload.config.ts, payload-types.ts) + the packages/payload dir; @payload-config alias
- package.json "name" fields (already @hanzo/cms*)
- URLs (payloadcms.com); Redux action.payload (a different, unrelated field)

CONSISTENCY VERIFIED repo-wide: req.payload=0, from 'payload'=0, payloadSettings=0
(all now cms*), Redux action.payload intact, license intact. Individual files
transpile clean.

NOT YET VERIFIED: full type-compilation — requires a 44-package monorepo build
(node_modules absent). Green build is the gate before publish; not claimed here.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-12 17:41:01 -07:00
..
2025-03-05 19:14:35 +00:00
2025-03-05 19:14:35 +00:00

Payload Admin Bar

An admin bar for React apps using Payload.

Installation

pnpm i @hanzo/cms-admin-bar

Basic Usage

import { PayloadAdminBar } from '@hanzo/cms-admin-bar'

export const App = () => {
  return <PayloadAdminBar cmsURL="https://cms.website.com" collection="pages" id="12345" />
}

Checks for authentication with Payload CMS by hitting the /me route. If authenticated, renders an admin bar with simple controls to do the following:

  • Navigate to the admin dashboard
  • Navigate to the currently logged-in user's account
  • Edit the current collection
  • Create a new collection of the same type
  • Logout
  • Indicate and exit preview mode

The admin bar ships with very little style and is fully customizable.

Dynamic props

With client-side routing, we need to update the admin bar with a new collection type and document id on each route change. This will depend on your app's specific setup, but here are a some common examples:

NextJS

For NextJS apps using dynamic-routes, use getStaticProps:

export const getStaticProps = async ({ params: { slug } }) => {
  const props = {}

  const pageReq = await fetch(
    `https://cms.website.com/api/pages?where[slug][equals]=${slug}&depth=1`,
  )
  const pageData = await pageReq.json()

  if (pageReq.ok) {
    const { docs } = pageData
    const [doc] = docs

    props = {
      ...doc,
      collection: 'pages',
      collectionLabels: {
        singular: 'page',
        plural: 'pages',
      },
    }
  }

  return props
}

Now your app can forward these props onto the admin bar. Something like this:

import { PayloadAdminBar } from '@hanzo/cms-admin-bar';

export const App = (appProps) => {
  const {
    pageProps: {
      collection,
      collectionLabels,
      id
    }
  } = appProps;

  return (
    <PayloadAdminBar
      {...{
        cmsURL: 'https://cms.website.com',
        collection,
        collectionLabels,
        id
      }}
    />
  )
}

Props

Property Type Required Default Description
cmsURL string true http://localhost:8000 serverURL as defined in your Payload config
adminPath string false /admin routes as defined in your Payload config
apiPath string false /api routes as defined in your Payload config
authCollectionSlug string false 'users' Slug of your auth collection
collectionSlug string true undefined Slug of your collection
collectionLabels { singular?: string, plural?: string } false undefined Labels of your collection
id string true undefined id of the document
logo ReactElement false undefined Custom logo
classNames { logo?: string, user?: string, controls?: string, create?: string, logout?: string, edit?: string, preview?: string } false undefined Custom class names, one for each rendered element
logoProps {[key: string]?: unknown} false undefined Custom props
userProps {[key: string]?: unknown} false undefined Custom props
divProps {[key: string]?: unknown} false undefined Custom props
createProps {[key: string]?: unknown} false undefined Custom props
logoutProps {[key: string]?: unknown} false undefined Custom props
editProps {[key: string]?: unknown} false undefined Custom props
previewProps {[key: string]?: unknown} false undefined Custom props
style CSSProperties false undefined Custom inline style
unstyled boolean false undefined If true, renders no inline style
onAuthChange (user: PayloadMeUser) => void false undefined Fired on each auth change
devMode boolean false undefined If true, fakes authentication (useful when dealing with SameSite cookies)
preview boolean false undefined If true, renders an exit button with your onPreviewExit handler)
onPreviewExit function false undefined Callback for the preview button onClick event)