Token导航 LogoToken导航

Agent Skill · 研究检索

webapp-gui-design(Web 应用 GUI 设计)

用于辅助界面设计、视觉规范、排版、配色、布局和交互体验优化。它适合让 Agent 根据产品场景整理页面结构、生成 UI 方案、检查视觉一致性或改进组件层级。使用时需要结合现有品牌、设计系统和用户任务,不应只堆装饰元素;涉及真实页面改动时,应通过截图或浏览器预览检查文本溢出、对齐和响应式表现。

webapp-gui-design 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为执行命令;许可证信息还不明确,第三方扫描已通过,按安装量在研究检索类的 73,675 个 Skill 里排第 51,536。

总安装 582周安装 24GitHub Stars 11下载 190核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:webapp-gui-design(Web 应用 GUI 设计)
来源仓库:https://github.com/peterbamuhigire/skills-web-dev
仓库路径:skills/webapp-gui-design
安装命令:
npx skills add https://github.com/peterbamuhigire/skills-web-dev --skill webapp-gui-design
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/peterbamuhigire/skills-web-dev --skill webapp-gui-design

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

辅助界面设计、视觉规范和交互体验优化,适合生成 UI 方案或改进组件层级。可结合品牌规范和设计系统,提升页面结构与布局合理性。通过 GitHub 仓库安装,适用于主流 AI 宿主环境。涉及真实页面改动时,应通过截图或预览验证文本溢出和对齐效果。

webapp-gui-design 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/webapp-gui-design

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/peterbamuhigire/skills-web-dev --skill webapp-…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要执行命令,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

webapp-gui-design 怎么安装?

在终端执行 npx skills add https://github.com/peterbamuhigire/skills-web-dev --skill webapp-gui-design。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

webapp-gui-design 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

webapp-gui-design 需要什么权限?

权限级别是执行命令。安装流程涉及命令执行,可能通过 npx skills add https://github.com/peterbamuhigire/skills-web-dev --skill webapp-gui-design 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

webapp-gui-design 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

webapp-gui-design 用的人多吗?

公开数据是累计安装 582 次,近一周安装 24 次,下载 190 次,GitHub 11 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

webapp-gui-design 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 需要执行命令,装到常用环境前要先评估影响面。
  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 不能接受 Skill 在你机器上执行命令的人。
  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
webapp-gui-design

Web 应用 GUI 设计 · 本页

58211执行命令未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Web App GUI Design

Acknowledgement: Shared by Peter Bamuhigire, techguypeter.com, +256 784 464178.

Use When

  • Building or reviewing a SaaS web UI on React/Next.js/TypeScript/Tailwind
  • Standardising app shell, navigation, dashboards, or data-table patterns across products
  • Working on the Bootstrap 5 + Tabler + PHP seeder stack — load sections/01-overview.md first

Do Not Use When

  • Pure landing or marketing pages — use frontend-design for editorial layouts
  • Mobile-native screens — use jetpack-compose-ui or swiftui-design
  • Low-level Tailwind syntax questions — use tailwind-css

Required Inputs

The target surface (dashboard, CRUD table, form, settings), the auth/tenant model, and the data model for at least one screen. For the seeder stack, the seeder-page.php template path.

Workflow

  1. Place the screen in the app shell (sidebar + topbar + content area).
  2. Pick the layout primitive (dashboard grid, table, form, detail-with-tabs).
  3. Wire data with React Query; never call fetch inside components.
  4. Attach loading + error + empty states *before* connecting real data.
  5. Check consistency against existing screens and primitives before adding a new pattern.
  6. Extend shared primitives/components before creating a bespoke screen-only pattern.
  7. Run the a11y + responsive sweep (§15 checklist) before merge.

Quality Standards

  • Every data screen has a loading, empty, error, and success state.
  • Every form uses React Hook Form + Zod with a single FormField primitive.
  • Every interactive widget is keyboard-operable (Tab, Enter, Escape, Arrow).
  • Shared patterns must resolve through documented tokens and components, not one-off screen styling.
  • Colour contrast ≥ 4.5:1 for body text, 3:1 for ≥18pt or bold text.
  • Buttons use the correct element: <button> for actions, <a href> for navigation.
  • Every decision point has one clear primary action; secondary and tertiary actions must not compete with it.
  • Every button ships with enabled, hover, focus, pressed, disabled, and loading states.
  • Button labels describe the outcome ("Save changes", "Delete project"), not a vague mechanism ("Submit", "OK").
  • Destructive actions use a dedicated danger variant and explicit confirmation or undo when the action is high impact.
  • Touch targets are at least 44x44 CSS pixels, including icon-only buttons.

Anti-Patterns

Spinners on the whole page after initial load; per-route custom chrome; forms with unvalidated submit handlers; empty states that say only "No data"; modals that trap focus incorrectly; buttons used as links; generic CTA copy; loading buttons that remove the action label.

