Skip to content
Agentmart
Submit a tool

screen-design-rules

Visual and usability rules for drawing any application screen — density, colour tokens, disabled and read-only states, field widths, status marks, keyboard…

Skill by IgorAIvanov

IndexedMIT★ 1
Write a review

Chalk Labs

Need help deploying screen-design-rules?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/igoraivanov-screen-design-rules

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Visual and usability rules for drawing any application screen — density, colour tokens, disabled and read-only states, field widths, status marks, keyboard expectations. Use whenever writing or reviewing the markup of a form, list, picker or report, and before adding any colour, size or spacing of your own.

Use cases: documents, design, writing

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/screen-design-rules

What's inside

Skill name
screen-design-rules
Description
Visual and usability rules for drawing any application screen — density, colour tokens, disabled and read-only states, field widths, status marks, keyboard expectations. Use whenever writing or reviewing the markup of a form, list, picker or report, and before adding any colour, size or spacing of your own.
License
MIT
Metadata
audience: app
Instructions
193 lines in SKILL.md · view on GitHub

Files (2)

  • SKILL.md
  • icons.md

SKILL.md (first lines)

# Screen design rules

This is an **accounting desktop application**, not a marketing site or a mobile app.
Most general UI advice you have seen was written for a different product and will make
these screens worse. The rules below are the ones that hold here.

Everything visual comes from the framework theme. Your job on a screen is to compose,
not to invent colours, sizes or spacing.

## Density is deliberate — do not "modernize" it

Controls are 24px tall, table cells have 3px vertical padding, the base font is 14px,
radii are 2px.

A bookkeeper looks at 30 invoice lines at once. Advice like "row height 40–52px" or
"touch targets 44×44" comes from mobile and from admin panels with twenty rows; applying
it here cuts the visible data in half. Do not raise heights, do not add shadows, do not
round corners.

## Never write a colour of your own

| Need | Use | Never |
|---|---|---|
| secondary text (codes, dates, hints, empty states, counters) | `class="text-muted"` | `text-base-content/40…70` |
| surfaces, borders | theme vars (`--app-surface`, `--app-border-field`) | hex literals |
| status colours | `--color-success` / `-warning` / `-error` | your own red/green |

`text-base-content/50` renders at **2.8:1** against white, `/40` at **2.2:1** — roughly
half the AA floor of 4.5:1. This is not a nitpick: it is the difference between a hint
being readable on a laptop screen in an office and not. `.text-muted` is a token picked
to pass on white, on the zebra stripe and on the hover row.

If you catch yourself writing a hex value in a screen, the answer is almost always a
theme variable that already exists.

## Status must never be colour alone

Dimming an inactive row is fine as *reinforcement*, but the row must also say what it is
— a strikethrough, a badge, a column. A user with low vision, a bad monitor, or a
printout gets nothing from colour.

If you do dim, dim to a value that is still readable (`#6b7280` on white is 4.8:1).
`#9ca3af` is 2.5:1 and on a selected row 1.9:1 — that is invisible, not subtle.

## Field width is information

A field as wide as the form tells the user nothing. A code field that holds 6 characters
should be about 6 characters wide. Use the `class` option of `renderField`:

```ts
${this.renderField(t("common.code"), html`<input class="input input-bordered w-full" …/>`,
  { class: "w-32", field: "code" })}
```

Two or three short fields on one row, grouped by meaning, read far better than a single
column of full-width boxes. A single column is advice from signup forms optimised for
conversion — it does not apply to master data.

## Disabled and read-only are different problems

- A **disabled button**: its label may go grey (3:1 is enough) — nobody needs to read it.
- A **disabled field**: the value must stay readable (**≥ 4.5:1**). In view mode the whole
  form is disabled and the user came precisely to *read* it. The theme handles this
  already — do not override it with your own `opacity`.

Never use `opacity` to show a disabled state on anything containing text.

## Numbers

- numeric cells get `tabular-nums` so digits line up in a column;
- **account codes do not** — they are identifiers, not quantities. In report screens this
  is also the contract that decides whether a cell lands in Excel as a number or as text.

## Labels, errors, footers

- field labels only via `BaseUI.renderField(...)` — it produces a real `<label>`, so
  clicking the caption focuses the field;
- **`form-control` and `label-text` do not exist in daisyUI 5** — they are v4 markup and
  they break label alignment. If you see them in an example, the example is stale;
- the field error floats out of layout flow on purpose: showing and hiding it must not
  make the form jump. Do not wrap it in your own layout;
## The form frame comes from the base

Do not compose an edit form's `render()` by hand. Return `this.renderForm(fields)`: it
places the command panel, the banner and the fields, and it makes the field area — not
the whole tab — the scrolling region.

```ts
protected override formWidth = "max-w-md";   // default is max-w-3xl

protected override renderActions() {         // your buttons, left, after Save
  return html`<button class="btn btn-sm btn-secondary" @click=${this.post}>…</button>`;
}
protected override renderAuxActions() {      // after a separator: print, export
  return html`<button class="btn btn-sm btn-outline" @click=${this.printPdf}>…</button>`;
}

override render() {
  return this.renderForm(html` …fields… `);
}
```

**The command panel is at the top, not in a footer.** In a document with a 30-line
tabular section a footer scrolls out of view — "Save" disappears exactly where the form
is longest. Lists and reports already keep their toolbar on top.

**There is no "Close" button.** The tab closes by the × on its label and by Esc, both
with the unsaved-changes dialog. A panel left with nothing in it is not rendered at all.

The two groups are parted by a thin **separator**, not by a full-width spacer. A spacer
throws the second group against the right edge of the screen, and on a wide monitor the
print button has to be hunted for — a large emptiness does not read as grouping, it reads
as "nothing here".

**Put an icon on every toolbar button.** Take it from `@client/ui-kit/icons.ts` — one
glyph set for the whole ui-kit — and never size it with Tailwind classes; the glyphs live
in shadow DOM and must not depend on whether `h-4` was generated elsewhere.

**The full list of glyphs is [icons.md](icons.md), next to this file** — every key with

From IgorAIvanov/altera03, MIT.

More from IgorAIvanov/altera03

Signals

Stars
1
Forks
0
Open issues
0
Last commit (this folder)
Sep 18, 2026 (1 month ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from IgorAIvanov

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get screen-design-rules running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying screen-design-rules?

CallGet help
Cite this page

screen-design-rules skill. Agent Mart. https://agentmart.dev/skills/igoraivanov-screen-design-rules (last updated 2026-10-24)