Agent skill

Zard

by zard-ui in zard-ui/zardui

Manages zard/ui components and projects — adding, composing, styling, and debugging Angular UI built on TailwindCSS v4.

MITAuto-check passedDevelopment

Install Zard

skills CLI
$ npx skills add zard-ui/zardui --skill zard -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install zard-ui/zardui zard --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/zard-ui/zardui.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/zard .claude/skills/zard && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
zard
GitHub stars
1.2k
Token cost
~4.6k tokens
SKILL.md length
1,604 words
Files
11
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

Manages zard/ui components and projects — adding, composing, styling, and debugging Angular UI built on TailwindCSS v4.

  • Works in 5 steps: Install before importing. A component… → Compose what exists. A settings page is… → Variants before classes.… → …
  • Add a zard component
  • SKILL.md covers Current Project Context, Key Fields, Principles and Critical Rules, plus 5 more sections
  • Calls npx, npm and pnpm; reaches zardui.com

What it does

Zard is an agent skill from zard-ui/zardui. Manages zard/ui components and projects — adding, composing, styling, and debugging Angular UI built on TailwindCSS v4. Provides project context, component source, and the real API instead of a remembered one. Applies when working with zard/ui, zard-cli, the zard registry, or any project with a components.json that declares a zard projectType. Also triggers for "zard-cli init", "add a zard component", or "set up zard/ui in an Nx workspace".

Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files (for example `cli.md`, `customization.md` and `mcp.md`).

It sits in Development, covering Monorepo tooling. It works with Angular, Nx and Tailwind CSS. The repository describes itself as: A collection of beautiful and accessible components for Angular based in Shadcn/ui and Ng-zorro. Fully open source and free ❤️. The licence is MIT.

When your agent uses it

  • Add a zard component
  • Set up zard/ui in an Nx workspace

Example prompts

  • “zard-cli init”
  • “add a zard component”
  • “set up zard/ui in an Nx workspace”
  • “/zard”

Requirements

  • Node.js
  • Pre-approved tools (allowed-tools): Bash(npx zard-cli *), Bash(pnpm dlx zard-cli *), Bash(bunx --bun zard-cli *)

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. Install before importing. A component only exists once zard-cli add has written it. Check the components directory first; do not import…
  2. Compose what exists. A settings page is Card + Field + Input + Button. A dashboard is Sidebar + Card + Chart + Table. Reach for custom…
  3. Variants before classes. zType="outline", zSize="sm" — not a class that re-styles the component into the same thing.
  4. Semantic tokens only. bg-primary, text-muted-foreground. Never bg-blue-500, never a dark: colour override.
  5. The library's own conventions apply to the code you write. Standalone, OnPush, input(), z-prefixed inputs. See rules/angular.md.

What it can do on your machine

Read from SKILL.md and the folder at commit 4340909. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash(npx zard-cli *)
    • Bash(pnpm dlx zard-cli *)
    • Bash(bunx --bun zard-cli *)

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npx
    • npm
    • pnpm
    • yarn
    • bunx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • zardui.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Zard loads about 4.6k tokens when it runs. Until then it costs about 112 tokens; SKILL.md has 1,604 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~112
When it runs · the whole SKILL.md, loaded when a task matches
~4.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from zard-ui/zardui at commit 4340909, republished under its MIT licence (© zard-ui). 1,604 words, ~4,643 tokens.

Download SKILL.mdSave it as .claude/skills/zard/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.
name
zard
description
Manages zard/ui components and projects — adding, composing, styling, and debugging Angular UI built on TailwindCSS v4. Provides project context, component source, and the real API instead of a remembered one. Applies when working with zard/ui, zard-cli, the zard registry, or any project with a components.json that declares a zard projectType. Also triggers for "zard-cli init", "add a zard component", or "set up zard/ui in an Nx workspace".
allowed-tools
Bash(npx zard-cli *), Bash(pnpm dlx zard-cli *), Bash(bunx --bun zard-cli *)
user-invocable
false

zard/ui

An Angular component library. Components are installed as source code into the user's project by the CLI — there is no runtime package to import from, and no component to npm install.

IMPORTANT: Run every CLI command with the project's own package runner: npx zard-cli, pnpm dlx zard-cli, yarn zard-cli, or bunx zard-cli — pick the one matching packageManager in components.json. The examples below use npx zard-cli; substitute the right runner.

Current Project Context

