HTML后台

marspanel — HTML 后台模板

作者 umars28

marspanel 是一个面向基础设施控制台的管理后台模板,使用原生 HTML、CSS 和 JavaScript,无框架、无运行时网络请求,默认 Aurora 深色主题,包含 38 个演示页面。

看看你的网站会是什么样

浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。

2 个预览视图
桌面端首页1 / 2
桌面端截图首屏预览

由服务器浏览器实际访问页面后截取。

全部页面与视图 2

截图用于了解视觉与布局,交互效果请以实际项目为准。

采集于 2026-10-15查看来源

值得关注的模板亮点

从已有项目资料中,快速了解它的特点。

01

原生 HTML、CSS、JavaScript 实现,无框架、无构建步骤、无运行时网络请求

02

默认 Aurora 深色主题,采用青色、靛蓝、紫色三色体系,品牌色与状态色职责分离

03

六种状态词汇通过 mpn-is-* 类统一应用于 pill、banner、日志行、时间线、日历、看板、拓扑节点等组件

04

设计令牌分 primitive、semantic、component 三层,组件不直接引用原始令牌,构建脚本会校验

05

包含 RTL 和打印样式,dir="rtl" 即可切换,打印样式会重复表头并避免行内断页

06

提供 38 个演示页面、342 个类、141 个图标和插图,以及对比度审计文档

模板详细介绍

marspanel 是一个基础设施控制台管理模板,使用原生 HTML、CSS 和 JavaScript 编写,不依赖任何框架,运行时不会发起网络请求。默认主题为 Aurora,以深色为主,在柔和径向渐变上叠加半透明层,采用青色、靛蓝、紫色三色体系。模板包含 38 个演示页面,覆盖仪表盘、表格、表单、图表、日志、拓扑等控制台常见界面。

该模板将失败实例、卡在 provisioning 的工作负载、长时间 detaching 的卷、因桶配额失败的备份、92% 的配额、不再满足 N+1 的集群等异常状态作为一等公民提供,强调控制台在故障场景下的可读性。

安装方式为复制 dist/ 目录到项目中,按顺序引入 CSS、主题脚本、精灵图和主脚本;也可通过 npm 安装后导入 CSS。主题脚本需放在 head 中同步执行,以便在首次绘制前确定深色或浅色主题。JavaScript 没有可导入的 API,CSS 类和 data-mpn-* 属性即为接口。README 提供了文档、构建、RTL、打印、对比度审计、安全策略和架构决策记录等说明。

HTML后台

适合你的项目吗?

适用场景

  • 构建需要展示失败实例、卡住 provisioning、配额告警等异常状态的基础设施控制台
  • 在无网络或气隙环境中部署管理界面,要求不加载外部字体、图标字体或 CDN 资源
  • 需要 RTL 支持或打印友好样式的后台系统
  • 以原生 HTML/CSS/JS 为基础,不引入前端框架的管理后台项目

适合人群

  • 需要展示基础设施异常状态和运维细节的控制台界面
  • 希望避免框架依赖和构建步骤、直接复制 dist 文件使用的项目
  • 需要深色优先、可切换主题并支持 RTL 和打印的管理后台
  • 对运行时网络请求有严格限制的部署环境

上手与定制指南

结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。

  1. 1

    将 dist/ 目录复制到项目中,按 README 指定顺序引入 marspanel.min.css、marspanel-theme.js、sprites.js 和 marspanel.js

  2. 2

    marspanel-theme.js 必须放在 head 中同步执行,否则首次绘制会出现主题闪烁

  3. 3

    也可通过 npm install marspanel 后 import "marspanel/css",没有 JavaScript API 需要导入

  4. 4

    starter/index.html 是可复制并删减的骨架页面

  5. 5

    构建使用 node build/index.mjs,本地服务使用 node build/serve.mjs,无需 npm install

查看仓库使用说明

授权与来源资料

使用条件与限制

免费使用 · 保留许可声明

本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。

使用时需要遵守

  • 允许免费使用、修改、商用和分发该版本代码。
  • 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
  • 代码按现状提供;担保与责任限制以原许可证及适用法律为准。

额外费用与待核对事项

  • 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
  • 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据

DeepSeek 根据仓库许可证和 README 整理 ·2026-10-15。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。

项目核对记录与介绍依据

模板资料

来源平台
GitHub
资料与维护参考分
资料较完整 · 80 / 100
技术栈
HTML
网站类型
后台
这个分数如何计算

本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。

这个项目需要核对什么

