ranui 0.1.10-alpha.7 → 0.2.0-alpha.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/README.md +397 -0
- package/README.zh-CN.md +369 -0
- package/dist/assets/image/failImage.d.ts +2 -0
- package/dist/bin/generate-component-api.d.ts +1 -0
- package/dist/bin/generate-style-docs.d.ts +1 -0
- package/dist/build/config.bundle.d.ts +2 -0
- package/dist/build/config.d.ts +3 -0
- package/dist/build/config.es.d.ts +2 -0
- package/dist/build/config.umd.d.ts +1 -0
- package/dist/builder.d.ts +11 -0
- package/dist/builder.js +39 -0
- package/dist/button-DukaD6uL.js +117 -0
- package/dist/button.js +3 -5
- package/dist/card-DQUJoDUQ.js +60 -0
- package/dist/card.js +5 -0
- package/dist/checkbox-iHZQb-yQ.js +94 -0
- package/dist/checkbox.js +3 -5
- package/dist/colorpicker-Ch67dWa_.js +302 -0
- package/dist/colorpicker.js +3 -9
- package/dist/components/button/index.d.ts +44 -0
- package/dist/components/card/index.d.ts +21 -0
- package/dist/components/checkbox/index.d.ts +35 -0
- package/dist/components/colorpicker/index.d.ts +88 -0
- package/dist/components/dropdown/index.d.ts +32 -0
- package/dist/components/form/index.d.ts +15 -0
- package/dist/components/icon/index.d.ts +58 -0
- package/dist/components/image/index.d.ts +25 -0
- package/dist/components/input/index.d.ts +229 -0
- package/dist/components/link/index.d.ts +21 -0
- package/dist/components/loading/index.d.ts +76 -0
- package/dist/components/math/index.d.ts +16 -0
- package/dist/components/message/container.d.ts +8 -0
- package/dist/components/message/index.d.ts +32 -0
- package/dist/components/modal/index.d.ts +100 -0
- package/dist/components/player/core/constants.d.ts +5 -0
- package/dist/components/player/core/controller.d.ts +33 -0
- package/dist/components/player/core/events.d.ts +10 -0
- package/dist/components/player/core/fullscreen.d.ts +5 -0
- package/dist/components/player/core/levels.d.ts +20 -0
- package/dist/components/player/core/media.d.ts +50 -0
- package/dist/components/player/core/playback.d.ts +14 -0
- package/dist/components/player/core/progress.d.ts +2 -0
- package/dist/components/player/core/state.d.ts +27 -0
- package/dist/components/player/core/view.d.ts +39 -0
- package/dist/components/player/index.d.ts +277 -0
- package/dist/components/popover/content/index.d.ts +12 -0
- package/dist/components/popover/index.d.ts +95 -0
- package/dist/components/progress/index.d.ts +40 -0
- package/dist/components/radar/index.d.ts +52 -0
- package/dist/components/route/index.d.ts +26 -0
- package/dist/components/router/index.d.ts +24 -0
- package/dist/components/scratch/index.d.ts +19 -0
- package/dist/components/section/index.d.ts +23 -0
- package/dist/components/select/dropdown-item/index.d.ts +21 -0
- package/dist/components/select/index.d.ts +135 -0
- package/dist/components/select/option/index.d.ts +19 -0
- package/dist/components/skeleton/index.d.ts +13 -0
- package/dist/components/tab/index.d.ts +58 -0
- package/dist/components/tabpane/index.d.ts +33 -0
- package/dist/demo/i18n.d.ts +4 -0
- package/dist/demo/index.d.ts +3 -0
- package/dist/demo/register-icons.d.ts +1 -0
- package/dist/dropdown-C5362qTy.js +82 -0
- package/dist/dropdown.js +6 -0
- package/dist/events-C59wGdni.js +30 -0
- package/dist/factory-BdsO0dEW.js +165 -0
- package/dist/form-05Lxxl3D.js +44 -0
- package/dist/form.js +5 -0
- package/dist/icon-DmoEnao5.js +165 -0
- package/dist/icon.js +4 -4
- package/dist/{index-KS2nvVcO.js → image-6GayFDqX.js} +58 -71
- package/dist/image.js +3 -2
- package/dist/index.cjs +35 -0
- package/dist/index.d.ts +277 -116
- package/dist/index.iife.js +306 -0
- package/dist/index.js +78 -38
- package/dist/input-DoraIb3x.js +198 -0
- package/dist/input.js +2 -3
- package/dist/katex-es-Bpesphgp.js +23682 -0
- package/dist/katex-es-Cnq5Pk8K.cjs +261 -0
- package/dist/link-BW-gvrpN.js +77 -0
- package/dist/link.js +6 -0
- package/dist/loading-Mko22ncl.js +206 -0
- package/dist/loading.js +4 -6
- package/dist/math-B5PpSnFR.js +52 -0
- package/dist/math.js +2 -4
- package/dist/message-CQENvkoi.js +137 -0
- package/dist/message.js +3 -4
- package/dist/mocks-CMGoftIc.js +179 -0
- package/dist/modal-DruDj3AB.js +350 -0
- package/dist/modal.js +3 -2
- package/dist/player-CvfmwWUa.js +13536 -0
- package/dist/player.js +3 -6
- package/dist/playwright.config.d.ts +2 -0
- package/dist/plugins/load-svg.d.ts +9 -0
- package/dist/popover-BCvHwLZb.js +213 -0
- package/dist/popover.js +3 -5
- package/dist/progress-BWkNf2J5.js +123 -0
- package/dist/progress.js +3 -5
- package/dist/radar-CWsawt2g.js +181 -0
- package/dist/radar.js +3 -4
- package/dist/ranui.css +1 -0
- package/dist/route-BY_E6-2C.js +88 -0
- package/dist/route.js +6 -0
- package/dist/router-BDcv4F-2.js +79 -0
- package/dist/router.js +6 -0
- package/dist/scratch-Dbd9G6Q6.js +60 -0
- package/dist/scratch.js +4 -0
- package/dist/section-CNTvgdQ-.js +63 -0
- package/dist/section.js +5 -0
- package/dist/select-BmhCUTLb.js +433 -0
- package/dist/select.js +3 -8
- package/dist/signal-XHfNsQNW.js +57 -0
- package/dist/skeleton-DPv9nFhL.js +32 -0
- package/dist/skeleton.js +3 -2
- package/dist/ssg.js +21 -0
- package/dist/ssr-DSGwPtEd.js +34 -0
- package/dist/ssr-stream.d.ts +1 -0
- package/dist/ssr-stream.js +87 -0
- package/dist/ssr.d.ts +1 -0
- package/dist/ssr.js +7 -0
- package/dist/style.d.ts +1 -0
- package/dist/style.js +0 -0
- package/dist/tab-C9swK-hm.js +185 -0
- package/dist/tab.js +3 -4
- package/dist/tabpane-B_M-Jokw.js +87 -0
- package/dist/tabpane.js +3 -2
- package/dist/test/e2e/button.spec.d.ts +1 -0
- package/dist/test/e2e/checkbox.spec.d.ts +1 -0
- package/dist/test/e2e/helpers.d.ts +13 -0
- package/dist/test/e2e/icon.spec.d.ts +1 -0
- package/dist/test/e2e/image.spec.d.ts +1 -0
- package/dist/test/e2e/input.spec.d.ts +1 -0
- package/dist/test/e2e/loading.spec.d.ts +1 -0
- package/dist/test/e2e/message.spec.d.ts +1 -0
- package/dist/test/e2e/modal.spec.d.ts +1 -0
- package/dist/test/e2e/popover.spec.d.ts +1 -0
- package/dist/test/e2e/progress.spec.d.ts +1 -0
- package/dist/test/e2e/radar.spec.d.ts +1 -0
- package/dist/test/e2e/select.spec.d.ts +1 -0
- package/dist/test/e2e/skeleton.spec.d.ts +1 -0
- package/dist/test/e2e/tab.spec.d.ts +1 -0
- package/dist/test/e2e/visual/colorpicker.spec.d.ts +1 -0
- package/dist/test/e2e/visual/components.spec.d.ts +1 -0
- package/dist/test/e2e/visual/player.spec.d.ts +1 -0
- package/dist/test/integration/composition.test.d.ts +23 -0
- package/dist/test/setup.d.ts +0 -0
- package/dist/test/ssr/builder.core.ssr.test.d.ts +1 -0
- package/dist/test/ssr/builder.factory.ssr.test.d.ts +1 -0
- package/dist/test/ssr/builder.mocks.test.d.ts +1 -0
- package/dist/test/ssr/components/button.test.d.ts +1 -0
- package/dist/test/ssr/css-vars.test.d.ts +1 -0
- package/dist/test/ssr/registry.test.d.ts +1 -0
- package/dist/test/ssr/router.ssg.test.d.ts +2 -0
- package/dist/test/ssr/snapshots/button.test.d.ts +1 -0
- package/dist/test/ssr/stream.test.d.ts +2 -0
- package/dist/test/ssr/theme.tokens.ssr.test.d.ts +1 -0
- package/dist/test/unit/builder.core.browser.test.d.ts +1 -0
- package/dist/test/unit/builder.escape.test.d.ts +1 -0
- package/dist/test/unit/builder.selectors.test.d.ts +1 -0
- package/dist/test/unit/button.contract.test.d.ts +1 -0
- package/dist/test/unit/card.contract.test.d.ts +1 -0
- package/dist/test/unit/checkbox.contract.test.d.ts +1 -0
- package/dist/test/unit/colorpicker.color.utils.test.d.ts +1 -0
- package/dist/test/unit/colorpicker.contract.test.d.ts +1 -0
- package/dist/test/unit/colorpicker.methods.test.d.ts +1 -0
- package/dist/test/unit/component.helpers.test.d.ts +1 -0
- package/dist/test/unit/dropdown-item.contract.test.d.ts +1 -0
- package/dist/test/unit/dropdown.contract.test.d.ts +1 -0
- package/dist/test/unit/form.contract.test.d.ts +1 -0
- package/dist/test/unit/helpers/component.d.ts +3 -0
- package/dist/test/unit/helpers/dom.d.ts +2 -0
- package/dist/test/unit/icon.contract.test.d.ts +1 -0
- package/dist/test/unit/image.contract.test.d.ts +1 -0
- package/dist/test/unit/input.contract.test.d.ts +1 -0
- package/dist/test/unit/link.contract.test.d.ts +1 -0
- package/dist/test/unit/loading.contract.test.d.ts +1 -0
- package/dist/test/unit/math.contract.test.d.ts +1 -0
- package/dist/test/unit/message.component.test.d.ts +1 -0
- package/dist/test/unit/message.container.test.d.ts +1 -0
- package/dist/test/unit/modal.contract.test.d.ts +1 -0
- package/dist/test/unit/option.contract.test.d.ts +1 -0
- package/dist/test/unit/package-exports.source.test.d.ts +1 -0
- package/dist/test/unit/player-controls.test.d.ts +1 -0
- package/dist/test/unit/player-core.test.d.ts +1 -0
- package/dist/test/unit/player-event-handlers.test.d.ts +1 -0
- package/dist/test/unit/player-events.test.d.ts +1 -0
- package/dist/test/unit/player-fullscreen.test.d.ts +1 -0
- package/dist/test/unit/player-interactions.test.d.ts +1 -0
- package/dist/test/unit/player-levels.test.d.ts +1 -0
- package/dist/test/unit/player-media.test.d.ts +1 -0
- package/dist/test/unit/player-playback.test.d.ts +1 -0
- package/dist/test/unit/player.contract.test.d.ts +1 -0
- package/dist/test/unit/popover-accessibility.test.d.ts +1 -0
- package/dist/test/unit/popover.contract.test.d.ts +2 -0
- package/dist/test/unit/progress.contract.test.d.ts +1 -0
- package/dist/test/unit/radar.contract.test.d.ts +1 -0
- package/dist/test/unit/route.contract.test.d.ts +1 -0
- package/dist/test/unit/router.contract.test.d.ts +2 -0
- package/dist/test/unit/scratch.contract.test.d.ts +1 -0
- package/dist/test/unit/select-accessibility.test.d.ts +1 -0
- package/dist/test/unit/select-option.contract.test.d.ts +1 -0
- package/dist/test/unit/select.contract.test.d.ts +1 -0
- package/dist/test/unit/skeleton.contract.test.d.ts +1 -0
- package/dist/test/unit/ssr.test.d.ts +1 -0
- package/dist/test/unit/tab.contract.test.d.ts +2 -0
- package/dist/test/unit/theme.semantic-tokens.test.d.ts +1 -0
- package/dist/test/unit/theme.skin-tokens.test.d.ts +1 -0
- package/dist/test/unit/utils.dom.test.d.ts +1 -0
- package/dist/test/unit/utils.error.test.d.ts +1 -0
- package/dist/test/unit/utils.i18n.test.d.ts +1 -0
- package/dist/test/unit/utils.image.test.d.ts +1 -0
- package/dist/test/unit/utils.math.test.d.ts +1 -0
- package/dist/test/unit/utils.router.test.d.ts +1 -0
- package/dist/test/unit/utils.signal.test.d.ts +1 -0
- package/dist/test/unit/utils.ssr-stream.test.d.ts +1 -0
- package/dist/test/unit/utils.style.test.d.ts +1 -0
- package/dist/test/unit/utils.theme.test.d.ts +1 -0
- package/dist/test/unit/utils.tween.test.d.ts +1 -0
- package/dist/tsconfig.json +9 -9
- package/dist/typings.d.ts +163 -116
- package/dist/utils/builder/core.d.ts +70 -0
- package/dist/utils/builder/env.d.ts +1 -0
- package/dist/utils/builder/escape.d.ts +2 -0
- package/dist/utils/builder/events.d.ts +55 -0
- package/dist/utils/builder/factory.d.ts +18 -0
- package/dist/utils/builder/index.d.ts +9 -0
- package/dist/utils/builder/mocks.d.ts +62 -0
- package/dist/utils/builder/selectors.d.ts +4 -0
- package/dist/utils/builder/signal.d.ts +87 -0
- package/dist/utils/color.d.ts +52 -0
- package/dist/utils/component.d.ts +16 -0
- package/dist/utils/dom.d.ts +39 -0
- package/dist/utils/error.d.ts +6 -0
- package/dist/utils/i18n/index.d.ts +53 -0
- package/dist/utils/i18n.js +88 -0
- package/dist/utils/image.d.ts +39 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/math.d.ts +26 -0
- package/dist/utils/router/index.d.ts +128 -0
- package/dist/utils/router.js +197 -0
- package/dist/utils/ssg.d.ts +49 -0
- package/dist/utils/ssr-registry.d.ts +8 -0
- package/dist/utils/ssr-stream.d.ts +23 -0
- package/dist/utils/ssr.d.ts +17 -0
- package/dist/utils/style.d.ts +12 -0
- package/dist/utils/theme.d.ts +9 -0
- package/dist/utils/tween.d.ts +21 -0
- package/dist/utils/video.d.ts +40 -0
- package/dist/utils-D4pPF77E.js +689 -0
- package/dist/vite.config.d.ts +6 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.ssr.d.ts +2 -0
- package/docs/COMPONENTS.md +326 -0
- package/docs/DESIGN.md +182 -0
- package/docs/style-tokens-public.md +880 -0
- package/package.json +138 -74
- package/typings.d.ts +163 -116
- package/dist/_commonjs-dynamic-modules-DLbDWi6a.js +0 -12
- package/dist/add-user-BN1JlY7e.js +0 -4
- package/dist/arrow-down-Beig7FXI.js +0 -652
- package/dist/book-nTEFXU2x.js +0 -4
- package/dist/check-circle-fill-B_pd8ZSs.js +0 -4
- package/dist/check-circle-szyAJiap.js +0 -4
- package/dist/close-CFnkhudp.js +0 -4
- package/dist/close-circle-CwmuN2C6.js +0 -4
- package/dist/close-circle-fill-jSqPPw9i.js +0 -4
- package/dist/colz-DJZvo_8B.js +0 -232
- package/dist/docx-CHkPTdGU.js +0 -3665
- package/dist/drop-4j4abxje.js +0 -36
- package/dist/eye-D_mEt17f.js +0 -4
- package/dist/eye-close-BVr3NJtg.js +0 -4
- package/dist/home-BUQ4USMk.js +0 -4
- package/dist/iconShadowless.js +0 -6
- package/dist/index-BZR0HaP2.js +0 -40
- package/dist/index-Bl6-5Hp8.js +0 -63701
- package/dist/index-C0Xh8vJ3.js +0 -146
- package/dist/index-C4Sv0T51.js +0 -495
- package/dist/index-CGEx9VOA.js +0 -17106
- package/dist/index-CILRcFIV.js +0 -100
- package/dist/index-CQTJoWhb.js +0 -19
- package/dist/index-CWNtaUwu.js +0 -308
- package/dist/index-CjSKJE6S.js +0 -158
- package/dist/index-Ck9TOxFh.js +0 -279
- package/dist/index-CryFK9u4.js +0 -320
- package/dist/index-D4twPONc.js +0 -187
- package/dist/index-D83djTVa.js +0 -659
- package/dist/index-DAxs7Dd2.js +0 -119
- package/dist/index-DBecKjmY.js +0 -279
- package/dist/index-DC5EA657.js +0 -91
- package/dist/index-DHTzB_6b.js +0 -9575
- package/dist/index-DL-1C2RQ.js +0 -496
- package/dist/index-DN-kAx-A.js +0 -72
- package/dist/index-TlwIh-o2.js +0 -306
- package/dist/index-WfFw4LJT.js +0 -490
- package/dist/index-lLO-8KJ1.js +0 -204
- package/dist/index-oD-_YELB.js +0 -511
- package/dist/index-qvcQTV5_.js +0 -105
- package/dist/info-circle-COnL5bTJ.js +0 -4
- package/dist/info-circle-fill-CFeVMdci.js +0 -4
- package/dist/inputShadowless.js +0 -6
- package/dist/jszip.min-Dhs3nUkD.js +0 -2346
- package/dist/katex-es-B5r5vt3m.js +0 -14628
- package/dist/loading-Dcc5RApI.js +0 -4
- package/dist/loading-scene-BMc2wqKm.js +0 -4
- package/dist/lock-Cr7BnmWN.js +0 -4
- package/dist/message-D36_Zo2l.js +0 -4
- package/dist/pdf-Cx0VWKFo.js +0 -118
- package/dist/power-off-lQRbiBak.js +0 -4
- package/dist/preview-CJbz9GjO.js +0 -4
- package/dist/preview.js +0 -7
- package/dist/selectShadowless.js +0 -564
- package/dist/setting-DemlgzVC.js +0 -4
- package/dist/shadowless.js +0 -8
- package/dist/sprite-CH2zLtZy.js +0 -141
- package/dist/style.css +0 -1
- package/dist/team-tl4NJXPC.js +0 -4
- package/dist/umd/index.umd.cjs +0 -60
- package/dist/umd/shadowless/shadowless.umd.cjs +0 -1
- package/dist/umd/shadowless/style.css +0 -1
- package/dist/umd/style.css +0 -1
- package/dist/unlock-CeU74z9n.js +0 -4
- package/dist/user-B-eVXwuk.js +0 -4
- package/dist/warning-circle-DDUgEDIv.js +0 -4
- package/dist/warning-circle-fill-lODUKz0i.js +0 -4
- package/readme.md +0 -176
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
# ranui
|
|
2
|
+
|
|
3
|
+
基于 `Web Components` 的实验性组件库。组件使用 Shadow DOM 封装、CSS Token 主题体系,并提供 SSR / Declarative Shadow DOM 支持。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<a href="https://github.com/chaxus/ran"><img src="https://img.shields.io/github/actions/workflow/status/chaxus/ran/ci.yml" alt="Build Status"></a>
|
|
8
|
+
<a href="https://github.com/chaxus/ran"><img src="https://img.shields.io/npm/v/ranui.svg" alt="npm-v"></a>
|
|
9
|
+
<a href="https://github.com/chaxus/ran"><img src="https://img.shields.io/npm/dt/ranui.svg" alt="npm-d"></a>
|
|
10
|
+
<a href="https://github.com/chaxus/ran"><img src="https://img.badgesize.io/https:/unpkg.com/ranui/dist/umd/shadowless/shadowless.umd.cjs?label=brotli&compression=brotli" alt="brotli"></a>
|
|
11
|
+
<a href="https://github.com/chaxus/ran"><img src="https://img.shields.io/badge/module%20formats-umd%2C%20esm-green.svg" alt="module formats: umd, esm"></a>
|
|
12
|
+
|
|
13
|
+
**中文** | [English](./README.md)
|
|
14
|
+
|
|
15
|
+
## ⚠️ 重要说明
|
|
16
|
+
|
|
17
|
+
这是一个**实验性 UI 库**,处于早期开发阶段。虽然功能可用,但主要用于学习和实验。
|
|
18
|
+
|
|
19
|
+
**关键要点:**
|
|
20
|
+
|
|
21
|
+
- 🚧 **早期开发**: 功能仍在开发和完善中
|
|
22
|
+
- 🧪 **实验性**: API 可能会频繁变化
|
|
23
|
+
- 📚 **学习导向**: 主要用于学习 Web Components 和 UI 开发
|
|
24
|
+
|
|
25
|
+
## 特点
|
|
26
|
+
|
|
27
|
+
1. **跨框架兼容:** 与 React, Vue, Preact, SolidJS, Svelte 等兼容。可以和遵循 W3C 标准的任何 JavaScript 项目集成。
|
|
28
|
+
2. **原生体验:** 易于入门,像使用原生 HTML 标签一样使用 `<r-button>`、`<r-modal>` 等自定义元素。
|
|
29
|
+
3. **模块化设计:** 可选导入和全量导入,以增强可维护性和可伸缩性。
|
|
30
|
+
4. **Shadow DOM 封装:** 组件内部样式默认隔离,并通过 CSS Token、`::part()` 和 `sheet` 属性开放可控的样式覆盖能力。
|
|
31
|
+
5. **支持类型校验:** 基于 TypeScript 构建,具有类型支持,确保代码的健壮性和可维护性。
|
|
32
|
+
6. **SSR 友好:** 通过 `defineSSR`、`renderToString` 和 Declarative Shadow DOM 支持服务端渲染场景。
|
|
33
|
+
7. **无障碍:** ARIA 角色/状态、完整键盘导航、表单参与控件(`<r-checkbox>`/`<r-input>`/`<r-select>` 可被原生 `FormData` 收集)、live-region 提示,并尊重 `prefers-reduced-motion`。
|
|
34
|
+
|
|
35
|
+
## 安装
|
|
36
|
+
|
|
37
|
+
使用 npm:
|
|
38
|
+
|
|
39
|
+
```console
|
|
40
|
+
npm install ranui --save
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 文档和示例
|
|
44
|
+
|
|
45
|
+
[See components and use examples](https://chaxus.github.io/ran/cn/src/ranui/)
|
|
46
|
+
|
|
47
|
+
### 样式定制文档
|
|
48
|
+
|
|
49
|
+
当前样式系统已统一为 CSS Token 与 `::part()` 规范。
|
|
50
|
+
|
|
51
|
+
- 样式覆盖规范:[docs/style-override.md](./docs/style-override.md)
|
|
52
|
+
- 完整 Token/Part 清单(自动生成): [docs/style-tokens-parts.md](./docs/style-tokens-parts.md)
|
|
53
|
+
- 面向使用方的公开样式 API(自动生成): [docs/style-tokens-public.md](./docs/style-tokens-public.md)
|
|
54
|
+
- 公开 Token 过滤配置:[docs/style-token-filter.json](./docs/style-token-filter.json)
|
|
55
|
+
|
|
56
|
+
可通过以下命令刷新样式文档:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pnpm doc:style
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 主题与主题包
|
|
63
|
+
|
|
64
|
+
RanUI 支持亮色、暗色与系统主题,并提供多个 CSS-only 主题包。
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { initTheme, setTheme, setThemePack, setThemeToken } from 'ranui';
|
|
68
|
+
import 'ranui/theme-packs/pixel-retro';
|
|
69
|
+
|
|
70
|
+
initTheme();
|
|
71
|
+
setTheme('system');
|
|
72
|
+
setThemePack('pixel-retro');
|
|
73
|
+
setThemeToken('--ran-color-primary', '#2563eb');
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
可用主题包包括 `windows-98`、`windows-xp`、`system-6`、`wired`、`paper`、`pixel-retro`、`neo-brutalism`。使用 `setThemePack('default')` 可恢复默认主题包。
|
|
77
|
+
|
|
78
|
+
## 引入方式
|
|
79
|
+
|
|
80
|
+
支持按需导入,以显著减少包体积大小
|
|
81
|
+
|
|
82
|
+
```js
|
|
83
|
+
import 'ranui/button';
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
如果遇到样式问题,可以选择手动导入样式文件
|
|
87
|
+
|
|
88
|
+
```js
|
|
89
|
+
import 'ranui/style';
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
如果遇到类型问题,可以选择手动导入类型文件
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
import 'ranui/typings';
|
|
96
|
+
// 或者
|
|
97
|
+
import 'ranui/dist/index.d.ts';
|
|
98
|
+
// 或者
|
|
99
|
+
import 'ranui/type';
|
|
100
|
+
// 或者
|
|
101
|
+
import 'ranui/dist/typings';
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
并不是都要,选一个能生效的就行
|
|
105
|
+
|
|
106
|
+
也支持全量导入
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import 'ranui';
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- ES module
|
|
113
|
+
|
|
114
|
+
```js
|
|
115
|
+
import 'ranui';
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
或者
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
import 'ranui/button';
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
- UMD, IIFE, CJS
|
|
125
|
+
|
|
126
|
+
```html
|
|
127
|
+
<script src="./ranui/dist/umd/index.umd.cjs"></script>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 使用方式
|
|
131
|
+
|
|
132
|
+
它是基于`Web Components`的组件,你可以不用关注框架就可以使用它。
|
|
133
|
+
|
|
134
|
+
在大多数情况下,您可以像使用本地 `div` 标签一样使用它
|
|
135
|
+
|
|
136
|
+
下面是一些例子:
|
|
137
|
+
|
|
138
|
+
- html
|
|
139
|
+
- js
|
|
140
|
+
- jsx
|
|
141
|
+
- vue
|
|
142
|
+
- tsx
|
|
143
|
+
|
|
144
|
+
### html
|
|
145
|
+
|
|
146
|
+
```html
|
|
147
|
+
<script src="./ranui/dist/umd/index.umd.cjs"></script>
|
|
148
|
+
|
|
149
|
+
<body>
|
|
150
|
+
<r-button>Button</r-button>
|
|
151
|
+
</body>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### js
|
|
155
|
+
|
|
156
|
+
```js
|
|
157
|
+
import 'ranui';
|
|
158
|
+
|
|
159
|
+
const Button = document.createElement('r-button');
|
|
160
|
+
Button.textContent = 'this is button text';
|
|
161
|
+
document.body.appendChild(Button);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### jsx
|
|
165
|
+
|
|
166
|
+
```jsx
|
|
167
|
+
import 'ranui';
|
|
168
|
+
|
|
169
|
+
const App = () => {
|
|
170
|
+
return (
|
|
171
|
+
<>
|
|
172
|
+
<r-button>Button</r-button>
|
|
173
|
+
</>
|
|
174
|
+
);
|
|
175
|
+
};
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### vue
|
|
179
|
+
|
|
180
|
+
```vue
|
|
181
|
+
<template>
|
|
182
|
+
<r-button></r-button>
|
|
183
|
+
</template>
|
|
184
|
+
<script>
|
|
185
|
+
import 'ranui';
|
|
186
|
+
</script>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### tsx
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
import 'ranui/button';
|
|
193
|
+
|
|
194
|
+
const Button = () => {
|
|
195
|
+
return (
|
|
196
|
+
<div>
|
|
197
|
+
<r-button type="primary">button</r-button>
|
|
198
|
+
</div>
|
|
199
|
+
);
|
|
200
|
+
};
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Message 位置与容器配置
|
|
204
|
+
|
|
205
|
+
`window.message` 现已支持自定义顶部偏移、层级和挂载容器:
|
|
206
|
+
|
|
207
|
+
```ts
|
|
208
|
+
import 'ranui/message';
|
|
209
|
+
|
|
210
|
+
const customRoot = document.getElementById('custom-message-root');
|
|
211
|
+
|
|
212
|
+
window.message?.success({
|
|
213
|
+
content: '保存成功',
|
|
214
|
+
duration: 2000,
|
|
215
|
+
top: 24,
|
|
216
|
+
zIndex: 3000,
|
|
217
|
+
getContainer: () => customRoot,
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
`top` 支持 `number | string`(`24` 会转成 `24px`,`'2rem'` 会保留原单位)。
|
|
222
|
+
|
|
223
|
+
`zIndex` 支持 `number | string`。
|
|
224
|
+
|
|
225
|
+
`getContainer` 需要返回 `HTMLElement`;未传时默认挂载到 `document.body`。
|
|
226
|
+
|
|
227
|
+
### 响应式原语
|
|
228
|
+
|
|
229
|
+
`signal`、`createEffect`、`computed`、`batch` 与 DOM builder 一起提供,用于在无框架依赖的情况下构建响应式页面区块。设计参考 SwiftUI 的 `@Observable`,并借鉴 Solid.js 补充了两个正确性改进:effect 重新执行前自动清理过期订阅;`batch()` 将多次 signal 写入合并为一次 effect flush,与 SwiftUI 自动合并变更的行为对齐。
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder';
|
|
233
|
+
|
|
234
|
+
function initCounter(container: HTMLElement) {
|
|
235
|
+
const [count, setCount] = signal(0);
|
|
236
|
+
const [step, setStep] = signal(1);
|
|
237
|
+
const doubled = computed(() => count() * 2);
|
|
238
|
+
const scope = new EventManager();
|
|
239
|
+
|
|
240
|
+
const label = Div().build();
|
|
241
|
+
const view = Div()
|
|
242
|
+
.children(
|
|
243
|
+
label,
|
|
244
|
+
ButtonBuilder()
|
|
245
|
+
.text('+')
|
|
246
|
+
.listen(scope, 'click', () => setCount((n) => n + step())),
|
|
247
|
+
ButtonBuilder()
|
|
248
|
+
.text('重置')
|
|
249
|
+
.listen(
|
|
250
|
+
scope,
|
|
251
|
+
'click',
|
|
252
|
+
() =>
|
|
253
|
+
batch(() => {
|
|
254
|
+
setCount(0);
|
|
255
|
+
setStep(1);
|
|
256
|
+
}), // 两次写入 → 一次 flush
|
|
257
|
+
),
|
|
258
|
+
)
|
|
259
|
+
.build();
|
|
260
|
+
|
|
261
|
+
const dispose = createEffect(() => {
|
|
262
|
+
label.textContent = `${count()} (×2 = ${doubled()})`;
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
container.appendChild(view);
|
|
266
|
+
return () => {
|
|
267
|
+
dispose();
|
|
268
|
+
scope.abort();
|
|
269
|
+
}; // 区块销毁时清理
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
详细 API 请参考 [工具文档](./utils/README.zh-CN.md)。
|
|
274
|
+
|
|
275
|
+
### 路由
|
|
276
|
+
|
|
277
|
+
RanUI 内置客户端路由,提供声明式组件和 JavaScript API 两种方式。
|
|
278
|
+
|
|
279
|
+
**声明式组件:**
|
|
280
|
+
|
|
281
|
+
```html
|
|
282
|
+
<r-router>
|
|
283
|
+
<nav>
|
|
284
|
+
<r-link href="/">首页</r-link>
|
|
285
|
+
<r-link href="/about">关于</r-link>
|
|
286
|
+
</nav>
|
|
287
|
+
|
|
288
|
+
<r-route path="/" exact><h2>首页</h2></r-route>
|
|
289
|
+
<r-route path="/about"><h2>关于</h2></r-route>
|
|
290
|
+
<r-route path="/users/:id"><h2>用户详情</h2></r-route>
|
|
291
|
+
</r-router>
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**JavaScript API,含导航守卫:**
|
|
295
|
+
|
|
296
|
+
```ts
|
|
297
|
+
import { createRouter } from 'ranui';
|
|
298
|
+
|
|
299
|
+
const router = createRouter({
|
|
300
|
+
mode: 'history',
|
|
301
|
+
routes: [
|
|
302
|
+
{ path: '/', exact: true, meta: { title: '首页' } },
|
|
303
|
+
{ path: '/users/:id', meta: { requiresAuth: true } },
|
|
304
|
+
],
|
|
305
|
+
viewTransition: 'spa', // 'spa' | 'mpa' | 'both'
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
router.beforeEach((to, from, next) => {
|
|
309
|
+
if (to.meta?.requiresAuth && !isLoggedIn()) next('/login');
|
|
310
|
+
else next();
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
router.push('/users/42');
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
纯 MPA 站点(无需 JS router)可使用 `enableMpaViewTransitions()` 注入 `@view-transition { navigation: auto }`。共享元素过渡动画通过标准 `view-transition-name` CSS 属性实现。
|
|
317
|
+
|
|
318
|
+
```ts
|
|
319
|
+
import { enableMpaViewTransitions } from 'ranui';
|
|
320
|
+
enableMpaViewTransitions();
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
完整 API(守卫、`onPageSwap`/`onPageReveal`、元素级动画命名)请参考 [路由文档](https://chaxus.github.io/ran/cn/src/ranui/router/)。
|
|
324
|
+
|
|
325
|
+
### SSR & Builder (推荐)
|
|
326
|
+
|
|
327
|
+
对于需要服务端渲染 (SSR) 或更声明式构建 UI 的场景,RanUI 内部使用 `builder`、SSR registry 与 Declarative Shadow DOM。组件会通过 `ensureShadowRoot` 复用已有 Shadow Root,并通过 `ensureShadowElement` 保持初始化幂等。
|
|
328
|
+
|
|
329
|
+
源码内的 SSR 渲染示例:
|
|
330
|
+
|
|
331
|
+
```ts
|
|
332
|
+
import { Button } from '@/components/button';
|
|
333
|
+
import { renderToString } from '@/utils/ssr';
|
|
334
|
+
|
|
335
|
+
const button = new Button();
|
|
336
|
+
button.setAttribute('effect', 'true');
|
|
337
|
+
|
|
338
|
+
// 输出包含 Declarative Shadow DOM 的 HTML 字符串
|
|
339
|
+
const html = renderToString(button);
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
更多细节请查看 [Utility Documentation](./utils/README.md)。
|
|
343
|
+
|
|
344
|
+
## 组件开发约定
|
|
345
|
+
|
|
346
|
+
新增或维护组件时请遵循当前包内约定:
|
|
347
|
+
|
|
348
|
+
- 组件继承 `RanElement`,不要直接继承浏览器环境下的 `HTMLElement`。
|
|
349
|
+
- 使用 `ensureShadowRoot` 创建或复用 Shadow Root,不要直接调用 `attachShadow`。
|
|
350
|
+
- 使用 `ensureShadowElement` 构建 Shadow DOM 子树,保证重复构造时幂等。
|
|
351
|
+
- `observedAttributes` 包含 `sheet`,并通过 `syncSheetAttribute` 同步组件级样式覆盖。
|
|
352
|
+
- `attributeChangedCallback` 首行使用 `if (old === next) return;` 避免重复同步。
|
|
353
|
+
- 使用 `defineSSR('r-name', Component)` 注册组件,而不是直接调用 `customElements.define`。
|
|
354
|
+
- 在 `index.ts` 中同时添加类型导出和副作用导入;在 `vite.config.ts`、`package.json` 中补齐独立入口与导出。
|
|
355
|
+
- 在 `connectedCallback` 中使用 `@/utils/builder` 导出的 `EventManager` 管理生命周期事件;在 `disconnectedCallback` 中调用 `manager.abort()` 一次清理所有监听器,不要逐个调用 `removeEventListener`。
|
|
356
|
+
|
|
357
|
+
## 贡献
|
|
358
|
+
|
|
359
|
+
我们欢迎学习者和开发者的贡献!这是一个实验性项目,请对开发过程保持耐心。
|
|
360
|
+
|
|
361
|
+
## 贡献者
|
|
362
|
+
|
|
363
|
+
<a href="https://github.com/chaxus/ran/graphs/contributors">
|
|
364
|
+
<img src="https://contrib.rocks/image?repo=chaxus/ran" />
|
|
365
|
+
</a>
|
|
366
|
+
|
|
367
|
+
## Meta
|
|
368
|
+
|
|
369
|
+
[LICENSE (MIT)](/LICENSE)
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const failImage = "\n data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==\n";
|
|
2
|
+
export default failImage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './config.bundle';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { isSSR } from './utils/builder/env';
|
|
2
|
+
export { EventManager } from './utils/builder/events';
|
|
3
|
+
export { signal, createEffect, computed, batch } from './utils/builder/signal';
|
|
4
|
+
export type { Getter, Setter, SignalOptions } from './utils/builder/signal';
|
|
5
|
+
export { escapeHtml, escapeHtmlAttribute } from './utils/builder/escape';
|
|
6
|
+
export { matchSelector, collectMatches } from './utils/builder/selectors';
|
|
7
|
+
export type { MockNode } from './utils/builder/selectors';
|
|
8
|
+
export { DocumentFragmentMock, HTMLElementMock, ShadowRootMock } from './utils/builder/mocks';
|
|
9
|
+
export { createRef, ElementBuilder, ShadowBuilder } from './utils/builder/core';
|
|
10
|
+
export type { Ref } from './utils/builder/core';
|
|
11
|
+
export { View, Div, Span, Slot, ButtonBuilder, InputBuilder, Style, Label, Ul, Li, Section, Article, Nav, Header, Footer, Main, DeclarativeShadow, } from './utils/builder/factory';
|
package/dist/builder.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { a as s, c as e, i as t, n as o, o as r, r as c, s as i, t as l } from "./mocks-CMGoftIc.js";
|
|
2
|
+
import { t as n } from "./events-C59wGdni.js";
|
|
3
|
+
import { i as d, n as u, r as S, t as f } from "./signal-XHfNsQNW.js";
|
|
4
|
+
import { _ as M, a as v, b as B, c as b, d as g, f as w, g as E, h as H, i as k, l as D, m as L, n as R, o as y, p as A, r as F, s as x, t as I, u as N, v as T, y as U } from "./factory-BdsO0dEW.js";
|
|
5
|
+
export {
|
|
6
|
+
I as Article,
|
|
7
|
+
R as ButtonBuilder,
|
|
8
|
+
F as DeclarativeShadow,
|
|
9
|
+
k as Div,
|
|
10
|
+
l as DocumentFragmentMock,
|
|
11
|
+
T as ElementBuilder,
|
|
12
|
+
n as EventManager,
|
|
13
|
+
v as Footer,
|
|
14
|
+
o as HTMLElementMock,
|
|
15
|
+
y as Header,
|
|
16
|
+
x as InputBuilder,
|
|
17
|
+
b as Label,
|
|
18
|
+
D as Li,
|
|
19
|
+
N as Main,
|
|
20
|
+
g as Nav,
|
|
21
|
+
w as Section,
|
|
22
|
+
U as ShadowBuilder,
|
|
23
|
+
c as ShadowRootMock,
|
|
24
|
+
A as Slot,
|
|
25
|
+
L as Span,
|
|
26
|
+
H as Style,
|
|
27
|
+
E as Ul,
|
|
28
|
+
M as View,
|
|
29
|
+
f as batch,
|
|
30
|
+
t as collectMatches,
|
|
31
|
+
u as computed,
|
|
32
|
+
S as createEffect,
|
|
33
|
+
B as createRef,
|
|
34
|
+
r as escapeHtml,
|
|
35
|
+
i as escapeHtmlAttribute,
|
|
36
|
+
e as isSSR,
|
|
37
|
+
s as matchSelector,
|
|
38
|
+
d as signal
|
|
39
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { C as i, c as b, d as l, f as d, p as a, s as h } from "./utils-D4pPF77E.js";
|
|
2
|
+
import { t as u } from "./events-C59wGdni.js";
|
|
3
|
+
import { _ as v, i as s, p as f } from "./factory-BdsO0dEW.js";
|
|
4
|
+
import { a as p, n as g } from "./ssr-DSGwPtEd.js";
|
|
5
|
+
var m = '.remove-wap-active-focus{outline:0;-webkit-tap-highlight-color:transparent}.remove-wap-active-focus:active,.remove-wap-active-focus:focus{outline:0;-webkit-tap-highlight-color:transparent}:host{box-sizing:var(--ran-btn-box-sizing, border-box);position:var(--ran-btn-position, relative);display:var(--ran-btn-display, inline-flex);background-image:var(--ran-btn-background-image, none);box-shadow:var(--ran-btn-box-shadow, var(--ran-skin-raised-shadow, 0 2px #00000004));cursor:var(--ran-btn-cursor, pointer);-webkit-user-select:var(--ran-btn-user-select, none);user-select:var(--ran-btn-user-select, none);touch-action:var(--ran-btn-touch-action, manipulation);overflow:var(--ran-btn-overflow, hidden);pointer-events:var(--ran-btn-pointer-events, auto)}:host .ran-btn{box-sizing:var(--ran-btn-contain-box-sizing, border-box);position:var(--ran-btn-contain-position, relative);display:var(--ran-btn-contain-display, block);background-image:var(--ran-btn-contain-background-image, none);cursor:var(--ran-btn-contain-cursor, pointer);transition:var(--ran-btn-contain-transition, all var(--ran-motion-duration-base, .2s) cubic-bezier(.645, .045, .355, 1));-webkit-user-select:var(--ran-btn-contain-user-select, none);user-select:var(--ran-btn-contain-user-select, none);touch-action:var(--ran-btn-contain-touch-action, manipulation);background:var(--ran-btn-contain-background, var(--ran-color-bg-elevated, #fff))}:host,:host(:active),:host(:focus){outline:0;-webkit-tap-highlight-color:transparent}:host .ran-btn,:host(:active) .ran-btn,:host(:focus) .ran-btn{outline:var(--ran-btn-contain-outline, 0)}:host(:focus-visible){outline:var(--ran-btn-focus-outline, 2px solid var(--ran-color-primary));outline-offset:var(--ran-btn-focus-outline-offset, 2px)}:host([type="primary"]) .ran-btn-content{background-color:var(--ran-btn-content-background-color, var(--ran-color-primary, #1890ff));background-image:var(--ran-btn-content-background-image, none);border-color:var(--ran-btn-content-border-color, var(--ran-color-primary, #1890ff));color:var(--ran-btn-content-color, #fff)}:host([type="primary"]:not([disabled])) .ran-btn:after{background-image:var(--ran-btn-after-background-image, radial-gradient(circle, #fff 10%, transparent 10.01%))}:host([type="primary"]:not([disabled]):active) .ran-btn-content{background-color:var(--ran-btn-content-active-background-color, var(--ran-color-primary-active, #005ff2));border-color:var(--ran-btn-content-active-border-color, var(--ran-color-primary-active, #005ff2))}@media(min-width:1024px){:host(:not([disabled]):hover) .ran-btn-content{border-color:var(--ran-btn-content-hover-border-color, var(--ran-color-primary, #1890ff));color:var(--ran-btn-content-hover-color, var(--ran-color-primary, #1890ff))}:host([type="primary"]:not([disabled]):hover) .ran-btn-content{background-color:var(--ran-btn-content-hover-background-color, var(--ran-color-primary-hover, #0059ec));border-color:var(--ran-btn-content-hover-border-color, var(--ran-color-primary-hover, #0059ec));color:var(--ran-btn-content-hover-color, #fff)}:host([type="warning"]:not([disabled]):hover) .ran-btn-content{border-color:var(--ran-btn-content-warning-border-color, var(--ran-color-danger, #ff4d4f));background-color:var(--ran-btn-content-warning-background-color, var(--ran-color-danger, #ff4d4f));color:var(--ran-btn-content-warning-color, #fff)}}:host([type="warning"]) .ran-btn-content{border-color:var(--ran-btn-content-warning-border-color, var(--ran-color-danger, #ff4d4f));background-color:var(--ran-btn-content-warning-background-color, var(--ran-color-danger, #ff4d4f));background-image:var(--ran-btn-content-background-image, none);color:var(--ran-btn-content-warning-color, #fff)}:host([type="warning"]:not([disabled])) .ran-btn:after{background-image:var(--ran-btn-after-background-image, radial-gradient(circle, #fff 10%, transparent 10.01%))}:host([type="text"]) .ran-btn-content{border:var(--ran-btn-content-text-border, none)}:host([disabled]){cursor:var(--ran-btn-disabled-cursor, not-allowed);pointer-events:var(--ran-btn-disabled-pointer-events, all);opacity:var(--ran-btn-disabled-opacity, .6)}:host([disabled]) .ran-btn{cursor:var(--ran-btn-disabled-container-cursor, not-allowed);pointer-events:var(--ran-btn-disabled-container-pointer-events, all);opacity:var(--ran-btn-disabled-container-opacity, .6)}:host(:not([disabled]):active) .ran-btn:after{transform:var(--ran-btn-after-transform, translate(-50%, -50%) scale(0));opacity:var(--ran-btn-after-opacity, .3);transition:var(--ran-btn-after-transition, 0s)}@media(min-width:1024px){:host(:not([disabled],[effect])) .ran-btn:after{content:"";display:block;position:absolute;width:100%;height:100%;left:var(--ran-x, 0);top:var(--ran-y, 0);pointer-events:none;background-image:radial-gradient(circle,var(--ran-color-primary, #1890ff) 10%,transparent 10.01%);background-repeat:no-repeat;background-position:50%;transform:translate(-50%,-50%) scale(10);opacity:0;transition:transform .3s,opacity .8s}}:host .slot{display:var(--ran-btn-slot-display, block)}.ran-btn-content{display:var(--ran-btn-content-display, flex);justify-content:var(--ran-btn-content-display, space-between);align-items:var(--ran-btn-content-align-items, center);padding:var(--ran-btn-content-padding, 4px 15px);border:var(--ran-btn-content-border, 1px solid transparent);border-image-source:var(--ran-btn-content-border-image-source, none);border-image-slice:var(--ran-btn-content-border-image-slice, 8);border-image-width:var(--ran-btn-content-border-image-width, 4px);border-image-outset:0;border-image-repeat:stretch;border-radius:var(--ran-btn-content-border-radius, var(--ran-radius-sm, 6px));border-color:var(--ran-btn-content-border-color, var(--ran-color-border, #d9d9d9));color:var(--ran-btn-content-color, var(--ran-color-text, #000000d9));line-height:var(--ran-btn-content-line-height, 22px);font-size:var(--ran-btn-content-font-size, 14px);font-weight:var(--ran-btn-content-font-weight, 400);font-family:var(--ran-btn-content-font-family, var(--ran-skin-font-family, inherit));white-space:var(--ran-btn-content-white-space, nowrap);text-align:var(--ran-btn-content-text-align, center);box-sizing:var(--ran-btn-content-box-sizing, border-box)}.ran-btn-content .icon{margin-right:var(--ran-btn-icon-margin-right, 2px)}', y = class extends g {
|
|
6
|
+
_btn;
|
|
7
|
+
_btnContent;
|
|
8
|
+
_iconElement;
|
|
9
|
+
_slot;
|
|
10
|
+
_shadowDom;
|
|
11
|
+
_events = new u();
|
|
12
|
+
debounceTimeId;
|
|
13
|
+
static get observedAttributes() {
|
|
14
|
+
return [
|
|
15
|
+
"disabled",
|
|
16
|
+
"icon",
|
|
17
|
+
"effect",
|
|
18
|
+
"iconSize",
|
|
19
|
+
"type",
|
|
20
|
+
"sheet"
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
constructor() {
|
|
24
|
+
super(), this._shadowDom = b(this, m);
|
|
25
|
+
const t = h(this._shadowDom, ".ran-btn", () => s().class("ran-btn").attr("part", "button").role("button").tabIndex(0).children(s().class("ran-btn-content").attr("part", "content").children(f().class("slot"))).build());
|
|
26
|
+
this._btn = t, this._btnContent = t.querySelector(".ran-btn-content"), this._slot = t.querySelector("slot");
|
|
27
|
+
}
|
|
28
|
+
get sheet() {
|
|
29
|
+
return this.getAttribute("sheet") || "";
|
|
30
|
+
}
|
|
31
|
+
set sheet(t) {
|
|
32
|
+
this.setAttribute("sheet", t || ""), this.handlerExternalCss();
|
|
33
|
+
}
|
|
34
|
+
get disabled() {
|
|
35
|
+
return a(this);
|
|
36
|
+
}
|
|
37
|
+
set disabled(t) {
|
|
38
|
+
!t || t === "false" ? (this.removeAttribute("disabled"), this.removeAttribute("aria-disabled")) : (this.setAttribute("disabled", ""), this.setAttribute("aria-disabled", "true"));
|
|
39
|
+
}
|
|
40
|
+
get iconSize() {
|
|
41
|
+
return this.getAttribute("iconSize") || "";
|
|
42
|
+
}
|
|
43
|
+
set iconSize(t) {
|
|
44
|
+
!t || t === "false" ? this.removeAttribute("iconSize") : (this.setAttribute("iconSize", t), this.setIcon());
|
|
45
|
+
}
|
|
46
|
+
get icon() {
|
|
47
|
+
return this.getAttribute("icon") || "";
|
|
48
|
+
}
|
|
49
|
+
set icon(t) {
|
|
50
|
+
!t || t === "false" ? this.removeAttribute("icon") : (this.setAttribute("icon", t), this.setIcon());
|
|
51
|
+
}
|
|
52
|
+
get effect() {
|
|
53
|
+
return this.getAttribute("effect") || "";
|
|
54
|
+
}
|
|
55
|
+
set effect(t) {
|
|
56
|
+
d.includes(t) || !t ? this.removeAttribute("effect") : this.setAttribute("effect", t);
|
|
57
|
+
}
|
|
58
|
+
get type() {
|
|
59
|
+
return this.getAttribute("type") || "";
|
|
60
|
+
}
|
|
61
|
+
set type(t) {
|
|
62
|
+
t ? this.setAttribute("type", t) : this.removeAttribute("type");
|
|
63
|
+
}
|
|
64
|
+
setIcon = () => {
|
|
65
|
+
if (typeof document > "u" || !this._slot) return;
|
|
66
|
+
const t = this.icon;
|
|
67
|
+
if (!t) {
|
|
68
|
+
this._iconElement && (this._iconElement.remove(), this._iconElement = void 0);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (this._iconElement) this._iconElement.setAttribute("name", t);
|
|
72
|
+
else {
|
|
73
|
+
let r = this._shadowDom.querySelector("r-icon");
|
|
74
|
+
r || (r = v("r-icon").attr("color", "currentColor").class("icon").build(), this._slot.insertAdjacentElement("beforebegin", r)), this._iconElement = r, this._iconElement.setAttribute("name", t);
|
|
75
|
+
}
|
|
76
|
+
const { width: n, height: e } = this._slot.getBoundingClientRect(), o = Math.min(n, e) || 16, c = this.iconSize || `${o > 5 ? o - 5 : o}`;
|
|
77
|
+
this._iconElement.setAttribute("size", String(c));
|
|
78
|
+
};
|
|
79
|
+
mousedown = (t) => {
|
|
80
|
+
if (i() === "pc" && !this.disabled) {
|
|
81
|
+
this.debounceMouseEvent();
|
|
82
|
+
const { left: n, top: e } = this.getBoundingClientRect();
|
|
83
|
+
this._btn.style.setProperty("--ran-x", `${t.clientX - n}px`), this._btn.style.setProperty("--ran-y", `${t.clientY - e}px`);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
mouseup = () => {
|
|
87
|
+
i() === "pc" && (this.debounceTimeId || (this.debounceTimeId = setTimeout(() => {
|
|
88
|
+
this._btn.style.removeProperty("--ran-x"), this._btn.style.removeProperty("--ran-y"), this.debounceMouseEvent();
|
|
89
|
+
}, 600)));
|
|
90
|
+
};
|
|
91
|
+
keydown = (t) => {
|
|
92
|
+
a(this) || (t.key === "Enter" || t.key === " ") && (t.preventDefault(), this.click());
|
|
93
|
+
};
|
|
94
|
+
debounceMouseEvent = () => {
|
|
95
|
+
this.debounceTimeId && (clearTimeout(this.debounceTimeId), this.debounceTimeId = void 0);
|
|
96
|
+
};
|
|
97
|
+
handlerExternalCss = () => {
|
|
98
|
+
l(this, this._shadowDom, "sheet", null, this.sheet);
|
|
99
|
+
};
|
|
100
|
+
syncA11yState = () => {
|
|
101
|
+
const t = a(this);
|
|
102
|
+
this._btn.setAttribute("aria-disabled", t ? "true" : "false"), this._btn.tabIndex = t ? -1 : 0, t ? (this.setAttribute("aria-disabled", "true"), this._btnContent.setAttribute("disabled", "true")) : (this.removeAttribute("aria-disabled"), this._btnContent.removeAttribute("disabled"));
|
|
103
|
+
};
|
|
104
|
+
connectedCallback() {
|
|
105
|
+
this.handlerExternalCss(), this.setIcon(), this.syncA11yState(), this._events.on(this._btn, "mousedown", this.mousedown).on(this._btn, "mouseup", this.mouseup).on(this._btn, "keydown", this.keydown);
|
|
106
|
+
}
|
|
107
|
+
disconnectedCallback() {
|
|
108
|
+
this.debounceMouseEvent(), this._events.abort();
|
|
109
|
+
}
|
|
110
|
+
attributeChangedCallback(t, n, e) {
|
|
111
|
+
n !== e && (t === "disabled" && this._btnContent && this.syncA11yState(), (t === "icon" || t === "iconSize") && this.setIcon(), t === "sheet" && this.handlerExternalCss());
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
p("r-button", y);
|
|
115
|
+
export {
|
|
116
|
+
y as t
|
|
117
|
+
};
|
package/dist/button.js
CHANGED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { c as d, d as o, l as a, s as c, u as i } from "./utils-D4pPF77E.js";
|
|
2
|
+
import { i as r, p as s } from "./factory-BdsO0dEW.js";
|
|
3
|
+
import { a as l, n as h } from "./ssr-DSGwPtEd.js";
|
|
4
|
+
var p = ".remove-wap-active-focus{outline:0;-webkit-tap-highlight-color:transparent}.remove-wap-active-focus:active,.remove-wap-active-focus:focus{outline:0;-webkit-tap-highlight-color:transparent}:host{display:var(--ran-card-display, block);box-sizing:border-box;min-height:var(--ran-card-min-height, 0)}.ran-card{display:grid;align-content:start;gap:var(--ran-card-gap, 14px);height:100%;min-width:0;padding:var(--ran-card-padding, 16px);border-width:var(--ran-skin-border-width, 1px);border-style:var(--ran-skin-border-style, solid);border-color:var(--ran-color-border, #d9d9d9);border-radius:var(--ran-card-radius, var(--ran-radius-md));background:var(--ran-card-background, var(--ran-color-bg-muted));box-shadow:var(--ran-card-shadow, none);box-sizing:border-box}.ran-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:14px}.ran-card-title-area{flex:1;min-width:0}.ran-card-title{margin:0;color:var(--ran-card-title-color, var(--ran-color-text));font-size:var(--ran-card-title-font-size, 16px);font-weight:var(--ran-card-title-font-weight, 600);line-height:1.3}.ran-card-title:empty{display:none}.ran-card-description{margin:4px 0 0;color:var(--ran-card-description-color, var(--ran-color-text-secondary));font-size:var(--ran-card-description-font-size, 14px);line-height:1.5}.ran-card-description:empty{display:none}.ran-card-body,.ran-card-footer{min-width:0}:host(:not([title]):not([description])) .ran-card-header{display:none}", g = class extends h {
|
|
5
|
+
_shadowDom;
|
|
6
|
+
_titleEl;
|
|
7
|
+
_descriptionEl;
|
|
8
|
+
_headerEl;
|
|
9
|
+
_footerEl;
|
|
10
|
+
static get observedAttributes() {
|
|
11
|
+
return [
|
|
12
|
+
"title",
|
|
13
|
+
"description",
|
|
14
|
+
"sheet"
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
constructor() {
|
|
18
|
+
super(), this._shadowDom = d(this, p);
|
|
19
|
+
const t = c(this._shadowDom, ".ran-card", () => r().class("ran-card").attr("part", "card").children(r().class("ran-card-header").attr("part", "header").children(r().class("ran-card-title-area").children(r().class("ran-card-title").attr("part", "title"), r().class("ran-card-description").attr("part", "description")), s().attr("name", "extra").attr("part", "extra")), r().class("ran-card-body").attr("part", "body").children(s()), r().class("ran-card-footer").attr("part", "footer").children(s().attr("name", "footer"))).build());
|
|
20
|
+
this._headerEl = t.querySelector(".ran-card-header"), this._titleEl = t.querySelector(".ran-card-title"), this._descriptionEl = t.querySelector(".ran-card-description"), this._footerEl = t.querySelector(".ran-card-footer"), this._footerEl.style.display = "none";
|
|
21
|
+
const e = this._footerEl.querySelector('slot[name="footer"]');
|
|
22
|
+
e.addEventListener("slotchange", () => {
|
|
23
|
+
this._footerEl.style.display = e.assignedElements().length > 0 ? "" : "none";
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
get title() {
|
|
27
|
+
return a(this, "title");
|
|
28
|
+
}
|
|
29
|
+
set title(t) {
|
|
30
|
+
i(this, "title", t);
|
|
31
|
+
}
|
|
32
|
+
get description() {
|
|
33
|
+
return a(this, "description");
|
|
34
|
+
}
|
|
35
|
+
set description(t) {
|
|
36
|
+
i(this, "description", t);
|
|
37
|
+
}
|
|
38
|
+
get sheet() {
|
|
39
|
+
return a(this, "sheet");
|
|
40
|
+
}
|
|
41
|
+
set sheet(t) {
|
|
42
|
+
i(this, "sheet", t);
|
|
43
|
+
}
|
|
44
|
+
_syncTitle() {
|
|
45
|
+
this._titleEl.textContent = this.getAttribute("title") ?? "";
|
|
46
|
+
}
|
|
47
|
+
_syncDescription() {
|
|
48
|
+
this._descriptionEl.textContent = this.getAttribute("description") ?? "";
|
|
49
|
+
}
|
|
50
|
+
connectedCallback() {
|
|
51
|
+
this._syncTitle(), this._syncDescription(), o(this, this._shadowDom, "sheet", null, this.sheet);
|
|
52
|
+
}
|
|
53
|
+
attributeChangedCallback(t, e, n) {
|
|
54
|
+
e !== n && (t === "title" && this._syncTitle(), t === "description" && this._syncDescription(), t === "sheet" && o(this, this._shadowDom, t, e, n));
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
l("r-card", g);
|
|
58
|
+
export {
|
|
59
|
+
g as t
|
|
60
|
+
};
|