Read components.json at the project root before doing anything else. It is written by zard-cli init and is the whole configuration — there is no zard-cli info command to call.

json
{
  "$schema": "https://zardui.com/schema.json",
  "style": "css",
  "icons": "lucide",
  "rtl": false,
  "projectType": "angular",
  "appConfigFile": "src/app/app.config.ts",
  "packageManager": "npm",
  "tailwind": { "css": "src/styles.css", "baseColor": "neutral" },
  "baseUrl": "src/app",
  "aliases": {
    "components": "@/shared/components",
    "utils": "@/shared/utils",
    "core": "@/shared/core",
    "services": "@/shared/services",
    "blocks": "@/shared/blocks"
  }
}

No components.json means the project has not been initialised — run init rather than writing component files by hand.

A components.json that exists but whose installed component source uses a renamed selector or an old file layout (core/css/tailwind.css instead of core/css/zard.css, a bare ::-webkit-scrollbar block in the global CSS, a button-group "divider" instead of "separator", a toast folder instead of sonner) belongs to a project predating the current registry. That is a job for the migration skill, which names every renamed selector precisely — not for guessing which shape is current.

For anything the file does not answer — what exists, what a component's API is, what it depends on — read the registry or use the MCP server. Never reconstruct a component API from memory.

Key Fields

  • aliases.components → the import prefix for every component. Use the actual value; never hardcode @/shared/components. The prefix can be anything (@app/..., ~/...) — it is mapped in tsconfig.json, or tsconfig.base.json in an Nx workspace.
  • aliases.blocks → the import prefix a block (add dashboard-01, add login-01) is written under. Absent from a components.json written before blocks were installable — a re-run of init adds it.
  • baseUrl → the source root the aliases resolve against. Components are written under it.
  • projectType → angular, angular-library, nx, nx-library, or analog. Decides which tsconfig holds the aliases, where Tailwind is configured, and whether an app.config.ts exists at all. See cli.md.
  • appConfigFile → where provideZard() is registered. Empty in a library — there the consuming app registers it.
  • tailwind.css → the global CSS file holding the theme tokens. Always edit this file; never create a second one.
  • tailwind.baseColor → the theme preset: neutral, stone, zinc, gray, or slate.
  • icons → the icon family the components are written with (lucide today). Decides the @ng-icons/* package and the symbol names. See rules/icons.md.
  • rtl → declares layout direction intent. It does not change what gets installed.
  • packageManager → use it for every dependency install (pnpm add date-fns, not npm install date-fns) and to pick the CLI runner.
  • registryUrl → optional. Present when the project installs from a registry other than https://zardui.com/r. See registry.md.

Principles

  1. Install before importing. A component only exists once zard-cli add has written it. Check the components directory first; do not import what is not there.
  2. Compose what exists. A settings page is Card + Field + Input + Button. A dashboard is Sidebar + Card + Chart + Table. Reach for custom markup only when nothing covers it.
  3. Variants before classes. zType="outline", zSize="sm" — not a class that re-styles the component into the same thing.
  4. Semantic tokens only. bg-primary, text-muted-foreground. Never bg-blue-500, never a dark: colour override.
  5. The library's own conventions apply to the code you write. Standalone, OnPush, input(), z-prefixed inputs. See rules/angular.md.

Critical Rules

Always enforced. Each links to a file with Incorrect/Correct pairs.

Angular API → rules/angular.md
  • Standalone with imports, ChangeDetectionStrategy.OnPush, ViewEncapsulation.None. No NgModules, no Default change detection.
  • Signal inputs: input(), model(), output(). No @Input() / @Output() decorators in new code.
  • Selectors are z-<name> and/or [z-<name>]. Some components are element-only, some are attributes on a native tag (input[z-input], button[z-button]). Use the one the component declares.
  • Composite components import their Zard<Name>Imports array, not the individual classes one by one.
  • Never edit generated output. apps/web/src/generated/** and public/r/*.json are build artefacts.
Styling → rules/styling.md
  • Semantic tokens, never raw colours. bg-primary not bg-blue-600.
  • class is for layout, not for restyling. It is merged last and wins — which is exactly why it should not be used to override the component's own colours.
  • mergeClasses(), not string concatenation. It is twMerge(clsx(...)); plain interpolation loses the conflict resolution.
  • No space-x-* / space-y-*. Use flex with gap-*.
  • size-* when width and height match. size-4, not w-4 h-4.
  • No dark: colour overrides. The tokens already switch.
  • Tailwind v4 only. There is no tailwind.config.js; the theme lives in CSS.
  • scroll-fade needs an overflow container; shimmer is text-only. Both are pure-CSS utilities from the core item.
Composition → rules/composition.md
  • Use the full composition. z-card wants z-card-header / z-card-title / z-card-content / z-card-footer, not everything dumped into content.
  • Items belong to their group. z-select-item inside z-select-group.
  • Dialogs, sheets, alert dialogs and drawers have two forms. Compose z-dialog / z-sheet / z-alert-dialog / z-drawer in the template with [(zVisible)] and the header/title/description/footer children, or open the same panel from code through ZardDialogService / ZardSheetService / ZardAlertDialogService / ZardDrawerService. Never toggle them with a hand-written open flag or @if.
  • Toasts go through ZardSonnerService — show, success, error, promise.
  • Use the component instead of styled markup. z-separator not <hr>, z-skeleton not an animate-pulse div, z-badge not a styled span, z-empty not a hand-built empty state.
Forms → rules/forms.md
  • All three Angular form APIs are supported: Signal Forms, Reactive Forms, Template-driven. Follow whichever the project already uses.
  • Form layout is z-field-group + z-field, never a div with space-y-*.
  • Validation state is data-invalid on the field and aria-invalid on the control.
  • Errors render in z-field-error, not a loose paragraph.
Typeset → rules/typeset.md
  • Rendered markdown gets a typeset container, never a class per tag. zard-cli add typeset installs the stylesheet.
  • Six variables govern it, three of which are the rhythm: --typeset-size, --typeset-leading, --typeset-flow.
  • not-typeset on any component embedded in prose. It brings its own sizing.
  • typeset-scroll around a wide table, instead of a hand-rolled overflow wrapper.
  • Utilities beat it with no !important — every element selector sits inside :where().
Show full SKILL.md (656 more words)Show less
Icons → rules/icons.md
  • Icons come from @ng-icons/<family> and are registered with provideIcons in viewProviders. An unregistered name renders nothing, silently.
  • The family comes from icons in components.json. Do not assume lucide.
  • No sizing classes on icons inside components. The component sizes them.

Key Patterns

angular-ts
// Host classes: computed + mergeClasses. Never assembled in the template.
protected readonly classes = computed(() => mergeClasses(cardVariants(), this.class()));

// Variants, not classes.
<button z-button zType="outline" zSize="sm">Save</button>   // correct
<button z-button class="border bg-transparent px-2.5">Save</button>  // wrong

// Spacing: gap-*, not space-y-*.
<div class="flex flex-col gap-4">   // correct
<div class="space-y-4">             // wrong

// Field: data-invalid on the field, aria-invalid on the control.
<div z-field [attr.data-invalid]="invalid || null">
  <label z-field-label for="email">Email</label>
  <input z-input id="email" [attr.aria-invalid]="invalid || null" />
  <z-field-error>Enter a valid email.</z-field-error>
</div>

// Loading button: the zLoading input, not a hand-rolled spinner.
<button z-button [zLoading]="saving()" [zDisabled]="saving()">Save</button>

Component Selection

NeedUse
Actionz-button (zType: default, destructive, outline, secondary, ghost, link)
Grouped actionsz-button-group, z-toggle, z-toggle-group
Text inputinput[z-input], textarea[z-textarea], z-input-group, z-input-otp
Choicez-select, z-combobox, z-radio-group, z-checkbox, z-switch, z-slider
Datesz-calendar, z-date-picker
Form structurez-field-group, z-field, z-field-label, z-field-description, z-field-error
Data displayz-table, z-card, z-item, z-badge, z-avatar, z-chart
Navigationz-navigation-menu, z-breadcrumb, z-tab-group, z-pagination
Nested / tree listz-collapsible, nested — a folder tree is a z-collapsible inside a z-collapsible-content, not a dedicated tree component. See the composition rule.
Layoutz-sidebar (with z-sidebar-provider and z-sidebar-inset), z-separator, z-resizable, z-accordion, z-carousel
Overlaysz-dialog (modal), z-drawer (bottom/side sheet), z-sheet (side panel), z-alert-dialog (confirmation) — each also from code via its service —, z-popover, z-tooltip, z-dropdown
Command palettez-command
FeedbackZardSonnerService (toast), z-alert, z-progress, z-skeleton, z-spinner
Empty statesz-empty
Chat / messagesz-bubble, z-bubble-group, z-bubble-content, z-bubble-reactions
Keyboard hintsz-kbd
Rendered prosetypeset + a preset class (a stylesheet, not a component) — see rules/typeset.md

Names are the registry names — the same string zard-cli add takes. Two names from an older registry, tree and layout, no longer exist: layout's header/content/sidebar shape was replaced by the sidebar component above; tree has no replacement component — nest z-collapsible instead, per the row above. A project installed before the removal may still have them; see the migration skill.

Non-component items

Not every registry name is a component you pick for a UI need — five install infrastructure instead:

ItemWhat it isInstalled
coreShared directives, the overlay stack, provideZard(), and the theme CSSAutomatic — init installs it; no component declares it as a dependency
utilsmergeClasses() (twMerge(clsx(...)))Automatic — same as core
utilitiesThe scroll-fade / shimmer CSS utilities — see rules/styling.mdzard-cli add utilities, or installed with a component that uses them
dark-modeThe dark-mode service and the toggle script injected into index.htmlOpt-in — zard-cli add dark-mode (interactive; needs an index.html path)
typesetThe prose stylesheet for rendered markdownOpt-in — zard-cli add typeset — see rules/typeset.md

Workflow

  1. Read components.json. No file → run init. Note aliases, baseUrl, icons, packageManager, projectType.
  2. Check what is installed. List the components directory resolved from aliases.components. Do not re-add what is there, and do not import what is not.
  3. Find what exists. The registry index at <registryUrl>/registry.json lists every item; the MCP server exposes the same thing as list-components and search-components.
  4. Read the real API before writing code. get-component-docs (MCP) or https://zardui.com/docs/components/<name>.md. Every component page is published as Markdown. Guessing at inputs is the single most common failure mode.
  5. Install. npx zard-cli add <name> — dependencies of the component, both npm packages and other registry items, are resolved and installed with it.
  6. Review what was written. Read the added files. Check the imports resolve under the project's real alias, and that the icon family matches icons.
  7. Never hand-fetch component source from GitHub. Use the CLI or the registry; the registry is what the project actually installs from.

Quick Reference

bash
# Initialise a project (full-screen wizard).
npx zard-cli init
npx zard-cli init --type nx --project web        # answer the wizard up front
npx zard-cli init --yes                          # accept the defaults; required without a TTY

# Add components.
npx zard-cli add button card dialog
npx zard-cli add                                 # pick from the list
npx zard-cli add --all
npx zard-cli add button --overwrite              # replace local changes — ask first
npx zard-cli add button --path src/app/ui        # a directory other than the configured one

# Diagnose.
npx zard-cli add button --debug
npx zard-cli --version

There is no search, view, diff, info, or build command — those are shadcn's. See cli.md for the full flag reference.

Detailed References

  • cli.md — init and add, every flag, the five project types, headless behaviour
  • registry.md — the index, item and icon-catalog formats, JSON Schemas, pointing at your own registry
  • mcp.md — the nine MCP tools, how to connect, ZARD_REGISTRY_URL / ZARD_DOCS_URL
  • customization.md — theme tokens, CVA variants, mergeClasses, extending a component
  • rules/angular.md — standalone, input(), OnPush, ViewEncapsulation.None, selectors
  • rules/styling.md — Tailwind v4, semantic tokens, mergeClasses, variants before raw classes, the scroll-fade / shimmer utilities
  • rules/composition.md — composing with what exists before inventing markup
  • rules/forms.md — Signal Forms, Reactive Forms, Template-driven
  • rules/icons.md — ng-icons, provideIcons, the catalog, the configurable family
  • rules/typeset.md — styling rendered markdown with one container class instead of one per tag
  • ../zard-migration/SKILL.md — a separate skill for a project whose installed component source predates the current registry (renamed selectors, --overwrite, the core/utils/utilities split)

© zard-ui, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 10 other files in skills/zard of zard-ui/zardui.

  • SKILL.md
  • cli.md
  • customization.md
  • mcp.md
  • registry.md
  • rules/angular.md
  • rules/composition.md
  • rules/forms.md
  • rules/icons.md
  • rules/styling.md
  • rules/typeset.md

Open the folder on GitHubat commit 4340909

Compare with similar skills

Zard next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Zard compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Zard this skillzard-ui/zardui1.2k—~4.6kAutomated safety check: PassMIT
Update Cnw Templatesnrwl/nx29k—~1.9kAutomated safety check: NotesMIT
Cometchat Angular V5 Patternscometchat/cometchat-skills132—~1.6kAutomated safety check: PassMIT
Angular ToolingKilo-Org/kilo-marketplace190—~1.7kAutomated safety check: PassMIT
Nx Importnrwl/nx29k6 repos~3.5kAutomated safety check: PassMIT
Nx Workspacenomcopter/react-mosaic4.8k8 repos~1.9kAutomated safety check: PassCustom licence

Similar skills

  • Update the CNW (create-nx-workspace) template repos (nrwl/empty-template, nrwl/react-template, etc.) to a target nx version via nx migrate, verify each repo, and open a PR per repo.

    29k GitHub stars~1.9k tokensUpdated today
    DevelopmentAuto-check: notes
  • Cometchat Angular V5 Patterns

    cometchat/cometchat-skills

    Angular project-shape glue for CometChat — Angular CLI vs Nx, standalone vs NgModule, environment file wiring, SSR/Angular Universal, lazy routes, and RxJS/signals state patterns.

    132 GitHub stars~1.6k tokensUpdated 4 days ago
    DevelopmentAuto-check passed
  • Angular Tooling

    Kilo-Org/kilo-marketplace

    Use Angular CLI and development tools effectively in Angular v20+ projects.

    190 GitHub stars~1.7k tokensUpdated 11 days ago
    DevelopmentAuto-check passed
  • Nx Import

    nrwl/nx

    Import, merge, or combine repositories into an Nx workspace using nx import.

    29k GitHub starsUsed in 6 repos~3.5k tokens
    DevelopmentAuto-check passed
  • Nx Workspace

    nomcopter/react-mosaic

    Explore and understand Nx workspaces. An agent skill from nomcopter/react-mosaic.

    4.8k GitHub starsUsed in 8 repos~1.9k tokens
    DevelopmentAuto-check passed
  • Nx Run Tasks

    nomcopter/react-mosaic

    Helps with running tasks in an Nx workspace. An agent skill from nomcopter/react-mosaic.

    4.8k GitHub starsUsed in 8 repos~613 tokens
    DevelopmentAuto-check passed

More from zard-ui/zardui

  • Zard Migration

    zard-ui/zardui

    Migrates a project whose installed zard/ui component source predates the current registry — components are copied into the project by zard-cli, so nothing upgrades them on its own.

    1.2k GitHub stars~2.2k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Zard

What does Zard do?

Manages zard/ui components and projects — adding, composing, styling, and debugging Angular UI built on TailwindCSS v4. Zard is an agent skill from zard-ui/zardui. Manages zard/ui components and projects — adding, composing, styling, and debugging Angular UI built on TailwindCSS v4.

When should I use Zard?

Zard fits situations like: add a zard component; set up zard/ui in an Nx workspace.

How do I install Zard in Claude Code?

Run `npx skills add zard-ui/zardui --skill zard -a claude-code`. Or copy the skill folder (skills/zard in zard-ui/zardui) into .claude/skills/zard in your project. Claude Code loads it when a task matches its description.

How do I install Zard in Codex?

Run `npx skills add zard-ui/zardui --skill zard -a codex`. Or copy the skill folder (skills/zard in zard-ui/zardui) into .agents/skills/zard in your project. Codex loads it when a task matches its description.

Can I use Zard in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add zard-ui/zardui --skill zard -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/zard, .gemini/skills/zard, .github/skills/zard and .opencode/skills/zard in your project.

What does Zard need to run?

Going by SKILL.md and its folder, Zard needs the command-line tools its instructions call (npx, npm, pnpm, yarn and bunx). Our summary lists: Node.js. Its frontmatter pre-approves these tools: Bash(npx zard-cli *), Bash(pnpm dlx zard-cli *), Bash(bunx --bun zard-cli *).

Does Zard access the network?

SKILL.md names 1 domain. In commands or code: zardui.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Zard safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Zard use?

Zard is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Zard use?

About 4.6k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Zard?

Skills that share tags, products or a category with Zard: Update Cnw Templates (nrwl/nx, 29k stars), Cometchat Angular V5 Patterns (cometchat/cometchat-skills, 132 stars), Angular Tooling (Kilo-Org/kilo-marketplace, 190 stars) and Nx Import (nrwl/nx, 29k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Zard?

zard-ui (a GitHub organization) maintains it in zard-ui/zardui, which has 1,174 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 9, 2026.

Source: zard-ui/zardui on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.