Outputs

App shell component, route-level layout files, reusable primitives (DataTable, FormField, Dialog, EmptyState, StatusPill), Tailwind theme tokens, a11y checklist report.

Evidence Produced

CategoryArtifactFormatExample
UX qualityScreen layout + state matrixMarkdown doc covering per-screen layout, states, and component inventorydocs/ui/screens/orders-list.md
UX qualityAccessibility + responsive sweepMarkdown doc covering a11y findings and responsive behaviour across breakpointsdocs/ui/a11y-audit-2026-04-16.md
CorrectnessUI shell + primitives registerMarkdown doc listing layout, data-table, form-field, and dialog primitives used per screendocs/ui/primitives-register.md

References

  • Companion skills: react-development, nextjs-app-router, tailwind-css, responsive-design, form-ux-design, frontend-performance, ux-principles-101.
  • Use references/interface-consistency.md when a new module risks drifting from the established UI language.
  • Free: Shadcn/ui (ui.shadcn.com), TanStack Table (tanstack.com/table), Atomic Design (atomicdesign.bradfrost.com), React Hook Form (react-hook-form.com), Zod (zod.dev).
  • For the Bootstrap/Tabler/PHP seeder stack, load sections/01-overview.md and onwards.

Overview

This skill prescribes the component architecture and interaction patterns for a modern SaaS web UI. The house stack is Next.js App Router + React 19 + TypeScript + Tailwind with Shadcn/ui primitives and TanStack Query/Table/Form where appropriate. Every section below is a reusable primitive or a layout pattern; build once, compose everywhere.

Cardinal rule: every data surface has four states — *loading, empty, error, success* — wired up *before* real data arrives. Screens without all four leak into production as broken pages.


1. SaaS Application Shell

Three regions: sidebar (primary nav), topbar (tenant switcher, search, user menu), content. The shell is a route group layout.

// app/(app)/layout.tsx
import { Sidebar } from '@/components/shell/Sidebar';
import { Topbar } from '@/components/shell/Topbar';
export default function AppLayout({ children }: { children: React.ReactNode }) {
  return (
    <div className="grid min-h-screen grid-cols-[auto_1fr] bg-slate-50 dark:bg-slate-950">
      <Sidebar />
      <div className="flex min-w-0 flex-col">
        <Topbar />
        <main className="flex-1 overflow-x-hidden p-6">{children}</main>
      </div>
    </div>
  );
}

The sidebar controls its own width with data-collapsed state persisted to localStorage. Never reach into the shell from a page — pages only fill main.


2. Navigation Patterns

Sidebar: collapsible, per-section groups, active-route highlight, hover-expand on collapsed state. Mobile: off-canvas drawer behind a hamburger; closes on route change.

<Link
  href={item.href}
  aria-current={active ? 'page' : undefined}
  className={cn(
    'flex items-center gap-3 rounded-md px-3 py-2 text-sm',
    'hover:bg-slate-100 dark:hover:bg-slate-800',
    active && 'bg-slate-200 font-medium dark:bg-slate-700',
  )}
>
  <item.icon className="h-4 w-4 shrink-0" /> <span className="truncate">{item.label}</span>
</Link>

Breadcrumbs render from the matched route segments — never hand-coded per page. Use usePathname() + a routeTitles map.


3. Dashboard Layout

12-column grid on lg:, stacking on sm:. Hero KPI strip (3–4 cards), chart area (8 cols), activity feed (4 cols), recent items table full-width below.

<div className="grid grid-cols-1 gap-4 lg:grid-cols-12">
  <KpiCard label="MRR" value="$42.3k" trend="+8.2%" className="lg:col-span-3" />
  <KpiCard label="Active users" value="1,284" trend="+3.1%" className="lg:col-span-3" />
  <KpiCard label="Churn" value="1.9%" trend="-0.4%" className="lg:col-span-3" />
  <KpiCard label="NRR" value="112%" trend="+2%" className="lg:col-span-3" />
  <RevenueChart  className="lg:col-span-8" />
  <ActivityFeed  className="lg:col-span-4" />
  <RecentOrders  className="lg:col-span-12" />
</div>

KPI cards show loading as shimmer blocks of the same height — never collapse vertical rhythm.


4. Data Table Architecture (TanStack Table)

One DataTable<T> primitive. Column definitions live in the feature folder. Server-side pagination, sorting, filtering — client-side only when the dataset is bounded (<500 rows).

const columns: ColumnDef<Order>[] = [
  { accessorKey: 'number', header: 'Order' },
  { accessorKey: 'customer', header: 'Customer' },
  { accessorKey: 'total', header: 'Total',
    cell: ({ row }) => formatCurrency(row.original.total, row.original.currency) },
  { id: 'actions', cell: ({ row }) => <RowActions order={row.original} /> },
];