记录的仓库更新时间
2026-09-13
截图检查日期
2026-10-15

已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。

目录记录的主要技术栈是 HTML。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。

查看具体选型方法 →

介绍的制作与核对状态

介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。

审核声明: codex-user-requested-batch-review-20261017 · 2026-10-16

查看当时使用的来源资料

SHA-256: 503e4ef809ca6be5ef27ae6ca62197c97c6c31ec3544b2bac9c34ec51c81c671

2026-10-15T13:27:04.315Z

来源文件 / 仓库
# marspanel

[![ci](https://github.com/umars28/marspanel/actions/workflows/ci.yml/badge.svg)](https://github.com/umars28/marspanel/actions/workflows/ci.yml)
[![licence](https://img.shields.io/github/license/umars28/marspanel?color=6366f1)](LICENSE)
[![dependencies](https://img.shields.io/badge/dependencies-0-22d3ee)](package.json)
[![contrast](https://img.shields.io/badge/WCAG%20AA-54%2F54-4ade80)](docs/accessibility.md)
[![demo](https://img.shields.io/badge/demo-live-a78bfa)](https://umars28.github.io/marspanel/)

Admin template for infrastructure consoles. Plain HTML, CSS and JavaScript — no build step for
consumers, no framework, and not one network request at runtime.

**[Live demo →](https://umars28.github.io/marspanel/)**

The default theme is **Aurora**: dark-first, layered translucency over a soft radial wash, with a
cyan → indigo → violet identity.

```
38 pages · 342 classes · 141 icons and illustrations · 0 dependencies · 54/54 contrast pairs pass
```

## Why another admin template

Every widely used admin template draws the happy path. Dashboards are green, tables are full,
nothing is mid-flight and nothing is broken. But the screen an operator actually stares at is the
one where something has gone wrong.

marspanel ships the ugly states as first-class: a failed instance, a workload stuck provisioning, a
volume that has been detaching for an hour, a backup that died on bucket quota, a quota at 92 %, a
cluster that is no longer N+1. If a template cannot render those legibly, it cannot render the job.

## Install

Copy `dist/` into your project. Four files, and the order matters.

```html
<link rel="stylesheet" href="/dist/marspanel.min.css">
<script src="/dist/marspanel-theme.js"></script>   <!-- in <head>, synchronous -->

<body class="mpn-root">
  <script src="/dist/sprites.js"></script>
  <div class="mpn-app">…</div>
  <script src="/dist/marspanel.js"></script>
</body>
```

`marspanel-theme.js` belongs in the head because it resolves dark or light **before first paint** —
move it lower and you get a flash of the wrong theme. `starter/index.html` is this skeleton with a
working shell; copy it and start deleting.

Or `npm install marspanel`, then `import "marspanel/css"`. There is no JavaScript API to import; the
CSS classes and the `data-mpn-*` attributes are the interface.

## Documentation

| | |
|---|---|
| [Getting started](docs/getting-started.md) | install, layout, breakpoints, building from source |
| [Theming](docs/theming.md) | the three token layers and how to write another theme |
| [JavaScript](docs/javascript.md) | every `data-mpn-*` attribute |
| [RTL and print](docs/rtl-and-print.md) | logical properties, the paper stylesheet |
| [Contrast audit](docs/accessibility.md) | generated by the build, not asserted by hand |
| [ADR 0001](docs/adr/0001-visual-direction.md) | the nine visual directions Aurora was chosen against |
| [ADR 0002](docs/adr/0002-packaging-and-structure.md) | why `dist/` is committed and the build has no dependencies |
| [Security](SECURITY.md) | scope, reporting, and a CSP that works |

Live pages: open `index.html`, or `pages/index.html` for the full list.

## The rule that makes it a system

Three hues, three jobs. Brand colour never argues with status colour.

| Hue | Token | Role | Where |
|---|---|---|---|
| Cyan `#22D3EE` | `--mpn-focus` | *pointing* | focus ring, active tab underline |
| Indigo `#6366F1` | `--mpn-accent` | *acting* | primary button, link, anything clickable |
| Violet `#A78BFA` | `--mpn-pending` | *in flight* | provisioning, reconciling, draining |

A focus ring is never the accent colour. A primary button is never cyan.

## One status vocabulary

Six states, one class, read by every stateful component:

```html
<span class="mpn-pill mpn-is-ok">running</span>
<div class="mpn-banner mpn-is-warn">…</div>
<div class="mpn-log-line mpn-is-danger">…</div>
```

`mpn-is-warn` works identically on a pill, a banner, a timeline dot, a calendar event, a board card,
an info box, a log line, a topology node and a donut segment — because each reads `--mpn-state` and
`--mpn-state-tint` rather than hard-coding a colour. Map your own nouns onto the six: `running`,
`bound`, `granted`, `paid` and `shipped` are all `ok`.

## Tokens are three layers deep, and the order is enforced

```
tokens/primitive.css      --mpn-indigo-500: #6366F1
tokens/semantic.css       --mpn-accent: var(--mpn-indigo-500)
components/button.css     background: var(--mpn-accent)
```

**Components never reference primitives.** That single constraint is what makes an alternate theme a
block of variables instead of a hunt through twenty stylesheets, and `build/verify.mjs` fails the
build if it is broken.

## Component coverage

| Group | Classes |
|---|---|
| Actions | `mpn-btn` (primary, solid, ghost, danger, sm, lg, block, group), `mpn-icon-btn`, `mpn-avatar` |
| Status | `mpn-pill`, `mpn-dot`, `mpn-tag`, `mpn-chip`, `mpn-env` |
| Surfaces | `mpn-card` (+head, body, foot, quiet, state), `mpn-infobox`, `mpn-stat-*`, `mpn-meter`, `mpn-kv` |
| Feedback | `mpn-banner`, `mpn-toast`, `mpn-progress`, `mpn-spinner`, `mpn-dots`, `mpn-skeleton`, `mpn-empty` |
| Data | `mpn-table` (striped, bordered, compact, fixed, flat, quiet, stack), sort, filter, bulk select, `mpn-pagination` |
| Forms | input, select, textarea, checkbox, radio, switch, range, OTP, tags, addon, drop zone, choice grid, validation states, date picker, searchable select, colour picker |
| Navigation | sidebar nav with collapsible groups, `mpn-tabs`, `mpn-crumbs`, `mpn-stepper`, `mpn-accordion`, `mpn-tree` |
| Overlays | `mpn-modal`, `mpn-drawer`, `mpn-menu`, `mpn-popover`, `mpn-palette`, `mpn-tooltip` |
| Charts | area, line, spark, bars, donut, gauge, stacked bar, heat matrix, meter rows — all hand-drawn SVG |
| Content | `mpn-list`, `mpn-media`, `mpn-comment`, `mpn-file-row`, `mpn-feed`, `mpn-timeline` |
| Code | `mpn-code`, `mpn-term`, `mpn-log`, `mpn-diff` |
| Workspace | `mpn-cal`, `mpn-board`, `mpn-chat`, `mpn-topo`, `mpn-split` |

## Right-to-left and print

`dir="rtl"` on `<html>` is the whole switch. Every directional rule is a logical property, so
`base/rtl.css` only has to fix what has no logical form — transforms, inset shadows, asymmetric
radii, the select arrow. The verifier fails the build on any `margin-left` or `border-right` outside
that file.

`base/print.css` relights the theme for paper, drops chrome and overlays, repeats table headers on
every page and keeps rows from breaking mid-way. Test it on `pages/invoice.html`.

## Structure

```
src/css/      tokens/ base/ components/ · the stylesheets
src/js/       theme.js ui.js widgets.js
src/sprites/  icons.svg illustrations.svg
build/        six Node scripts, standard library only
dist/         what you copy: bundled css, js, sprites
pages/        38 demo pages
starter/      minimal copy-me page
docs/         guides and decision records
```

```
node build/index.mjs     # build everything
node build/serve.mjs     # http://localhost:8777
```

There is nothing to `npm install`. Keeping it that way is a design constraint, not an accident.

`build/verify.mjs` runs on every build and in CI. It fails on an undeclared token, a class used but
never defined, a missing icon symbol, a broken link, a page missing its theme script, or a physical
CSS property that would break RTL. Fix the cause, never the check.

## No webfonts, no icon font, no CDN

System font stack for prose; monospace for anything a machine produced or a human has to type —
identifiers, states, addresses, sizes, durations. Icons are an inline SVG sprite.

This is not minimalism for its own sake. A console that fetches nothing renders identically when it
is served from a single binary on an air-gapped node.

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md). The public API is the set of `mpn-*` classes, `--mpn-*`
tokens and `data-mpn-*` attributes; renaming any of them is a breaking change.

## License

[MIT](LICENSE)
反馈内容错误

看看同类模板

对比同技术栈与用途的模板,找到更适合的视觉与内容结构。