@kupola/kupola 1.2.0 → 1.4.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/LICENSE +21 -0
- package/README.md +330 -286
- package/adapters/axios.d.ts +34 -0
- package/adapters/axios.js +122 -0
- package/adapters/navios-http.d.ts +110 -0
- package/adapters/navios-http.js +151 -0
- package/css/components-ext.css +157 -0
- package/css/components.css +69 -0
- package/css/theme-dark.css +5 -5
- package/css/utilities.css +119 -1
- package/dist/css/accessibility.css +119 -0
- package/dist/css/animations.css +224 -0
- package/dist/css/brand-themes.css +300 -0
- package/dist/css/colors_and_type.css +441 -0
- package/dist/css/components-ext.css +4165 -0
- package/dist/css/components.css +1483 -0
- package/dist/css/kupola.css +1 -12
- package/dist/css/kupola.min.css +1 -0
- package/dist/css/responsive.css +697 -0
- package/dist/css/scaffold.css +145 -0
- package/dist/css/states.css +316 -0
- package/dist/css/theme-dark.css +296 -0
- package/dist/css/theme-light.css +296 -0
- package/dist/css/utilities.css +171 -0
- package/dist/icons.svg +284 -0
- package/dist/kupola.cjs.js +17409 -257
- package/dist/kupola.cjs.js.map +1 -1
- package/dist/kupola.css +9000 -0
- package/dist/kupola.esm.js +17183 -7597
- package/dist/kupola.esm.js.map +1 -1
- package/dist/kupola.min.css +1 -0
- package/dist/kupola.min.js +2 -0
- package/dist/kupola.min.js.map +1 -0
- package/dist/kupola.umd.js +17415 -257
- package/dist/kupola.umd.js.map +1 -1
- package/dist/plugins/vite-plugin-kupola.js +120 -0
- package/dist/types/kupola.d.ts +421 -323
- package/js/calendar.js +334 -25
- package/js/carousel.js +182 -48
- package/js/collapse.js +148 -34
- package/js/color-picker.js +416 -108
- package/js/component.js +8 -19
- package/js/countdown.js +9 -8
- package/js/data-bind.js +73 -16
- package/js/datepicker.js +488 -110
- package/js/depends.js +710 -0
- package/js/dialog.js +4 -2
- package/js/drawer.js +172 -8
- package/js/dropdown.js +272 -17
- package/js/dynamic-tags.js +156 -40
- package/js/fileupload.js +9 -8
- package/js/form.js +280 -254
- package/js/global-events.js +281 -188
- package/js/heatmap.js +10 -7
- package/js/i18n.js +18 -10
- package/js/icons.js +141 -161
- package/js/image-preview.js +146 -2
- package/js/initializer.js +151 -71
- package/js/kupola-core.js +123 -45
- package/js/kupola-lifecycle.js +13 -11
- package/js/message.js +8 -1
- package/js/modal.js +207 -59
- package/js/notification.js +8 -1
- package/js/numberinput.js +9 -8
- package/js/pagination.js +263 -0
- package/js/registry.js +29 -12
- package/js/select.js +482 -27
- package/js/slide-captcha.js +11 -2
- package/js/slider.js +442 -25
- package/js/statcard.js +9 -7
- package/js/table.js +1210 -0
- package/js/tag.js +268 -14
- package/js/theme-standalone.js +88 -0
- package/js/theme.js +14 -43
- package/js/timepicker.js +335 -66
- package/js/tooltip.js +317 -86
- package/js/utils.js +6 -2
- package/js/validation.js +6 -2
- package/js/virtual-list.js +11 -7
- package/js/web-components.js +288 -0
- package/package.json +81 -67
- package/plugins/vite-plugin-kupola.js +120 -0
- package/scripts/build-css.cjs +113 -0
- package/scripts/build-svg-sprite.cjs +107 -0
- package/types/kupola.d.ts +421 -323
- package/CHANGELOG.md +0 -130
- package/INTEGRATION.md +0 -440
- package/PROJECT_SUMMARY.md +0 -312
- package/SKILL.md +0 -572
- package/dist/utils/utils/Kupola.cs +0 -77
- package/dist/utils/utils/Kupola.java +0 -104
- package/dist/utils/utils/kupola.go +0 -120
- package/dist/utils/utils/kupola.js +0 -63
- package/dist/utils/utils/kupola.py +0 -1392
- package/dist/utils/utils/kupola.rb +0 -69
- package/js/composition-api.js +0 -458
- package/js/error-handler.js +0 -181
- package/js/http.js +0 -419
- package/js/kupola-devtools.js +0 -598
- package/js/performance.js +0 -250
- package/js/router.js +0 -396
- package/js/security.js +0 -189
- package/js/test-utils.js +0 -251
- package/templates/base.html +0 -30
- package/templates/base_dashboard.html +0 -99
- package/utils/Kupola.cs +0 -77
- package/utils/Kupola.java +0 -104
- package/utils/kupola.go +0 -120
- package/utils/kupola.js +0 -63
- package/utils/kupola.py +0 -1392
- package/utils/kupola.rb +0 -69
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 KUPOLA
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,286 +1,330 @@
|
|
|
1
|
-
# Kupola
|
|
2
|
-
|
|
3
|
-
A lightweight
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
###
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
-
|
|
282
|
-
-
|
|
283
|
-
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
1
|
+
# Kupola
|
|
2
|
+
|
|
3
|
+
> A lightweight, dependency-free declarative UI component system for server-side rendered web applications.
|
|
4
|
+
>
|
|
5
|
+
> 零外部框架依赖的声明式 UI 组件系统,适用于任何服务端渲染 Web 应用。
|
|
6
|
+
|
|
7
|
+
[](https://github.com/kupola-cn/kupola/blob/main/LICENSE)
|
|
8
|
+
[](https://www.npmjs.com/package/@kupola/kupola)
|
|
9
|
+
[](https://bundlephobia.com/package/@kupola/kupola)
|
|
10
|
+
[](https://github.com/kupola-cn/kupola/stargazers)
|
|
11
|
+
|
|
12
|
+
**HTMX** (data fetching) + **Alpine.js** (declarative interaction) + **Bootstrap** (component richness) — in one zero-dependency package.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🌐 Languages / 语言
|
|
17
|
+
|
|
18
|
+
- [English](#english)
|
|
19
|
+
- [中文](#中文)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
<a id="english"></a>
|
|
24
|
+
## ✨ Features
|
|
25
|
+
|
|
26
|
+
- **50+ UI Components** — Buttons, inputs, cards, modals, datepickers, timepickers, heatmap, virtual list, stat cards, and more
|
|
27
|
+
- **Declarative Data Dependencies** — `useDeps()` with auto-caching, retry, refresh, and transform
|
|
28
|
+
- **HTTP Client Plugin System** — Plug in Axios, @navios/http, or any HTTP client; interceptors preserved
|
|
29
|
+
- **Reactive Data Binding** — Two-way binding with `ref()` / `store()` (Proxy-based)
|
|
30
|
+
- **Dual Themes** — Dark-first design with light theme support
|
|
31
|
+
- **11 Brand Colors** — Switchable brand themes inspired by Chinese traditional colors
|
|
32
|
+
- **Responsive** — PC, Pad, and Phone
|
|
33
|
+
- **Accessible** — WCAG AA compliant
|
|
34
|
+
- **Form Validation** — Built-in validation with custom rules
|
|
35
|
+
- **Zero Dependencies** — Pure HTML/CSS/JavaScript, ~88 KB gzipped
|
|
36
|
+
- **Backend Agnostic** — Works with Flask, Django, FastAPI, Gin, Spring Boot, ASP.NET, Express, Rails, Actix-web, and any backend that outputs HTML
|
|
37
|
+
- **TypeScript Ready** — Full type definitions included
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 🚀 Quick Start
|
|
42
|
+
|
|
43
|
+
### npm
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install @kupola/kupola
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```html
|
|
50
|
+
<link rel="stylesheet" href="node_modules/@kupola/kupola/dist/css/kupola.css">
|
|
51
|
+
<script src="node_modules/@kupola/kupola/dist/kupola.esm.js" type="module"></script>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### CDN
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<!-- ESM (modern browsers) -->
|
|
58
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/css/kupola.css">
|
|
59
|
+
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola.esm.js" type="module"></script>
|
|
60
|
+
|
|
61
|
+
<!-- UMD (legacy) -->
|
|
62
|
+
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola.umd.js"></script>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 📦 Usage
|
|
68
|
+
|
|
69
|
+
### Components (HTML-only, no JS needed)
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<button class="ds-btn ds-btn--brand">Primary</button>
|
|
73
|
+
<button class="ds-btn ds-btn--outline">Outline</button>
|
|
74
|
+
|
|
75
|
+
<div class="ds-card">
|
|
76
|
+
<div class="ds-card__header">
|
|
77
|
+
<h3 class="ds-card__title">Card Title</h3>
|
|
78
|
+
</div>
|
|
79
|
+
<div class="ds-card__body">Card content</div>
|
|
80
|
+
</div>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Data Binding
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<input type="text" data-bind="user.name:value" placeholder="Name">
|
|
87
|
+
<span data-bind="user.name:text"></span>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```js
|
|
91
|
+
kupolaData.data.user = { name: 'John' };
|
|
92
|
+
kupolaData.data.user.name = 'Jane'; // Auto-updates all bound elements
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Declarative Data Dependencies
|
|
96
|
+
|
|
97
|
+
```html
|
|
98
|
+
<div data-deps="users:fetch:/api/users">
|
|
99
|
+
<template data-each="users">
|
|
100
|
+
<span data-bind="item.name:text"></span>
|
|
101
|
+
</template>
|
|
102
|
+
</div>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```js
|
|
106
|
+
import { useDeps } from 'kupola';
|
|
107
|
+
useDeps({ users: { url: '/api/users', staleTime: 60000 } });
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### HTTP Client Plugin (Axios Example)
|
|
111
|
+
|
|
112
|
+
```js
|
|
113
|
+
import { configureHttpClient } from 'kupola';
|
|
114
|
+
import { createAxiosAdapter } from 'kupola/adapters/axios';
|
|
115
|
+
import axios from 'axios';
|
|
116
|
+
|
|
117
|
+
const api = axios.create({ baseURL: '/api' });
|
|
118
|
+
api.interceptors.request.use(config => {
|
|
119
|
+
config.headers.Authorization = `Bearer ${getToken()}`;
|
|
120
|
+
return config;
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// All useDeps() requests now go through Axios
|
|
124
|
+
configureHttpClient(createAxiosAdapter(api));
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### HTTP Client Plugin (@navios/http Example)
|
|
128
|
+
|
|
129
|
+
```js
|
|
130
|
+
import { configureHttpClient } from 'kupola';
|
|
131
|
+
import { createNaviosAdapter } from 'kupola/adapters/navios-http';
|
|
132
|
+
import { create } from '@navios/http';
|
|
133
|
+
|
|
134
|
+
const client = create({ baseURL: '/api' });
|
|
135
|
+
client.interceptors.request.use(config => {
|
|
136
|
+
config.headers['Authorization'] = `Bearer ${getToken()}`;
|
|
137
|
+
return config;
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
configureHttpClient(createNaviosAdapter(client));
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 📖 Documentation
|
|
146
|
+
|
|
147
|
+
- [Usage Guide](docs/usage-guide.md) — Getting started and API reference
|
|
148
|
+
- [Integration Guide](INTEGRATION.md) — Framework integration examples
|
|
149
|
+
- [Kupola vs Vue/React](docs/kupola-vs-vue-react.md) — Architecture comparison
|
|
150
|
+
- [Contributing](CONTRIBUTING.md) — How to contribute
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 🛠️ Development
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npm install # Install dependencies
|
|
158
|
+
npm run dev # Dev server (Vite, hot reload)
|
|
159
|
+
npm run build # Production build
|
|
160
|
+
npm run lint # Lint code
|
|
161
|
+
npm run test # Run tests
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 🌐 Browser Support
|
|
167
|
+
|
|
168
|
+
Chrome, Firefox, Safari, Edge (latest)
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
<a id="中文"></a>
|
|
173
|
+
## ✨ 核心特性
|
|
174
|
+
|
|
175
|
+
- **50+ UI 组件** — 按钮、输入框、卡片、模态框、日期选择器、时间选择器、热力图、虚拟列表、统计卡片等
|
|
176
|
+
- **声明式数据依赖** — `useDeps()` 自动缓存、重试、刷新、数据转换
|
|
177
|
+
- **HTTP 客户端插件** — 无缝集成 Axios、@navios/http 或任意 HTTP 客户端,保留拦截器
|
|
178
|
+
- **响应式数据绑定** — 基于 Proxy 的双向绑定,`ref()` / `store()`
|
|
179
|
+
- **双主题** — 暗色优先设计,支持亮色主题切换
|
|
180
|
+
- **11 种品牌色** — 灵感源自中国传统色的可切换品牌主题
|
|
181
|
+
- **响应式** — 适配 PC、平板、手机
|
|
182
|
+
- **无障碍** — 符合 WCAG AA 标准
|
|
183
|
+
- **表单验证** — 内置验证系统,支持自定义规则
|
|
184
|
+
- **零依赖** — 纯 HTML/CSS/JavaScript,gzip 后约 88 KB
|
|
185
|
+
- **后端无关** — 支持 Flask、Django、FastAPI、Gin、Spring Boot、ASP.NET、Express、Rails、Actix-web 等任何输出 HTML 的后端
|
|
186
|
+
- **TypeScript 支持** — 完整类型定义
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 🚀 快速开始
|
|
191
|
+
|
|
192
|
+
### npm 安装
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
npm install @kupola/kupola
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```html
|
|
199
|
+
<link rel="stylesheet" href="node_modules/@kupola/kupola/dist/css/kupola.css">
|
|
200
|
+
<script src="node_modules/@kupola/kupola/dist/kupola.esm.js" type="module"></script>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### CDN 引入
|
|
204
|
+
|
|
205
|
+
```html
|
|
206
|
+
<!-- ESM(现代浏览器) -->
|
|
207
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/css/kupola.css">
|
|
208
|
+
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola.esm.js" type="module"></script>
|
|
209
|
+
|
|
210
|
+
<!-- UMD(传统方式) -->
|
|
211
|
+
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola.umd.js"></script>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 📦 使用示例
|
|
217
|
+
|
|
218
|
+
### 组件(纯 HTML,无需 JS)
|
|
219
|
+
|
|
220
|
+
```html
|
|
221
|
+
<button class="ds-btn ds-btn--brand">主要按钮</button>
|
|
222
|
+
<button class="ds-btn ds-btn--outline">描边按钮</button>
|
|
223
|
+
|
|
224
|
+
<div class="ds-card">
|
|
225
|
+
<div class="ds-card__header">
|
|
226
|
+
<h3 class="ds-card__title">卡片标题</h3>
|
|
227
|
+
</div>
|
|
228
|
+
<div class="ds-card__body">卡片内容</div>
|
|
229
|
+
</div>
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 数据绑定
|
|
233
|
+
|
|
234
|
+
```html
|
|
235
|
+
<input type="text" data-bind="user.name:value" placeholder="姓名">
|
|
236
|
+
<span data-bind="user.name:text"></span>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
```js
|
|
240
|
+
kupolaData.data.user = { name: '张三' };
|
|
241
|
+
kupolaData.data.user.name = '李四'; // 所有绑定元素自动更新
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 声明式数据依赖
|
|
245
|
+
|
|
246
|
+
```html
|
|
247
|
+
<div data-deps="users:fetch:/api/users">
|
|
248
|
+
<template data-each="users">
|
|
249
|
+
<span data-bind="item.name:text"></span>
|
|
250
|
+
</template>
|
|
251
|
+
</div>
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```js
|
|
255
|
+
import { useDeps } from 'kupola';
|
|
256
|
+
useDeps({ users: { url: '/api/users', staleTime: 60000 } });
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### HTTP 客户端插件(Axios 示例)
|
|
260
|
+
|
|
261
|
+
```js
|
|
262
|
+
import { configureHttpClient } from 'kupola';
|
|
263
|
+
import { createAxiosAdapter } from 'kupola/adapters/axios';
|
|
264
|
+
import axios from 'axios';
|
|
265
|
+
|
|
266
|
+
const api = axios.create({ baseURL: '/api' });
|
|
267
|
+
api.interceptors.request.use(config => {
|
|
268
|
+
config.headers.Authorization = `Bearer ${getToken()}`;
|
|
269
|
+
return config;
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// 之后所有 useDeps() 请求自动走 Axios + 拦截器
|
|
273
|
+
configureHttpClient(createAxiosAdapter(api));
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## 📖 文档
|
|
279
|
+
|
|
280
|
+
- [使用指南](docs/usage-guide.md) — 入门与 API 参考
|
|
281
|
+
- [集成指南](INTEGRATION.md) — 后端框架集成示例
|
|
282
|
+
- [Kupola 与 Vue/React 对比](docs/kupola-vs-vue-react.md) — 架构对比
|
|
283
|
+
- [贡献指南](CONTRIBUTING.md) — 如何参与贡献
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 🛠️ 开发
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
npm install # 安装依赖
|
|
291
|
+
npm run dev # 开发服务器(Vite,热更新)
|
|
292
|
+
npm run build # 生产构建
|
|
293
|
+
npm run lint # 代码检查
|
|
294
|
+
npm run test # 运行测试
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## 🌐 浏览器支持
|
|
300
|
+
|
|
301
|
+
Chrome、Firefox、Safari、Edge(最新版本)
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## 🤝 Contributing / 贡献
|
|
306
|
+
|
|
307
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 🙏 Acknowledgments / 致谢
|
|
312
|
+
|
|
313
|
+
Kupola is built with the help of these excellent open-source tools:
|
|
314
|
+
|
|
315
|
+
**Build & Dev Tooling:**
|
|
316
|
+
- [Vite](https://vitejs.dev/) — Next generation frontend tooling
|
|
317
|
+
- [Rollup](https://rollupjs.org/) — ES module bundler
|
|
318
|
+
- [ESLint](https://eslint.org/) — JavaScript linter
|
|
319
|
+
- [Prettier](https://prettier.io/) — Code formatter
|
|
320
|
+
- [Jest](https://jestjs.io/) — JavaScript testing framework
|
|
321
|
+
|
|
322
|
+
**HTTP Client Adapters (optional, user-installed):**
|
|
323
|
+
- [Axios](https://axios-http.com/) — Promise based HTTP client
|
|
324
|
+
- [@navios/http](https://www.npmjs.com/package/@navios/http) — Lightweight fetch-based Axios replacement
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 📄 License
|
|
329
|
+
|
|
330
|
+
[MIT](LICENSE) © Kupola Team
|