const table = useReactTable({
  data, columns,
  pageCount, state: { pagination, sorting, columnFilters },
  manualPagination: true, manualSorting: true, manualFiltering: true,
  onPaginationChange: setPagination, onSortingChange: setSorting,
  getCoreRowModel: getCoreRowModel(),
});

Row actions open a dropdown *anchored to the row*, never a global menu. Use stickyHeader on tables taller than a viewport.


5. Form Architecture (React Hook Form + Zod)

Every form is a Zod schema + RHF hook + FormField primitives. Submit handlers are async and return a typed result — never throw into the void.

const schema = z.object({
  name: z.string().min(2, 'Too short').max(60),
  email: z.string().email(),
  role: z.enum(['admin', 'editor', 'viewer']),
});
type Values = z.infer<typeof schema>;

export function InviteUserForm({ onSuccess }: { onSuccess: () => void }) {
  const form = useForm<Values>({ resolver: zodResolver(schema) });
  const mutation = useMutation({ mutationFn: inviteUser });
  return (
    <form onSubmit={form.handleSubmit(async (v) => {
      await mutation.mutateAsync(v);
      onSuccess();
    })} className="space-y-4">
      <FormField control={form.control} name="name" label="Full name" />
      <FormField control={form.control} name="email" label="Email" type="email" />
      <FormSelect control={form.control} name="role" label="Role"
        options={[['admin','Admin'],['editor','Editor'],['viewer','Viewer']]} />
      <Button type="submit" disabled={mutation.isPending}>
        {mutation.isPending ? 'Sending…' : 'Send invite'}
      </Button>
    </form>
  );
}

FormField owns the label, error, description, and the input. Load form-ux-design for field-level patterns across web + mobile.


6. Modal & Drawer Patterns

Modals for focused edits; slide-over drawers for "view-with-actions" where context behind matters. Never more than one stacked modal. Destructive actions always go through ConfirmDialog with a typed confirm label.

<ConfirmDialog
  open={open} onOpenChange={setOpen}
  title="Delete workspace" description="This cannot be undone."
  confirmLabel="Delete" destructive
  onConfirm={() => deleteWorkspace(id)}
/>

Dialog content is always in a Radix Dialog — focus trap and escape-to-close are not negotiable.


7. Loading States

Skeleton screens for initial route loads; spinners only for button-level pending states. Use Suspense boundaries around the content area so route transitions paint the shell immediately.

<Suspense fallback={<DashboardSkeleton />}>
  <DashboardContent />
</Suspense>

Optimistic updates: React Query onMutate sets the new value; onError rolls back; onSettled invalidates.


8. Error Boundaries

Every route has an error boundary. Global handler sends to Sentry; the UI offers "Try again" and a support channel link.

// app/(app)/orders/error.tsx
'use client';
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
  useEffect(() => { Sentry.captureException(error); }, [error]);
  return (
    <EmptyState
      icon={AlertTriangle}
      title="Something went wrong"
      description={error.message}
      primary={{ label: 'Try again', onClick: reset }}
      secondary={{ label: 'Contact support', href: '/support' }}
    />
  );
}

Never show a raw stack in production. Log the digest to give support a lookup handle.


9. Toast Notifications

Sonner for SaaS — one per result, stacked top-right. Success toasts auto-dismiss in 4 s; error toasts require dismissal.

toast.success('Invite sent', { description: values.email });
toast.error('Failed to save', { description: err.message, duration: Infinity });
const t = toast.loading('Uploading…');
upload().then(() => toast.success('Uploaded', { id: t })).catch(() => toast.error('Failed', { id: t }));

Never use toast for navigation-required errors — route to an error page or a banner instead.


10. Authentication Flow UI

Login, register, forgot-password, reset-password, 2FA. Single-column, narrow (max-w-sm), centred, with a subtle brand header. Auth pages never render the shell.

// app/(auth)/login/page.tsx
export default function Login() {
  return (
    <div className="mx-auto mt-24 max-w-sm space-y-6">
      <BrandMark />
      <h1 className="text-2xl font-semibold">Sign in</h1>
      <LoginForm />
      <p className="text-sm text-slate-500">
        New here? <Link className="underline" href="/register">Create an account</Link>
      </p>
    </div>
  );
}

Post-login redirect: honour ?redirect= if same-origin; fall back to /. 2FA input is a 6-digit <OTPInput> — no free-form text field.


11. Multi-Tenant Switcher

Tenants identify by slug and appear in the URL: /[tenant]/orders. The TenantSwitcher lives top-left in the topbar, persists the last-chosen tenant, and shows a quick-filter for power users with many tenants.

