@kupola/kupola 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +130 -0
- package/INTEGRATION.md +440 -0
- package/PROJECT_SUMMARY.md +312 -0
- package/README.md +286 -0
- package/SKILL.md +572 -0
- package/css/accessibility.css +119 -0
- package/css/animations.css +224 -0
- package/css/brand-themes.css +300 -0
- package/css/colors_and_type.css +441 -0
- package/css/components-ext.css +4165 -0
- package/css/components.css +1483 -0
- package/css/kupola.css +12 -0
- package/css/responsive.css +697 -0
- package/css/scaffold.css +145 -0
- package/css/states.css +316 -0
- package/css/theme-dark.css +296 -0
- package/css/theme-light.css +296 -0
- package/css/utilities.css +171 -0
- package/dist/css/kupola.css +12 -0
- package/dist/icons/icons/activity.svg +3 -0
- package/dist/icons/icons/alert-circle.svg +1 -0
- package/dist/icons/icons/alert-triangle.svg +1 -0
- package/dist/icons/icons/alert.d27e24.svg +1 -0
- package/dist/icons/icons/alert.svg +1 -0
- package/dist/icons/icons/apple.svg +1 -0
- package/dist/icons/icons/arrow-down.svg +1 -0
- package/dist/icons/icons/arrow-expand.svg +1 -0
- package/dist/icons/icons/arrow-left.svg +1 -0
- package/dist/icons/icons/arrow-minimize.svg +1 -0
- package/dist/icons/icons/arrow-right-to-line.svg +1 -0
- package/dist/icons/icons/arrow-right.svg +1 -0
- package/dist/icons/icons/arrow-up-right.svg +1 -0
- package/dist/icons/icons/arrow-up.0c0c0d.svg +1 -0
- package/dist/icons/icons/arrow-up.svg +1 -0
- package/dist/icons/icons/at.svg +1 -0
- package/dist/icons/icons/atom.0c0c0d.svg +1 -0
- package/dist/icons/icons/atom.svg +1 -0
- package/dist/icons/icons/bar-chart-2.svg +1 -0
- package/dist/icons/icons/bar.svg +1 -0
- package/dist/icons/icons/bell.svg +1 -0
- package/dist/icons/icons/box.svg +1 -0
- package/dist/icons/icons/bug.svg +1 -0
- package/dist/icons/icons/button.svg +1 -0
- package/dist/icons/icons/calendar.svg +1 -0
- package/dist/icons/icons/check-circle.33c192.svg +1 -0
- package/dist/icons/icons/check-circle.svg +1 -0
- package/dist/icons/icons/check-square.svg +4 -0
- package/dist/icons/icons/check.d1d3db.svg +1 -0
- package/dist/icons/icons/check.svg +1 -0
- package/dist/icons/icons/chevron-down.svg +1 -0
- package/dist/icons/icons/chevron-left.svg +1 -0
- package/dist/icons/icons/chevron-right.svg +1 -0
- package/dist/icons/icons/chevron-up.svg +1 -0
- package/dist/icons/icons/circle.svg +1 -0
- package/dist/icons/icons/clock.svg +1 -0
- package/dist/icons/icons/cmd.svg +1 -0
- package/dist/icons/icons/code.svg +1 -0
- package/dist/icons/icons/columns.svg +1 -0
- package/dist/icons/icons/copy.svg +1 -0
- package/dist/icons/icons/cpu.svg +1 -0
- package/dist/icons/icons/dashboard.0c0c0d.svg +1 -0
- package/dist/icons/icons/dashboard.svg +1 -0
- package/dist/icons/icons/dollar.svg +1 -0
- package/dist/icons/icons/download.svg +1 -0
- package/dist/icons/icons/edit.svg +1 -0
- package/dist/icons/icons/extensions.svg +1 -0
- package/dist/icons/icons/external.svg +1 -0
- package/dist/icons/icons/eye.svg +1 -0
- package/dist/icons/icons/file-text.svg +1 -0
- package/dist/icons/icons/file.svg +1 -0
- package/dist/icons/icons/files.svg +1 -0
- package/dist/icons/icons/filter.svg +1 -0
- package/dist/icons/icons/folder-open.svg +4 -0
- package/dist/icons/icons/folder.svg +1 -0
- package/dist/icons/icons/gear.svg +1 -0
- package/dist/icons/icons/git.svg +1 -0
- package/dist/icons/icons/github.svg +1 -0
- package/dist/icons/icons/globe.svg +1 -0
- package/dist/icons/icons/grid-2x2.svg +1 -0
- package/dist/icons/icons/hash.svg +1 -0
- package/dist/icons/icons/heart.svg +1 -0
- package/dist/icons/icons/help-circle.svg +5 -0
- package/dist/icons/icons/help.svg +1 -0
- package/dist/icons/icons/home.svg +1 -0
- package/dist/icons/icons/icons.svg +153 -0
- package/dist/icons/icons/image.svg +1 -0
- package/dist/icons/icons/info-circle.svg +1 -0
- package/dist/icons/icons/info-square.svg +1 -0
- package/dist/icons/icons/info.387bff.svg +1 -0
- package/dist/icons/icons/info.svg +1 -0
- package/dist/icons/icons/input.svg +1 -0
- package/dist/icons/icons/key.svg +1 -0
- package/dist/icons/icons/layers.svg +1 -0
- package/dist/icons/icons/layout-grid.svg +6 -0
- package/dist/icons/icons/layout.svg +1 -0
- package/dist/icons/icons/link.svg +1 -0
- package/dist/icons/icons/list.svg +1 -0
- package/dist/icons/icons/lock.svg +1 -0
- package/dist/icons/icons/log-out.svg +1 -0
- package/dist/icons/icons/logo.svg +1 -0
- package/dist/icons/icons/mail.svg +1 -0
- package/dist/icons/icons/menu.svg +1 -0
- package/dist/icons/icons/message-circle.svg +1 -0
- package/dist/icons/icons/message-plus.svg +1 -0
- package/dist/icons/icons/message-square.svg +1 -0
- package/dist/icons/icons/mic.svg +1 -0
- package/dist/icons/icons/minus.svg +1 -0
- package/dist/icons/icons/moon.svg +1 -0
- package/dist/icons/icons/more-h.svg +1 -0
- package/dist/icons/icons/mouse.svg +1 -0
- package/dist/icons/icons/palette.svg +1 -0
- package/dist/icons/icons/panel-bottom.svg +1 -0
- package/dist/icons/icons/pause.svg +1 -0
- package/dist/icons/icons/play.svg +1 -0
- package/dist/icons/icons/plug.svg +1 -0
- package/dist/icons/icons/plus.0c0c0d.svg +1 -0
- package/dist/icons/icons/plus.svg +1 -0
- package/dist/icons/icons/refresh.svg +1 -0
- package/dist/icons/icons/ruler.svg +1 -0
- package/dist/icons/icons/scroll-text.svg +1 -0
- package/dist/icons/icons/search-menu.svg +1 -0
- package/dist/icons/icons/search.svg +1 -0
- package/dist/icons/icons/send.0c0c0d.svg +1 -0
- package/dist/icons/icons/send.svg +1 -0
- package/dist/icons/icons/settings.0c0c0d.svg +1 -0
- package/dist/icons/icons/settings.svg +1 -0
- package/dist/icons/icons/shield.svg +1 -0
- package/dist/icons/icons/sidebar-left.svg +1 -0
- package/dist/icons/icons/sidebar-right.svg +1 -0
- package/dist/icons/icons/sliders.svg +1 -0
- package/dist/icons/icons/sparkles.32f08c.svg +1 -0
- package/dist/icons/icons/sparkles.svg +1 -0
- package/dist/icons/icons/square.svg +1 -0
- package/dist/icons/icons/star.svg +1 -0
- package/dist/icons/icons/sun.svg +1 -0
- package/dist/icons/icons/table.svg +1 -0
- package/dist/icons/icons/terminal.svg +1 -0
- package/dist/icons/icons/trash.svg +1 -0
- package/dist/icons/icons/trending-down.svg +1 -0
- package/dist/icons/icons/trending-up.svg +1 -0
- package/dist/icons/icons/type.svg +1 -0
- package/dist/icons/icons/upload.svg +1 -0
- package/dist/icons/icons/user-circle.svg +1 -0
- package/dist/icons/icons/user-plus.svg +6 -0
- package/dist/icons/icons/user.svg +1 -0
- package/dist/icons/icons/users.svg +1 -0
- package/dist/icons/icons/warning.svg +1 -0
- package/dist/icons/icons/wrench.svg +1 -0
- package/dist/icons/icons/x-circle.svg +1 -0
- package/dist/icons/icons/x.svg +1 -0
- package/dist/icons/icons/zap.0c0c0d.svg +1 -0
- package/dist/icons/icons/zap.svg +1 -0
- package/dist/kupola.cjs.js +258 -0
- package/dist/kupola.cjs.js.map +1 -0
- package/dist/kupola.esm.js +7640 -0
- package/dist/kupola.esm.js.map +1 -0
- package/dist/kupola.umd.js +258 -0
- package/dist/kupola.umd.js.map +1 -0
- package/dist/types/kupola.d.ts +1359 -0
- package/dist/utils/utils/Kupola.cs +77 -0
- package/dist/utils/utils/Kupola.java +104 -0
- package/dist/utils/utils/kupola.go +120 -0
- package/dist/utils/utils/kupola.js +63 -0
- package/dist/utils/utils/kupola.py +1392 -0
- package/dist/utils/utils/kupola.rb +69 -0
- package/icons/activity.svg +3 -0
- package/icons/alert-circle.svg +1 -0
- package/icons/alert-triangle.svg +1 -0
- package/icons/alert.d27e24.svg +1 -0
- package/icons/alert.svg +1 -0
- package/icons/apple.svg +1 -0
- package/icons/arrow-down.svg +1 -0
- package/icons/arrow-expand.svg +1 -0
- package/icons/arrow-left.svg +1 -0
- package/icons/arrow-minimize.svg +1 -0
- package/icons/arrow-right-to-line.svg +1 -0
- package/icons/arrow-right.svg +1 -0
- package/icons/arrow-up-right.svg +1 -0
- package/icons/arrow-up.0c0c0d.svg +1 -0
- package/icons/arrow-up.svg +1 -0
- package/icons/at.svg +1 -0
- package/icons/atom.0c0c0d.svg +1 -0
- package/icons/atom.svg +1 -0
- package/icons/bar-chart-2.svg +1 -0
- package/icons/bar.svg +1 -0
- package/icons/bell.svg +1 -0
- package/icons/box.svg +1 -0
- package/icons/bug.svg +1 -0
- package/icons/button.svg +1 -0
- package/icons/calendar.svg +1 -0
- package/icons/check-circle.33c192.svg +1 -0
- package/icons/check-circle.svg +1 -0
- package/icons/check-square.svg +4 -0
- package/icons/check.d1d3db.svg +1 -0
- package/icons/check.svg +1 -0
- package/icons/chevron-down.svg +1 -0
- package/icons/chevron-left.svg +1 -0
- package/icons/chevron-right.svg +1 -0
- package/icons/chevron-up.svg +1 -0
- package/icons/circle.svg +1 -0
- package/icons/clock.svg +1 -0
- package/icons/cmd.svg +1 -0
- package/icons/code.svg +1 -0
- package/icons/columns.svg +1 -0
- package/icons/copy.svg +1 -0
- package/icons/cpu.svg +1 -0
- package/icons/dashboard.0c0c0d.svg +1 -0
- package/icons/dashboard.svg +1 -0
- package/icons/dollar.svg +1 -0
- package/icons/download.svg +1 -0
- package/icons/edit.svg +1 -0
- package/icons/extensions.svg +1 -0
- package/icons/external.svg +1 -0
- package/icons/eye.svg +1 -0
- package/icons/file-text.svg +1 -0
- package/icons/file.svg +1 -0
- package/icons/files.svg +1 -0
- package/icons/filter.svg +1 -0
- package/icons/folder-open.svg +4 -0
- package/icons/folder.svg +1 -0
- package/icons/gear.svg +1 -0
- package/icons/git.svg +1 -0
- package/icons/github.svg +1 -0
- package/icons/globe.svg +1 -0
- package/icons/grid-2x2.svg +1 -0
- package/icons/hash.svg +1 -0
- package/icons/heart.svg +1 -0
- package/icons/help-circle.svg +5 -0
- package/icons/help.svg +1 -0
- package/icons/home.svg +1 -0
- package/icons/icons.svg +153 -0
- package/icons/image.svg +1 -0
- package/icons/info-circle.svg +1 -0
- package/icons/info-square.svg +1 -0
- package/icons/info.387bff.svg +1 -0
- package/icons/info.svg +1 -0
- package/icons/input.svg +1 -0
- package/icons/key.svg +1 -0
- package/icons/layers.svg +1 -0
- package/icons/layout-grid.svg +6 -0
- package/icons/layout.svg +1 -0
- package/icons/link.svg +1 -0
- package/icons/list.svg +1 -0
- package/icons/lock.svg +1 -0
- package/icons/log-out.svg +1 -0
- package/icons/logo.svg +1 -0
- package/icons/mail.svg +1 -0
- package/icons/menu.svg +1 -0
- package/icons/message-circle.svg +1 -0
- package/icons/message-plus.svg +1 -0
- package/icons/message-square.svg +1 -0
- package/icons/mic.svg +1 -0
- package/icons/minus.svg +1 -0
- package/icons/moon.svg +1 -0
- package/icons/more-h.svg +1 -0
- package/icons/mouse.svg +1 -0
- package/icons/palette.svg +1 -0
- package/icons/panel-bottom.svg +1 -0
- package/icons/pause.svg +1 -0
- package/icons/play.svg +1 -0
- package/icons/plug.svg +1 -0
- package/icons/plus.0c0c0d.svg +1 -0
- package/icons/plus.svg +1 -0
- package/icons/refresh.svg +1 -0
- package/icons/ruler.svg +1 -0
- package/icons/scroll-text.svg +1 -0
- package/icons/search-menu.svg +1 -0
- package/icons/search.svg +1 -0
- package/icons/send.0c0c0d.svg +1 -0
- package/icons/send.svg +1 -0
- package/icons/settings.0c0c0d.svg +1 -0
- package/icons/settings.svg +1 -0
- package/icons/shield.svg +1 -0
- package/icons/sidebar-left.svg +1 -0
- package/icons/sidebar-right.svg +1 -0
- package/icons/sliders.svg +1 -0
- package/icons/sparkles.32f08c.svg +1 -0
- package/icons/sparkles.svg +1 -0
- package/icons/square.svg +1 -0
- package/icons/star.svg +1 -0
- package/icons/sun.svg +1 -0
- package/icons/table.svg +1 -0
- package/icons/terminal.svg +1 -0
- package/icons/trash.svg +1 -0
- package/icons/trending-down.svg +1 -0
- package/icons/trending-up.svg +1 -0
- package/icons/type.svg +1 -0
- package/icons/upload.svg +1 -0
- package/icons/user-circle.svg +1 -0
- package/icons/user-plus.svg +6 -0
- package/icons/user.svg +1 -0
- package/icons/users.svg +1 -0
- package/icons/warning.svg +1 -0
- package/icons/wrench.svg +1 -0
- package/icons/x-circle.svg +1 -0
- package/icons/x.svg +1 -0
- package/icons/zap.0c0c0d.svg +1 -0
- package/icons/zap.svg +1 -0
- package/js/calendar.js +184 -0
- package/js/carousel.js +173 -0
- package/js/collapse.js +127 -0
- package/js/color-picker.js +144 -0
- package/js/component.js +276 -0
- package/js/composition-api.js +458 -0
- package/js/countdown.js +144 -0
- package/js/data-bind.js +1286 -0
- package/js/datepicker.js +270 -0
- package/js/dialog.js +131 -0
- package/js/drawer.js +118 -0
- package/js/dropdown.js +122 -0
- package/js/dynamic-tags.js +156 -0
- package/js/error-handler.js +181 -0
- package/js/fileupload.js +392 -0
- package/js/form.js +291 -0
- package/js/global-events.js +203 -0
- package/js/heatmap.js +405 -0
- package/js/http.js +419 -0
- package/js/i18n.js +228 -0
- package/js/icons.js +165 -0
- package/js/image-preview.js +218 -0
- package/js/initializer.js +162 -0
- package/js/kupola-core.js +66 -0
- package/js/kupola-devtools.js +598 -0
- package/js/kupola-lifecycle.js +510 -0
- package/js/message.js +60 -0
- package/js/modal.js +191 -0
- package/js/notification.js +73 -0
- package/js/numberinput.js +146 -0
- package/js/performance.js +250 -0
- package/js/registry.js +205 -0
- package/js/router.js +396 -0
- package/js/security.js +189 -0
- package/js/select.js +143 -0
- package/js/slide-captcha.js +504 -0
- package/js/slider.js +94 -0
- package/js/statcard.js +219 -0
- package/js/tag.js +83 -0
- package/js/test-utils.js +251 -0
- package/js/theme.js +363 -0
- package/js/timepicker.js +238 -0
- package/js/tooltip.js +122 -0
- package/js/utils.js +1458 -0
- package/js/validation.js +553 -0
- package/js/virtual-list.js +593 -0
- package/package.json +105 -0
- package/templates/base.html +30 -0
- package/templates/base_dashboard.html +99 -0
- package/types/kupola.d.ts +1359 -0
- package/utils/Kupola.cs +77 -0
- package/utils/Kupola.java +104 -0
- package/utils/kupola.go +120 -0
- package/utils/kupola.js +63 -0
- package/utils/kupola.py +1392 -0
- package/utils/kupola.rb +69 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# Kupola Design System - 项目总结
|
|
2
|
+
|
|
3
|
+
## 一、项目概述
|
|
4
|
+
|
|
5
|
+
Kupola 是一个轻量级设计系统,专为 Python Web 项目(Flask/Django)设计,无需 React/Vue 等重型框架。
|
|
6
|
+
|
|
7
|
+
### 项目历史
|
|
8
|
+
|
|
9
|
+
| 阶段 | 时间 | 事件 |
|
|
10
|
+
|------|------|------|
|
|
11
|
+
| Nimbus | 初始版本 | 项目创建,命名为 Nimbus Design System |
|
|
12
|
+
| 重构 | 2026-07 | 代码重构,修复响应式、HTTP、内存泄漏等问题 |
|
|
13
|
+
| 重命名 | 2026-07-09 | 项目从 Nimbus 重命名为 Kupola |
|
|
14
|
+
| 清理 | 2026-07-09 | 清理无用文件,优化项目结构 |
|
|
15
|
+
| GitHub | 2026-07-09 | 推送到 GitHub 仓库 `github.com/kupola-cn/kupola` |
|
|
16
|
+
|
|
17
|
+
### 核心特性
|
|
18
|
+
|
|
19
|
+
- **50+ 组件**:按钮、输入框、卡片、弹窗、日期选择器、时间选择器、热力图、虚拟列表等
|
|
20
|
+
- **双主题**:深色优先设计,支持浅色主题
|
|
21
|
+
- **11 个品牌色**:可切换的品牌色彩系统
|
|
22
|
+
- **响应式设计**:适配 PC、平板、手机
|
|
23
|
+
- **无障碍**:符合 WCAG AA 标准
|
|
24
|
+
- **表单验证**:内置验证规则,支持自定义规则
|
|
25
|
+
- **数据绑定**:基于 Proxy 的双向数据绑定系统
|
|
26
|
+
- **无依赖**:纯 HTML/CSS/JavaScript
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 二、架构设计
|
|
31
|
+
|
|
32
|
+
### 架构原则
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
┌──────────────────────────────────────────────────────┐
|
|
36
|
+
│ HTML 层(后端渲染) │
|
|
37
|
+
│ Jinja2/Django 模板输出语义化 HTML │
|
|
38
|
+
│ data-bind / data-component / data-validate 属性 │
|
|
39
|
+
├──────────────────────────────────────────────────────┤
|
|
40
|
+
│ CSS 层(视觉增强) │
|
|
41
|
+
│ CSS 变量 + BEM 命名 + 双主题支持 │
|
|
42
|
+
│ 即使 JS 未加载,页面依然可用 │
|
|
43
|
+
├──────────────────────────────────────────────────────┤
|
|
44
|
+
│ JS 层(交互增强) │
|
|
45
|
+
│ IIFE + window 全局挂载,无需打包器 │
|
|
46
|
+
│ MutationObserver 自动检测并初始化组件 │
|
|
47
|
+
│ 响应式系统(Proxy)+ 组合式 API │
|
|
48
|
+
└──────────────────────────────────────────────────────┘
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 组件生命周期
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
创建 → init() → 挂载 → 更新 → 销毁 → destroy()
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
通过 `KupolaLifecycle` 和 `GlobalEventManager` 统一管理组件生命周期。
|
|
58
|
+
|
|
59
|
+
### 响应式系统
|
|
60
|
+
|
|
61
|
+
基于 Proxy 实现,支持:
|
|
62
|
+
- `ref()` - 基础响应式引用
|
|
63
|
+
- `reactive()` - 响应式对象
|
|
64
|
+
- `computed()` - 计算属性(自动依赖追踪)
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 三、项目结构
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
kupola/
|
|
72
|
+
├── css/ # CSS 样式表(13个文件)
|
|
73
|
+
│ ├── kupola.css # 主样式入口
|
|
74
|
+
│ ├── components.css # 组件样式
|
|
75
|
+
│ ├── theme-dark.css # 深色主题
|
|
76
|
+
│ ├── theme-light.css # 浅色主题
|
|
77
|
+
│ └── ... # 其他样式
|
|
78
|
+
├── js/ # JavaScript 模块(40+个)
|
|
79
|
+
│ ├── kupola-core.js # 核心框架
|
|
80
|
+
│ ├── kupola-lifecycle.js # 生命周期管理
|
|
81
|
+
│ ├── component.js # 组件基类
|
|
82
|
+
│ ├── data-bind.js # 数据绑定
|
|
83
|
+
│ ├── composition-api.js # 组合式 API
|
|
84
|
+
│ ├── http.js # HTTP 客户端
|
|
85
|
+
│ ├── router.js # 路由系统
|
|
86
|
+
│ ├── theme.js # 主题切换
|
|
87
|
+
│ └── ... # UI 组件
|
|
88
|
+
├── icons/ # SVG 图标(133个)
|
|
89
|
+
├── dist/ # 构建产物
|
|
90
|
+
│ ├── kupola.esm.js # ES Module 格式
|
|
91
|
+
│ ├── kupola.cjs.js # CommonJS 格式
|
|
92
|
+
│ ├── kupola.umd.js # UMD 格式
|
|
93
|
+
│ └── types/kupola.d.ts # TypeScript 类型定义
|
|
94
|
+
├── src/ # 构建入口
|
|
95
|
+
├── utils/ # Python 工具函数
|
|
96
|
+
├── dashboard/ # 仪表盘模板
|
|
97
|
+
├── casepages/ # 组件展示页面
|
|
98
|
+
├── examples/ # 使用示例
|
|
99
|
+
├── test/ # 测试文件
|
|
100
|
+
├── docs/ # 文档
|
|
101
|
+
└── package.json # 构建脚本
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 四、核心功能
|
|
107
|
+
|
|
108
|
+
### 1. 组件系统
|
|
109
|
+
|
|
110
|
+
| 类别 | 组件 |
|
|
111
|
+
|------|------|
|
|
112
|
+
| **基础** | Button, Input, Textarea, Select, Checkbox, Radio, Switch |
|
|
113
|
+
| **数据** | Table, Pagination, VirtualList, DynamicTags |
|
|
114
|
+
| **反馈** | Modal, Dialog, Message, Notification, Tooltip |
|
|
115
|
+
| **导航** | Tabs, Dropdown, Breadcrumb |
|
|
116
|
+
| **表单** | Form, DatePicker, TimePicker, ColorPicker |
|
|
117
|
+
| **数据可视化** | Heatmap, StatCard |
|
|
118
|
+
| **其他** | Carousel, Drawer, Collapse, Upload |
|
|
119
|
+
|
|
120
|
+
### 2. 数据绑定
|
|
121
|
+
|
|
122
|
+
```html
|
|
123
|
+
<input type="text" data-bind="user.name:value">
|
|
124
|
+
<span data-bind="user.name:text"></span>
|
|
125
|
+
<input type="checkbox" data-bind="user.active:checked">
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
kupolaData.data.user = { name: 'John', active: true };
|
|
130
|
+
kupolaData.data.user.name = 'Jane';
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 3. 组合式 API
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
setup(() => {
|
|
137
|
+
const count = ref(0);
|
|
138
|
+
const doubled = computed(() => count.value * 2);
|
|
139
|
+
|
|
140
|
+
onMounted(() => {
|
|
141
|
+
console.log('组件挂载');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
return { count, doubled };
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 4. 主题系统
|
|
149
|
+
|
|
150
|
+
```javascript
|
|
151
|
+
setTheme('dark'); // 切换到深色主题
|
|
152
|
+
setTheme('light'); // 切换到浅色主题
|
|
153
|
+
setBrand('zengqing'); // 设置品牌色
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 5. HTTP 客户端
|
|
157
|
+
|
|
158
|
+
```javascript
|
|
159
|
+
const http = createHttp({ baseURL: '/api' });
|
|
160
|
+
http.get('/users');
|
|
161
|
+
http.post('/login', { username, password });
|
|
162
|
+
http.cancelRequest('/users');
|
|
163
|
+
http.cancelAllRequests();
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 五、使用方法
|
|
169
|
+
|
|
170
|
+
### 快速开始
|
|
171
|
+
|
|
172
|
+
```html
|
|
173
|
+
<!-- 引入 CSS -->
|
|
174
|
+
<link rel="stylesheet" href="kupola/css/kupola.css">
|
|
175
|
+
|
|
176
|
+
<!-- 引入 JavaScript -->
|
|
177
|
+
<script src="kupola/js/kupola-core.js"></script>
|
|
178
|
+
|
|
179
|
+
<!-- 使用组件 -->
|
|
180
|
+
<button class="ds-btn ds-btn--brand">提交</button>
|
|
181
|
+
<input type="text" class="ds-input" placeholder="输入内容">
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### ES Module 方式
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
import { KupolaComponent, ref, reactive, createHttp } from 'kupola';
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 构建命令
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
npm install # 安装依赖
|
|
194
|
+
npm run build # 生产构建(Vite)
|
|
195
|
+
npm run build:rollup # 备选构建(Rollup)
|
|
196
|
+
npm run dev # 开发服务器
|
|
197
|
+
npm run test # 运行测试
|
|
198
|
+
npm run lint # 代码检查
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 六、构建系统
|
|
204
|
+
|
|
205
|
+
### 构建工具
|
|
206
|
+
|
|
207
|
+
- **Vite ^5.4.1**:主要构建工具,生成 ESM/CJS/UMD 格式
|
|
208
|
+
- **Rollup**:备选构建工具,兼容更多场景
|
|
209
|
+
|
|
210
|
+
### 构建产物
|
|
211
|
+
|
|
212
|
+
| 文件 | 大小 | 说明 |
|
|
213
|
+
|------|------|------|
|
|
214
|
+
| `dist/kupola.esm.js` | ~332 kB | ES Module 格式 |
|
|
215
|
+
| `dist/kupola.cjs.js` | ~254 kB | CommonJS 格式 |
|
|
216
|
+
| `dist/kupola.umd.js` | ~254 kB | UMD 格式 |
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 七、分支管理
|
|
221
|
+
|
|
222
|
+
### 分支策略
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
main # 生产分支(稳定版本)
|
|
226
|
+
└── develop # 开发分支(日常开发)
|
|
227
|
+
├── feature/xxx # 功能分支
|
|
228
|
+
├── fix/xxx # 修复分支
|
|
229
|
+
└── release/xxx # 发布分支
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 工作流程
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
# 切换到开发分支
|
|
236
|
+
git checkout develop
|
|
237
|
+
|
|
238
|
+
# 创建功能分支
|
|
239
|
+
git checkout -b feature/new-component
|
|
240
|
+
|
|
241
|
+
# 开发完成后推送
|
|
242
|
+
git push github feature/new-component
|
|
243
|
+
|
|
244
|
+
# 创建 PR 到 develop
|
|
245
|
+
# 合并后删除分支
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 八、贡献指南
|
|
251
|
+
|
|
252
|
+
### 代码规范
|
|
253
|
+
|
|
254
|
+
- **JavaScript**:使用 ESLint 检查,遵循 Airbnb 规范
|
|
255
|
+
- **CSS**:使用 BEM 命名规范
|
|
256
|
+
- **提交信息**:使用 Conventional Commits 格式
|
|
257
|
+
|
|
258
|
+
### 开发流程
|
|
259
|
+
|
|
260
|
+
1. Fork 仓库
|
|
261
|
+
2. 创建功能分支 `feature/xxx`
|
|
262
|
+
3. 开发并测试
|
|
263
|
+
4. 创建 PR 到 `develop` 分支
|
|
264
|
+
5. 等待审核和合并
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 九、迁移指南(从 Nimbus)
|
|
269
|
+
|
|
270
|
+
### 名称变更
|
|
271
|
+
|
|
272
|
+
| 旧名称 | 新名称 |
|
|
273
|
+
|--------|--------|
|
|
274
|
+
| `NimbusComponent` | `KupolaComponent` |
|
|
275
|
+
| `NimbusHttp` | `KupolaHttp` |
|
|
276
|
+
| `window.nimbusData` | `window.kupolaData` |
|
|
277
|
+
| `nimbus-core.js` | `kupola-core.js` |
|
|
278
|
+
| `nimbus.css` | `kupola.css` |
|
|
279
|
+
|
|
280
|
+
### 引用路径变更
|
|
281
|
+
|
|
282
|
+
| 旧路径 | 新路径 |
|
|
283
|
+
|--------|--------|
|
|
284
|
+
| `/nimbus-js/` | `/kupola-js/` |
|
|
285
|
+
| `/nimbus-css/` | `/kupola-css/` |
|
|
286
|
+
| `/nimbus-dist/` | `/kupola-dist/` |
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## 十、版本历史
|
|
291
|
+
|
|
292
|
+
| 版本 | 日期 | 变更 |
|
|
293
|
+
|------|------|------|
|
|
294
|
+
| 1.2.0 | 2026-07-09 | 项目重命名为 Kupola,清理无用文件 |
|
|
295
|
+
| 1.1.0 | 2026-07 | 修复响应式系统、HTTP 取消、内存泄漏 |
|
|
296
|
+
| 1.0.0 | 初始 | Nimbus Design System 发布 |
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 十一、相关链接
|
|
301
|
+
|
|
302
|
+
- **GitHub**:https://github.com/kupola-cn/kupola
|
|
303
|
+
- **Gitee**:https://gitee.com/coln/nimbus
|
|
304
|
+
- **文档**:docs/api.md, docs/kupola-vs-vue-react.md
|
|
305
|
+
- **集成指南**:INTEGRATION.md
|
|
306
|
+
- **组件展示**:dashboard/showcase.html
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 十二、许可证
|
|
311
|
+
|
|
312
|
+
MIT License
|
package/README.md
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# Kupola
|
|
2
|
+
|
|
3
|
+
A lightweight UI toolkit for any web project. No heavy frontend frameworks required. Works seamlessly with Flask, Django, Gin, Spring Boot, ASP.NET Core, Express, Ruby on Rails, and any backend framework that outputs HTML.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **50+ Components**: Buttons, inputs, cards, modals, datepickers, timepickers, heatmap, virtual list, stat cards, image components, and more
|
|
8
|
+
- **Dual Themes**: Dark-first design with light theme support
|
|
9
|
+
- **11 Brand Colors**: Switchable brand colors
|
|
10
|
+
- **Responsive Design**: Works on PC, Pad, and Phone
|
|
11
|
+
- **Accessibility**: WCAG AA compliant
|
|
12
|
+
- **Form Validation**: Built-in validation with custom rules
|
|
13
|
+
- **Data Binding**: Two-way data binding system (Proxy-based)
|
|
14
|
+
- **No Dependencies**: Pure HTML/CSS/JavaScript
|
|
15
|
+
- **Multi-language Support**: Helper functions for Python, Go, Java, C#, Node.js, Ruby
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
### 1. Copy Files
|
|
20
|
+
|
|
21
|
+
Copy the `kupola` directory to your project:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
your-project/
|
|
25
|
+
├── kupola/
|
|
26
|
+
│ ├── css/
|
|
27
|
+
│ ├── js/
|
|
28
|
+
│ └── icons/
|
|
29
|
+
└── index.html
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 2. Include CSS
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<link rel="stylesheet" href="kupola/css/kupola.css">
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 3. Include JavaScript
|
|
39
|
+
|
|
40
|
+
```html
|
|
41
|
+
<script src="kupola/js/kupola-core.js"></script>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 4. Start Using Components
|
|
45
|
+
|
|
46
|
+
```html
|
|
47
|
+
<button class="ds-btn ds-btn--brand">Click Me</button>
|
|
48
|
+
<input type="text" class="ds-input" placeholder="Enter text">
|
|
49
|
+
<div class="ds-card">
|
|
50
|
+
<div class="ds-card__header">
|
|
51
|
+
<h3 class="ds-card__title">Card Title</h3>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="ds-card__body">Card content</div>
|
|
54
|
+
</div>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Framework Integration
|
|
58
|
+
|
|
59
|
+
### Python (Flask/Django)
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
from kupola import button, card
|
|
63
|
+
|
|
64
|
+
html = card("Welcome", "Hello Kupola!", "") + button("Submit", "brand", "md")
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Go (Gin/Echo)
|
|
68
|
+
|
|
69
|
+
```go
|
|
70
|
+
import "kupola"
|
|
71
|
+
|
|
72
|
+
html := kupola.Card("Welcome", "Hello Kupola!", "") + kupola.Button("Submit", "brand", "md")
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Java (Spring Boot)
|
|
76
|
+
|
|
77
|
+
```java
|
|
78
|
+
import com.kupola.Kupola;
|
|
79
|
+
|
|
80
|
+
String html = Kupola.card("Welcome", "Hello Kupola!", "") + Kupola.button("Submit", "brand", "md");
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### C# (ASP.NET Core)
|
|
84
|
+
|
|
85
|
+
```csharp
|
|
86
|
+
using Kupola;
|
|
87
|
+
|
|
88
|
+
string html = Components.Card("Welcome", "Hello Kupola!", "") + Components.Button("Submit", "brand", "md");
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Node.js (Express/Koa)
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
import { button, card } from './kupola/utils/kupola.js';
|
|
95
|
+
|
|
96
|
+
const html = card('Welcome', 'Hello Kupola!', '') + button('Submit', 'brand', 'md');
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Ruby (Ruby on Rails)
|
|
100
|
+
|
|
101
|
+
```ruby
|
|
102
|
+
require './utils/kupola.rb'
|
|
103
|
+
|
|
104
|
+
html = Kupola.card('Welcome', 'Hello Kupola!', '') + Kupola.button('Submit', 'brand', 'md')
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Basic Usage Examples
|
|
108
|
+
|
|
109
|
+
### Buttons
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<button class="ds-btn ds-btn--brand">Primary</button>
|
|
113
|
+
<button class="ds-btn ds-btn--secondary">Secondary</button>
|
|
114
|
+
<button class="ds-btn ds-btn--outline">Outline</button>
|
|
115
|
+
<button class="ds-btn ds-btn--ghost">Ghost</button>
|
|
116
|
+
<button class="ds-btn ds-btn--danger">Danger</button>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Inputs
|
|
120
|
+
|
|
121
|
+
```html
|
|
122
|
+
<input type="text" class="ds-input" placeholder="Text input">
|
|
123
|
+
<input type="password" class="ds-input" placeholder="Password">
|
|
124
|
+
<input type="email" class="ds-input" placeholder="Email">
|
|
125
|
+
<textarea class="ds-textarea" placeholder="Textarea"></textarea>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Cards
|
|
129
|
+
|
|
130
|
+
```html
|
|
131
|
+
<div class="ds-card">
|
|
132
|
+
<div class="ds-card__header">
|
|
133
|
+
<h3 class="ds-card__title">Card Title</h3>
|
|
134
|
+
<p class="ds-card__subtitle">Subtitle</p>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="ds-card__body">Card content goes here</div>
|
|
137
|
+
<div class="ds-card__footer">Footer actions</div>
|
|
138
|
+
</div>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Forms
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<form class="ds-form">
|
|
145
|
+
<div class="ds-form-item">
|
|
146
|
+
<label class="ds-form-item__label">Name</label>
|
|
147
|
+
<input type="text" class="ds-input" placeholder="Enter name">
|
|
148
|
+
</div>
|
|
149
|
+
<div class="ds-form-item">
|
|
150
|
+
<label class="ds-form-item__label">Email</label>
|
|
151
|
+
<input type="email" class="ds-input" data-validate="email" placeholder="Enter email">
|
|
152
|
+
</div>
|
|
153
|
+
<button type="submit" class="ds-btn ds-btn--brand">Submit</button>
|
|
154
|
+
</form>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Data Binding
|
|
158
|
+
|
|
159
|
+
```html
|
|
160
|
+
<input type="text" data-bind="user.name:value" placeholder="Name">
|
|
161
|
+
<span data-bind="user.name:text"></span>
|
|
162
|
+
<input type="checkbox" data-bind="user.active:checked">
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```javascript
|
|
166
|
+
kupolaData.data.user = { name: 'John', active: true };
|
|
167
|
+
kupolaData.data.user.name = 'Jane'; // Auto updates all bound elements
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Theme Switching
|
|
171
|
+
|
|
172
|
+
```javascript
|
|
173
|
+
setTheme('light'); // Switch to light theme
|
|
174
|
+
setTheme('dark'); // Switch to dark theme
|
|
175
|
+
setBrand('zengqing'); // Set brand color to 曾青
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Project Structure
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
kupola/
|
|
182
|
+
├── css/ # CSS stylesheets
|
|
183
|
+
│ ├── kupola.css # Main CSS bundle
|
|
184
|
+
│ ├── components.css # Component styles
|
|
185
|
+
│ ├── components-ext.css # Extended component styles
|
|
186
|
+
│ ├── theme-dark.css # Dark theme tokens
|
|
187
|
+
│ ├── theme-light.css # Light theme tokens
|
|
188
|
+
│ └── ... # Other stylesheets
|
|
189
|
+
├── js/ # JavaScript modules (40+)
|
|
190
|
+
│ ├── kupola-core.js # Core framework
|
|
191
|
+
│ ├── kupola-lifecycle.js # Lifecycle management
|
|
192
|
+
│ ├── kupola-devtools.js # Development tools
|
|
193
|
+
│ ├── component.js # Base component class
|
|
194
|
+
│ ├── router.js # Client-side router
|
|
195
|
+
│ ├── http.js # HTTP client
|
|
196
|
+
│ ├── data-bind.js # Data binding
|
|
197
|
+
│ ├── validation.js # Form validation
|
|
198
|
+
│ ├── theme.js # Theme/brand switching
|
|
199
|
+
│ └── ... # UI components
|
|
200
|
+
├── icons/ # 120+ SVG icons
|
|
201
|
+
├── dist/ # Build output
|
|
202
|
+
│ ├── kupola.esm.js # ES Module format
|
|
203
|
+
│ ├── kupola.cjs.js # CommonJS format
|
|
204
|
+
│ ├── kupola.umd.js # UMD format
|
|
205
|
+
│ └── types/kupola.d.ts # TypeScript types
|
|
206
|
+
├── src/ # Build entry points
|
|
207
|
+
├── utils/ # Multi-language utility functions
|
|
208
|
+
│ ├── kupola.py # Python component generation
|
|
209
|
+
│ ├── kupola.go # Go component generation
|
|
210
|
+
│ ├── Kupola.java # Java component generation
|
|
211
|
+
│ ├── Kupola.cs # C# component generation
|
|
212
|
+
│ ├── kupola.js # Node.js component generation
|
|
213
|
+
│ └── kupola.rb # Ruby component generation
|
|
214
|
+
├── templates/ # HTML templates
|
|
215
|
+
│ ├── base.html # Base template
|
|
216
|
+
│ └── base_dashboard.html # Dashboard base template
|
|
217
|
+
├── dashboard/ # Dashboard template
|
|
218
|
+
├── casepages/ # Component showcase pages
|
|
219
|
+
├── test/ # Test files
|
|
220
|
+
├── examples/ # Usage examples
|
|
221
|
+
├── docs/ # Documentation
|
|
222
|
+
├── INTEGRATION.md # Integration guide
|
|
223
|
+
└── package.json # Build scripts
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Build
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
cd kupola
|
|
230
|
+
npm install
|
|
231
|
+
npm run build # Production build (Vite)
|
|
232
|
+
npm run build:rollup # Alternative build (Rollup)
|
|
233
|
+
npm run dev # Development server
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Documentation
|
|
237
|
+
|
|
238
|
+
- [Integration Guide](INTEGRATION.md) - Framework integration examples
|
|
239
|
+
- [API Documentation](docs/api.md) - API reference
|
|
240
|
+
- [showcase.html](dashboard/showcase.html) - Interactive component showcase
|
|
241
|
+
- [Case Pages](casepages/) - Component usage examples
|
|
242
|
+
|
|
243
|
+
## Browser Support
|
|
244
|
+
|
|
245
|
+
Chrome, Firefox, Safari, Edge (latest versions)
|
|
246
|
+
|
|
247
|
+
## License
|
|
248
|
+
|
|
249
|
+
MIT License
|
|
250
|
+
|
|
251
|
+
## Migration Notice
|
|
252
|
+
|
|
253
|
+
This project was previously known as **Nimbus Design System**. It has been renamed to **Kupola** with the following changes:
|
|
254
|
+
|
|
255
|
+
### Name Changes
|
|
256
|
+
|
|
257
|
+
| Old Name | New Name |
|
|
258
|
+
|----------|----------|
|
|
259
|
+
| `NimbusComponent` | `KupolaComponent` |
|
|
260
|
+
| `NimbusHttp` | `KupolaHttp` |
|
|
261
|
+
| `NimbusRouter` | `KupolaRouter` |
|
|
262
|
+
| `NimbusLifecycle` | `KupolaLifecycle` |
|
|
263
|
+
| `window.nimbusData` | `window.kupolaData` |
|
|
264
|
+
| `window.nimbusRegistry` | `window.kupolaRegistry` |
|
|
265
|
+
|
|
266
|
+
### File Changes
|
|
267
|
+
|
|
268
|
+
| Old Path | New Path |
|
|
269
|
+
|----------|----------|
|
|
270
|
+
| `js/nimbus-core.js` | `js/kupola-core.js` |
|
|
271
|
+
| `js/nimbus-lifecycle.js` | `js/kupola-lifecycle.js` |
|
|
272
|
+
| `js/nimbus-devtools.js` | `js/kupola-devtools.js` |
|
|
273
|
+
| `css/nimbus.css` | `css/kupola.css` |
|
|
274
|
+
| `types/nimbus.d.ts` | `types/kupola.d.ts` |
|
|
275
|
+
| `dist/nimbus.esm.js` | `dist/kupola.esm.js` |
|
|
276
|
+
| `dist/nimbus.cjs.js` | `dist/kupola.cjs.js` |
|
|
277
|
+
| `dist/nimbus.umd.js` | `dist/kupola.umd.js` |
|
|
278
|
+
|
|
279
|
+
### Removed Files
|
|
280
|
+
|
|
281
|
+
- `build.js` / `watch.js` - Legacy build scripts (replaced by Vite)
|
|
282
|
+
- `dev-server.js` - Unused development server
|
|
283
|
+
- `DOCS.md` - Outdated documentation
|
|
284
|
+
- `components/` - Legacy HTML components
|
|
285
|
+
- `common/` - Empty directory
|
|
286
|
+
- Temporary scripts: `rename-project.cjs`, `fix-remaining.cjs`, etc.
|