@kupola/kupola 1.9.16 → 2.0.0-beta.1
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/README.md +248 -400
- package/README.zh-CN.md +335 -0
- package/dist/css/components.css +239 -1542
- package/dist/css/index.css +13 -0
- package/dist/css/tokens.css +182 -0
- package/dist/kupola-core-alert.cjs.js +9 -0
- package/dist/kupola-core-alert.esm.js +9 -0
- package/dist/kupola-core-avatar.cjs.js +1 -0
- package/dist/kupola-core-avatar.esm.js +1 -0
- package/dist/kupola-core-badge.cjs.js +3 -0
- package/dist/kupola-core-badge.esm.js +3 -0
- package/dist/kupola-core-breadcrumb.cjs.js +1 -0
- package/dist/kupola-core-breadcrumb.esm.js +1 -0
- package/dist/kupola-core-calendar.cjs.js +1 -0
- package/dist/kupola-core-calendar.esm.js +1 -0
- package/dist/kupola-core-carousel.cjs.js +12 -0
- package/dist/kupola-core-carousel.esm.js +12 -0
- package/dist/kupola-core-checkbox.cjs.js +7 -0
- package/dist/kupola-core-checkbox.esm.js +7 -0
- package/dist/kupola-core-collapse.cjs.js +11 -0
- package/dist/kupola-core-collapse.esm.js +11 -0
- package/dist/kupola-core-colorpicker.cjs.js +14 -0
- package/dist/kupola-core-colorpicker.esm.js +14 -0
- package/dist/kupola-core-countdown.cjs.js +23 -0
- package/dist/kupola-core-countdown.esm.js +23 -0
- package/dist/kupola-core-datepicker.cjs.js +28 -0
- package/dist/kupola-core-datepicker.esm.js +28 -0
- package/dist/kupola-core-dialog.cjs.js +13 -0
- package/dist/kupola-core-dialog.esm.js +13 -0
- package/dist/kupola-core-directives.cjs.js +1 -0
- package/dist/kupola-core-directives.esm.js +1 -0
- package/dist/kupola-core-divider.cjs.js +1 -0
- package/dist/kupola-core-divider.esm.js +1 -0
- package/dist/kupola-core-drawer.cjs.js +15 -0
- package/dist/kupola-core-drawer.esm.js +15 -0
- package/dist/kupola-core-dropdown.cjs.js +11 -0
- package/dist/kupola-core-dropdown.esm.js +11 -0
- package/dist/kupola-core-dynamictags.cjs.js +8 -0
- package/dist/kupola-core-dynamictags.esm.js +8 -0
- package/dist/kupola-core-empty.cjs.js +7 -0
- package/dist/kupola-core-empty.esm.js +7 -0
- package/dist/kupola-core-fileupload.cjs.js +15 -0
- package/dist/kupola-core-fileupload.esm.js +15 -0
- package/dist/kupola-core-form.cjs.js +1 -0
- package/dist/kupola-core-form.esm.js +1 -0
- package/dist/kupola-core-heatmap.cjs.js +1 -0
- package/dist/kupola-core-heatmap.esm.js +1 -0
- package/dist/kupola-core-i18n.cjs.js +1 -0
- package/dist/kupola-core-i18n.esm.js +1 -0
- package/dist/kupola-core-icons.cjs.js +1 -0
- package/dist/kupola-core-icons.esm.js +1 -0
- package/dist/kupola-core-imagepreview.cjs.js +20 -0
- package/dist/kupola-core-imagepreview.esm.js +20 -0
- package/dist/kupola-core-input.cjs.js +5 -0
- package/dist/kupola-core-input.esm.js +5 -0
- package/dist/kupola-core-kbd.cjs.js +1 -0
- package/dist/kupola-core-kbd.esm.js +1 -0
- package/dist/kupola-core-menu.cjs.js +1 -0
- package/dist/kupola-core-menu.esm.js +1 -0
- package/dist/kupola-core-message.cjs.js +1 -0
- package/dist/kupola-core-message.esm.js +1 -0
- package/dist/kupola-core-modal.cjs.js +15 -0
- package/dist/kupola-core-modal.esm.js +15 -0
- package/dist/kupola-core-notification.cjs.js +1 -0
- package/dist/kupola-core-notification.esm.js +1 -0
- package/dist/kupola-core-numberinput.cjs.js +7 -0
- package/dist/kupola-core-numberinput.esm.js +7 -0
- package/dist/kupola-core-pagination.cjs.js +12 -0
- package/dist/kupola-core-pagination.esm.js +12 -0
- package/dist/kupola-core-progress.cjs.js +5 -0
- package/dist/kupola-core-progress.esm.js +5 -0
- package/dist/kupola-core-radio.cjs.js +1 -0
- package/dist/kupola-core-radio.esm.js +1 -0
- package/dist/kupola-core-select.cjs.js +15 -0
- package/dist/kupola-core-select.esm.js +15 -0
- package/dist/kupola-core-server.cjs.js +1 -0
- package/dist/kupola-core-server.esm.js +1 -0
- package/dist/kupola-core-skeleton.cjs.js +1 -0
- package/dist/kupola-core-skeleton.esm.js +1 -0
- package/dist/kupola-core-slider.cjs.js +15 -0
- package/dist/kupola-core-slider.esm.js +15 -0
- package/dist/kupola-core-spin.cjs.js +6 -0
- package/dist/kupola-core-spin.esm.js +6 -0
- package/dist/kupola-core-statcard.cjs.js +18 -0
- package/dist/kupola-core-statcard.esm.js +18 -0
- package/dist/kupola-core-switch.cjs.js +6 -0
- package/dist/kupola-core-switch.esm.js +6 -0
- package/dist/kupola-core-table.cjs.js +1 -0
- package/dist/kupola-core-table.esm.js +1 -0
- package/dist/kupola-core-tabs.cjs.js +6 -0
- package/dist/kupola-core-tabs.esm.js +6 -0
- package/dist/kupola-core-tag.cjs.js +6 -0
- package/dist/kupola-core-tag.esm.js +6 -0
- package/dist/kupola-core-textarea.cjs.js +3 -0
- package/dist/kupola-core-textarea.esm.js +3 -0
- package/dist/kupola-core-timeline.cjs.js +1 -0
- package/dist/kupola-core-timeline.esm.js +1 -0
- package/dist/kupola-core-timepicker.cjs.js +22 -0
- package/dist/kupola-core-timepicker.esm.js +22 -0
- package/dist/kupola-core-tooltip.cjs.js +1 -0
- package/dist/kupola-core-tooltip.esm.js +1 -0
- package/dist/kupola-core-tree.cjs.js +1 -0
- package/dist/kupola-core-tree.esm.js +1 -0
- package/dist/kupola-core-validation.cjs.js +1 -0
- package/dist/kupola-core-validation.esm.js +1 -0
- package/dist/kupola-core-virtuallist.cjs.js +7 -0
- package/dist/kupola-core-virtuallist.esm.js +7 -0
- package/dist/kupola-core.cjs.js +1 -0
- package/dist/kupola-core.esm.js +1 -0
- package/package.json +217 -76
- package/packages/core/__tests__/component.test.js +269 -0
- package/packages/core/__tests__/components/alert.test.js +136 -0
- package/packages/core/__tests__/components/avatar.test.js +132 -0
- package/packages/core/__tests__/components/badge.test.js +187 -0
- package/packages/core/__tests__/components/breadcrumb.test.js +120 -0
- package/packages/core/__tests__/components/calendar.test.js +293 -0
- package/packages/core/__tests__/components/carousel.test.js +220 -0
- package/packages/core/__tests__/components/checkbox.test.js +139 -0
- package/packages/core/__tests__/components/collapse.test.js +220 -0
- package/packages/core/__tests__/components/colorpicker.test.js +173 -0
- package/packages/core/__tests__/components/countdown.test.js +156 -0
- package/packages/core/__tests__/components/datepicker.test.js +344 -0
- package/packages/core/__tests__/components/dialog.test.js +188 -0
- package/packages/core/__tests__/components/divider.test.js +84 -0
- package/packages/core/__tests__/components/drawer.test.js +230 -0
- package/packages/core/__tests__/components/dropdown.test.js +324 -0
- package/packages/core/__tests__/components/dynamictags.test.js +239 -0
- package/packages/core/__tests__/components/empty.test.js +107 -0
- package/packages/core/__tests__/components/fileupload.test.js +151 -0
- package/packages/core/__tests__/components/form.test.js +258 -0
- package/packages/core/__tests__/components/heatmap.test.js +161 -0
- package/packages/core/__tests__/components/icons.test.js +166 -0
- package/packages/core/__tests__/components/imagepreview.test.js +166 -0
- package/packages/core/__tests__/components/input.test.js +165 -0
- package/packages/core/__tests__/components/kbd.test.js +74 -0
- package/packages/core/__tests__/components/menu.test.js +131 -0
- package/packages/core/__tests__/components/message.test.js +136 -0
- package/packages/core/__tests__/components/modal.test.js +291 -0
- package/packages/core/__tests__/components/notification.test.js +164 -0
- package/packages/core/__tests__/components/numberinput.test.js +153 -0
- package/packages/core/__tests__/components/pagination.test.js +229 -0
- package/packages/core/__tests__/components/progress.test.js +156 -0
- package/packages/core/__tests__/components/radio.test.js +167 -0
- package/packages/core/__tests__/components/select.test.js +352 -0
- package/packages/core/__tests__/components/skeleton.test.js +126 -0
- package/packages/core/__tests__/components/slider.test.js +177 -0
- package/packages/core/__tests__/components/spin.test.js +95 -0
- package/packages/core/__tests__/components/statcard.test.js +167 -0
- package/packages/core/__tests__/components/switch.test.js +145 -0
- package/packages/core/__tests__/components/table.test.js +611 -0
- package/packages/core/__tests__/components/tabs.test.js +185 -0
- package/packages/core/__tests__/components/tag.test.js +130 -0
- package/packages/core/__tests__/components/textarea.test.js +137 -0
- package/packages/core/__tests__/components/timeline.test.js +126 -0
- package/packages/core/__tests__/components/timepicker.test.js +184 -0
- package/packages/core/__tests__/components/tooltip.test.js +237 -0
- package/packages/core/__tests__/components/tree.test.js +238 -0
- package/packages/core/__tests__/components/validation.test.js +256 -0
- package/packages/core/__tests__/components/virtuallist.test.js +141 -0
- package/packages/core/__tests__/core.test.js +357 -0
- package/packages/core/__tests__/directives.test.js +467 -0
- package/packages/core/__tests__/server.test.js +290 -0
- package/packages/core/__tests__/template.test.js +301 -0
- package/packages/core/package.json +234 -0
- package/packages/core/src/batch.js +66 -0
- package/packages/core/src/component.js +154 -0
- package/packages/core/src/components/alert.js +92 -0
- package/packages/core/src/components/avatar.js +87 -0
- package/packages/core/src/components/badge.js +106 -0
- package/packages/core/src/components/breadcrumb.js +83 -0
- package/packages/core/src/components/calendar.js +442 -0
- package/packages/core/src/components/carousel.js +173 -0
- package/packages/core/src/components/checkbox.js +101 -0
- package/packages/core/src/components/collapse.js +148 -0
- package/packages/core/src/components/colorpicker.js +147 -0
- package/packages/core/src/components/countdown.js +142 -0
- package/packages/core/src/components/datepicker.js +378 -0
- package/packages/core/src/components/dialog.js +142 -0
- package/packages/core/src/components/divider.js +63 -0
- package/packages/core/src/components/drawer.js +125 -0
- package/packages/core/src/components/dropdown.js +191 -0
- package/packages/core/src/components/dynamictags.js +173 -0
- package/packages/core/src/components/empty.js +71 -0
- package/packages/core/src/components/fileupload.js +203 -0
- package/packages/core/src/components/form.js +257 -0
- package/packages/core/src/components/heatmap.js +324 -0
- package/{js → packages/core/src/components}/icons.js +42 -55
- package/packages/core/src/components/imagepreview.js +146 -0
- package/packages/core/src/components/input.js +117 -0
- package/packages/core/src/components/kbd.js +53 -0
- package/packages/core/src/components/menu.js +105 -0
- package/packages/core/src/components/message.js +115 -0
- package/packages/core/src/components/modal.js +123 -0
- package/packages/core/src/components/notification.js +150 -0
- package/packages/core/src/components/numberinput.js +141 -0
- package/packages/core/src/components/pagination.js +186 -0
- package/packages/core/src/components/progress.js +107 -0
- package/packages/core/src/components/radio.js +128 -0
- package/packages/core/src/components/select.js +340 -0
- package/packages/core/src/components/skeleton.js +77 -0
- package/packages/core/src/components/slider.js +134 -0
- package/packages/core/src/components/spin.js +58 -0
- package/packages/core/src/components/statcard.js +100 -0
- package/packages/core/src/components/switch.js +105 -0
- package/packages/core/src/components/table.js +916 -0
- package/packages/core/src/components/tabs.js +139 -0
- package/packages/core/src/components/tag.js +89 -0
- package/packages/core/src/components/textarea.js +115 -0
- package/packages/core/src/components/timeline.js +91 -0
- package/packages/core/src/components/timepicker.js +212 -0
- package/packages/core/src/components/tooltip.js +184 -0
- package/packages/core/src/components/tree.js +156 -0
- package/packages/core/src/components/types.d.ts +917 -0
- package/packages/core/src/components/validation.js +329 -0
- package/packages/core/src/components/virtuallist.js +157 -0
- package/packages/core/src/computed.js +118 -0
- package/packages/core/src/directives.js +413 -0
- package/packages/core/src/effect.js +98 -0
- package/packages/core/src/i18n.js +86 -0
- package/packages/core/src/index.js +42 -0
- package/packages/core/src/render.js +431 -0
- package/packages/core/src/scheduler.js +51 -0
- package/packages/core/src/server.js +446 -0
- package/packages/core/src/signal.js +157 -0
- package/packages/core/src/template.js +51 -0
- package/packages/css/components.css +273 -0
- package/packages/css/index.css +13 -0
- package/packages/css/tokens.css +182 -0
- package/version.json +1 -1
- package/adapters/axios.d.ts +0 -34
- package/adapters/axios.js +0 -122
- package/adapters/navios-http.d.ts +0 -110
- package/adapters/navios-http.js +0 -151
- package/css/accessibility.css +0 -119
- package/css/animations.css +0 -224
- package/css/brand-themes.css +0 -300
- package/css/colors-and-type.css +0 -408
- package/css/components-ext.css +0 -4401
- package/css/components.css +0 -1576
- package/css/dashboard.css +0 -425
- package/css/kupola.css +0 -13
- package/css/responsive.css +0 -697
- package/css/scaffold.css +0 -155
- package/css/states.css +0 -316
- package/css/table.css +0 -75
- package/css/theme.css +0 -568
- package/css/utilities.css +0 -334
- package/dist/core-Cs-VWZ5H.cjs +0 -1
- package/dist/core-DBjFFC_n.js +0 -4959
- package/dist/core.cjs.js +0 -1
- package/dist/core.esm.js +0 -106
- package/dist/css/accessibility.css +0 -119
- package/dist/css/animations.css +0 -224
- package/dist/css/brand-themes.css +0 -300
- package/dist/css/colors-and-type.css +0 -408
- package/dist/css/components-ext.css +0 -4401
- package/dist/css/dashboard.css +0 -368
- package/dist/css/kupola.css +0 -14
- package/dist/css/responsive.css +0 -697
- package/dist/css/scaffold.css +0 -155
- package/dist/css/states.css +0 -316
- package/dist/css/table.css +0 -75
- package/dist/css/theme-dark.css +0 -341
- package/dist/css/theme-light.css +0 -298
- package/dist/css/utilities.css +0 -334
- package/dist/icons/icons/activity.svg +0 -3
- package/dist/icons/icons/alert-circle.svg +0 -1
- package/dist/icons/icons/alert-triangle.svg +0 -1
- package/dist/icons/icons/alert.d27e24.svg +0 -1
- package/dist/icons/icons/alert.svg +0 -1
- package/dist/icons/icons/apple.svg +0 -1
- package/dist/icons/icons/arrow-down.svg +0 -1
- package/dist/icons/icons/arrow-expand.svg +0 -1
- package/dist/icons/icons/arrow-left.svg +0 -1
- package/dist/icons/icons/arrow-minimize.svg +0 -1
- package/dist/icons/icons/arrow-right-to-line.svg +0 -1
- package/dist/icons/icons/arrow-right.svg +0 -1
- package/dist/icons/icons/arrow-up-right.svg +0 -1
- package/dist/icons/icons/arrow-up.0c0c0d.svg +0 -1
- package/dist/icons/icons/arrow-up.svg +0 -1
- package/dist/icons/icons/at.svg +0 -1
- package/dist/icons/icons/atom.0c0c0d.svg +0 -1
- package/dist/icons/icons/atom.svg +0 -1
- package/dist/icons/icons/bar-chart-2.svg +0 -1
- package/dist/icons/icons/bar.svg +0 -1
- package/dist/icons/icons/bell.svg +0 -1
- package/dist/icons/icons/box.svg +0 -1
- package/dist/icons/icons/bug.svg +0 -1
- package/dist/icons/icons/button.svg +0 -1
- package/dist/icons/icons/calendar.svg +0 -1
- package/dist/icons/icons/check-circle.33c192.svg +0 -1
- package/dist/icons/icons/check-circle.svg +0 -1
- package/dist/icons/icons/check-square.svg +0 -4
- package/dist/icons/icons/check.d1d3db.svg +0 -1
- package/dist/icons/icons/check.svg +0 -1
- package/dist/icons/icons/chevron-down.svg +0 -1
- package/dist/icons/icons/chevron-left.svg +0 -1
- package/dist/icons/icons/chevron-right.svg +0 -1
- package/dist/icons/icons/chevron-up.svg +0 -1
- package/dist/icons/icons/circle.svg +0 -1
- package/dist/icons/icons/clock.svg +0 -1
- package/dist/icons/icons/cmd.svg +0 -1
- package/dist/icons/icons/code.svg +0 -1
- package/dist/icons/icons/columns.svg +0 -1
- package/dist/icons/icons/copy.svg +0 -1
- package/dist/icons/icons/cpu.svg +0 -1
- package/dist/icons/icons/dashboard.0c0c0d.svg +0 -1
- package/dist/icons/icons/dashboard.svg +0 -1
- package/dist/icons/icons/dollar.svg +0 -1
- package/dist/icons/icons/download.svg +0 -1
- package/dist/icons/icons/edit.svg +0 -1
- package/dist/icons/icons/extensions.svg +0 -1
- package/dist/icons/icons/external.svg +0 -1
- package/dist/icons/icons/eye.svg +0 -1
- package/dist/icons/icons/file-text.svg +0 -1
- package/dist/icons/icons/file.svg +0 -1
- package/dist/icons/icons/files.svg +0 -1
- package/dist/icons/icons/filter.svg +0 -1
- package/dist/icons/icons/folder-open.svg +0 -4
- package/dist/icons/icons/folder.svg +0 -1
- package/dist/icons/icons/gear.svg +0 -1
- package/dist/icons/icons/git.svg +0 -1
- package/dist/icons/icons/github.svg +0 -1
- package/dist/icons/icons/globe.svg +0 -1
- package/dist/icons/icons/grid-2x2.svg +0 -1
- package/dist/icons/icons/hash.svg +0 -1
- package/dist/icons/icons/heart.svg +0 -1
- package/dist/icons/icons/help-circle.svg +0 -5
- package/dist/icons/icons/help.svg +0 -1
- package/dist/icons/icons/home.svg +0 -1
- package/dist/icons/icons/icons.svg +0 -153
- package/dist/icons/icons/image.svg +0 -1
- package/dist/icons/icons/info-circle.svg +0 -1
- package/dist/icons/icons/info-square.svg +0 -1
- package/dist/icons/icons/info.387bff.svg +0 -1
- package/dist/icons/icons/info.svg +0 -1
- package/dist/icons/icons/input.svg +0 -1
- package/dist/icons/icons/key.svg +0 -1
- package/dist/icons/icons/layers.svg +0 -1
- package/dist/icons/icons/layout-grid.svg +0 -6
- package/dist/icons/icons/layout.svg +0 -1
- package/dist/icons/icons/link.svg +0 -1
- package/dist/icons/icons/list.svg +0 -1
- package/dist/icons/icons/lock.svg +0 -1
- package/dist/icons/icons/log-out.svg +0 -1
- package/dist/icons/icons/logo.svg +0 -1
- package/dist/icons/icons/mail.svg +0 -1
- package/dist/icons/icons/menu.svg +0 -1
- package/dist/icons/icons/message-circle.svg +0 -1
- package/dist/icons/icons/message-plus.svg +0 -1
- package/dist/icons/icons/message-square.svg +0 -1
- package/dist/icons/icons/mic.svg +0 -1
- package/dist/icons/icons/minus.svg +0 -1
- package/dist/icons/icons/moon.svg +0 -1
- package/dist/icons/icons/more-h.svg +0 -1
- package/dist/icons/icons/mouse.svg +0 -1
- package/dist/icons/icons/palette.svg +0 -1
- package/dist/icons/icons/panel-bottom.svg +0 -1
- package/dist/icons/icons/pause.svg +0 -1
- package/dist/icons/icons/play.svg +0 -1
- package/dist/icons/icons/plug.svg +0 -1
- package/dist/icons/icons/plus.0c0c0d.svg +0 -1
- package/dist/icons/icons/plus.svg +0 -1
- package/dist/icons/icons/refresh.svg +0 -1
- package/dist/icons/icons/ruler.svg +0 -1
- package/dist/icons/icons/scroll-text.svg +0 -1
- package/dist/icons/icons/search-menu.svg +0 -1
- package/dist/icons/icons/search.svg +0 -1
- package/dist/icons/icons/send.0c0c0d.svg +0 -1
- package/dist/icons/icons/send.svg +0 -1
- package/dist/icons/icons/settings.0c0c0d.svg +0 -1
- package/dist/icons/icons/settings.svg +0 -1
- package/dist/icons/icons/shield.svg +0 -1
- package/dist/icons/icons/sidebar-left.svg +0 -1
- package/dist/icons/icons/sidebar-right.svg +0 -1
- package/dist/icons/icons/sliders.svg +0 -1
- package/dist/icons/icons/sparkles.32f08c.svg +0 -1
- package/dist/icons/icons/sparkles.svg +0 -1
- package/dist/icons/icons/square.svg +0 -1
- package/dist/icons/icons/star.svg +0 -1
- package/dist/icons/icons/sun.svg +0 -1
- package/dist/icons/icons/table.svg +0 -1
- package/dist/icons/icons/terminal.svg +0 -1
- package/dist/icons/icons/trash.svg +0 -1
- package/dist/icons/icons/trending-down.svg +0 -1
- package/dist/icons/icons/trending-up.svg +0 -1
- package/dist/icons/icons/type.svg +0 -1
- package/dist/icons/icons/upload.svg +0 -1
- package/dist/icons/icons/user-circle.svg +0 -1
- package/dist/icons/icons/user-plus.svg +0 -6
- package/dist/icons/icons/user.svg +0 -1
- package/dist/icons/icons/users.svg +0 -1
- package/dist/icons/icons/warning.svg +0 -1
- package/dist/icons/icons/wrench.svg +0 -1
- package/dist/icons/icons/x-circle.svg +0 -1
- package/dist/icons/icons/x.svg +0 -1
- package/dist/icons/icons/zap.0c0c0d.svg +0 -1
- package/dist/icons/icons/zap.svg +0 -1
- package/dist/kupola.cjs.js +0 -1
- package/dist/kupola.css +0 -9601
- package/dist/kupola.esm.js +0 -9965
- package/dist/kupola.min.css +0 -1
- package/dist/plugins/vite-plugin-kupola.js +0 -142
- package/dist/plugins/webpack-plugin-kupola.js +0 -69
- package/dist/react-theme.js +0 -111
- package/dist/theme-preload.js +0 -75
- package/dist/theme-standalone.js +0 -161
- package/dist/types/kupola.d.ts +0 -1608
- package/dist/vue-theme.js +0 -78
- package/icons/activity.svg +0 -3
- package/icons/alert-circle.svg +0 -1
- package/icons/alert-triangle.svg +0 -1
- package/icons/alert.d27e24.svg +0 -1
- package/icons/alert.svg +0 -1
- package/icons/apple.svg +0 -1
- package/icons/arrow-down.svg +0 -1
- package/icons/arrow-expand.svg +0 -1
- package/icons/arrow-left.svg +0 -1
- package/icons/arrow-minimize.svg +0 -1
- package/icons/arrow-right-to-line.svg +0 -1
- package/icons/arrow-right.svg +0 -1
- package/icons/arrow-up-right.svg +0 -1
- package/icons/arrow-up.0c0c0d.svg +0 -1
- package/icons/arrow-up.svg +0 -1
- package/icons/at.svg +0 -1
- package/icons/atom.0c0c0d.svg +0 -1
- package/icons/atom.svg +0 -1
- package/icons/bar-chart-2.svg +0 -1
- package/icons/bar.svg +0 -1
- package/icons/bell.svg +0 -1
- package/icons/box.svg +0 -1
- package/icons/bug.svg +0 -1
- package/icons/button.svg +0 -1
- package/icons/calendar.svg +0 -1
- package/icons/check-circle.33c192.svg +0 -1
- package/icons/check-circle.svg +0 -1
- package/icons/check-square.svg +0 -4
- package/icons/check.d1d3db.svg +0 -1
- package/icons/check.svg +0 -1
- package/icons/chevron-down.svg +0 -1
- package/icons/chevron-left.svg +0 -1
- package/icons/chevron-right.svg +0 -1
- package/icons/chevron-up.svg +0 -1
- package/icons/circle.svg +0 -1
- package/icons/clock.svg +0 -1
- package/icons/cmd.svg +0 -1
- package/icons/code.svg +0 -1
- package/icons/columns.svg +0 -1
- package/icons/copy.svg +0 -1
- package/icons/cpu.svg +0 -1
- package/icons/dashboard.0c0c0d.svg +0 -1
- package/icons/dashboard.svg +0 -1
- package/icons/dollar.svg +0 -1
- package/icons/download.svg +0 -1
- package/icons/edit.svg +0 -1
- package/icons/extensions.svg +0 -1
- package/icons/external.svg +0 -1
- package/icons/eye.svg +0 -1
- package/icons/file-text.svg +0 -1
- package/icons/file.svg +0 -1
- package/icons/files.svg +0 -1
- package/icons/filter.svg +0 -1
- package/icons/folder-open.svg +0 -4
- package/icons/folder.svg +0 -1
- package/icons/gear.svg +0 -1
- package/icons/git.svg +0 -1
- package/icons/github.svg +0 -1
- package/icons/globe.svg +0 -1
- package/icons/grid-2x2.svg +0 -1
- package/icons/hash.svg +0 -1
- package/icons/heart.svg +0 -1
- package/icons/help-circle.svg +0 -5
- package/icons/help.svg +0 -1
- package/icons/home.svg +0 -1
- package/icons/icons.svg +0 -153
- package/icons/image.svg +0 -1
- package/icons/info-circle.svg +0 -1
- package/icons/info-square.svg +0 -1
- package/icons/info.387bff.svg +0 -1
- package/icons/info.svg +0 -1
- package/icons/input.svg +0 -1
- package/icons/key.svg +0 -1
- package/icons/layers.svg +0 -1
- package/icons/layout-grid.svg +0 -6
- package/icons/layout.svg +0 -1
- package/icons/link.svg +0 -1
- package/icons/list.svg +0 -1
- package/icons/lock.svg +0 -1
- package/icons/log-out.svg +0 -1
- package/icons/logo.svg +0 -1
- package/icons/mail.svg +0 -1
- package/icons/menu.svg +0 -1
- package/icons/message-circle.svg +0 -1
- package/icons/message-plus.svg +0 -1
- package/icons/message-square.svg +0 -1
- package/icons/mic.svg +0 -1
- package/icons/minus.svg +0 -1
- package/icons/moon.svg +0 -1
- package/icons/more-h.svg +0 -1
- package/icons/mouse.svg +0 -1
- package/icons/palette.svg +0 -1
- package/icons/panel-bottom.svg +0 -1
- package/icons/pause.svg +0 -1
- package/icons/play.svg +0 -1
- package/icons/plug.svg +0 -1
- package/icons/plus.0c0c0d.svg +0 -1
- package/icons/plus.svg +0 -1
- package/icons/refresh.svg +0 -1
- package/icons/ruler.svg +0 -1
- package/icons/scroll-text.svg +0 -1
- package/icons/search-menu.svg +0 -1
- package/icons/search.svg +0 -1
- package/icons/send.0c0c0d.svg +0 -1
- package/icons/send.svg +0 -1
- package/icons/settings.0c0c0d.svg +0 -1
- package/icons/settings.svg +0 -1
- package/icons/shield.svg +0 -1
- package/icons/sidebar-left.svg +0 -1
- package/icons/sidebar-right.svg +0 -1
- package/icons/sliders.svg +0 -1
- package/icons/sparkles.32f08c.svg +0 -1
- package/icons/sparkles.svg +0 -1
- package/icons/square.svg +0 -1
- package/icons/star.svg +0 -1
- package/icons/sun.svg +0 -1
- package/icons/table.svg +0 -1
- package/icons/terminal.svg +0 -1
- package/icons/trash.svg +0 -1
- package/icons/trending-down.svg +0 -1
- package/icons/trending-up.svg +0 -1
- package/icons/type.svg +0 -1
- package/icons/upload.svg +0 -1
- package/icons/user-circle.svg +0 -1
- package/icons/user-plus.svg +0 -6
- package/icons/user.svg +0 -1
- package/icons/users.svg +0 -1
- package/icons/warning.svg +0 -1
- package/icons/wrench.svg +0 -1
- package/icons/x-circle.svg +0 -1
- package/icons/x.svg +0 -1
- package/icons/zap.0c0c0d.svg +0 -1
- package/icons/zap.svg +0 -1
- package/js/calendar.js +0 -486
- package/js/carousel.js +0 -300
- package/js/collapse.js +0 -234
- package/js/color-picker.js +0 -441
- package/js/component.js +0 -251
- package/js/countdown.js +0 -138
- package/js/data-bind.js +0 -1363
- package/js/datepicker.js +0 -716
- package/js/depends.js +0 -732
- package/js/dialog.js +0 -129
- package/js/drawer.js +0 -274
- package/js/dropdown.js +0 -509
- package/js/dynamic-tags.js +0 -265
- package/js/fileupload.js +0 -391
- package/js/form.js +0 -323
- package/js/global-events.js +0 -283
- package/js/heatmap.js +0 -399
- package/js/i18n.js +0 -226
- package/js/image-preview.js +0 -356
- package/js/initializer.js +0 -201
- package/js/kupola-config.js +0 -212
- package/js/kupola-core.js +0 -161
- package/js/kupola-lifecycle.js +0 -504
- package/js/message.js +0 -78
- package/js/modal.js +0 -348
- package/js/notification.js +0 -81
- package/js/numberinput.js +0 -140
- package/js/pagination.js +0 -258
- package/js/react-theme.js +0 -111
- package/js/registry.js +0 -218
- package/js/security.js +0 -113
- package/js/select.js +0 -701
- package/js/slide-captcha.js +0 -500
- package/js/slider.js +0 -504
- package/js/statcard.js +0 -213
- package/js/table.js +0 -1188
- package/js/tag.js +0 -330
- package/js/theme-preload.js +0 -75
- package/js/theme-standalone.js +0 -161
- package/js/theme.js +0 -372
- package/js/timepicker.js +0 -494
- package/js/tooltip.js +0 -353
- package/js/utils.js +0 -304
- package/js/validation.js +0 -567
- package/js/virtual-list.js +0 -572
- package/js/vue-theme.js +0 -78
- package/js/web-components.js +0 -279
- package/plugins/vite-plugin-kupola.js +0 -142
- package/plugins/webpack-plugin-kupola.js +0 -69
- package/scripts/build-css.cjs +0 -115
- package/scripts/build-svg-sprite.cjs +0 -107
- package/types/kupola.d.ts +0 -1608
package/README.md
CHANGED
|
@@ -1,487 +1,335 @@
|
|
|
1
|
-
|
|
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
|
-
## 📦 构建工具插件
|
|
24
|
-
|
|
25
|
-
### Vite 插件
|
|
26
|
-
|
|
27
|
-
```js
|
|
28
|
-
// vite.config.js
|
|
29
|
-
import { kupola } from '@kupola/kupola/vite';
|
|
30
|
-
|
|
31
|
-
export default {
|
|
32
|
-
plugins: [kupola()]
|
|
33
|
-
};
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**配置选项:**
|
|
37
|
-
|
|
38
|
-
| 选项 | 类型 | 默认值 | 说明 |
|
|
39
|
-
|------|------|--------|------|
|
|
40
|
-
| `autoCSS` | boolean | `true` | 自动注入 Kupola CSS |
|
|
41
|
-
| `autoImport` | boolean | `true` | 自动导入 `useDeps`/`useQuery` |
|
|
42
|
-
| `devTools` | boolean | `true` | 开发模式下启用调试工具 |
|
|
43
|
-
| `cssPath` | string | `null` | 自定义 CSS 路径 |
|
|
44
|
-
| `themePreload` | boolean | `false` | 自动注入主题预加载脚本 |
|
|
1
|
+
[中文文档](./README.zh-CN.md)
|
|
45
2
|
|
|
46
|
-
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
47
7
|
|
|
48
|
-
|
|
49
|
-
// webpack.config.js
|
|
50
|
-
const KupolaWebpackPlugin = require('@kupola/kupola/webpack');
|
|
51
|
-
|
|
52
|
-
module.exports = {
|
|
53
|
-
plugins: [new KupolaWebpackPlugin()]
|
|
54
|
-
};
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**配置选项:**
|
|
58
|
-
|
|
59
|
-
| 选项 | 类型 | 默认值 | 说明 |
|
|
60
|
-
|------|------|--------|------|
|
|
61
|
-
| `autoCSS` | boolean | `true` | 自动注入 Kupola CSS |
|
|
62
|
-
| `themePreload` | boolean | `false` | 自动注入主题预加载脚本 |
|
|
63
|
-
| `cssPath` | string | `null` | 自定义 CSS 路径 |
|
|
64
|
-
|
|
65
|
-
### themePreload 配置说明
|
|
66
|
-
|
|
67
|
-
**默认值:`false`**(v1.9.13 变更)
|
|
68
|
-
|
|
69
|
-
`themePreload` 用于在 CSS 加载前设置主题属性,防止主题切换时的闪屏问题。请根据你的使用方式决定是否开启:
|
|
70
|
-
|
|
71
|
-
| 使用方式 | themePreload | 说明 |
|
|
72
|
-
|---------|-------------|------|
|
|
73
|
-
| **ESM + initTheme()** | `false`(默认) | JS 模块加载时自动初始化,无需预加载 |
|
|
74
|
-
| **UMD / 纯 CSS** | `true` | 需要在 CSS 加载前设置主题,防止闪屏 |
|
|
75
|
-
|
|
76
|
-
**开启示例:**
|
|
77
|
-
|
|
78
|
-
```js
|
|
79
|
-
// Vite
|
|
80
|
-
kupola({ themePreload: true })
|
|
8
|
+
# Kupola
|
|
81
9
|
|
|
82
|
-
|
|
83
|
-
new KupolaWebpackPlugin({ themePreload: true })
|
|
84
|
-
```
|
|
10
|
+
**A zero-framework-dependency declarative UI engine + component library for any server-rendered web application.**
|
|
85
11
|
|
|
86
12
|
---
|
|
87
13
|
|
|
88
|
-
##
|
|
14
|
+
## Features
|
|
89
15
|
|
|
90
|
-
-
|
|
91
|
-
-
|
|
16
|
+
- ⚛️ **Signal-based Reactivity**: Fine-grained tracking via `signal` / `computed` / `effect` with automatic batched updates
|
|
17
|
+
- 📝 **Template Literals**: `html` tagged template + `render` for instant DOM binding — no compilation step
|
|
18
|
+
- 🖥️ **SSR Ready**: `renderToString` + `hydrate` for pristine hydration with zero client-side flicker
|
|
19
|
+
- 🧩 **48+ Components, Tree-shakeable**: Modal, Table, Dropdown, Form… each component is independently bundled
|
|
20
|
+
- 🪶 **Ultra-lightweight**: Core engine < 5KB gzip, zero third-party dependencies
|
|
92
21
|
|
|
93
22
|
---
|
|
94
23
|
|
|
95
|
-
|
|
96
|
-
## 📦 Build Tool Plugins
|
|
97
|
-
|
|
98
|
-
### Vite Plugin
|
|
99
|
-
|
|
100
|
-
```js
|
|
101
|
-
// vite.config.js
|
|
102
|
-
import { kupola } from '@kupola/kupola/vite';
|
|
103
|
-
|
|
104
|
-
export default {
|
|
105
|
-
plugins: [kupola()]
|
|
106
|
-
};
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
**Options:**
|
|
110
|
-
|
|
111
|
-
| Option | Type | Default | Description |
|
|
112
|
-
|--------|------|--------|-------------|
|
|
113
|
-
| `autoCSS` | boolean | `true` | Auto inject Kupola CSS |
|
|
114
|
-
| `autoImport` | boolean | `true` | Auto import `useDeps`/`useQuery` |
|
|
115
|
-
| `devTools` | boolean | `true` | Enable dev tools in dev mode |
|
|
116
|
-
| `cssPath` | string | `null` | Custom CSS path |
|
|
117
|
-
| `themePreload` | boolean | `false` | Auto inject theme preload script |
|
|
118
|
-
|
|
119
|
-
### Webpack Plugin
|
|
120
|
-
|
|
121
|
-
```js
|
|
122
|
-
// webpack.config.js
|
|
123
|
-
const KupolaWebpackPlugin = require('@kupola/kupola/webpack');
|
|
24
|
+
## Quick Start
|
|
124
25
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
26
|
+
```html
|
|
27
|
+
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola-core.umd.js"></script>
|
|
28
|
+
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola-core-directives.umd.js"></script>
|
|
29
|
+
<div k-data="{ count: 0 }">
|
|
30
|
+
<button k-on:click="count++">Clicked {{ count }} times</button>
|
|
31
|
+
</div>
|
|
32
|
+
<script>
|
|
33
|
+
Kupola.walk(document.body);
|
|
34
|
+
</script>
|
|
128
35
|
```
|
|
129
36
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
| Option | Type | Default | Description |
|
|
133
|
-
|--------|------|--------|-------------|
|
|
134
|
-
| `autoCSS` | boolean | `true` | Auto inject Kupola CSS |
|
|
135
|
-
| `themePreload` | boolean | `false` | Auto inject theme preload script |
|
|
136
|
-
| `cssPath` | string | `null` | Custom CSS path |
|
|
37
|
+
Or use the programmatic API:
|
|
137
38
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
| **UMD / CSS-only** | `true` | Needs theme set before CSS loads to prevent flash |
|
|
148
|
-
|
|
149
|
-
**Example with themePreload enabled:**
|
|
150
|
-
|
|
151
|
-
```js
|
|
152
|
-
// Vite
|
|
153
|
-
kupola({ themePreload: true })
|
|
154
|
-
|
|
155
|
-
// Webpack
|
|
156
|
-
new KupolaWebpackPlugin({ themePreload: true })
|
|
39
|
+
```html
|
|
40
|
+
<div id="app"></div>
|
|
41
|
+
<script type="module">
|
|
42
|
+
import { signal, html, render } from 'https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola-core.esm.js';
|
|
43
|
+
|
|
44
|
+
const count = signal(0);
|
|
45
|
+
const view = () => html`<button @click=${() => count.value++}>Clicked ${count} times</button>`;
|
|
46
|
+
render(view(), document.getElementById('app'));
|
|
47
|
+
</script>
|
|
157
48
|
```
|
|
158
49
|
|
|
159
50
|
---
|
|
160
51
|
|
|
161
|
-
##
|
|
162
|
-
|
|
163
|
-
- **50+ UI Components** — Buttons, inputs, cards, modals, datepickers, timepickers, heatmap, virtual list, stat cards, and more
|
|
164
|
-
- **Declarative Data Dependencies** — `useDeps()` with auto-caching, retry, refresh, and transform
|
|
165
|
-
- **HTTP Client Plugin System** — Plug in Axios, @navios/http, or any HTTP client; interceptors preserved
|
|
166
|
-
- **Reactive Data Binding** — Two-way binding with `ref()` / `store()` (Proxy-based)
|
|
167
|
-
- **Dual Themes** — Dark-first design with light theme support
|
|
168
|
-
- **11 Brand Colors** — Switchable brand themes inspired by Chinese traditional colors
|
|
169
|
-
- **Responsive** — PC, Pad, and Phone
|
|
170
|
-
- **Accessible** — WCAG AA compliant
|
|
171
|
-
- **Form Validation** — Built-in validation with custom rules
|
|
172
|
-
- **Zero Dependencies** — Pure HTML/CSS/JavaScript, ~75 KB minified gzipped
|
|
173
|
-
- **Backend Agnostic** — Works with Flask, Django, FastAPI, Gin, Spring Boot, ASP.NET, Express, Rails, Actix-web, and any backend that outputs HTML
|
|
174
|
-
- **TypeScript Ready** — Full type definitions included
|
|
175
|
-
|
|
176
|
-
---
|
|
52
|
+
## Installation
|
|
177
53
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
### Scaffold (recommended)
|
|
181
|
-
|
|
182
|
-
Create a fully configured Kupola project in seconds:
|
|
54
|
+
> **Current version**: `2.0.0-alpha.1` (pre-release). Use `@next` tag to install:
|
|
183
55
|
|
|
184
56
|
```bash
|
|
185
|
-
|
|
57
|
+
npm install @kupola/kupola@next # Full package
|
|
58
|
+
# Or core engine only
|
|
59
|
+
npm install @kupola/kupola/core@next # signal + template + render + SSR
|
|
186
60
|
```
|
|
187
61
|
|
|
188
|
-
Choose from **Static**, **Flask**, **FastAPI**, or **Gin** — with dark theme, brand colors, and example pages out of the box.
|
|
189
|
-
|
|
190
|
-
### npm
|
|
191
|
-
|
|
192
62
|
```bash
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
```html
|
|
197
|
-
<link rel="stylesheet" href="node_modules/@kupola/kupola/dist/css/kupola.css">
|
|
198
|
-
<script src="node_modules/@kupola/kupola/dist/kupola.esm.js" type="module"></script>
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### CDN
|
|
202
|
-
|
|
203
|
-
```html
|
|
204
|
-
<!-- ESM (modern browsers) -->
|
|
205
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/css/kupola.css">
|
|
206
|
-
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola.esm.js" type="module"></script>
|
|
207
|
-
|
|
208
|
-
<!-- UMD (legacy) -->
|
|
209
|
-
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola.umd.js"></script>
|
|
63
|
+
# CDN
|
|
64
|
+
https://cdn.jsdelivr.net/npm/@kupola/kupola@next/dist/kupola-core.esm.js
|
|
65
|
+
https://cdn.jsdelivr.net/npm/@kupola/kupola@next/dist/kupola-core.cjs.js
|
|
210
66
|
```
|
|
211
67
|
|
|
212
68
|
---
|
|
213
69
|
|
|
214
|
-
##
|
|
70
|
+
## Import Components on Demand
|
|
215
71
|
|
|
216
|
-
|
|
72
|
+
Each component is independently bundled — import only what you need:
|
|
217
73
|
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
|
|
74
|
+
```javascript
|
|
75
|
+
// Import Modal only
|
|
76
|
+
import { Modal } from '@kupola/kupola/components/modal';
|
|
221
77
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
<h3 class="ds-card__title">Card Title</h3>
|
|
225
|
-
</div>
|
|
226
|
-
<div class="ds-card__body">Card content</div>
|
|
227
|
-
</div>
|
|
78
|
+
const modal = Modal({ title: 'Confirm', content: 'This action cannot be undone.' });
|
|
79
|
+
modal.open();
|
|
228
80
|
```
|
|
229
81
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
```html
|
|
245
|
-
<div data-deps="users:fetch:/api/users">
|
|
246
|
-
<template data-each="users">
|
|
247
|
-
<span data-bind="item.name:text"></span>
|
|
248
|
-
</template>
|
|
249
|
-
</div>
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
```js
|
|
253
|
-
import { useDeps } from 'kupola';
|
|
254
|
-
useDeps({ users: { url: '/api/users', staleTime: 60000 } });
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
### HTTP Client Plugin (Axios Example)
|
|
258
|
-
|
|
259
|
-
```js
|
|
260
|
-
import { configureHttpClient } from 'kupola';
|
|
261
|
-
import { createAxiosAdapter } from 'kupola/adapters/axios';
|
|
262
|
-
import axios from 'axios';
|
|
263
|
-
|
|
264
|
-
const api = axios.create({ baseURL: '/api' });
|
|
265
|
-
api.interceptors.request.use(config => {
|
|
266
|
-
config.headers.Authorization = `Bearer ${getToken()}`;
|
|
267
|
-
return config;
|
|
82
|
+
```javascript
|
|
83
|
+
// Import Table only
|
|
84
|
+
import { Table } from '@kupola/kupola/components/table';
|
|
85
|
+
|
|
86
|
+
const table = Table({
|
|
87
|
+
columns: [
|
|
88
|
+
{ key: 'name', label: 'Name', sortable: true },
|
|
89
|
+
{ key: 'age', label: 'Age', sortable: true },
|
|
90
|
+
],
|
|
91
|
+
data: [
|
|
92
|
+
{ name: 'Alice', age: 28 },
|
|
93
|
+
{ name: 'Bob', age: 34 },
|
|
94
|
+
],
|
|
95
|
+
pageSize: 10,
|
|
268
96
|
});
|
|
269
|
-
|
|
270
|
-
// All useDeps() requests now go through Axios
|
|
271
|
-
configureHttpClient(createAxiosAdapter(api));
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### HTTP Client Plugin (@navios/http Example)
|
|
275
|
-
|
|
276
|
-
```js
|
|
277
|
-
import { configureHttpClient } from 'kupola';
|
|
278
|
-
import { createNaviosAdapter } from 'kupola/adapters/navios-http';
|
|
279
|
-
import { create } from '@navios/http';
|
|
280
|
-
|
|
281
|
-
const client = create({ baseURL: '/api' });
|
|
282
|
-
client.interceptors.request.use(config => {
|
|
283
|
-
config.headers['Authorization'] = `Bearer ${getToken()}`;
|
|
284
|
-
return config;
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
configureHttpClient(createNaviosAdapter(client));
|
|
97
|
+
document.body.appendChild(table.element);
|
|
288
98
|
```
|
|
289
99
|
|
|
290
100
|
---
|
|
291
101
|
|
|
292
|
-
##
|
|
293
|
-
|
|
294
|
-
- [Usage Guide](docs/usage-guide.md) — Getting started and API reference
|
|
295
|
-
- [Integration Guide](INTEGRATION.md) — Framework integration examples
|
|
296
|
-
- [Kupola vs Vue/React](docs/kupola-vs-vue-react.md) — Architecture comparison
|
|
297
|
-
- [Contributing](CONTRIBUTING.md) — How to contribute
|
|
298
|
-
|
|
299
|
-
---
|
|
300
|
-
|
|
301
|
-
## 🛠️ Development
|
|
302
|
-
|
|
303
|
-
```bash
|
|
304
|
-
npm install # Install dependencies
|
|
305
|
-
npm run dev # Dev server (Vite, hot reload)
|
|
306
|
-
npm run build # Production build
|
|
307
|
-
npm run lint # Lint code
|
|
308
|
-
npm run test # Run tests
|
|
309
|
-
```
|
|
102
|
+
## Core Engine API
|
|
310
103
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
## 🌐 Browser Support
|
|
314
|
-
|
|
315
|
-
Chrome, Firefox, Safari, Edge (latest)
|
|
316
|
-
|
|
317
|
-
---
|
|
318
|
-
|
|
319
|
-
<a id="中文"></a>
|
|
320
|
-
## ✨ 核心特性
|
|
321
|
-
|
|
322
|
-
- **50+ UI 组件** — 按钮、输入框、卡片、模态框、日期选择器、时间选择器、热力图、虚拟列表、统计卡片等
|
|
323
|
-
- **声明式数据依赖** — `useDeps()` 自动缓存、重试、刷新、数据转换
|
|
324
|
-
- **HTTP 客户端插件** — 无缝集成 Axios、@navios/http 或任意 HTTP 客户端,保留拦截器
|
|
325
|
-
- **响应式数据绑定** — 基于 Proxy 的双向绑定,`ref()` / `store()`
|
|
326
|
-
- **双主题** — 暗色优先设计,支持亮色主题切换
|
|
327
|
-
- **11 种品牌色** — 灵感源自中国传统色的可切换品牌主题
|
|
328
|
-
- **响应式** — 适配 PC、平板、手机
|
|
329
|
-
- **无障碍** — 符合 WCAG AA 标准
|
|
330
|
-
- **表单验证** — 内置验证系统,支持自定义规则
|
|
331
|
-
- **零依赖** — 纯 HTML/CSS/JavaScript,minified gzip 约 75 KB
|
|
332
|
-
- **后端无关** — 支持 Flask、Django、FastAPI、Gin、Spring Boot、ASP.NET、Express、Rails、Actix-web 等任何输出 HTML 的后端
|
|
333
|
-
- **TypeScript 支持** — 完整类型定义
|
|
334
|
-
|
|
335
|
-
---
|
|
104
|
+
```javascript
|
|
105
|
+
import { signal, computed, effect, batch, html, render } from '@kupola/kupola';
|
|
336
106
|
|
|
337
|
-
|
|
107
|
+
// Signal — reactive state
|
|
108
|
+
const count = signal(0);
|
|
338
109
|
|
|
339
|
-
|
|
110
|
+
// Computed — derived value (auto-tracks dependencies)
|
|
111
|
+
const doubled = computed(() => count.value * 2);
|
|
340
112
|
|
|
341
|
-
|
|
113
|
+
// Effect — side effect (auto re-runs)
|
|
114
|
+
effect(() => console.log(`count = ${count.value}, doubled = ${doubled.value}`));
|
|
342
115
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
### npm 安装
|
|
350
|
-
|
|
351
|
-
```bash
|
|
352
|
-
npm install @kupola/kupola
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
```html
|
|
356
|
-
<link rel="stylesheet" href="node_modules/@kupola/kupola/dist/css/kupola.css">
|
|
357
|
-
<script src="node_modules/@kupola/kupola/dist/kupola.esm.js" type="module"></script>
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
### CDN 引入
|
|
361
|
-
|
|
362
|
-
```html
|
|
363
|
-
<!-- ESM(现代浏览器) -->
|
|
364
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/css/kupola.css">
|
|
365
|
-
<script src="https://cdn.jsdelivr.net/npm/@kupola/kupola/dist/kupola.esm.js" type="module"></script>
|
|
116
|
+
// Batch — merge multiple updates into one flush
|
|
117
|
+
batch(() => {
|
|
118
|
+
count.value++;
|
|
119
|
+
count.value++;
|
|
120
|
+
});
|
|
366
121
|
|
|
367
|
-
|
|
368
|
-
|
|
122
|
+
// Template + Render — declarative DOM
|
|
123
|
+
const view = () => html`
|
|
124
|
+
<div class="counter">
|
|
125
|
+
<p>Count: ${count}</p>
|
|
126
|
+
<button @click=${() => count.value++}>+1</button>
|
|
127
|
+
</div>
|
|
128
|
+
`;
|
|
129
|
+
render(view(), document.getElementById('app'));
|
|
369
130
|
```
|
|
370
131
|
|
|
371
132
|
---
|
|
372
133
|
|
|
373
|
-
##
|
|
134
|
+
## Directive System (Declarative HTML)
|
|
374
135
|
|
|
375
|
-
|
|
136
|
+
Add interactivity directly in HTML — no build tools required:
|
|
376
137
|
|
|
377
138
|
```html
|
|
378
|
-
<
|
|
379
|
-
<
|
|
380
|
-
|
|
381
|
-
<
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
139
|
+
<div k-data="{ name: '', items: [], show: true }">
|
|
140
|
+
<input k-model="name" placeholder="Enter search term">
|
|
141
|
+
<p k-show="name">Hello, {{ name }}!</p>
|
|
142
|
+
<ul>
|
|
143
|
+
<li k-for="item in items" k-text="item"></li>
|
|
144
|
+
</ul>
|
|
145
|
+
<button k-on:click="show = !show" k-bind:disabled="!name">
|
|
146
|
+
<span k-show="show">Hide</span>
|
|
147
|
+
<span k-show="!show">Show</span>
|
|
148
|
+
</button>
|
|
386
149
|
</div>
|
|
150
|
+
<script>
|
|
151
|
+
import { walk } from '@kupola/kupola/directives';
|
|
152
|
+
walk(document.body);
|
|
153
|
+
</script>
|
|
387
154
|
```
|
|
388
155
|
|
|
389
|
-
|
|
156
|
+
**Directives Overview**:
|
|
390
157
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
158
|
+
| Directive | Shorthand | Purpose |
|
|
159
|
+
|-----------|-----------|---------|
|
|
160
|
+
| `k-data` | — | Create a reactive scope |
|
|
161
|
+
| `k-show` | — | Conditional display (`display: none`) |
|
|
162
|
+
| `k-text` | — | Reactive textContent |
|
|
163
|
+
| `k-html` | — | Reactive innerHTML |
|
|
164
|
+
| `k-bind` | `:` | Dynamic attribute binding |
|
|
165
|
+
| `k-on` | `@` | Event listener |
|
|
166
|
+
| `k-model` | — | Two-way input binding |
|
|
167
|
+
| `k-for` | — | List rendering |
|
|
395
168
|
|
|
396
|
-
|
|
397
|
-
kupolaData.data.user = { name: '张三' };
|
|
398
|
-
kupolaData.data.user.name = '李四'; // 所有绑定元素自动更新
|
|
399
|
-
```
|
|
169
|
+
---
|
|
400
170
|
|
|
401
|
-
|
|
171
|
+
## SSR (Server-Side Rendering)
|
|
402
172
|
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
<span data-bind="item.name:text"></span>
|
|
407
|
-
</template>
|
|
408
|
-
</div>
|
|
409
|
-
```
|
|
173
|
+
```javascript
|
|
174
|
+
import { signal, html } from '@kupola/kupola';
|
|
175
|
+
import { renderToString } from '@kupola/kupola/server';
|
|
410
176
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
177
|
+
const title = signal('Hello Server');
|
|
178
|
+
const serverHtml = renderToString(html`<h1>${title}</h1>`);
|
|
179
|
+
// => '<h1>Hello Server<!----></h1>'
|
|
180
|
+
res.send(`<!DOCTYPE html><html><body>${serverHtml}</body></html>`);
|
|
414
181
|
```
|
|
415
182
|
|
|
416
|
-
|
|
183
|
+
Client-side hydration:
|
|
417
184
|
|
|
418
|
-
```
|
|
419
|
-
import {
|
|
420
|
-
import {
|
|
421
|
-
import axios from 'axios';
|
|
422
|
-
|
|
423
|
-
const api = axios.create({ baseURL: '/api' });
|
|
424
|
-
api.interceptors.request.use(config => {
|
|
425
|
-
config.headers.Authorization = `Bearer ${getToken()}`;
|
|
426
|
-
return config;
|
|
427
|
-
});
|
|
185
|
+
```javascript
|
|
186
|
+
import { signal, html } from '@kupola/kupola';
|
|
187
|
+
import { hydrate } from '@kupola/kupola/server';
|
|
428
188
|
|
|
429
|
-
|
|
430
|
-
|
|
189
|
+
const title = signal('Hello Server');
|
|
190
|
+
hydrate(html`<h1>${title}</h1>`, document.body);
|
|
191
|
+
// DOM is not rebuilt — only reactive bindings are attached
|
|
431
192
|
```
|
|
432
193
|
|
|
433
194
|
---
|
|
434
195
|
|
|
435
|
-
##
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
196
|
+
## Components
|
|
197
|
+
|
|
198
|
+
<details>
|
|
199
|
+
<summary><strong>Overlay & Navigation</strong> (6)</summary>
|
|
200
|
+
|
|
201
|
+
| Component | Import Path | Description |
|
|
202
|
+
|-----------|-------------|-------------|
|
|
203
|
+
| Modal | `@kupola/kupola/components/modal` | Modal dialog |
|
|
204
|
+
| Dropdown | `@kupola/kupola/components/dropdown` | Dropdown menu |
|
|
205
|
+
| Drawer | `@kupola/kupola/components/drawer` | Side drawer |
|
|
206
|
+
| Tabs | `@kupola/kupola/components/tabs` | Tab panel |
|
|
207
|
+
| Tooltip | `@kupola/kupola/components/tooltip` | Text tooltip |
|
|
208
|
+
| Menu | `@kupola/kupola/components/menu` | Navigation menu |
|
|
209
|
+
|
|
210
|
+
</details>
|
|
211
|
+
|
|
212
|
+
<details>
|
|
213
|
+
<summary><strong>Form</strong> (11)</summary>
|
|
214
|
+
|
|
215
|
+
| Component | Import Path | Description |
|
|
216
|
+
|-----------|-------------|-------------|
|
|
217
|
+
| Input | `@kupola/kupola/components/input` | Text input |
|
|
218
|
+
| Select | `@kupola/kupola/components/select` | Dropdown select |
|
|
219
|
+
| Checkbox | `@kupola/kupola/components/checkbox` | Checkbox |
|
|
220
|
+
| Radio | `@kupola/kupola/components/radio` | Radio button |
|
|
221
|
+
| Switch | `@kupola/kupola/components/switch` | Toggle switch |
|
|
222
|
+
| Slider | `@kupola/kupola/components/slider` | Range slider |
|
|
223
|
+
| NumberInput | `@kupola/kupola/components/numberinput` | Number input |
|
|
224
|
+
| Textarea | `@kupola/kupola/components/textarea` | Multi-line text |
|
|
225
|
+
| Datepicker | `@kupola/kupola/components/datepicker` | Date picker |
|
|
226
|
+
| Timepicker | `@kupola/kupola/components/timepicker` | Time picker |
|
|
227
|
+
| Form | `@kupola/kupola/components/form` | Form container + validation |
|
|
228
|
+
|
|
229
|
+
</details>
|
|
230
|
+
|
|
231
|
+
<details>
|
|
232
|
+
<summary><strong>Feedback</strong> (6)</summary>
|
|
233
|
+
|
|
234
|
+
| Component | Import Path | Description |
|
|
235
|
+
|-----------|-------------|-------------|
|
|
236
|
+
| Dialog | `@kupola/kupola/components/dialog` | Native confirm dialog |
|
|
237
|
+
| Notification | `@kupola/kupola/components/notification` | Notification toast |
|
|
238
|
+
| Message | `@kupola/kupola/components/message` | Lightweight global message |
|
|
239
|
+
| Alert | `@kupola/kupola/components/alert` | Alert banner |
|
|
240
|
+
| Spin | `@kupola/kupola/components/spin` | Loading spinner |
|
|
241
|
+
| Progress | `@kupola/kupola/components/progress` | Progress bar |
|
|
242
|
+
|
|
243
|
+
</details>
|
|
244
|
+
|
|
245
|
+
<details>
|
|
246
|
+
<summary><strong>Data Display</strong> (9)</summary>
|
|
247
|
+
|
|
248
|
+
| Component | Import Path | Description |
|
|
249
|
+
|-----------|-------------|-------------|
|
|
250
|
+
| Table | `@kupola/kupola/components/table` | Data table (sort/filter/paginate/select/edit) |
|
|
251
|
+
| Tree | `@kupola/kupola/components/tree` | Tree view |
|
|
252
|
+
| Calendar | `@kupola/kupola/components/calendar` | Calendar |
|
|
253
|
+
| Carousel | `@kupola/kupola/components/carousel` | Carousel / slider |
|
|
254
|
+
| Timeline | `@kupola/kupola/components/timeline` | Timeline |
|
|
255
|
+
| Collapse | `@kupola/kupola/components/collapse` | Collapse panel |
|
|
256
|
+
| Tag | `@kupola/kupola/components/tag` | Tag |
|
|
257
|
+
| Badge | `@kupola/kupola/components/badge` | Badge |
|
|
258
|
+
| Statcard | `@kupola/kupola/components/statcard` | Stat card |
|
|
259
|
+
|
|
260
|
+
</details>
|
|
261
|
+
|
|
262
|
+
<details>
|
|
263
|
+
<summary><strong>Interactive & Utility</strong> (16)</summary>
|
|
264
|
+
|
|
265
|
+
| Component | Import Path | Description |
|
|
266
|
+
|-----------|-------------|-------------|
|
|
267
|
+
| Pagination | `@kupola/kupola/components/pagination` | Pagination |
|
|
268
|
+
| Breadcrumb | `@kupola/kupola/components/breadcrumb` | Breadcrumb |
|
|
269
|
+
| FileUpload | `@kupola/kupola/components/fileupload` | File upload |
|
|
270
|
+
| DynamicTags | `@kupola/kupola/components/dynamictags` | Dynamic tags |
|
|
271
|
+
| ImagePreview | `@kupola/kupola/components/imagepreview` | Image preview |
|
|
272
|
+
| ColorPicker | `@kupola/kupola/components/colorpicker` | Color picker |
|
|
273
|
+
| VirtualList | `@kupola/kupola/components/virtuallist` | Virtual list |
|
|
274
|
+
| Heatmap | `@kupola/kupola/components/heatmap` | Heatmap |
|
|
275
|
+
| Countdown | `@kupola/kupola/components/countdown` | Countdown timer |
|
|
276
|
+
| Icons | `@kupola/kupola/components/icons` | SVG icon set |
|
|
277
|
+
| Validation | `@kupola/kupola/components/validation` | Validation engine |
|
|
278
|
+
| Avatar | `@kupola/kupola/components/avatar` | Avatar |
|
|
279
|
+
| Divider | `@kupola/kupola/components/divider` | Divider |
|
|
280
|
+
| Skeleton | `@kupola/kupola/components/skeleton` | Skeleton screen |
|
|
281
|
+
| Empty | `@kupola/kupola/components/empty` | Empty state |
|
|
282
|
+
| Kbd | `@kupola/kupola/components/kbd` | Keyboard key |
|
|
283
|
+
|
|
284
|
+
</details>
|
|
441
285
|
|
|
442
286
|
---
|
|
443
287
|
|
|
444
|
-
##
|
|
288
|
+
## TypeScript
|
|
445
289
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
290
|
+
Full type definitions included out of the box:
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
import type { Modal, ModalOptions } from '@kupola/kupola/components/modal';
|
|
294
|
+
import type { Table, TableOptions, TableColumn } from '@kupola/kupola/components/table';
|
|
295
|
+
|
|
296
|
+
const options: ModalOptions = {
|
|
297
|
+
title: 'Confirm',
|
|
298
|
+
content: 'Are you sure you want to delete?',
|
|
299
|
+
onConfirm: () => console.log('confirmed'),
|
|
300
|
+
};
|
|
452
301
|
```
|
|
453
302
|
|
|
454
303
|
---
|
|
455
304
|
|
|
456
|
-
##
|
|
305
|
+
## Browser Support
|
|
457
306
|
|
|
458
|
-
Chrome
|
|
307
|
+
- Chrome / Edge >= 88
|
|
308
|
+
- Firefox >= 78
|
|
309
|
+
- Safari >= 14
|
|
310
|
+
- IE is not supported
|
|
459
311
|
|
|
460
312
|
---
|
|
461
313
|
|
|
462
|
-
##
|
|
314
|
+
## Documentation
|
|
463
315
|
|
|
464
|
-
|
|
316
|
+
- 📖 [Integration Guide](./INTEGRATION.md) — CDN / SSR / Vite / Webpack / React / Vue
|
|
317
|
+
- 🤝 [Contributing Guide](./CONTRIBUTING.md) — Dev setup & code standards
|
|
318
|
+
- 📋 [Changelog](./CHANGELOG.md)
|
|
319
|
+
- 📄 [MIT License](./LICENSE)
|
|
465
320
|
|
|
466
321
|
---
|
|
467
322
|
|
|
468
|
-
##
|
|
469
|
-
|
|
470
|
-
Kupola is built with the help of these excellent open-source tools:
|
|
323
|
+
## Ecosystem
|
|
471
324
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
-
|
|
476
|
-
-
|
|
477
|
-
- [Jest](https://jestjs.io/) — JavaScript testing framework
|
|
478
|
-
|
|
479
|
-
**HTTP Client Adapters (optional, user-installed):**
|
|
480
|
-
- [Axios](https://axios-http.com/) — Promise based HTTP client
|
|
481
|
-
- [@navios/http](https://www.npmjs.com/package/@navios/http) — Lightweight fetch-based Axios replacement
|
|
325
|
+
| Project | Description |
|
|
326
|
+
|---------|-------------|
|
|
327
|
+
| `@kupola/kupola` | Core engine + 48 UI components |
|
|
328
|
+
| `create-kupola` | Project scaffolding CLI |
|
|
329
|
+
| `his-sys` | HIS medical system built on Kupola |
|
|
482
330
|
|
|
483
331
|
---
|
|
484
332
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
333
|
+
<p align="center">
|
|
334
|
+
<strong>Kupola</strong> — Zero framework dependencies. Declarative UI. Import only what you need.
|
|
335
|
+
</p>
|