<Combobox
  value={current.slug}
  onChange={(slug) => router.push(`/${slug}${restOfPath}`)}
  options={tenants.map(t => ({ value: t.slug, label: t.name, meta: t.plan }))}
  placeholder="Switch workspace"
/>

Tenant-scoped API requests derive the tenant from context; never from a client-provided header that the user could forge. Load multi-tenant-saas-architecture for the backend isolation model.


12. Dark Mode

Class strategy (dark:) with a tri-state switch (system / light / dark). Persist to localStorage; set on <html> before first paint to avoid flicker.

// app/layout.tsx — inline script before hydration
<script dangerouslySetInnerHTML={{ __html: `
  try {
    const t = localStorage.getItem('theme');
    if (t === 'dark' || (!t && matchMedia('(prefers-color-scheme: dark)').matches))
      document.documentElement.classList.add('dark');
  } catch {}
` }} />

Theme tokens live as CSS variables (--bg, --fg, --muted, --accent) so charts + third-party widgets can read them. Avoid hard-coded Tailwind greys in components — use semantic tokens.


13. File Upload Patterns

Drag-and-drop zone with keyboard fallback (button + hidden <input type="file">). Client-side size + type validation before upload begins. Upload via a signed-URL path — never stream through the app server.

const { getRootProps, getInputProps, isDragActive } = useDropzone({
  accept: { 'image/*': ['.png', '.jpg', '.jpeg', '.webp'] },
  maxSize: 10 * 1024 * 1024,
  onDrop: (files) => startUpload(files),
});
return (
  <div {...getRootProps()} aria-label="Upload file"
    className={cn('rounded-md border-2 border-dashed p-8 text-center',
      isDragActive ? 'border-indigo-500 bg-indigo-50' : 'border-slate-300')}>
    <input {...getInputProps()} />
    <p>Drop files here or <span className="underline">browse</span></p>
  </div>
);

Progress bars read from the XMLHttpRequest.upload progress event or from the signed-URL provider's SDK. Every upload is cancellable with AbortController.


14. Empty State Design

Empty lists, empty dashboards, first-run onboarding. Three components: icon, short headline, concrete next action. Never just "No data."

<EmptyState
  icon={Inbox}
  title="No invoices yet"
  description="When you bill a customer, invoices will appear here."
  primary={{ label: 'Create invoice', href: '/invoices/new' }}
  secondary={{ label: 'Read the billing guide', href: '/docs/billing' }}
/>

First-use onboarding: a checklist card on the dashboard; tick items as they complete; dismiss after all done with a "show me tips" toggle. See ux-principles-101 for empty-state rules #34–#38.


15. Accessibility

Non-negotiables at merge time:

  • Keyboard: every interactive widget reachable by Tab, activated by Enter/Space, dismissed by Escape. Radix primitives get this right by default — do not reinvent.
  • Focus: :focus-visible outlines on all interactive elements. Tailwind's focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-indigo-500 is the house token.
  • ARIA: label every icon-only button with aria-label; mark live regions (aria-live="polite") for toast containers; use aria-current="page" for active nav.
  • Contrast: body text ≥ 4.5:1 against its background; ≥ 3:1 for 18pt or bold 14pt. Run axe in CI.
  • Motion: respect prefers-reduced-motion. motion-safe: / motion-reduce: Tailwind variants.
  • Forms: every input has a visible label; errors use aria-invalid and aria-describedby.

Responsive sweep: test at 360 px (mobile small), 768 px (tablet), 1280 px (laptop), 1920 px (desktop). No horizontal overflow, no content clipped behind fixed headers.


Using This Skill with the Bootstrap/Tabler/PHP Seeder Stack

The repository's PHP seeder template uses Bootstrap 5 + Tabler + SweetAlert2 + DataTables + Flatpickr. The architecture, permissions, AJAX, photo, and responsive patterns for *that* stack are in the sections/ directory. Load them progressively:

  1. Overview & Stack — when starting any PHP page.
  2. Security, Print/PDF, Dates
  3. Architecture, Panels, Menus
  4. Permissions & Searchable Dropdowns
  5. Templates & UI Components
  6. AJAX & Utilities
  7. Responsive, Photo Cards, Flatpickr
  8. Best Practices & Aesthetics
  9. Interface Design
  10. SaaS UX Principles

The patterns in §§1–15 above apply to the React/Next.js stack; the sections/ deep-dives apply to the PHP stack. Pick the one your codebase uses — do not mix.

平台分布

Codex

37.89%
按下载量换算72

Claude

28.51%
按下载量换算54

Cursor

19.42%
按下载量换算37

Gemini CLI

10.16%
按下载量换算19

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

执行命令

安装流程涉及命令执行,可能通过 npx skills add https://github.com/peterbamuhigire/skills-web-dev --skill webapp-gui-design 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills