@fangxinyan/lumina 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +110 -0
- package/dist/Accordion-GSBY5T5U.css +38 -0
- package/dist/Accordion.cjs +13 -0
- package/dist/Accordion.cjs.map +1 -0
- package/dist/Accordion.d.cts +21 -0
- package/dist/Accordion.d.ts +21 -0
- package/dist/Accordion.js +4 -0
- package/dist/Accordion.js.map +1 -0
- package/dist/Alert-LSKBYDRI.css +35 -0
- package/dist/Alert.cjs +13 -0
- package/dist/Alert.cjs.map +1 -0
- package/dist/Alert.d.cts +17 -0
- package/dist/Alert.d.ts +17 -0
- package/dist/Alert.js +4 -0
- package/dist/Alert.js.map +1 -0
- package/dist/AppShell-RCALXUCZ.css +162 -0
- package/dist/AppShell.cjs +24 -0
- package/dist/AppShell.cjs.map +1 -0
- package/dist/AppShell.d.cts +68 -0
- package/dist/AppShell.d.ts +68 -0
- package/dist/AppShell.js +3 -0
- package/dist/AppShell.js.map +1 -0
- package/dist/Avatar-OXDSG5Q6.css +36 -0
- package/dist/Avatar.cjs +12 -0
- package/dist/Avatar.cjs.map +1 -0
- package/dist/Avatar.d.cts +15 -0
- package/dist/Avatar.d.ts +15 -0
- package/dist/Avatar.js +3 -0
- package/dist/Avatar.js.map +1 -0
- package/dist/Button-5UI7QXGU.css +96 -0
- package/dist/Button.cjs +17 -0
- package/dist/Button.cjs.map +1 -0
- package/dist/Button.d.cts +41 -0
- package/dist/Button.d.ts +41 -0
- package/dist/Button.js +4 -0
- package/dist/Button.js.map +1 -0
- package/dist/Calendar-LHZELUDL.css +65 -0
- package/dist/Calendar.cjs +13 -0
- package/dist/Calendar.cjs.map +1 -0
- package/dist/Calendar.d.cts +16 -0
- package/dist/Calendar.d.ts +16 -0
- package/dist/Calendar.js +4 -0
- package/dist/Calendar.js.map +1 -0
- package/dist/Card-2CHHFD4Y.css +28 -0
- package/dist/Card.cjs +16 -0
- package/dist/Card.cjs.map +1 -0
- package/dist/Card.d.cts +25 -0
- package/dist/Card.d.ts +25 -0
- package/dist/Card.js +3 -0
- package/dist/Card.js.map +1 -0
- package/dist/Cascader-TO2QMSLJ.css +76 -0
- package/dist/Cascader.cjs +13 -0
- package/dist/Cascader.cjs.map +1 -0
- package/dist/Cascader.d.cts +23 -0
- package/dist/Cascader.d.ts +23 -0
- package/dist/Cascader.js +4 -0
- package/dist/Cascader.js.map +1 -0
- package/dist/Checkbox-SKJATVSN.css +72 -0
- package/dist/Checkbox.cjs +17 -0
- package/dist/Checkbox.cjs.map +1 -0
- package/dist/Checkbox.d.cts +33 -0
- package/dist/Checkbox.d.ts +33 -0
- package/dist/Checkbox.js +4 -0
- package/dist/Checkbox.js.map +1 -0
- package/dist/Divider-Z37INS5E.css +49 -0
- package/dist/Divider.cjs +12 -0
- package/dist/Divider.cjs.map +1 -0
- package/dist/Divider.d.cts +12 -0
- package/dist/Divider.d.ts +12 -0
- package/dist/Divider.js +3 -0
- package/dist/Divider.js.map +1 -0
- package/dist/Empty-VM23UNLQ.css +138 -0
- package/dist/Empty.cjs +20 -0
- package/dist/Empty.cjs.map +1 -0
- package/dist/Empty.d.cts +37 -0
- package/dist/Empty.d.ts +37 -0
- package/dist/Empty.js +3 -0
- package/dist/Empty.js.map +1 -0
- package/dist/Icon.cjs +16 -0
- package/dist/Icon.cjs.map +1 -0
- package/dist/Icon.d.cts +21 -0
- package/dist/Icon.d.ts +21 -0
- package/dist/Icon.js +3 -0
- package/dist/Icon.js.map +1 -0
- package/dist/Image-WYWORJT4.css +106 -0
- package/dist/Image.cjs +17 -0
- package/dist/Image.cjs.map +1 -0
- package/dist/Image.d.cts +30 -0
- package/dist/Image.d.ts +30 -0
- package/dist/Image.js +4 -0
- package/dist/Image.js.map +1 -0
- package/dist/Input-Z526ARZP.css +66 -0
- package/dist/Input.cjs +17 -0
- package/dist/Input.cjs.map +1 -0
- package/dist/Input.d.cts +36 -0
- package/dist/Input.d.ts +36 -0
- package/dist/Input.js +4 -0
- package/dist/Input.js.map +1 -0
- package/dist/List-W5BW4D2P.css +26 -0
- package/dist/List.cjs +12 -0
- package/dist/List.cjs.map +1 -0
- package/dist/List.d.cts +20 -0
- package/dist/List.d.ts +20 -0
- package/dist/List.js +3 -0
- package/dist/List.js.map +1 -0
- package/dist/Modal-AYKNIWWQ.css +79 -0
- package/dist/Modal.cjs +18 -0
- package/dist/Modal.cjs.map +1 -0
- package/dist/Modal.d.cts +27 -0
- package/dist/Modal.d.ts +27 -0
- package/dist/Modal.js +5 -0
- package/dist/Modal.js.map +1 -0
- package/dist/Pagination-6FFOI4NM.css +35 -0
- package/dist/Pagination.cjs +13 -0
- package/dist/Pagination.cjs.map +1 -0
- package/dist/Pagination.d.cts +19 -0
- package/dist/Pagination.d.ts +19 -0
- package/dist/Pagination.js +4 -0
- package/dist/Pagination.js.map +1 -0
- package/dist/Popover-WXEVUYBG.css +15 -0
- package/dist/Popover.cjs +12 -0
- package/dist/Popover.cjs.map +1 -0
- package/dist/Popover.d.cts +16 -0
- package/dist/Popover.d.ts +16 -0
- package/dist/Popover.js +3 -0
- package/dist/Popover.js.map +1 -0
- package/dist/Progress-IXRSO5TW.css +63 -0
- package/dist/Progress.cjs +16 -0
- package/dist/Progress.cjs.map +1 -0
- package/dist/Progress.d.cts +26 -0
- package/dist/Progress.d.ts +26 -0
- package/dist/Progress.js +3 -0
- package/dist/Progress.js.map +1 -0
- package/dist/Select-DDJJBQEL.css +263 -0
- package/dist/Select.cjs +14 -0
- package/dist/Select.cjs.map +1 -0
- package/dist/Select.d.cts +68 -0
- package/dist/Select.d.ts +68 -0
- package/dist/Select.js +5 -0
- package/dist/Select.js.map +1 -0
- package/dist/Slider-RE4HZQKF.css +59 -0
- package/dist/Slider.cjs +12 -0
- package/dist/Slider.cjs.map +1 -0
- package/dist/Slider.d.cts +18 -0
- package/dist/Slider.d.ts +18 -0
- package/dist/Slider.js +3 -0
- package/dist/Slider.js.map +1 -0
- package/dist/Switch-NP7KKJOX.css +44 -0
- package/dist/Switch.cjs +12 -0
- package/dist/Switch.cjs.map +1 -0
- package/dist/Switch.d.cts +18 -0
- package/dist/Switch.d.ts +18 -0
- package/dist/Switch.js +3 -0
- package/dist/Switch.js.map +1 -0
- package/dist/Table-ZDPGWLH3.css +139 -0
- package/dist/Table.cjs +18 -0
- package/dist/Table.cjs.map +1 -0
- package/dist/Table.d.cts +57 -0
- package/dist/Table.d.ts +57 -0
- package/dist/Table.js +5 -0
- package/dist/Table.js.map +1 -0
- package/dist/Tabs-A27TSZOP.css +95 -0
- package/dist/Tabs.cjs +16 -0
- package/dist/Tabs.cjs.map +1 -0
- package/dist/Tabs.d.cts +35 -0
- package/dist/Tabs.d.ts +35 -0
- package/dist/Tabs.js +3 -0
- package/dist/Tabs.js.map +1 -0
- package/dist/Tag-EYOY3UWG.css +49 -0
- package/dist/Tag.cjs +17 -0
- package/dist/Tag.cjs.map +1 -0
- package/dist/Tag.d.cts +27 -0
- package/dist/Tag.d.ts +27 -0
- package/dist/Tag.js +4 -0
- package/dist/Tag.js.map +1 -0
- package/dist/Theme.cjs +44 -0
- package/dist/Theme.cjs.map +1 -0
- package/dist/Theme.d.cts +127 -0
- package/dist/Theme.d.ts +127 -0
- package/dist/Theme.js +3 -0
- package/dist/Theme.js.map +1 -0
- package/dist/Toast-ERHDN3WG.css +45 -0
- package/dist/Toast.cjs +17 -0
- package/dist/Toast.cjs.map +1 -0
- package/dist/Toast.d.cts +26 -0
- package/dist/Toast.d.ts +26 -0
- package/dist/Toast.js +4 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Tooltip-RT4BOVTD.css +23 -0
- package/dist/Tooltip.cjs +12 -0
- package/dist/Tooltip.cjs.map +1 -0
- package/dist/Tooltip.d.cts +13 -0
- package/dist/Tooltip.d.ts +13 -0
- package/dist/Tooltip.js +3 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/chunk-2VA2HSL4.cjs +121 -0
- package/dist/chunk-2VA2HSL4.cjs.map +1 -0
- package/dist/chunk-2W2AJUZW.js +118 -0
- package/dist/chunk-2W2AJUZW.js.map +1 -0
- package/dist/chunk-3QWHDCHJ.js +53 -0
- package/dist/chunk-3QWHDCHJ.js.map +1 -0
- package/dist/chunk-3WAFIUDQ.js +85 -0
- package/dist/chunk-3WAFIUDQ.js.map +1 -0
- package/dist/chunk-4AA22BOG.js +63 -0
- package/dist/chunk-4AA22BOG.js.map +1 -0
- package/dist/chunk-4GT5TOHP.js +18 -0
- package/dist/chunk-4GT5TOHP.js.map +1 -0
- package/dist/chunk-5EYI27B6.js +64 -0
- package/dist/chunk-5EYI27B6.js.map +1 -0
- package/dist/chunk-6YVW3VYL.js +51 -0
- package/dist/chunk-6YVW3VYL.js.map +1 -0
- package/dist/chunk-77NP67ML.cjs +70 -0
- package/dist/chunk-77NP67ML.cjs.map +1 -0
- package/dist/chunk-7CKHWCEA.cjs +110 -0
- package/dist/chunk-7CKHWCEA.cjs.map +1 -0
- package/dist/chunk-7H453VPW.cjs +20 -0
- package/dist/chunk-7H453VPW.cjs.map +1 -0
- package/dist/chunk-7NM5BRUX.js +91 -0
- package/dist/chunk-7NM5BRUX.js.map +1 -0
- package/dist/chunk-7U6I44RV.cjs +283 -0
- package/dist/chunk-7U6I44RV.cjs.map +1 -0
- package/dist/chunk-AAMYURWQ.cjs +87 -0
- package/dist/chunk-AAMYURWQ.cjs.map +1 -0
- package/dist/chunk-ALFDP5WX.cjs +70 -0
- package/dist/chunk-ALFDP5WX.cjs.map +1 -0
- package/dist/chunk-C5TGQ7CV.cjs +114 -0
- package/dist/chunk-C5TGQ7CV.cjs.map +1 -0
- package/dist/chunk-F3NHM4GX.js +20 -0
- package/dist/chunk-F3NHM4GX.js.map +1 -0
- package/dist/chunk-FI7QO3I5.cjs +90 -0
- package/dist/chunk-FI7QO3I5.cjs.map +1 -0
- package/dist/chunk-FMG3ZPGK.js +88 -0
- package/dist/chunk-FMG3ZPGK.js.map +1 -0
- package/dist/chunk-G3UWXSNQ.js +71 -0
- package/dist/chunk-G3UWXSNQ.js.map +1 -0
- package/dist/chunk-GEYMWUW6.js +146 -0
- package/dist/chunk-GEYMWUW6.js.map +1 -0
- package/dist/chunk-HTP6UEVR.js +48 -0
- package/dist/chunk-HTP6UEVR.js.map +1 -0
- package/dist/chunk-I2ERCHFV.cjs +58 -0
- package/dist/chunk-I2ERCHFV.cjs.map +1 -0
- package/dist/chunk-I7SSCSFH.js +253 -0
- package/dist/chunk-I7SSCSFH.js.map +1 -0
- package/dist/chunk-IGHLSNXT.cjs +109 -0
- package/dist/chunk-IGHLSNXT.cjs.map +1 -0
- package/dist/chunk-IKI5CS4L.cjs +91 -0
- package/dist/chunk-IKI5CS4L.cjs.map +1 -0
- package/dist/chunk-ITGCHU3Y.cjs +94 -0
- package/dist/chunk-ITGCHU3Y.cjs.map +1 -0
- package/dist/chunk-JNFCTYJT.cjs +31 -0
- package/dist/chunk-JNFCTYJT.cjs.map +1 -0
- package/dist/chunk-JWFVSBVX.cjs +30 -0
- package/dist/chunk-JWFVSBVX.cjs.map +1 -0
- package/dist/chunk-K5MHL732.js +81 -0
- package/dist/chunk-K5MHL732.js.map +1 -0
- package/dist/chunk-K67KIKX4.cjs +67 -0
- package/dist/chunk-K67KIKX4.cjs.map +1 -0
- package/dist/chunk-KF4MCHZL.cjs +105 -0
- package/dist/chunk-KF4MCHZL.cjs.map +1 -0
- package/dist/chunk-M6CGYGEO.js +91 -0
- package/dist/chunk-M6CGYGEO.js.map +1 -0
- package/dist/chunk-M6OTFXZA.js +48 -0
- package/dist/chunk-M6OTFXZA.js.map +1 -0
- package/dist/chunk-NWJW5KLN.js +29 -0
- package/dist/chunk-NWJW5KLN.js.map +1 -0
- package/dist/chunk-NXOAYNG2.cjs +52 -0
- package/dist/chunk-NXOAYNG2.cjs.map +1 -0
- package/dist/chunk-NZPJ7BUB.cjs +22 -0
- package/dist/chunk-NZPJ7BUB.cjs.map +1 -0
- package/dist/chunk-OUJBCNWD.js +52 -0
- package/dist/chunk-OUJBCNWD.js.map +1 -0
- package/dist/chunk-OXYFB2ZI.js +35 -0
- package/dist/chunk-OXYFB2ZI.js.map +1 -0
- package/dist/chunk-Q33V7MSK.js +79 -0
- package/dist/chunk-Q33V7MSK.js.map +1 -0
- package/dist/chunk-QESLHLTG.cjs +107 -0
- package/dist/chunk-QESLHLTG.cjs.map +1 -0
- package/dist/chunk-QPZZNSRB.js +65 -0
- package/dist/chunk-QPZZNSRB.js.map +1 -0
- package/dist/chunk-QT7SJITQ.cjs +114 -0
- package/dist/chunk-QT7SJITQ.cjs.map +1 -0
- package/dist/chunk-RMD6KQ4H.cjs +56 -0
- package/dist/chunk-RMD6KQ4H.cjs.map +1 -0
- package/dist/chunk-T5AH4FCV.js +280 -0
- package/dist/chunk-T5AH4FCV.js.map +1 -0
- package/dist/chunk-U6ODMPTI.cjs +74 -0
- package/dist/chunk-U6ODMPTI.cjs.map +1 -0
- package/dist/chunk-V2ZUOEXM.cjs +73 -0
- package/dist/chunk-V2ZUOEXM.cjs.map +1 -0
- package/dist/chunk-VJN637MT.js +49 -0
- package/dist/chunk-VJN637MT.js.map +1 -0
- package/dist/chunk-VMHNKD3N.cjs +56 -0
- package/dist/chunk-VMHNKD3N.cjs.map +1 -0
- package/dist/chunk-VXITDXLW.js +28 -0
- package/dist/chunk-VXITDXLW.js.map +1 -0
- package/dist/chunk-XFRP2MBR.js +87 -0
- package/dist/chunk-XFRP2MBR.js.map +1 -0
- package/dist/chunk-XRZ5OKZH.js +101 -0
- package/dist/chunk-XRZ5OKZH.js.map +1 -0
- package/dist/chunk-Y6FVCCUE.js +34 -0
- package/dist/chunk-Y6FVCCUE.js.map +1 -0
- package/dist/chunk-YVO7XO4W.cjs +149 -0
- package/dist/chunk-YVO7XO4W.cjs.map +1 -0
- package/dist/chunk-ZMDVK2U3.cjs +302 -0
- package/dist/chunk-ZMDVK2U3.cjs.map +1 -0
- package/dist/chunk-ZXM247EM.cjs +123 -0
- package/dist/chunk-ZXM247EM.cjs.map +1 -0
- package/dist/index.cjs +249 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/shared-NJHRNLRH.css +4 -0
- package/dist/styles.css +2068 -0
- package/dist/tokens-HWQ7KWPG.css +153 -0
- package/dist/tokens.css +153 -0
- package/package.json +77 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('./tokens-HWQ7KWPG.css');
|
|
4
|
+
require('./shared-NJHRNLRH.css');
|
|
5
|
+
require('./Popover-WXEVUYBG.css');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
|
+
|
|
29
|
+
// src/components/Popover/Popover.tsx
|
|
30
|
+
var Popover = ({
|
|
31
|
+
content,
|
|
32
|
+
placement = "bottom",
|
|
33
|
+
trigger = "click",
|
|
34
|
+
defaultOpen = false,
|
|
35
|
+
open,
|
|
36
|
+
onOpenChange,
|
|
37
|
+
children,
|
|
38
|
+
className = ""
|
|
39
|
+
}) => {
|
|
40
|
+
const [inner, setInner] = React__namespace.useState(defaultOpen);
|
|
41
|
+
const isControlled = open !== void 0;
|
|
42
|
+
const show = isControlled ? open : inner;
|
|
43
|
+
const ref = React__namespace.useRef(null);
|
|
44
|
+
const set = (v) => {
|
|
45
|
+
if (!isControlled) setInner(v);
|
|
46
|
+
onOpenChange?.(v);
|
|
47
|
+
};
|
|
48
|
+
React__namespace.useEffect(() => {
|
|
49
|
+
if (trigger !== "click" || !show) return;
|
|
50
|
+
const h = (e) => {
|
|
51
|
+
if (ref.current && !ref.current.contains(e.target)) set(false);
|
|
52
|
+
};
|
|
53
|
+
document.addEventListener("mousedown", h);
|
|
54
|
+
return () => document.removeEventListener("mousedown", h);
|
|
55
|
+
}, [show, trigger]);
|
|
56
|
+
const interact = trigger === "hover" ? { onMouseEnter: () => set(true), onMouseLeave: () => set(false) } : { onClick: () => set(!show) };
|
|
57
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
58
|
+
"span",
|
|
59
|
+
{
|
|
60
|
+
ref,
|
|
61
|
+
className: `popover-anchor ${className}`,
|
|
62
|
+
style: { position: "relative", display: "inline-flex" },
|
|
63
|
+
...interact,
|
|
64
|
+
children: [
|
|
65
|
+
children,
|
|
66
|
+
show && /* @__PURE__ */ jsxRuntime.jsx("span", { className: `popover ${placement}`, children: content })
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
exports.Popover = Popover;
|
|
73
|
+
//# sourceMappingURL=chunk-U6ODMPTI.cjs.map
|
|
74
|
+
//# sourceMappingURL=chunk-U6ODMPTI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Popover/Popover.tsx"],"names":["React","jsxs","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,IAAM,UAAkC,CAAC;AAAA,EAC9C,OAAA;AAAA,EACA,SAAA,GAAY,QAAA;AAAA,EACZ,OAAA,GAAU,OAAA;AAAA,EACV,WAAA,GAAc,KAAA;AAAA,EACd,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAS,WAAW,CAAA;AACpD,EAAA,MAAM,eAAe,IAAA,KAAS,MAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,eAAe,IAAA,GAAQ,KAAA;AACpC,EAAA,MAAM,GAAA,GAAYA,wBAAwB,IAAI,CAAA;AAE9C,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAe;AAC1B,IAAA,IAAI,CAAC,YAAA,EAAc,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,YAAA,GAAe,CAAC,CAAA;AAAA,EAClB,CAAA;AAEA,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,OAAA,KAAY,OAAA,IAAW,CAAC,IAAA,EAAM;AAClC,IAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAkB;AAC3B,MAAA,IAAI,GAAA,CAAI,OAAA,IAAW,CAAC,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAc,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA;AAAA,IACvE,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,CAAC,CAAA;AACxC,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,CAAC,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,MAAM,QAAA,GACJ,YAAY,OAAA,GACR,EAAE,cAAc,MAAM,GAAA,CAAI,IAAI,CAAA,EAAG,YAAA,EAAc,MAAM,GAAA,CAAI,KAAK,GAAE,GAChE,EAAE,SAAS,MAAM,GAAA,CAAI,CAAC,IAAI,CAAA,EAAE;AAElC,EAAA,uBACEC,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,kBAAkB,SAAS,CAAA,CAAA;AAAA,MACtC,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,SAAS,aAAA,EAAc;AAAA,MACrD,GAAG,QAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,wBAAQC,cAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,QAAA,EAAW,SAAS,IAAK,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA;AAAA,GAC7D;AAEJ","file":"chunk-U6ODMPTI.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Popover.css\";\nimport * as React from \"react\";\n\nexport interface PopoverProps {\n content: React.ReactNode;\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n trigger?: \"click\" | \"hover\";\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactElement;\n className?: string;\n}\n\n/** `Popover` — rich content bubble. */\nexport const Popover: React.FC<PopoverProps> = ({\n content,\n placement = \"bottom\",\n trigger = \"click\",\n defaultOpen = false,\n open,\n onOpenChange,\n children,\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState(defaultOpen);\n const isControlled = open !== undefined;\n const show = isControlled ? open! : inner;\n const ref = React.useRef<HTMLSpanElement>(null);\n\n const set = (v: boolean) => {\n if (!isControlled) setInner(v);\n onOpenChange?.(v);\n };\n\n React.useEffect(() => {\n if (trigger !== \"click\" || !show) return;\n const h = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) set(false);\n };\n document.addEventListener(\"mousedown\", h);\n return () => document.removeEventListener(\"mousedown\", h);\n }, [show, trigger]);\n\n const interact =\n trigger === \"hover\"\n ? { onMouseEnter: () => set(true), onMouseLeave: () => set(false) }\n : { onClick: () => set(!show) };\n\n return (\n <span\n ref={ref}\n className={`popover-anchor ${className}`}\n style={{ position: \"relative\", display: \"inline-flex\" }}\n {...interact}\n >\n {children}\n {show && <span className={`popover ${placement}`}>{content}</span>}\n </span>\n );\n};\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('./tokens-HWQ7KWPG.css');
|
|
4
|
+
require('./shared-NJHRNLRH.css');
|
|
5
|
+
require('./Slider-RE4HZQKF.css');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
|
+
|
|
29
|
+
// src/components/Slider/Slider.tsx
|
|
30
|
+
var Slider = ({
|
|
31
|
+
value,
|
|
32
|
+
defaultValue = 0,
|
|
33
|
+
onChange,
|
|
34
|
+
min = 0,
|
|
35
|
+
max = 100,
|
|
36
|
+
step = 1,
|
|
37
|
+
disabled,
|
|
38
|
+
showValue,
|
|
39
|
+
tone = "accent",
|
|
40
|
+
className = ""
|
|
41
|
+
}) => {
|
|
42
|
+
const [inner, setInner] = React__namespace.useState(defaultValue);
|
|
43
|
+
const isControlled = value !== void 0;
|
|
44
|
+
const v = isControlled ? value : inner;
|
|
45
|
+
const pct = (v - min) / (max - min) * 100;
|
|
46
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `slider ${tone} ${disabled ? "disabled" : ""} ${className}`, children: [
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "slider-track", children: [
|
|
48
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "slider-fill", style: { width: `${pct}%` } }),
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "slider-thumb", style: { left: `${pct}%` } })
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
52
|
+
"input",
|
|
53
|
+
{
|
|
54
|
+
type: "range",
|
|
55
|
+
min,
|
|
56
|
+
max,
|
|
57
|
+
step,
|
|
58
|
+
value: v,
|
|
59
|
+
disabled,
|
|
60
|
+
onChange: (e) => {
|
|
61
|
+
const n = Number(e.target.value);
|
|
62
|
+
if (!isControlled) setInner(n);
|
|
63
|
+
onChange?.(n);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
showValue && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-value", children: v })
|
|
68
|
+
] });
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
exports.Slider = Slider;
|
|
72
|
+
//# sourceMappingURL=chunk-V2ZUOEXM.cjs.map
|
|
73
|
+
//# sourceMappingURL=chunk-V2ZUOEXM.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Slider/Slider.tsx"],"names":["React","jsxs","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,IAAM,SAAgC,CAAC;AAAA,EAC5C,KAAA;AAAA,EACA,YAAA,GAAe,CAAA;AAAA,EACf,QAAA;AAAA,EACA,GAAA,GAAM,CAAA;AAAA,EACN,GAAA,GAAM,GAAA;AAAA,EACN,IAAA,GAAO,CAAA;AAAA,EACP,QAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAS,YAAY,CAAA;AACrD,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAS,KAAA;AAClC,EAAA,MAAM,GAAA,GAAA,CAAQ,CAAA,GAAI,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAA,GAAQ,GAAA;AAExC,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EACvE,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,EAAI,EAAG,CAAA;AAAA,sBAC1DA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,EAAI,EAAG;AAAA,KAAA,EAC5D,CAAA;AAAA,oBACAA,cAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,GAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA,EAAO,CAAA;AAAA,QACP,QAAA;AAAA,QACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAC/B,UAAA,IAAI,CAAC,YAAA,EAAc,QAAA,CAAS,CAAC,CAAA;AAC7B,UAAA,QAAA,GAAW,CAAC,CAAA;AAAA,QACd;AAAA;AAAA,KACF;AAAA,IACC,SAAA,oBAAaA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAgB,QAAA,EAAA,CAAA,EAAE;AAAA,GAAA,EAClD,CAAA;AAEJ","file":"chunk-V2ZUOEXM.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Slider.css\";\nimport * as React from \"react\";\n\nexport interface SliderProps {\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n showValue?: boolean;\n tone?: \"accent\" | \"success\" | \"warning\" | \"danger\";\n className?: string;\n}\n\n/** `Slider` — neumorphic range input with grooved track. */\nexport const Slider: React.FC<SliderProps> = ({\n value,\n defaultValue = 0,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n disabled,\n showValue,\n tone = \"accent\",\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState(defaultValue);\n const isControlled = value !== undefined;\n const v = isControlled ? value! : inner;\n const pct = ((v - min) / (max - min)) * 100;\n\n return (\n <div className={`slider ${tone} ${disabled ? \"disabled\" : \"\"} ${className}`}>\n <div className=\"slider-track\">\n <div className=\"slider-fill\" style={{ width: `${pct}%` }} />\n <div className=\"slider-thumb\" style={{ left: `${pct}%` }} />\n </div>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={v}\n disabled={disabled}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (!isControlled) setInner(n);\n onChange?.(n);\n }}\n />\n {showValue && <span className=\"slider-value\">{v}</span>}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import './tokens-HWQ7KWPG.css';
|
|
2
|
+
import './shared-NJHRNLRH.css';
|
|
3
|
+
import './Progress-IXRSO5TW.css';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/components/Progress/Progress.tsx
|
|
7
|
+
var Progress = ({
|
|
8
|
+
value,
|
|
9
|
+
max = 100,
|
|
10
|
+
label,
|
|
11
|
+
showValue,
|
|
12
|
+
tone = "accent",
|
|
13
|
+
size = "md",
|
|
14
|
+
className = ""
|
|
15
|
+
}) => {
|
|
16
|
+
const pct = Math.max(0, Math.min(100, value / max * 100));
|
|
17
|
+
return /* @__PURE__ */ jsxs("div", { className: `progress ${size} ${tone} ${className}`, children: [
|
|
18
|
+
(label || showValue) && /* @__PURE__ */ jsxs("div", { className: "progress-label", children: [
|
|
19
|
+
label ? /* @__PURE__ */ jsx("span", { children: label }) : /* @__PURE__ */ jsx("span", {}),
|
|
20
|
+
showValue && /* @__PURE__ */ jsxs("span", { className: "v", children: [
|
|
21
|
+
Math.round(pct),
|
|
22
|
+
"%"
|
|
23
|
+
] })
|
|
24
|
+
] }),
|
|
25
|
+
/* @__PURE__ */ jsx("div", { className: "progress-track", children: /* @__PURE__ */ jsx("div", { className: "progress-bar", style: { width: `${pct}%` } }) })
|
|
26
|
+
] });
|
|
27
|
+
};
|
|
28
|
+
var Ring = ({
|
|
29
|
+
value,
|
|
30
|
+
max = 100,
|
|
31
|
+
size = 72,
|
|
32
|
+
tone = "accent",
|
|
33
|
+
children,
|
|
34
|
+
className = ""
|
|
35
|
+
}) => {
|
|
36
|
+
const pct = Math.max(0, Math.min(100, value / max * 100));
|
|
37
|
+
return /* @__PURE__ */ jsx(
|
|
38
|
+
"div",
|
|
39
|
+
{
|
|
40
|
+
className: `ring ${tone} ${className}`,
|
|
41
|
+
style: { ["--size"]: `${size}px`, ["--val"]: pct },
|
|
42
|
+
children: /* @__PURE__ */ jsx("span", { className: "ring-label", children: children ?? `${Math.round(pct)}%` })
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export { Progress, Ring };
|
|
48
|
+
//# sourceMappingURL=chunk-VJN637MT.js.map
|
|
49
|
+
//# sourceMappingURL=chunk-VJN637MT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Progress/Progress.tsx"],"names":[],"mappings":";;;;;;AAiBO,IAAM,WAAoC,CAAC;AAAA,EAChD,KAAA;AAAA,EACA,GAAA,GAAM,GAAA;AAAA,EACN,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAC1D,EAAA,uBACE,IAAA,CAAC,SAAI,SAAA,EAAW,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EACjD,QAAA,EAAA;AAAA,IAAA,CAAA,KAAA,IAAS,SAAA,qBACT,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQ,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA,uBAAW,MAAA,EAAA,EAAK,CAAA;AAAA,MACrC,SAAA,oBAAa,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,GAAA,EAAK,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EAAC;AAAA,KAAA,EACtD,CAAA;AAAA,oBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,IAAO,CAAA,EAC7D;AAAA,GAAA,EACF,CAAA;AAEJ;AAYO,IAAM,OAA4B,CAAC;AAAA,EACxC,KAAA;AAAA,EACA,GAAA,GAAM,GAAA;AAAA,EACN,IAAA,GAAO,EAAA;AAAA,EACP,IAAA,GAAO,QAAA;AAAA,EACP,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAC1D,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MACpC,KAAA,EAAO,EAAE,CAAC,QAAiB,GAAG,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA,EAAM,CAAC,OAAgB,GAAG,GAAA,EAAI;AAAA,MAEnE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAc,QAAA,EAAA,QAAA,IAAY,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA,CAAA,EAAI;AAAA;AAAA,GAClE;AAEJ","file":"chunk-VJN637MT.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Progress.css\";\nimport * as React from \"react\";\n\nexport interface ProgressProps {\n /** 0–100 */\n value: number;\n max?: number;\n label?: React.ReactNode;\n showValue?: boolean;\n tone?: \"accent\" | \"success\" | \"warning\" | \"danger\";\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\n/** `Progress` — horizontal progress bar with neumorphic track. */\nexport const Progress: React.FC<ProgressProps> = ({\n value,\n max = 100,\n label,\n showValue,\n tone = \"accent\",\n size = \"md\",\n className = \"\",\n}) => {\n const pct = Math.max(0, Math.min(100, (value / max) * 100));\n return (\n <div className={`progress ${size} ${tone} ${className}`}>\n {(label || showValue) && (\n <div className=\"progress-label\">\n {label ? <span>{label}</span> : <span />}\n {showValue && <span className=\"v\">{Math.round(pct)}%</span>}\n </div>\n )}\n <div className=\"progress-track\">\n <div className=\"progress-bar\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n};\n\nexport interface RingProps {\n value: number;\n max?: number;\n size?: number;\n tone?: \"accent\" | \"success\" | \"warning\" | \"danger\";\n children?: React.ReactNode;\n className?: string;\n}\n\n/** `Ring` — circular progress indicator. */\nexport const Ring: React.FC<RingProps> = ({\n value,\n max = 100,\n size = 72,\n tone = \"accent\",\n children,\n className = \"\",\n}) => {\n const pct = Math.max(0, Math.min(100, (value / max) * 100));\n return (\n <div\n className={`ring ${tone} ${className}`}\n style={{ [\"--size\" as never]: `${size}px`, [\"--val\" as never]: pct }}\n >\n <span className=\"ring-label\">{children ?? `${Math.round(pct)}%`}</span>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkYVO7XO4W_cjs = require('./chunk-YVO7XO4W.cjs');
|
|
4
|
+
require('./tokens-HWQ7KWPG.css');
|
|
5
|
+
require('./shared-NJHRNLRH.css');
|
|
6
|
+
require('./Tag-EYOY3UWG.css');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
var Tag = ({
|
|
10
|
+
tone = "neutral",
|
|
11
|
+
solid,
|
|
12
|
+
dot,
|
|
13
|
+
removable,
|
|
14
|
+
onRemove,
|
|
15
|
+
className = "",
|
|
16
|
+
children,
|
|
17
|
+
...rest
|
|
18
|
+
}) => {
|
|
19
|
+
const cls = ["tag", tone, solid && "solid", className].filter(Boolean).join(" ");
|
|
20
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cls, ...rest, children: [
|
|
21
|
+
dot && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "dot" }),
|
|
22
|
+
children,
|
|
23
|
+
removable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
24
|
+
"span",
|
|
25
|
+
{
|
|
26
|
+
className: "x",
|
|
27
|
+
role: "button",
|
|
28
|
+
"aria-label": "Remove",
|
|
29
|
+
onClick: (e) => {
|
|
30
|
+
e.stopPropagation();
|
|
31
|
+
onRemove?.();
|
|
32
|
+
},
|
|
33
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunkYVO7XO4W_cjs.Icon, { name: "x", size: 11 })
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
] });
|
|
37
|
+
};
|
|
38
|
+
var Badge = ({
|
|
39
|
+
count,
|
|
40
|
+
dot,
|
|
41
|
+
tone = "danger",
|
|
42
|
+
children,
|
|
43
|
+
className = "",
|
|
44
|
+
...rest
|
|
45
|
+
}) => {
|
|
46
|
+
const show = dot || typeof count === "number" && count > 0;
|
|
47
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: `badge-wrap ${className}`, ...rest, children: [
|
|
48
|
+
children,
|
|
49
|
+
show && /* @__PURE__ */ jsxRuntime.jsx("span", { className: `badge ${tone} ${dot ? "dot" : ""}`, children: !dot && (count > 99 ? "99+" : count) })
|
|
50
|
+
] });
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
exports.Badge = Badge;
|
|
54
|
+
exports.Tag = Tag;
|
|
55
|
+
//# sourceMappingURL=chunk-VMHNKD3N.cjs.map
|
|
56
|
+
//# sourceMappingURL=chunk-VMHNKD3N.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Tag/Tag.tsx"],"names":["jsxs","jsx","Icon"],"mappings":";;;;;;;;AAoBO,IAAM,MAA0B,CAAC;AAAA,EACtC,IAAA,GAAO,SAAA;AAAA,EACP,KAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,OAAA,EAAS,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC/E,EAAA,uBACEA,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAA,EAAM,GAAG,IAAA,EACvB,QAAA,EAAA;AAAA,IAAA,GAAA,oBAAOC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EAAM,CAAA;AAAA,IAC7B,QAAA;AAAA,IACA,SAAA,oBACCA,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,GAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,QAAA;AAAA,QACX,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,IAAW;AAAA,QACb,CAAA;AAAA,QAEA,QAAA,kBAAAA,cAAA,CAACC,sBAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,MAAM,EAAA,EAAI;AAAA;AAAA;AAC3B,GAAA,EAEJ,CAAA;AAEJ;AAYO,IAAM,QAA8B,CAAC;AAAA,EAC1C,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,IAAA,GAAO,GAAA,IAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,GAAQ,CAAA;AAC1D,EAAA,uCACG,MAAA,EAAA,EAAK,SAAA,EAAW,cAAc,SAAS,CAAA,CAAA,EAAK,GAAG,IAAA,EAC7C,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,wBACCD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,GAAA,GAAM,KAAA,GAAQ,EAAE,IAC/C,QAAA,EAAA,CAAC,GAAA,KAAQ,KAAA,GAAS,EAAA,GAAK,QAAQ,KAAA,CAAA,EAClC;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-VMHNKD3N.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Tag.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport type TagTone = \"neutral\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: TagTone;\n solid?: boolean;\n /** Render a leading colored dot. */\n dot?: boolean;\n /** Show a close button. */\n removable?: boolean;\n onRemove?: () => void;\n children?: React.ReactNode;\n}\n\n/** `Tag` — small label/pill. */\nexport const Tag: React.FC<TagProps> = ({\n tone = \"neutral\",\n solid,\n dot,\n removable,\n onRemove,\n className = \"\",\n children,\n ...rest\n}) => {\n const cls = [\"tag\", tone, solid && \"solid\", className].filter(Boolean).join(\" \");\n return (\n <span className={cls} {...rest}>\n {dot && <span className=\"dot\" />}\n {children}\n {removable && (\n <span\n className=\"x\"\n role=\"button\"\n aria-label=\"Remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n >\n <Icon name=\"x\" size={11} />\n </span>\n )}\n </span>\n );\n};\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Numeric count — renders as \"99+\" if > 99. */\n count?: number;\n /** Show a tiny dot instead of a number. */\n dot?: boolean;\n tone?: TagTone;\n children?: React.ReactNode;\n}\n\n/** `Badge` — notification dot / count. Wrap around another element. */\nexport const Badge: React.FC<BadgeProps> = ({\n count,\n dot,\n tone = \"danger\",\n children,\n className = \"\",\n ...rest\n}) => {\n const show = dot || (typeof count === \"number\" && count > 0);\n return (\n <span className={`badge-wrap ${className}`} {...rest}>\n {children}\n {show && (\n <span className={`badge ${tone} ${dot ? \"dot\" : \"\"}`}>\n {!dot && (count! > 99 ? \"99+\" : count)}\n </span>\n )}\n </span>\n );\n};\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import './tokens-HWQ7KWPG.css';
|
|
2
|
+
import './shared-NJHRNLRH.css';
|
|
3
|
+
import './Avatar-OXDSG5Q6.css';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/components/Avatar/Avatar.tsx
|
|
7
|
+
var Avatar = ({
|
|
8
|
+
src,
|
|
9
|
+
alt = "",
|
|
10
|
+
initials,
|
|
11
|
+
size = "md",
|
|
12
|
+
status,
|
|
13
|
+
className = "",
|
|
14
|
+
style,
|
|
15
|
+
...rest
|
|
16
|
+
}) => {
|
|
17
|
+
const sizeCls = typeof size === "string" && size !== "md" ? size : "";
|
|
18
|
+
const customStyle = typeof size === "number" ? { ["--size"]: `${size}px`, ...style } : style ?? {};
|
|
19
|
+
const shown = initials ?? alt.slice(0, 2).toUpperCase();
|
|
20
|
+
return /* @__PURE__ */ jsxs("div", { className: `avatar ${sizeCls} ${className}`, style: customStyle, ...rest, children: [
|
|
21
|
+
src ? /* @__PURE__ */ jsx("img", { src, alt }) : /* @__PURE__ */ jsx("span", { children: shown }),
|
|
22
|
+
status && /* @__PURE__ */ jsx("span", { className: `avatar-status ${status}` })
|
|
23
|
+
] });
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { Avatar };
|
|
27
|
+
//# sourceMappingURL=chunk-VXITDXLW.js.map
|
|
28
|
+
//# sourceMappingURL=chunk-VXITDXLW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":[],"mappings":";;;;;;AAgBO,IAAM,SAAgC,CAAC;AAAA,EAC5C,GAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,UAAU,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,OAAO,IAAA,GAAO,EAAA;AACnE,EAAA,MAAM,WAAA,GACJ,OAAO,IAAA,KAAS,QAAA,GAAW,EAAE,CAAC,QAAiB,GAAG,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA,EAAM,GAAG,KAAA,EAAM,GAAI,SAAS,EAAC;AACxF,EAAA,MAAM,QAAQ,QAAA,IAAY,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AACtD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,WAAA,EAAc,GAAG,IAAA,EACvE,QAAA,EAAA;AAAA,IAAA,GAAA,uBAAO,KAAA,EAAA,EAAI,GAAA,EAAU,KAAU,CAAA,mBAAK,GAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACjD,0BAAU,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAA,EAAI;AAAA,GAAA,EACzD,CAAA;AAEJ","file":"chunk-VXITDXLW.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Avatar.css\";\nimport * as React from \"react\";\n\nexport interface AvatarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n src?: string;\n alt?: string;\n /** Initials if no image. Auto-derived from `alt` if omitted. */\n initials?: string;\n size?: number | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Status dot. */\n status?: \"online\" | \"busy\" | \"away\" | \"offline\";\n}\n\n/** `Avatar` — user image or initials chip. */\nexport const Avatar: React.FC<AvatarProps> = ({\n src,\n alt = \"\",\n initials,\n size = \"md\",\n status,\n className = \"\",\n style,\n ...rest\n}) => {\n const sizeCls = typeof size === \"string\" && size !== \"md\" ? size : \"\";\n const customStyle: React.CSSProperties =\n typeof size === \"number\" ? { [\"--size\" as never]: `${size}px`, ...style } : style ?? {};\n const shown = initials ?? alt.slice(0, 2).toUpperCase();\n return (\n <div className={`avatar ${sizeCls} ${className}`} style={customStyle} {...rest}>\n {src ? <img src={src} alt={alt} /> : <span>{shown}</span>}\n {status && <span className={`avatar-status ${status}`} />}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Icon } from './chunk-GEYMWUW6.js';
|
|
2
|
+
import './tokens-HWQ7KWPG.css';
|
|
3
|
+
import './shared-NJHRNLRH.css';
|
|
4
|
+
import './Pagination-6FFOI4NM.css';
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var Pagination = ({
|
|
9
|
+
total,
|
|
10
|
+
pageSize = 10,
|
|
11
|
+
page,
|
|
12
|
+
defaultPage = 1,
|
|
13
|
+
onChange,
|
|
14
|
+
siblings = 1,
|
|
15
|
+
className = ""
|
|
16
|
+
}) => {
|
|
17
|
+
const [inner, setInner] = React.useState(defaultPage);
|
|
18
|
+
const isControlled = page !== void 0;
|
|
19
|
+
const cur = isControlled ? page : inner;
|
|
20
|
+
const pages = Math.max(1, Math.ceil(total / pageSize));
|
|
21
|
+
const go = (p) => {
|
|
22
|
+
const next = Math.min(pages, Math.max(1, p));
|
|
23
|
+
if (!isControlled) setInner(next);
|
|
24
|
+
onChange?.(next);
|
|
25
|
+
};
|
|
26
|
+
const range = () => {
|
|
27
|
+
const out = [];
|
|
28
|
+
const add = (n) => out.push(n);
|
|
29
|
+
const s = Math.max(2, cur - siblings);
|
|
30
|
+
const e = Math.min(pages - 1, cur + siblings);
|
|
31
|
+
add(1);
|
|
32
|
+
if (s > 2) add("...");
|
|
33
|
+
for (let i = s; i <= e; i++) add(i);
|
|
34
|
+
if (e < pages - 1) add("...");
|
|
35
|
+
if (pages > 1) add(pages);
|
|
36
|
+
return out;
|
|
37
|
+
};
|
|
38
|
+
return /* @__PURE__ */ jsxs("div", { className: `pagination ${className}`, children: [
|
|
39
|
+
/* @__PURE__ */ jsxs("span", { className: "pg-info", children: [
|
|
40
|
+
"\u5171 ",
|
|
41
|
+
total,
|
|
42
|
+
" \u6761 \xB7 \u7B2C ",
|
|
43
|
+
cur,
|
|
44
|
+
" / ",
|
|
45
|
+
pages,
|
|
46
|
+
" \u9875"
|
|
47
|
+
] }),
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "pg-controls", children: [
|
|
49
|
+
/* @__PURE__ */ jsx(
|
|
50
|
+
"button",
|
|
51
|
+
{
|
|
52
|
+
type: "button",
|
|
53
|
+
className: `pg ${cur === 1 ? "disabled" : ""}`,
|
|
54
|
+
onClick: () => cur > 1 && go(cur - 1),
|
|
55
|
+
"aria-label": "Previous",
|
|
56
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "chevLeft", size: 12 })
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
range().map(
|
|
60
|
+
(p, i) => p === "..." ? /* @__PURE__ */ jsx("span", { className: "ellipsis", children: "\u2026" }, `e${i}`) : /* @__PURE__ */ jsx(
|
|
61
|
+
"button",
|
|
62
|
+
{
|
|
63
|
+
type: "button",
|
|
64
|
+
className: `pg ${p === cur ? "active" : ""}`,
|
|
65
|
+
onClick: () => go(p),
|
|
66
|
+
children: p
|
|
67
|
+
},
|
|
68
|
+
p
|
|
69
|
+
)
|
|
70
|
+
),
|
|
71
|
+
/* @__PURE__ */ jsx(
|
|
72
|
+
"button",
|
|
73
|
+
{
|
|
74
|
+
type: "button",
|
|
75
|
+
className: `pg ${cur === pages ? "disabled" : ""}`,
|
|
76
|
+
onClick: () => cur < pages && go(cur + 1),
|
|
77
|
+
"aria-label": "Next",
|
|
78
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "chevRight", size: 12 })
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
] })
|
|
82
|
+
] });
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export { Pagination };
|
|
86
|
+
//# sourceMappingURL=chunk-XFRP2MBR.js.map
|
|
87
|
+
//# sourceMappingURL=chunk-XFRP2MBR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Pagination/Pagination.tsx"],"names":[],"mappings":"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","file":"chunk-XFRP2MBR.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Pagination.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface PaginationProps {\n /** Total number of items. */\n total: number;\n /** Items per page. */\n pageSize?: number;\n /** Current page (1-indexed). */\n page?: number;\n defaultPage?: number;\n onChange?: (page: number) => void;\n /** Max visible page buttons (before ellipsis logic). */\n siblings?: number;\n className?: string;\n}\n\n/** `Pagination` — page number controls. */\nexport const Pagination: React.FC<PaginationProps> = ({\n total,\n pageSize = 10,\n page,\n defaultPage = 1,\n onChange,\n siblings = 1,\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState(defaultPage);\n const isControlled = page !== undefined;\n const cur = isControlled ? page! : inner;\n const pages = Math.max(1, Math.ceil(total / pageSize));\n const go = (p: number) => {\n const next = Math.min(pages, Math.max(1, p));\n if (!isControlled) setInner(next);\n onChange?.(next);\n };\n\n const range = (): (number | \"...\")[] => {\n const out: (number | \"...\")[] = [];\n const add = (n: number | \"...\") => out.push(n);\n const s = Math.max(2, cur - siblings);\n const e = Math.min(pages - 1, cur + siblings);\n add(1);\n if (s > 2) add(\"...\");\n for (let i = s; i <= e; i++) add(i);\n if (e < pages - 1) add(\"...\");\n if (pages > 1) add(pages);\n return out;\n };\n\n return (\n <div className={`pagination ${className}`}>\n <span className=\"pg-info\">\n 共 {total} 条 · 第 {cur} / {pages} 页\n </span>\n <div className=\"pg-controls\">\n <button\n type=\"button\"\n className={`pg ${cur === 1 ? \"disabled\" : \"\"}`}\n onClick={() => cur > 1 && go(cur - 1)}\n aria-label=\"Previous\"\n >\n <Icon name=\"chevLeft\" size={12} />\n </button>\n {range().map((p, i) =>\n p === \"...\" ? (\n <span key={`e${i}`} className=\"ellipsis\">…</span>\n ) : (\n <button\n key={p}\n type=\"button\"\n className={`pg ${p === cur ? \"active\" : \"\"}`}\n onClick={() => go(p)}\n >\n {p}\n </button>\n )\n )}\n <button\n type=\"button\"\n className={`pg ${cur === pages ? \"disabled\" : \"\"}`}\n onClick={() => cur < pages && go(cur + 1)}\n aria-label=\"Next\"\n >\n <Icon name=\"chevRight\" size={12} />\n </button>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Icon } from './chunk-GEYMWUW6.js';
|
|
2
|
+
import './tokens-HWQ7KWPG.css';
|
|
3
|
+
import './shared-NJHRNLRH.css';
|
|
4
|
+
import './Cascader-TO2QMSLJ.css';
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var Cascader = ({
|
|
9
|
+
options,
|
|
10
|
+
value,
|
|
11
|
+
defaultValue = [],
|
|
12
|
+
onChange,
|
|
13
|
+
placeholder = "\u8BF7\u9009\u62E9",
|
|
14
|
+
disabled,
|
|
15
|
+
className = ""
|
|
16
|
+
}) => {
|
|
17
|
+
const [inner, setInner] = React.useState(defaultValue);
|
|
18
|
+
const isControlled = value !== void 0;
|
|
19
|
+
const cur = isControlled ? value : inner;
|
|
20
|
+
const [open, setOpen] = React.useState(false);
|
|
21
|
+
const [path, setPath] = React.useState(cur);
|
|
22
|
+
const ref = React.useRef(null);
|
|
23
|
+
React.useEffect(() => {
|
|
24
|
+
const h = (e) => {
|
|
25
|
+
if (ref.current && !ref.current.contains(e.target)) setOpen(false);
|
|
26
|
+
};
|
|
27
|
+
document.addEventListener("mousedown", h);
|
|
28
|
+
return () => document.removeEventListener("mousedown", h);
|
|
29
|
+
}, []);
|
|
30
|
+
React.useEffect(() => {
|
|
31
|
+
if (open) setPath(cur);
|
|
32
|
+
}, [open, cur]);
|
|
33
|
+
const columns = [options];
|
|
34
|
+
let cursor = options;
|
|
35
|
+
for (const v of path) {
|
|
36
|
+
const match = cursor.find((o) => o.value === v);
|
|
37
|
+
if (match && match.children) {
|
|
38
|
+
cursor = match.children;
|
|
39
|
+
columns.push(cursor);
|
|
40
|
+
} else break;
|
|
41
|
+
}
|
|
42
|
+
const pick = (depth, val, hasChildren) => {
|
|
43
|
+
const np = [...path.slice(0, depth), val];
|
|
44
|
+
setPath(np);
|
|
45
|
+
if (!hasChildren) {
|
|
46
|
+
if (!isControlled) setInner(np);
|
|
47
|
+
onChange?.(np);
|
|
48
|
+
setOpen(false);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const labels = [];
|
|
52
|
+
let list = options;
|
|
53
|
+
for (const v of cur) {
|
|
54
|
+
const m = list.find((o) => o.value === v);
|
|
55
|
+
if (!m) break;
|
|
56
|
+
labels.push(m.label);
|
|
57
|
+
if (!m.children) break;
|
|
58
|
+
list = m.children;
|
|
59
|
+
}
|
|
60
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: `cascader ${open ? "open" : ""} ${className}`, children: [
|
|
61
|
+
/* @__PURE__ */ jsxs(
|
|
62
|
+
"button",
|
|
63
|
+
{
|
|
64
|
+
type: "button",
|
|
65
|
+
className: `cascader-trigger ${labels.length === 0 ? "placeholder" : ""}`,
|
|
66
|
+
disabled,
|
|
67
|
+
onClick: () => !disabled && setOpen((o) => !o),
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ jsx("span", { style: { flex: 1 }, children: labels.length ? labels.map((l, i) => /* @__PURE__ */ jsxs("span", { children: [
|
|
70
|
+
i > 0 && " / ",
|
|
71
|
+
l
|
|
72
|
+
] }, i)) : placeholder }),
|
|
73
|
+
/* @__PURE__ */ jsx("span", { style: { position: "absolute", right: 12, color: "var(--fg-subtle)" }, children: /* @__PURE__ */ jsx(Icon, { name: "chevDown", size: 14 }) })
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
),
|
|
77
|
+
open && /* @__PURE__ */ jsx("div", { className: "cascader-panel", children: columns.map((col, depth) => /* @__PURE__ */ jsx("div", { className: "cascader-col", children: col.map((o) => {
|
|
78
|
+
const isActive = path[depth] === o.value;
|
|
79
|
+
const hasChildren = !!(o.children && o.children.length);
|
|
80
|
+
return /* @__PURE__ */ jsxs(
|
|
81
|
+
"button",
|
|
82
|
+
{
|
|
83
|
+
type: "button",
|
|
84
|
+
className: `cascader-item ${isActive ? "active" : ""}`,
|
|
85
|
+
disabled: o.disabled,
|
|
86
|
+
onClick: () => pick(depth, o.value, hasChildren),
|
|
87
|
+
children: [
|
|
88
|
+
o.icon && /* @__PURE__ */ jsx(Icon, { name: o.icon, size: 13 }),
|
|
89
|
+
/* @__PURE__ */ jsx("span", { children: o.label }),
|
|
90
|
+
hasChildren && /* @__PURE__ */ jsx("span", { className: "chev", children: /* @__PURE__ */ jsx(Icon, { name: "chevRight", size: 12 }) })
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
o.value
|
|
94
|
+
);
|
|
95
|
+
}) }, depth)) })
|
|
96
|
+
] });
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export { Cascader };
|
|
100
|
+
//# sourceMappingURL=chunk-XRZ5OKZH.js.map
|
|
101
|
+
//# sourceMappingURL=chunk-XRZ5OKZH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Cascader/Cascader.tsx"],"names":[],"mappings":"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","file":"chunk-XRZ5OKZH.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Cascader.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport interface CascaderOption {\n value: string;\n label: React.ReactNode;\n icon?: IconName;\n children?: CascaderOption[];\n disabled?: boolean;\n}\n\nexport interface CascaderProps {\n options: CascaderOption[];\n value?: string[];\n defaultValue?: string[];\n onChange?: (path: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/** `Cascader` — multi-column hierarchical selector. */\nexport const Cascader: React.FC<CascaderProps> = ({\n options,\n value,\n defaultValue = [],\n onChange,\n placeholder = \"请选择\",\n disabled,\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState<string[]>(defaultValue);\n const isControlled = value !== undefined;\n const cur = isControlled ? value! : inner;\n const [open, setOpen] = React.useState(false);\n const [path, setPath] = React.useState<string[]>(cur);\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const h = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", h);\n return () => document.removeEventListener(\"mousedown\", h);\n }, []);\n\n React.useEffect(() => {\n if (open) setPath(cur);\n }, [open, cur]);\n\n const columns: CascaderOption[][] = [options];\n let cursor: CascaderOption[] = options;\n for (const v of path) {\n const match: CascaderOption | undefined = cursor.find((o) => o.value === v);\n if (match && match.children) {\n cursor = match.children;\n columns.push(cursor);\n } else break;\n }\n\n const pick = (depth: number, val: string, hasChildren: boolean) => {\n const np = [...path.slice(0, depth), val];\n setPath(np);\n if (!hasChildren) {\n if (!isControlled) setInner(np);\n onChange?.(np);\n setOpen(false);\n }\n };\n\n const labels: React.ReactNode[] = [];\n let list: CascaderOption[] = options;\n for (const v of cur) {\n const m: CascaderOption | undefined = list.find((o) => o.value === v);\n if (!m) break;\n labels.push(m.label);\n if (!m.children) break;\n list = m.children;\n }\n\n return (\n <div ref={ref} className={`cascader ${open ? \"open\" : \"\"} ${className}`}>\n <button\n type=\"button\"\n className={`cascader-trigger ${labels.length === 0 ? \"placeholder\" : \"\"}`}\n disabled={disabled}\n onClick={() => !disabled && setOpen((o) => !o)}\n >\n <span style={{ flex: 1 }}>\n {labels.length ? labels.map((l, i) => <span key={i}>{i > 0 && \" / \"}{l}</span>) : placeholder}\n </span>\n <span style={{ position: \"absolute\", right: 12, color: \"var(--fg-subtle)\" }}>\n <Icon name=\"chevDown\" size={14} />\n </span>\n </button>\n {open && (\n <div className=\"cascader-panel\">\n {columns.map((col, depth) => (\n <div key={depth} className=\"cascader-col\">\n {col.map((o) => {\n const isActive = path[depth] === o.value;\n const hasChildren = !!(o.children && o.children.length);\n return (\n <button\n key={o.value}\n type=\"button\"\n className={`cascader-item ${isActive ? \"active\" : \"\"}`}\n disabled={o.disabled}\n onClick={() => pick(depth, o.value, hasChildren)}\n >\n {o.icon && <Icon name={o.icon} size={13} />}\n <span>{o.label}</span>\n {hasChildren && (\n <span className=\"chev\">\n <Icon name=\"chevRight\" size={12} />\n </span>\n )}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import './tokens-HWQ7KWPG.css';
|
|
2
|
+
import './shared-NJHRNLRH.css';
|
|
3
|
+
import './Tooltip-RT4BOVTD.css';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
// src/components/Tooltip/Tooltip.tsx
|
|
8
|
+
var Tooltip = ({
|
|
9
|
+
content,
|
|
10
|
+
placement = "top",
|
|
11
|
+
children,
|
|
12
|
+
delay = 250,
|
|
13
|
+
disabled
|
|
14
|
+
}) => {
|
|
15
|
+
const [show, setShow] = React.useState(false);
|
|
16
|
+
const t = React.useRef();
|
|
17
|
+
const open = () => {
|
|
18
|
+
if (disabled) return;
|
|
19
|
+
window.clearTimeout(t.current);
|
|
20
|
+
t.current = window.setTimeout(() => setShow(true), delay);
|
|
21
|
+
};
|
|
22
|
+
const close = () => {
|
|
23
|
+
window.clearTimeout(t.current);
|
|
24
|
+
setShow(false);
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ jsxs("span", { className: "tip-anchor", onMouseEnter: open, onMouseLeave: close, onFocus: open, onBlur: close, children: [
|
|
27
|
+
children,
|
|
28
|
+
show && /* @__PURE__ */ jsx("span", { className: `tip ${placement}`, children: content })
|
|
29
|
+
] });
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export { Tooltip };
|
|
33
|
+
//# sourceMappingURL=chunk-Y6FVCCUE.js.map
|
|
34
|
+
//# sourceMappingURL=chunk-Y6FVCCUE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Tooltip/Tooltip.tsx"],"names":[],"mappings":";;;;;;;AAcO,IAAM,UAAkC,CAAC;AAAA,EAC9C,OAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA;AAAA,EACA,KAAA,GAAQ,GAAA;AAAA,EACR;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,IAAU,KAAA,CAAA,MAAA,EAA2B;AAE3C,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAA,CAAO,YAAA,CAAa,EAAE,OAAO,CAAA;AAC7B,IAAA,CAAA,CAAE,UAAU,MAAA,CAAO,UAAA,CAAW,MAAM,OAAA,CAAQ,IAAI,GAAG,KAAK,CAAA;AAAA,EAC1D,CAAA;AACA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,MAAA,CAAO,YAAA,CAAa,EAAE,OAAO,CAAA;AAC7B,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAA,EAC1F,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,wBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,IAAA,EAAO,SAAS,IAAK,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACzD,CAAA;AAEJ","file":"chunk-Y6FVCCUE.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Tooltip.css\";\nimport * as React from \"react\";\n\nexport interface TooltipProps {\n content: React.ReactNode;\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n children: React.ReactElement;\n delay?: number;\n disabled?: boolean;\n}\n\n/** `Tooltip` — hover/focus text bubble. */\nexport const Tooltip: React.FC<TooltipProps> = ({\n content,\n placement = \"top\",\n children,\n delay = 250,\n disabled,\n}) => {\n const [show, setShow] = React.useState(false);\n const t = React.useRef<number | undefined>();\n\n const open = () => {\n if (disabled) return;\n window.clearTimeout(t.current);\n t.current = window.setTimeout(() => setShow(true), delay);\n };\n const close = () => {\n window.clearTimeout(t.current);\n setShow(false);\n };\n\n return (\n <span className=\"tip-anchor\" onMouseEnter={open} onMouseLeave={close} onFocus={open} onBlur={close}>\n {children}\n {show && <span className={`tip ${placement}`}>{content}</span>}\n </span>\n );\n};\n"]}
|