wz-h5-design 1.0.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 +51 -0
- package/dist/Button/index.js +84 -0
- package/dist/Button/index.umd.cjs +1 -0
- package/dist/Button/style/index.css +1 -0
- package/dist/Button/style/index.js +1 -0
- package/dist/Button/style.css +1 -0
- package/dist/Card/index.js +32 -0
- package/dist/Card/index.umd.cjs +1 -0
- package/dist/Card/style/index.css +1 -0
- package/dist/Card/style/index.js +1 -0
- package/dist/Card/style.css +1 -0
- package/dist/Cascader/index.js +94 -0
- package/dist/Cascader/index.umd.cjs +1 -0
- package/dist/Cascader/style/index.css +1 -0
- package/dist/Cascader/style/index.js +1 -0
- package/dist/Cascader/style.css +1 -0
- package/dist/Cell/index.js +135 -0
- package/dist/Cell/index.umd.cjs +6 -0
- package/dist/Cell/style/index.css +1 -0
- package/dist/Cell/style/index.js +1 -0
- package/dist/Cell/style.css +1 -0
- package/dist/CheckList/index.js +34 -0
- package/dist/CheckList/index.umd.cjs +1 -0
- package/dist/CheckList/style/index.css +1 -0
- package/dist/CheckList/style/index.js +1 -0
- package/dist/CheckList/style.css +1 -0
- package/dist/Checkbox/index.js +84 -0
- package/dist/Checkbox/index.umd.cjs +1 -0
- package/dist/Checkbox/style/index.css +1 -0
- package/dist/Checkbox/style/index.js +1 -0
- package/dist/Checkbox/style.css +1 -0
- package/dist/Collapse/index.js +72 -0
- package/dist/Collapse/index.umd.cjs +1 -0
- package/dist/Collapse/style/index.css +1 -0
- package/dist/Collapse/style/index.js +1 -0
- package/dist/Collapse/style.css +1 -0
- package/dist/DatePicker/index.js +154 -0
- package/dist/DatePicker/index.umd.cjs +1 -0
- package/dist/DatePicker/style/index.css +1 -0
- package/dist/DatePicker/style/index.js +1 -0
- package/dist/DatePicker/style.css +1 -0
- package/dist/DateRangePicker/index.js +220 -0
- package/dist/DateRangePicker/index.umd.cjs +1 -0
- package/dist/DateRangePicker/style/index.css +1 -0
- package/dist/DateRangePicker/style/index.js +1 -0
- package/dist/DateRangePicker/style.css +1 -0
- package/dist/Dialog/index.js +216 -0
- package/dist/Dialog/index.umd.cjs +6 -0
- package/dist/Dialog/style/index.css +1 -0
- package/dist/Dialog/style/index.js +1 -0
- package/dist/Dialog/style.css +1 -0
- package/dist/Divider/index.js +27 -0
- package/dist/Divider/index.umd.cjs +1 -0
- package/dist/Divider/style/index.css +1 -0
- package/dist/Divider/style/index.js +1 -0
- package/dist/Divider/style.css +1 -0
- package/dist/DropDownMenu/index.js +111 -0
- package/dist/DropDownMenu/index.umd.cjs +1 -0
- package/dist/DropDownMenu/style/index.css +1 -0
- package/dist/DropDownMenu/style/index.js +1 -0
- package/dist/DropDownMenu/style.css +1 -0
- package/dist/Flex/index.js +85 -0
- package/dist/Flex/index.umd.cjs +1 -0
- package/dist/Flex/style/index.css +1 -0
- package/dist/Flex/style/index.js +1 -0
- package/dist/Flex/style.css +1 -0
- package/dist/Grid/index.js +54 -0
- package/dist/Grid/index.umd.cjs +1 -0
- package/dist/Grid/style/index.css +1 -0
- package/dist/Grid/style/index.js +1 -0
- package/dist/Grid/style.css +1 -0
- package/dist/GridView/index.js +90 -0
- package/dist/GridView/index.umd.cjs +1 -0
- package/dist/GridView/style/index.css +1 -0
- package/dist/GridView/style/index.js +1 -0
- package/dist/GridView/style.css +1 -0
- package/dist/Icon/index.js +31 -0
- package/dist/Icon/index.umd.cjs +1 -0
- package/dist/Icon/style/index.css +1 -0
- package/dist/Icon/style/index.js +1 -0
- package/dist/Icon/style.css +1 -0
- package/dist/Input/index.js +148 -0
- package/dist/Input/index.umd.cjs +1 -0
- package/dist/Input/style/index.css +1 -0
- package/dist/Input/style/index.js +1 -0
- package/dist/Input/style.css +1 -0
- package/dist/NavBar/index.js +175 -0
- package/dist/NavBar/index.umd.cjs +6 -0
- package/dist/NavBar/style/index.css +1 -0
- package/dist/NavBar/style/index.js +1 -0
- package/dist/NavBar/style.css +1 -0
- package/dist/Popup/index.js +124 -0
- package/dist/Popup/index.umd.cjs +1 -0
- package/dist/Popup/style/index.css +1 -0
- package/dist/Popup/style/index.js +1 -0
- package/dist/Popup/style.css +1 -0
- package/dist/Radio/index.js +82 -0
- package/dist/Radio/index.umd.cjs +1 -0
- package/dist/Radio/style/index.css +1 -0
- package/dist/Radio/style/index.js +1 -0
- package/dist/Radio/style.css +1 -0
- package/dist/Search/index.js +158 -0
- package/dist/Search/index.umd.cjs +1 -0
- package/dist/Search/style/index.css +1 -0
- package/dist/Search/style/index.js +1 -0
- package/dist/Search/style.css +1 -0
- package/dist/Stepper/index.js +140 -0
- package/dist/Stepper/index.umd.cjs +1 -0
- package/dist/Stepper/style/index.css +1 -0
- package/dist/Stepper/style/index.js +1 -0
- package/dist/Stepper/style.css +1 -0
- package/dist/Switch/index.js +53 -0
- package/dist/Switch/index.umd.cjs +1 -0
- package/dist/Switch/style/index.css +1 -0
- package/dist/Switch/style/index.js +1 -0
- package/dist/Switch/style.css +1 -0
- package/dist/Tabbar/index.js +159 -0
- package/dist/Tabbar/index.umd.cjs +6 -0
- package/dist/Tabbar/style/index.css +1 -0
- package/dist/Tabbar/style/index.js +1 -0
- package/dist/Tabbar/style.css +1 -0
- package/dist/Tabs/index.js +50 -0
- package/dist/Tabs/index.umd.cjs +1 -0
- package/dist/Tabs/style/index.css +1 -0
- package/dist/Tabs/style/index.js +1 -0
- package/dist/Tabs/style.css +1 -0
- package/dist/Tag/index.js +96 -0
- package/dist/Tag/index.umd.cjs +6 -0
- package/dist/Tag/style/index.css +1 -0
- package/dist/Tag/style/index.js +1 -0
- package/dist/Tag/style.css +1 -0
- package/dist/TimePicker/index.js +201 -0
- package/dist/TimePicker/index.umd.cjs +1 -0
- package/dist/TimePicker/style/index.css +1 -0
- package/dist/TimePicker/style/index.js +1 -0
- package/dist/TimePicker/style.css +1 -0
- package/dist/Tip/index.js +104 -0
- package/dist/Tip/index.umd.cjs +6 -0
- package/dist/Tip/style/index.css +1 -0
- package/dist/Tip/style/index.js +1 -0
- package/dist/Tip/style.css +1 -0
- package/dist/Toast/index.js +183 -0
- package/dist/Toast/index.umd.cjs +6 -0
- package/dist/Toast/style/index.css +1 -0
- package/dist/Toast/style/index.js +1 -0
- package/dist/Toast/style.css +1 -0
- package/dist/Tooltip/index.js +172 -0
- package/dist/Tooltip/index.umd.cjs +6 -0
- package/dist/Tooltip/style/index.css +1 -0
- package/dist/Tooltip/style/index.js +1 -0
- package/dist/Tooltip/style.css +1 -0
- package/dist/assets/fonts/qitu/iconfont.css +140 -0
- package/dist/assets/fonts/qitu/iconfont.ttf +0 -0
- package/dist/assets/fonts/qitu/iconfont.woff +0 -0
- package/dist/assets/fonts/qitu/iconfont.woff2 +0 -0
- package/dist/assets/fonts/qituyonghu/iconfont.css +64 -0
- package/dist/assets/fonts/qituyonghu/iconfont.ttf +0 -0
- package/dist/assets/fonts/qituyonghu/iconfont.woff +0 -0
- package/dist/assets/fonts/qituyonghu/iconfont.woff2 +0 -0
- package/dist/assets/fonts/wzdaili/iconfont.css +71 -0
- package/dist/assets/fonts/wzdaili/iconfont.ttf +0 -0
- package/dist/assets/fonts/wzdaili/iconfont.woff +0 -0
- package/dist/assets/fonts/wzdaili/iconfont.woff2 +0 -0
- package/dist/assets/fonts/wzyonghu/iconfont.css +97 -0
- package/dist/assets/fonts/wzyonghu/iconfont.ttf +0 -0
- package/dist/assets/fonts/wzyonghu/iconfont.woff +0 -0
- package/dist/assets/fonts/wzyonghu/iconfont.woff2 +0 -0
- package/dist/assets/fonts/yunying/iconfont.css +303 -0
- package/dist/assets/fonts/yunying/iconfont.ttf +0 -0
- package/dist/assets/fonts/yunying/iconfont.woff +0 -0
- package/dist/assets/fonts/yunying/iconfont.woff2 +0 -0
- package/dist/style.css +1 -0
- package/dist/types/components/Button/Button.d.ts +16 -0
- package/dist/types/components/Button/index.d.ts +5 -0
- package/dist/types/components/Card/Card.d.ts +15 -0
- package/dist/types/components/Card/index.d.ts +3 -0
- package/dist/types/components/Cascader/Cascader.d.ts +14 -0
- package/dist/types/components/Cascader/index.d.ts +3 -0
- package/dist/types/components/Cell/Cell.d.ts +24 -0
- package/dist/types/components/Cell/CellGroup.d.ts +8 -0
- package/dist/types/components/Cell/index.d.ts +8 -0
- package/dist/types/components/CheckList/CheckList.d.ts +11 -0
- package/dist/types/components/CheckList/index.d.ts +3 -0
- package/dist/types/components/Checkbox/Checkbox.d.ts +62 -0
- package/dist/types/components/Checkbox/index.d.ts +3 -0
- package/dist/types/components/Collapse/Collapse.d.ts +17 -0
- package/dist/types/components/Collapse/index.d.ts +3 -0
- package/dist/types/components/DatePicker/DatePicker.d.ts +13 -0
- package/dist/types/components/DatePicker/index.d.ts +3 -0
- package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +13 -0
- package/dist/types/components/DateRangePicker/index.d.ts +3 -0
- package/dist/types/components/Dialog/Dialog.d.ts +16 -0
- package/dist/types/components/Dialog/imperative.d.ts +8 -0
- package/dist/types/components/Dialog/index.d.ts +8 -0
- package/dist/types/components/Divider/Divider.d.ts +11 -0
- package/dist/types/components/Divider/index.d.ts +3 -0
- package/dist/types/components/DropDownMenu/DropdownMenu.d.ts +19 -0
- package/dist/types/components/DropDownMenu/index.d.ts +2 -0
- package/dist/types/components/Flex/Flex.d.ts +25 -0
- package/dist/types/components/Flex/index.d.ts +3 -0
- package/dist/types/components/Grid/Grid.d.ts +22 -0
- package/dist/types/components/Grid/index.d.ts +3 -0
- package/dist/types/components/GridView/GridView.d.ts +59 -0
- package/dist/types/components/GridView/index.d.ts +2 -0
- package/dist/types/components/Icon/Icon.d.ts +12 -0
- package/dist/types/components/Icon/icon-data.d.ts +42 -0
- package/dist/types/components/Icon/index.d.ts +3 -0
- package/dist/types/components/Input/Input.d.ts +17 -0
- package/dist/types/components/Input/index.d.ts +3 -0
- package/dist/types/components/NavBar/NavBar.d.ts +20 -0
- package/dist/types/components/NavBar/index.d.ts +3 -0
- package/dist/types/components/Popup/Popup.d.ts +23 -0
- package/dist/types/components/Popup/index.d.ts +3 -0
- package/dist/types/components/Radio/Radio.d.ts +62 -0
- package/dist/types/components/Radio/index.d.ts +3 -0
- package/dist/types/components/Search/Search.d.ts +26 -0
- package/dist/types/components/Search/index.d.ts +3 -0
- package/dist/types/components/Stepper/Stepper.d.ts +22 -0
- package/dist/types/components/Stepper/index.d.ts +3 -0
- package/dist/types/components/Switch/Switch.d.ts +16 -0
- package/dist/types/components/Switch/index.d.ts +3 -0
- package/dist/types/components/Tabbar/Tabbar.d.ts +39 -0
- package/dist/types/components/Tabbar/index.d.ts +3 -0
- package/dist/types/components/Tabs/Tabs.d.ts +25 -0
- package/dist/types/components/Tabs/index.d.ts +3 -0
- package/dist/types/components/Tag/Tag.d.ts +39 -0
- package/dist/types/components/Tag/index.d.ts +3 -0
- package/dist/types/components/TimePicker/TimePicker.d.ts +12 -0
- package/dist/types/components/TimePicker/index.d.ts +3 -0
- package/dist/types/components/Tip/Tip.d.ts +32 -0
- package/dist/types/components/Tip/index.d.ts +3 -0
- package/dist/types/components/Toast/Toast.d.ts +11 -0
- package/dist/types/components/Toast/index.d.ts +15 -0
- package/dist/types/components/Tooltip/Tooltip.d.ts +17 -0
- package/dist/types/components/Tooltip/index.d.ts +3 -0
- package/dist/types/components/index.d.ts +31 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/utils/color.d.ts +1 -0
- package/dist/wz-h5-design.es.js +2449 -0
- package/dist/wz-h5-design.umd.js +6 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wz-checkbox-group{flex-direction:column;gap:12px;display:inline-flex}.wz-checkbox-group.wz-checkbox-group--horizontal{flex-direction:row;align-items:center}.wz-checkbox-wrapper{cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;outline:none;align-items:center;padding:8px 0;font-family:"Alibaba PuHuiTi 2.0",Alibaba-PuHuiTi-Regular,PingFang SC,Microsoft YaHei,Arial,sans-serif;transition:all .2s ease-in-out;display:inline-flex;position:relative}.wz-checkbox-wrapper.wz-checkbox--small .wz-checkbox-inner{width:16px;height:16px}.wz-checkbox-wrapper.wz-checkbox--small .wz-checkbox-label{margin-left:8px;font-size:13px}.wz-checkbox-wrapper.wz-checkbox--medium .wz-checkbox-inner{width:18px;height:18px}.wz-checkbox-wrapper.wz-checkbox--medium .wz-checkbox-label{margin-left:12px;font-size:14px}.wz-checkbox-wrapper.wz-checkbox--large .wz-checkbox-inner{width:20px;height:20px}.wz-checkbox-wrapper.wz-checkbox--large .wz-checkbox-label{margin-left:16px;font-size:16px}.wz-checkbox-wrapper.wz-checkbox--disabled{cursor:not-allowed;opacity:.6}.wz-checkbox-wrapper.wz-checkbox--disabled .wz-checkbox-inner{background-color:#f5f7fa;border-color:#e4e7ed}.wz-checkbox-wrapper.wz-checkbox--disabled .wz-checkbox-label{color:#c0c4cc}.wz-checkbox-input{opacity:0;z-index:-1;width:0;height:0;margin:0;padding:0;position:absolute}.wz-checkbox-inner{background-color:#fff;border:1.5px solid #dcdfe6;border-radius:2px;transition:all .2s cubic-bezier(.4,0,.2,1);display:inline-block;position:relative;box-shadow:0 1px 2px #0000000d}.wz-checkbox-inner:after{content:"";opacity:0;pointer-events:none;border:2px solid #fff;border-width:0 2px 2px 0;width:6px;height:12px;transition:all .2s cubic-bezier(.4,0,.2,1);display:block;position:absolute;top:50%;left:50%;transform:translate(-50%,-60%)scale(.7)rotate(45deg)}.wz-checkbox-input:checked+.wz-checkbox-inner{border-color:var(--wz-primary-color,#22c94d);background-color:var(--wz-primary-color,#22c94d);box-shadow:0 2px 4px #22c94d33}.wz-checkbox-input:checked+.wz-checkbox-inner:after{opacity:1;transform:translate(-50%,-60%)scale(1)rotate(45deg)}.wz-checkbox-input:focus+.wz-checkbox-inner{border-color:var(--wz-primary-color,#22c94d);box-shadow:0 0 0 3px #22c94d26}.wz-checkbox-wrapper:hover .wz-checkbox-inner{border-color:var(--wz-primary-color,#22c94d);box-shadow:0 2px 4px #22c94d1a}.wz-checkbox-label{color:#333;font-family:"Alibaba PuHuiTi 2.0",Alibaba-PuHuiTi-Regular,PingFang SC,Microsoft YaHei,Arial,sans-serif;line-height:1.5;transition:color .2s}.wz-checkbox-wrapper:hover .wz-checkbox-label{color:var(--wz-primary-color,#22c94d)}@media screen and (max-width:767px){.wz-checkbox-group{gap:8px}.wz-checkbox-wrapper.wz-checkbox--small .wz-checkbox-label{font-size:14px}.wz-checkbox-wrapper.wz-checkbox--medium .wz-checkbox-label{font-size:15px}.wz-checkbox-wrapper.wz-checkbox--large .wz-checkbox-label{font-size:16px}}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
const Collapse = ({
|
|
4
|
+
title,
|
|
5
|
+
extra,
|
|
6
|
+
children,
|
|
7
|
+
defaultExpanded = false,
|
|
8
|
+
expanded,
|
|
9
|
+
onChange,
|
|
10
|
+
style,
|
|
11
|
+
className = "",
|
|
12
|
+
headerStyle,
|
|
13
|
+
headerClassName = "",
|
|
14
|
+
contentStyle,
|
|
15
|
+
contentClassName = ""
|
|
16
|
+
}) => {
|
|
17
|
+
const [innerExpanded, setInnerExpanded] = useState(defaultExpanded);
|
|
18
|
+
const isControlled = expanded !== void 0;
|
|
19
|
+
const isExpanded = isControlled ? expanded : innerExpanded;
|
|
20
|
+
const handleToggle = () => {
|
|
21
|
+
if (!isControlled) {
|
|
22
|
+
setInnerExpanded(!isExpanded);
|
|
23
|
+
}
|
|
24
|
+
onChange == null ? void 0 : onChange(!isExpanded);
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ jsxs("div", { className: `wz-collapse${className ? " " + className : ""}`, style, children: [
|
|
27
|
+
/* @__PURE__ */ jsxs(
|
|
28
|
+
"div",
|
|
29
|
+
{
|
|
30
|
+
className: `wz-collapse-header ${headerClassName}`,
|
|
31
|
+
onClick: handleToggle,
|
|
32
|
+
style: headerStyle,
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx("div", { className: "wz-collapse-title", children: title }),
|
|
35
|
+
/* @__PURE__ */ jsx("div", { className: "wz-collapse-extra", onClick: (e) => e.stopPropagation(), children: extra }),
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
"svg",
|
|
38
|
+
{
|
|
39
|
+
className: `wz-collapse-arrow${isExpanded ? " expanded" : ""}`,
|
|
40
|
+
width: "20",
|
|
41
|
+
height: "20",
|
|
42
|
+
viewBox: "0 0 20 20",
|
|
43
|
+
style: { transition: "transform 0.2s", transform: isExpanded ? "rotate(90deg)" : "rotate(0deg)" },
|
|
44
|
+
children: /* @__PURE__ */ jsx(
|
|
45
|
+
"polyline",
|
|
46
|
+
{
|
|
47
|
+
points: "7,5 13,10 7,15",
|
|
48
|
+
fill: "none",
|
|
49
|
+
stroke: "#888",
|
|
50
|
+
strokeWidth: "2",
|
|
51
|
+
strokeLinecap: "round",
|
|
52
|
+
strokeLinejoin: "round"
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
className: `wz-collapse-content${isExpanded ? " expanded" : ""} ${contentClassName}`,
|
|
64
|
+
style: contentStyle,
|
|
65
|
+
children
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
] });
|
|
69
|
+
};
|
|
70
|
+
export {
|
|
71
|
+
Collapse as default
|
|
72
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("react/jsx-runtime"),require("react")):"function"==typeof define&&define.amd?define(["react/jsx-runtime","react"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).Collapse=t(e.jsxRuntime,e.React)}(this,(function(e,t){"use strict";return({title:s,extra:l,children:n,defaultExpanded:a=!1,expanded:o,onChange:i,style:r,className:d="",headerStyle:c,headerClassName:p="",contentStyle:u,contentClassName:x=""})=>{const[h,f]=t.useState(a),m=void 0!==o,j=m?o:h;return e.jsxs("div",{className:"wz-collapse"+(d?" "+d:""),style:r,children:[e.jsxs("div",{className:`wz-collapse-header ${p}`,onClick:()=>{m||f(!j),null==i||i(!j)},style:c,children:[e.jsx("div",{className:"wz-collapse-title",children:s}),e.jsx("div",{className:"wz-collapse-extra",onClick:e=>e.stopPropagation(),children:l}),e.jsx("svg",{className:"wz-collapse-arrow"+(j?" expanded":""),width:"20",height:"20",viewBox:"0 0 20 20",style:{transition:"transform 0.2s",transform:j?"rotate(90deg)":"rotate(0deg)"},children:e.jsx("polyline",{points:"7,5 13,10 7,15",fill:"none",stroke:"#888",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})]}),e.jsx("div",{className:`wz-collapse-content${j?" expanded":""} ${x}`,style:u,children:n})]})}}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wz-collapse{background:#fff;border-radius:8px;overflow:hidden}.wz-collapse-header{cursor:pointer;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;outline:none;align-items:center;padding:12px 16px;display:flex;position:relative}.wz-collapse-title{color:#333;flex:1;font-size:15px;font-weight:500}.wz-collapse-extra{color:#999;margin-right:12px;font-size:13px}.wz-collapse-arrow{color:#999;transition:transform .2s}.wz-collapse-arrow.expanded{transform:rotate(90deg)}.wz-collapse-content{max-height:0;transition:max-height .2s;overflow:hidden}.wz-collapse-content.expanded{max-height:1000px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import './index.css';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wz-collapse{background:#fff;border-radius:8px;overflow:hidden}.wz-collapse-header{cursor:pointer;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;outline:none;align-items:center;padding:12px 16px;display:flex;position:relative}.wz-collapse-title{color:#333;flex:1;font-size:15px;font-weight:500}.wz-collapse-extra{color:#999;margin-right:12px;font-size:13px}.wz-collapse-arrow{color:#999;transition:transform .2s}.wz-collapse-arrow.expanded{transform:rotate(90deg)}.wz-collapse-content{max-height:0;transition:max-height .2s;overflow:hidden}.wz-collapse-content.expanded{max-height:1000px}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useMemo, useState, useRef, useLayoutEffect } from "react";
|
|
3
|
+
const getYearList = (min, max) => {
|
|
4
|
+
const arr = [];
|
|
5
|
+
for (let i = min; i <= max; i++) arr.push(i.toString());
|
|
6
|
+
return arr;
|
|
7
|
+
};
|
|
8
|
+
const getMonthList = () => Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, "0"));
|
|
9
|
+
const getDayList = (year, month) => {
|
|
10
|
+
const days = new Date(year, month, 0).getDate();
|
|
11
|
+
return Array.from({ length: days }, (_, i) => (i + 1).toString().padStart(2, "0"));
|
|
12
|
+
};
|
|
13
|
+
const DatePicker = ({
|
|
14
|
+
value,
|
|
15
|
+
onChange,
|
|
16
|
+
min = "1970-01-01",
|
|
17
|
+
max = "2100-12-31",
|
|
18
|
+
columns = ["year", "month", "day"],
|
|
19
|
+
itemHeight = 48,
|
|
20
|
+
className = "",
|
|
21
|
+
style
|
|
22
|
+
}) => {
|
|
23
|
+
const today = /* @__PURE__ */ new Date();
|
|
24
|
+
const [initYear, initMonth, initDay] = value ? value.split("-").map(Number) : [today.getFullYear(), today.getMonth() + 1, today.getDate()];
|
|
25
|
+
const minYear = Number(min.split("-")[0]);
|
|
26
|
+
const maxYear = Number(max.split("-")[0]);
|
|
27
|
+
const yearList = useMemo(() => getYearList(minYear, maxYear), [minYear, maxYear]);
|
|
28
|
+
const [year, setYear] = useState(initYear);
|
|
29
|
+
const [month, setMonth] = useState(initMonth);
|
|
30
|
+
const [day, setDay] = useState(initDay);
|
|
31
|
+
const monthList = getMonthList();
|
|
32
|
+
const dayList = getDayList(year, month);
|
|
33
|
+
const yearRef = useRef(null);
|
|
34
|
+
const monthRef = useRef(null);
|
|
35
|
+
const dayRef = useRef(null);
|
|
36
|
+
const startY = useRef(0);
|
|
37
|
+
const startScroll = useRef(0);
|
|
38
|
+
const isDragging = useRef(false);
|
|
39
|
+
const dragType = useRef(null);
|
|
40
|
+
useLayoutEffect(() => {
|
|
41
|
+
if (yearRef.current) yearRef.current.scrollTo({ top: (year - minYear) * itemHeight, behavior: "auto" });
|
|
42
|
+
}, [year, itemHeight, minYear]);
|
|
43
|
+
useLayoutEffect(() => {
|
|
44
|
+
if (monthRef.current) monthRef.current.scrollTo({ top: (month - 1) * itemHeight, behavior: "auto" });
|
|
45
|
+
}, [month, itemHeight]);
|
|
46
|
+
useLayoutEffect(() => {
|
|
47
|
+
if (dayRef.current) dayRef.current.scrollTo({ top: (day - 1) * itemHeight, behavior: "auto" });
|
|
48
|
+
}, [day, itemHeight]);
|
|
49
|
+
const handleTouchStart = (type) => (e) => {
|
|
50
|
+
var _a, _b, _c;
|
|
51
|
+
isDragging.current = true;
|
|
52
|
+
dragType.current = type;
|
|
53
|
+
startY.current = e.touches[0].clientY;
|
|
54
|
+
let scrollTop = 0;
|
|
55
|
+
if (type === "year") scrollTop = ((_a = yearRef.current) == null ? void 0 : _a.scrollTop) || 0;
|
|
56
|
+
if (type === "month") scrollTop = ((_b = monthRef.current) == null ? void 0 : _b.scrollTop) || 0;
|
|
57
|
+
if (type === "day") scrollTop = ((_c = dayRef.current) == null ? void 0 : _c.scrollTop) || 0;
|
|
58
|
+
startScroll.current = scrollTop;
|
|
59
|
+
};
|
|
60
|
+
const handleTouchMove = (e) => {
|
|
61
|
+
if (!isDragging.current || !dragType.current) return;
|
|
62
|
+
const deltaY = e.touches[0].clientY - startY.current;
|
|
63
|
+
if (dragType.current === "year" && yearRef.current) yearRef.current.scrollTop = startScroll.current - deltaY;
|
|
64
|
+
if (dragType.current === "month" && monthRef.current) monthRef.current.scrollTop = startScroll.current - deltaY;
|
|
65
|
+
if (dragType.current === "day" && dayRef.current) dayRef.current.scrollTop = startScroll.current - deltaY;
|
|
66
|
+
};
|
|
67
|
+
const handleTouchEnd = () => {
|
|
68
|
+
if (!isDragging.current || !dragType.current) return;
|
|
69
|
+
if (dragType.current === "year" && yearRef.current) {
|
|
70
|
+
const idx = Math.round(yearRef.current.scrollTop / itemHeight);
|
|
71
|
+
setYear(Number(yearList[idx]));
|
|
72
|
+
onChange == null ? void 0 : onChange(`${yearList[idx]}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}`);
|
|
73
|
+
}
|
|
74
|
+
if (dragType.current === "month" && monthRef.current) {
|
|
75
|
+
const idx = Math.round(monthRef.current.scrollTop / itemHeight);
|
|
76
|
+
setMonth(Number(monthList[idx]));
|
|
77
|
+
onChange == null ? void 0 : onChange(`${year}-${monthList[idx]}-${day.toString().padStart(2, "0")}`);
|
|
78
|
+
}
|
|
79
|
+
if (dragType.current === "day" && dayRef.current) {
|
|
80
|
+
const idx = Math.round(dayRef.current.scrollTop / itemHeight);
|
|
81
|
+
setDay(Number(dayList[idx]));
|
|
82
|
+
onChange == null ? void 0 : onChange(`${year}-${month.toString().padStart(2, "0")}-${dayList[idx]}`);
|
|
83
|
+
}
|
|
84
|
+
isDragging.current = false;
|
|
85
|
+
dragType.current = null;
|
|
86
|
+
};
|
|
87
|
+
const handleScroll = (type) => () => {
|
|
88
|
+
if (isDragging.current) return;
|
|
89
|
+
if (type === "year" && yearRef.current) {
|
|
90
|
+
const idx = Math.round(yearRef.current.scrollTop / itemHeight);
|
|
91
|
+
setYear(Number(yearList[idx]));
|
|
92
|
+
onChange == null ? void 0 : onChange(`${yearList[idx]}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}`);
|
|
93
|
+
}
|
|
94
|
+
if (type === "month" && monthRef.current) {
|
|
95
|
+
const idx = Math.round(monthRef.current.scrollTop / itemHeight);
|
|
96
|
+
setMonth(Number(monthList[idx]));
|
|
97
|
+
onChange == null ? void 0 : onChange(`${year}-${monthList[idx]}-${day.toString().padStart(2, "0")}`);
|
|
98
|
+
}
|
|
99
|
+
if (type === "day" && dayRef.current) {
|
|
100
|
+
const idx = Math.round(dayRef.current.scrollTop / itemHeight);
|
|
101
|
+
setDay(Number(dayList[idx]));
|
|
102
|
+
onChange == null ? void 0 : onChange(`${year}-${month.toString().padStart(2, "0")}-${dayList[idx]}`);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
React.useEffect(() => {
|
|
106
|
+
if (value) {
|
|
107
|
+
const [y, m, d] = value.split("-").map(Number);
|
|
108
|
+
setYear(y);
|
|
109
|
+
setMonth(m);
|
|
110
|
+
setDay(d);
|
|
111
|
+
if (yearRef.current) yearRef.current.scrollTo({ top: (y - minYear) * itemHeight, behavior: "auto" });
|
|
112
|
+
if (monthRef.current) monthRef.current.scrollTo({ top: (m - 1) * itemHeight, behavior: "auto" });
|
|
113
|
+
if (dayRef.current) dayRef.current.scrollTo({ top: (d - 1) * itemHeight, behavior: "auto" });
|
|
114
|
+
}
|
|
115
|
+
}, [value]);
|
|
116
|
+
const renderColumn = (options, current, ref, type) => /* @__PURE__ */ jsxs(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
className: "wz-date-picker-list",
|
|
120
|
+
ref,
|
|
121
|
+
style: { height: itemHeight * 3 },
|
|
122
|
+
onTouchStart: handleTouchStart(type),
|
|
123
|
+
onTouchMove: handleTouchMove,
|
|
124
|
+
onTouchEnd: handleTouchEnd,
|
|
125
|
+
onScroll: handleScroll(type),
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsx("div", { style: { height: itemHeight } }),
|
|
128
|
+
options.map((opt, idx) => /* @__PURE__ */ jsx(
|
|
129
|
+
"div",
|
|
130
|
+
{
|
|
131
|
+
className: `wz-date-picker-item${idx === current ? " active" : ""}`,
|
|
132
|
+
style: { height: itemHeight },
|
|
133
|
+
children: type === "year" ? `${opt}年` : type === "month" ? `${opt}月` : `${opt}日`
|
|
134
|
+
},
|
|
135
|
+
opt
|
|
136
|
+
)),
|
|
137
|
+
/* @__PURE__ */ jsx("div", { style: { height: itemHeight } })
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
return /* @__PURE__ */ jsxs("div", { className: `wz-date-picker ${className}`, style, children: [
|
|
142
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-picker-mask wz-date-picker-mask-top", style: { height: itemHeight } }),
|
|
143
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-picker-indicator", style: { height: itemHeight } }),
|
|
144
|
+
/* @__PURE__ */ jsxs("div", { className: "wz-date-picker-columns", children: [
|
|
145
|
+
columns.includes("year") && renderColumn(yearList, year - minYear, yearRef, "year"),
|
|
146
|
+
columns.includes("month") && renderColumn(monthList, month - 1, monthRef, "month"),
|
|
147
|
+
columns.includes("day") && renderColumn(dayList, day - 1, dayRef, "day")
|
|
148
|
+
] }),
|
|
149
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-picker-mask wz-date-picker-mask-bottom", style: { height: itemHeight } })
|
|
150
|
+
] });
|
|
151
|
+
};
|
|
152
|
+
export {
|
|
153
|
+
DatePicker as default
|
|
154
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("react/jsx-runtime"),require("react")):"function"==typeof define&&define.amd?define(["react/jsx-runtime","react"],r):(t="undefined"!=typeof globalThis?globalThis:t||self).DatePicker=r(t.jsxRuntime,t.React)}(this,(function(t,r){"use strict";return({value:e,onChange:n,min:u="1970-01-01",max:c="2100-12-31",columns:o=["year","month","day"],itemHeight:a=48,className:l="",style:s})=>{const i=new Date,[d,h,p]=e?e.split("-").map(Number):[i.getFullYear(),i.getMonth()+1,i.getDate()],m=Number(u.split("-")[0]),f=Number(c.split("-")[0]),y=r.useMemo((()=>((t,r)=>{const e=[];for(let n=t;n<=r;n++)e.push(n.toString());return e})(m,f)),[m,f]),[g,S]=r.useState(d),[T,v]=r.useState(h),[$,b]=r.useState(p),N=Array.from({length:12},((t,r)=>(r+1).toString().padStart(2,"0"))),x=((t,r)=>{const e=new Date(t,r,0).getDate();return Array.from({length:e},((t,r)=>(r+1).toString().padStart(2,"0")))})(g,T),k=r.useRef(null),j=r.useRef(null),w=r.useRef(null),z=r.useRef(0),M=r.useRef(0),R=r.useRef(!1),D=r.useRef(null);r.useLayoutEffect((()=>{k.current&&k.current.scrollTo({top:(g-m)*a,behavior:"auto"})}),[g,a,m]),r.useLayoutEffect((()=>{j.current&&j.current.scrollTo({top:(T-1)*a,behavior:"auto"})}),[T,a]),r.useLayoutEffect((()=>{w.current&&w.current.scrollTo({top:($-1)*a,behavior:"auto"})}),[$,a]);const E=t=>r=>{var e,n,u;R.current=!0,D.current=t,z.current=r.touches[0].clientY;let c=0;"year"===t&&(c=(null==(e=k.current)?void 0:e.scrollTop)||0),"month"===t&&(c=(null==(n=j.current)?void 0:n.scrollTop)||0),"day"===t&&(c=(null==(u=w.current)?void 0:u.scrollTop)||0),M.current=c},L=t=>{if(!R.current||!D.current)return;const r=t.touches[0].clientY-z.current;"year"===D.current&&k.current&&(k.current.scrollTop=M.current-r),"month"===D.current&&j.current&&(j.current.scrollTop=M.current-r),"day"===D.current&&w.current&&(w.current.scrollTop=M.current-r)},Y=()=>{if(R.current&&D.current){if("year"===D.current&&k.current){const t=Math.round(k.current.scrollTop/a);S(Number(y[t])),null==n||n(`${y[t]}-${T.toString().padStart(2,"0")}-${$.toString().padStart(2,"0")}`)}if("month"===D.current&&j.current){const t=Math.round(j.current.scrollTop/a);v(Number(N[t])),null==n||n(`${g}-${N[t]}-${$.toString().padStart(2,"0")}`)}if("day"===D.current&&w.current){const t=Math.round(w.current.scrollTop/a);b(Number(x[t])),null==n||n(`${g}-${T.toString().padStart(2,"0")}-${x[t]}`)}R.current=!1,D.current=null}},q=t=>()=>{if(!R.current){if("year"===t&&k.current){const t=Math.round(k.current.scrollTop/a);S(Number(y[t])),null==n||n(`${y[t]}-${T.toString().padStart(2,"0")}-${$.toString().padStart(2,"0")}`)}if("month"===t&&j.current){const t=Math.round(j.current.scrollTop/a);v(Number(N[t])),null==n||n(`${g}-${N[t]}-${$.toString().padStart(2,"0")}`)}if("day"===t&&w.current){const t=Math.round(w.current.scrollTop/a);b(Number(x[t])),null==n||n(`${g}-${T.toString().padStart(2,"0")}-${x[t]}`)}}};r.useEffect((()=>{if(e){const[t,r,n]=e.split("-").map(Number);S(t),v(r),b(n),k.current&&k.current.scrollTo({top:(t-m)*a,behavior:"auto"}),j.current&&j.current.scrollTo({top:(r-1)*a,behavior:"auto"}),w.current&&w.current.scrollTo({top:(n-1)*a,behavior:"auto"})}}),[e]);const A=(r,e,n,u)=>t.jsxs("div",{className:"wz-date-picker-list",ref:n,style:{height:3*a},onTouchStart:E(u),onTouchMove:L,onTouchEnd:Y,onScroll:q(u),children:[t.jsx("div",{style:{height:a}}),r.map(((r,n)=>t.jsx("div",{className:"wz-date-picker-item"+(n===e?" active":""),style:{height:a},children:"year"===u?`${r}年`:"month"===u?`${r}月`:`${r}日`},r))),t.jsx("div",{style:{height:a}})]});return t.jsxs("div",{className:`wz-date-picker ${l}`,style:s,children:[t.jsx("div",{className:"wz-date-picker-mask wz-date-picker-mask-top",style:{height:a}}),t.jsx("div",{className:"wz-date-picker-indicator",style:{height:a}}),t.jsxs("div",{className:"wz-date-picker-columns",children:[o.includes("year")&&A(y,g-m,k,"year"),o.includes("month")&&A(N,T-1,j,"month"),o.includes("day")&&A(x,$-1,w,"day")]}),t.jsx("div",{className:"wz-date-picker-mask wz-date-picker-mask-bottom",style:{height:a}})]})}}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wz-date-picker{background:var(--wz-date-picker-bg,#f5f5f5);-webkit-user-select:none;user-select:none;touch-action:pan-y;width:100%;position:relative;overflow:hidden}.wz-date-picker-columns{flex-direction:row;width:100%;height:100%;display:flex}.wz-date-picker-list{-webkit-overflow-scrolling:touch;scrollbar-width:none;z-index:2;flex:1 1 0;min-width:0;position:relative;overflow-y:scroll}.wz-date-picker-list::-webkit-scrollbar{display:none}.wz-date-picker-item{color:var(--wz-date-picker-item-color,#bbb);background:0 0;justify-content:center;align-items:center;font-family:"阿里巴巴普惠体 2.0";font-size:20px;font-weight:600;transition:color .2s;display:flex}.wz-date-picker-item.active{color:var(--wz-date-picker-active-color,#000)}.wz-date-picker-mask{z-index:3;pointer-events:none;position:absolute;left:0;right:0}.wz-date-picker-mask-top{background:linear-gradient(to bottom,var(--wz-date-picker-bg,#f5f5f5)20%,#f5f5f500);top:0}.wz-date-picker-mask-bottom{background:linear-gradient(to top,var(--wz-date-picker-bg,#f5f5f5)20%,#f5f5f500);bottom:0}.wz-date-picker-indicator{z-index:1;pointer-events:none;border-radius:var(--wz-date-picker-radius,10px);background:var(--wz-date-picker-active-bg,#fff);position:absolute;top:50%;left:10px;right:10px;transform:translateY(-50%)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import './index.css';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wz-date-picker{background:var(--wz-date-picker-bg,#f5f5f5);-webkit-user-select:none;user-select:none;touch-action:pan-y;width:100%;position:relative;overflow:hidden}.wz-date-picker-columns{flex-direction:row;width:100%;height:100%;display:flex}.wz-date-picker-list{-webkit-overflow-scrolling:touch;scrollbar-width:none;z-index:2;flex:1 1 0;min-width:0;position:relative;overflow-y:scroll}.wz-date-picker-list::-webkit-scrollbar{display:none}.wz-date-picker-item{color:var(--wz-date-picker-item-color,#bbb);background:0 0;justify-content:center;align-items:center;font-family:"阿里巴巴普惠体 2.0";font-size:20px;font-weight:600;transition:color .2s;display:flex}.wz-date-picker-item.active{color:var(--wz-date-picker-active-color,#000)}.wz-date-picker-mask{z-index:3;pointer-events:none;position:absolute;left:0;right:0}.wz-date-picker-mask-top{background:linear-gradient(to bottom,var(--wz-date-picker-bg,#f5f5f5)20%,#f5f5f500);top:0}.wz-date-picker-mask-bottom{background:linear-gradient(to top,var(--wz-date-picker-bg,#f5f5f5)20%,#f5f5f500);bottom:0}.wz-date-picker-indicator{z-index:1;pointer-events:none;border-radius:var(--wz-date-picker-radius,10px);background:var(--wz-date-picker-active-bg,#fff);position:absolute;top:50%;left:10px;right:10px;transform:translateY(-50%)}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useMemo, useState, useRef, useLayoutEffect } from "react";
|
|
3
|
+
const getYearList = (min, max) => {
|
|
4
|
+
const arr = [];
|
|
5
|
+
for (let i = min; i <= max; i++) arr.push(i.toString());
|
|
6
|
+
return arr;
|
|
7
|
+
};
|
|
8
|
+
const getMonthList = () => Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, "0"));
|
|
9
|
+
const getDayList = (year, month) => {
|
|
10
|
+
const days = new Date(year, month, 0).getDate();
|
|
11
|
+
return Array.from({ length: days }, (_, i) => (i + 1).toString().padStart(2, "0"));
|
|
12
|
+
};
|
|
13
|
+
const DatePicker = ({
|
|
14
|
+
value,
|
|
15
|
+
onChange,
|
|
16
|
+
min = "1970-01-01",
|
|
17
|
+
max = "2100-12-31",
|
|
18
|
+
columns = ["year", "month", "day"],
|
|
19
|
+
itemHeight = 48,
|
|
20
|
+
className = "",
|
|
21
|
+
style
|
|
22
|
+
}) => {
|
|
23
|
+
const today = /* @__PURE__ */ new Date();
|
|
24
|
+
const [initYear, initMonth, initDay] = value ? value.split("-").map(Number) : [today.getFullYear(), today.getMonth() + 1, today.getDate()];
|
|
25
|
+
const minYear = Number(min.split("-")[0]);
|
|
26
|
+
const maxYear = Number(max.split("-")[0]);
|
|
27
|
+
const yearList = useMemo(() => getYearList(minYear, maxYear), [minYear, maxYear]);
|
|
28
|
+
const [year, setYear] = useState(initYear);
|
|
29
|
+
const [month, setMonth] = useState(initMonth);
|
|
30
|
+
const [day, setDay] = useState(initDay);
|
|
31
|
+
const monthList = getMonthList();
|
|
32
|
+
const dayList = getDayList(year, month);
|
|
33
|
+
const yearRef = useRef(null);
|
|
34
|
+
const monthRef = useRef(null);
|
|
35
|
+
const dayRef = useRef(null);
|
|
36
|
+
const startY = useRef(0);
|
|
37
|
+
const startScroll = useRef(0);
|
|
38
|
+
const isDragging = useRef(false);
|
|
39
|
+
const dragType = useRef(null);
|
|
40
|
+
useLayoutEffect(() => {
|
|
41
|
+
if (yearRef.current) yearRef.current.scrollTo({ top: (year - minYear) * itemHeight, behavior: "auto" });
|
|
42
|
+
}, [year, itemHeight, minYear]);
|
|
43
|
+
useLayoutEffect(() => {
|
|
44
|
+
if (monthRef.current) monthRef.current.scrollTo({ top: (month - 1) * itemHeight, behavior: "auto" });
|
|
45
|
+
}, [month, itemHeight]);
|
|
46
|
+
useLayoutEffect(() => {
|
|
47
|
+
if (dayRef.current) dayRef.current.scrollTo({ top: (day - 1) * itemHeight, behavior: "auto" });
|
|
48
|
+
}, [day, itemHeight]);
|
|
49
|
+
const handleTouchStart = (type) => (e) => {
|
|
50
|
+
var _a, _b, _c;
|
|
51
|
+
isDragging.current = true;
|
|
52
|
+
dragType.current = type;
|
|
53
|
+
startY.current = e.touches[0].clientY;
|
|
54
|
+
let scrollTop = 0;
|
|
55
|
+
if (type === "year") scrollTop = ((_a = yearRef.current) == null ? void 0 : _a.scrollTop) || 0;
|
|
56
|
+
if (type === "month") scrollTop = ((_b = monthRef.current) == null ? void 0 : _b.scrollTop) || 0;
|
|
57
|
+
if (type === "day") scrollTop = ((_c = dayRef.current) == null ? void 0 : _c.scrollTop) || 0;
|
|
58
|
+
startScroll.current = scrollTop;
|
|
59
|
+
};
|
|
60
|
+
const handleTouchMove = (e) => {
|
|
61
|
+
if (!isDragging.current || !dragType.current) return;
|
|
62
|
+
const deltaY = e.touches[0].clientY - startY.current;
|
|
63
|
+
if (dragType.current === "year" && yearRef.current) yearRef.current.scrollTop = startScroll.current - deltaY;
|
|
64
|
+
if (dragType.current === "month" && monthRef.current) monthRef.current.scrollTop = startScroll.current - deltaY;
|
|
65
|
+
if (dragType.current === "day" && dayRef.current) dayRef.current.scrollTop = startScroll.current - deltaY;
|
|
66
|
+
};
|
|
67
|
+
const handleTouchEnd = () => {
|
|
68
|
+
if (!isDragging.current || !dragType.current) return;
|
|
69
|
+
if (dragType.current === "year" && yearRef.current) {
|
|
70
|
+
const idx = Math.round(yearRef.current.scrollTop / itemHeight);
|
|
71
|
+
setYear(Number(yearList[idx]));
|
|
72
|
+
onChange == null ? void 0 : onChange(`${yearList[idx]}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}`);
|
|
73
|
+
}
|
|
74
|
+
if (dragType.current === "month" && monthRef.current) {
|
|
75
|
+
const idx = Math.round(monthRef.current.scrollTop / itemHeight);
|
|
76
|
+
setMonth(Number(monthList[idx]));
|
|
77
|
+
onChange == null ? void 0 : onChange(`${year}-${monthList[idx]}-${day.toString().padStart(2, "0")}`);
|
|
78
|
+
}
|
|
79
|
+
if (dragType.current === "day" && dayRef.current) {
|
|
80
|
+
const idx = Math.round(dayRef.current.scrollTop / itemHeight);
|
|
81
|
+
setDay(Number(dayList[idx]));
|
|
82
|
+
onChange == null ? void 0 : onChange(`${year}-${month.toString().padStart(2, "0")}-${dayList[idx]}`);
|
|
83
|
+
}
|
|
84
|
+
isDragging.current = false;
|
|
85
|
+
dragType.current = null;
|
|
86
|
+
};
|
|
87
|
+
const handleScroll = (type) => () => {
|
|
88
|
+
if (isDragging.current) return;
|
|
89
|
+
if (type === "year" && yearRef.current) {
|
|
90
|
+
const idx = Math.round(yearRef.current.scrollTop / itemHeight);
|
|
91
|
+
setYear(Number(yearList[idx]));
|
|
92
|
+
onChange == null ? void 0 : onChange(`${yearList[idx]}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}`);
|
|
93
|
+
}
|
|
94
|
+
if (type === "month" && monthRef.current) {
|
|
95
|
+
const idx = Math.round(monthRef.current.scrollTop / itemHeight);
|
|
96
|
+
setMonth(Number(monthList[idx]));
|
|
97
|
+
onChange == null ? void 0 : onChange(`${year}-${monthList[idx]}-${day.toString().padStart(2, "0")}`);
|
|
98
|
+
}
|
|
99
|
+
if (type === "day" && dayRef.current) {
|
|
100
|
+
const idx = Math.round(dayRef.current.scrollTop / itemHeight);
|
|
101
|
+
setDay(Number(dayList[idx]));
|
|
102
|
+
onChange == null ? void 0 : onChange(`${year}-${month.toString().padStart(2, "0")}-${dayList[idx]}`);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
React.useEffect(() => {
|
|
106
|
+
if (value) {
|
|
107
|
+
const [y, m, d] = value.split("-").map(Number);
|
|
108
|
+
setYear(y);
|
|
109
|
+
setMonth(m);
|
|
110
|
+
setDay(d);
|
|
111
|
+
if (yearRef.current) yearRef.current.scrollTo({ top: (y - minYear) * itemHeight, behavior: "auto" });
|
|
112
|
+
if (monthRef.current) monthRef.current.scrollTo({ top: (m - 1) * itemHeight, behavior: "auto" });
|
|
113
|
+
if (dayRef.current) dayRef.current.scrollTo({ top: (d - 1) * itemHeight, behavior: "auto" });
|
|
114
|
+
}
|
|
115
|
+
}, [value]);
|
|
116
|
+
const renderColumn = (options, current, ref, type) => /* @__PURE__ */ jsxs(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
className: "wz-date-picker-list",
|
|
120
|
+
ref,
|
|
121
|
+
style: { height: itemHeight * 3 },
|
|
122
|
+
onTouchStart: handleTouchStart(type),
|
|
123
|
+
onTouchMove: handleTouchMove,
|
|
124
|
+
onTouchEnd: handleTouchEnd,
|
|
125
|
+
onScroll: handleScroll(type),
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsx("div", { style: { height: itemHeight } }),
|
|
128
|
+
options.map((opt, idx) => /* @__PURE__ */ jsx(
|
|
129
|
+
"div",
|
|
130
|
+
{
|
|
131
|
+
className: `wz-date-picker-item${idx === current ? " active" : ""}`,
|
|
132
|
+
style: { height: itemHeight },
|
|
133
|
+
children: type === "year" ? `${opt}年` : type === "month" ? `${opt}月` : `${opt}日`
|
|
134
|
+
},
|
|
135
|
+
opt
|
|
136
|
+
)),
|
|
137
|
+
/* @__PURE__ */ jsx("div", { style: { height: itemHeight } })
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
return /* @__PURE__ */ jsxs("div", { className: `wz-date-picker ${className}`, style, children: [
|
|
142
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-picker-mask wz-date-picker-mask-top", style: { height: itemHeight } }),
|
|
143
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-picker-indicator", style: { height: itemHeight } }),
|
|
144
|
+
/* @__PURE__ */ jsxs("div", { className: "wz-date-picker-columns", children: [
|
|
145
|
+
columns.includes("year") && renderColumn(yearList, year - minYear, yearRef, "year"),
|
|
146
|
+
columns.includes("month") && renderColumn(monthList, month - 1, monthRef, "month"),
|
|
147
|
+
columns.includes("day") && renderColumn(dayList, day - 1, dayRef, "day")
|
|
148
|
+
] }),
|
|
149
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-picker-mask wz-date-picker-mask-bottom", style: { height: itemHeight } })
|
|
150
|
+
] });
|
|
151
|
+
};
|
|
152
|
+
const DateRangePicker = ({
|
|
153
|
+
value,
|
|
154
|
+
onChange,
|
|
155
|
+
min = "1970-01-01",
|
|
156
|
+
max = "2100-12-31",
|
|
157
|
+
startLabel = "开始时间",
|
|
158
|
+
endLabel = "结束时间",
|
|
159
|
+
className = "",
|
|
160
|
+
style
|
|
161
|
+
}) => {
|
|
162
|
+
const todayStr = React.useMemo(() => {
|
|
163
|
+
const today = /* @__PURE__ */ new Date();
|
|
164
|
+
const y = today.getFullYear();
|
|
165
|
+
const m = (today.getMonth() + 1).toString().padStart(2, "0");
|
|
166
|
+
const d = today.getDate().toString().padStart(2, "0");
|
|
167
|
+
return `${y}-${m}-${d}`;
|
|
168
|
+
}, []);
|
|
169
|
+
const [innerValue, setInnerValue] = useState(value || [todayStr, todayStr]);
|
|
170
|
+
const range = value || innerValue;
|
|
171
|
+
const [active, setActive] = useState("start");
|
|
172
|
+
const handleSelect = (val) => {
|
|
173
|
+
if (active === "start") {
|
|
174
|
+
const newRange = [val, range[1] && range[1] >= val ? range[1] : val];
|
|
175
|
+
setInnerValue(newRange);
|
|
176
|
+
onChange == null ? void 0 : onChange(newRange);
|
|
177
|
+
} else {
|
|
178
|
+
const newRange = [range[0], val && val >= range[0] ? val : range[0]];
|
|
179
|
+
setInnerValue(newRange);
|
|
180
|
+
onChange == null ? void 0 : onChange(newRange);
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
return /* @__PURE__ */ jsxs("div", { className: `wz-date-range-picker ${className}`, style, children: [
|
|
184
|
+
/* @__PURE__ */ jsxs("div", { className: "wz-date-range-picker-label-row", children: [
|
|
185
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-range-picker-label", children: startLabel }),
|
|
186
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-range-picker-label", children: endLabel })
|
|
187
|
+
] }),
|
|
188
|
+
/* @__PURE__ */ jsxs("div", { className: "wz-date-range-picker-row", children: [
|
|
189
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-range-picker-col", children: /* @__PURE__ */ jsx(
|
|
190
|
+
"div",
|
|
191
|
+
{
|
|
192
|
+
className: `wz-date-range-picker-value${active === "start" ? " active" : ""}`,
|
|
193
|
+
onClick: () => setActive("start"),
|
|
194
|
+
children: range[0] || "请选择"
|
|
195
|
+
}
|
|
196
|
+
) }),
|
|
197
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-range-picker-sep", children: "至" }),
|
|
198
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-range-picker-col", children: /* @__PURE__ */ jsx(
|
|
199
|
+
"div",
|
|
200
|
+
{
|
|
201
|
+
className: `wz-date-range-picker-value${active === "end" ? " active" : ""}`,
|
|
202
|
+
onClick: () => setActive("end"),
|
|
203
|
+
children: range[1] || "请选择"
|
|
204
|
+
}
|
|
205
|
+
) })
|
|
206
|
+
] }),
|
|
207
|
+
/* @__PURE__ */ jsx("div", { className: "wz-date-range-picker-picker", children: /* @__PURE__ */ jsx(
|
|
208
|
+
DatePicker,
|
|
209
|
+
{
|
|
210
|
+
value: active === "start" ? range[0] : range[1],
|
|
211
|
+
onChange: handleSelect,
|
|
212
|
+
min,
|
|
213
|
+
max
|
|
214
|
+
}
|
|
215
|
+
) })
|
|
216
|
+
] });
|
|
217
|
+
};
|
|
218
|
+
export {
|
|
219
|
+
DateRangePicker as default
|
|
220
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("react/jsx-runtime"),require("react")):"function"==typeof define&&define.amd?define(["react/jsx-runtime","react"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).DateRangePicker=t(e.jsxRuntime,e.React)}(this,(function(e,t){"use strict";const r=({value:r,onChange:n,min:a="1970-01-01",max:c="2100-12-31",columns:s=["year","month","day"],itemHeight:l=48,className:o="",style:u})=>{const i=new Date,[d,p,h]=r?r.split("-").map(Number):[i.getFullYear(),i.getMonth()+1,i.getDate()],m=Number(a.split("-")[0]),g=Number(c.split("-")[0]),f=t.useMemo((()=>((e,t)=>{const r=[];for(let n=e;n<=t;n++)r.push(n.toString());return r})(m,g)),[m,g]),[v,y]=t.useState(d),[S,N]=t.useState(p),[x,k]=t.useState(h),$=Array.from({length:12},((e,t)=>(t+1).toString().padStart(2,"0"))),b=((e,t)=>{const r=new Date(e,t,0).getDate();return Array.from({length:r},((e,t)=>(t+1).toString().padStart(2,"0")))})(v,S),j=t.useRef(null),w=t.useRef(null),T=t.useRef(null),z=t.useRef(0),M=t.useRef(0),R=t.useRef(!1),D=t.useRef(null);t.useLayoutEffect((()=>{j.current&&j.current.scrollTo({top:(v-m)*l,behavior:"auto"})}),[v,l,m]),t.useLayoutEffect((()=>{w.current&&w.current.scrollTo({top:(S-1)*l,behavior:"auto"})}),[S,l]),t.useLayoutEffect((()=>{T.current&&T.current.scrollTo({top:(x-1)*l,behavior:"auto"})}),[x,l]);const C=e=>t=>{var r,n,a;R.current=!0,D.current=e,z.current=t.touches[0].clientY;let c=0;"year"===e&&(c=(null==(r=j.current)?void 0:r.scrollTop)||0),"month"===e&&(c=(null==(n=w.current)?void 0:n.scrollTop)||0),"day"===e&&(c=(null==(a=T.current)?void 0:a.scrollTop)||0),M.current=c},E=e=>{if(!R.current||!D.current)return;const t=e.touches[0].clientY-z.current;"year"===D.current&&j.current&&(j.current.scrollTop=M.current-t),"month"===D.current&&w.current&&(w.current.scrollTop=M.current-t),"day"===D.current&&T.current&&(T.current.scrollTop=M.current-t)},L=()=>{if(R.current&&D.current){if("year"===D.current&&j.current){const e=Math.round(j.current.scrollTop/l);y(Number(f[e])),null==n||n(`${f[e]}-${S.toString().padStart(2,"0")}-${x.toString().padStart(2,"0")}`)}if("month"===D.current&&w.current){const e=Math.round(w.current.scrollTop/l);N(Number($[e])),null==n||n(`${v}-${$[e]}-${x.toString().padStart(2,"0")}`)}if("day"===D.current&&T.current){const e=Math.round(T.current.scrollTop/l);k(Number(b[e])),null==n||n(`${v}-${S.toString().padStart(2,"0")}-${b[e]}`)}R.current=!1,D.current=null}},Y=e=>()=>{if(!R.current){if("year"===e&&j.current){const e=Math.round(j.current.scrollTop/l);y(Number(f[e])),null==n||n(`${f[e]}-${S.toString().padStart(2,"0")}-${x.toString().padStart(2,"0")}`)}if("month"===e&&w.current){const e=Math.round(w.current.scrollTop/l);N(Number($[e])),null==n||n(`${v}-${$[e]}-${x.toString().padStart(2,"0")}`)}if("day"===e&&T.current){const e=Math.round(T.current.scrollTop/l);k(Number(b[e])),null==n||n(`${v}-${S.toString().padStart(2,"0")}-${b[e]}`)}}};t.useEffect((()=>{if(r){const[e,t,n]=r.split("-").map(Number);y(e),N(t),k(n),j.current&&j.current.scrollTo({top:(e-m)*l,behavior:"auto"}),w.current&&w.current.scrollTo({top:(t-1)*l,behavior:"auto"}),T.current&&T.current.scrollTo({top:(n-1)*l,behavior:"auto"})}}),[r]);const q=(t,r,n,a)=>e.jsxs("div",{className:"wz-date-picker-list",ref:n,style:{height:3*l},onTouchStart:C(a),onTouchMove:E,onTouchEnd:L,onScroll:Y(a),children:[e.jsx("div",{style:{height:l}}),t.map(((t,n)=>e.jsx("div",{className:"wz-date-picker-item"+(n===r?" active":""),style:{height:l},children:"year"===a?`${t}年`:"month"===a?`${t}月`:`${t}日`},t))),e.jsx("div",{style:{height:l}})]});return e.jsxs("div",{className:`wz-date-picker ${o}`,style:u,children:[e.jsx("div",{className:"wz-date-picker-mask wz-date-picker-mask-top",style:{height:l}}),e.jsx("div",{className:"wz-date-picker-indicator",style:{height:l}}),e.jsxs("div",{className:"wz-date-picker-columns",children:[s.includes("year")&&q(f,v-m,j,"year"),s.includes("month")&&q($,S-1,w,"month"),s.includes("day")&&q(b,x-1,T,"day")]}),e.jsx("div",{className:"wz-date-picker-mask wz-date-picker-mask-bottom",style:{height:l}})]})};return({value:n,onChange:a,min:c="1970-01-01",max:s="2100-12-31",startLabel:l="开始时间",endLabel:o="结束时间",className:u="",style:i})=>{const d=t.useMemo((()=>{const e=new Date;return`${e.getFullYear()}-${(e.getMonth()+1).toString().padStart(2,"0")}-${e.getDate().toString().padStart(2,"0")}`}),[]),[p,h]=t.useState(n||[d,d]),m=n||p,[g,f]=t.useState("start");return e.jsxs("div",{className:`wz-date-range-picker ${u}`,style:i,children:[e.jsxs("div",{className:"wz-date-range-picker-label-row",children:[e.jsx("div",{className:"wz-date-range-picker-label",children:l}),e.jsx("div",{className:"wz-date-range-picker-label",children:o})]}),e.jsxs("div",{className:"wz-date-range-picker-row",children:[e.jsx("div",{className:"wz-date-range-picker-col",children:e.jsx("div",{className:"wz-date-range-picker-value"+("start"===g?" active":""),onClick:()=>f("start"),children:m[0]||"请选择"})}),e.jsx("div",{className:"wz-date-range-picker-sep",children:"至"}),e.jsx("div",{className:"wz-date-range-picker-col",children:e.jsx("div",{className:"wz-date-range-picker-value"+("end"===g?" active":""),onClick:()=>f("end"),children:m[1]||"请选择"})})]}),e.jsx("div",{className:"wz-date-range-picker-picker",children:e.jsx(r,{value:"start"===g?m[0]:m[1],onChange:e=>{if("start"===g){const t=[e,m[1]&&m[1]>=e?m[1]:e];h(t),null==a||a(t)}else{const t=[m[0],e&&e>=m[0]?e:m[0]];h(t),null==a||a(t)}},min:c,max:s})})]})}}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wz-date-range-picker-row{justify-content:center;align-items:center;gap:16px;display:flex}.wz-date-range-picker-col{flex-direction:column;flex:1;align-items:center;display:flex}.wz-date-range-picker-label-row{justify-content:space-between;column-gap:65px;margin-bottom:8px;display:flex}.wz-date-range-picker-label{text-align:center;color:#333;flex:1;font-size:15px}.wz-date-range-picker-value{color:#bbb;text-align:center;cursor:pointer;background:#fff;border:1.5px solid #0000;border-radius:8px;min-width:100%;height:44px;font-size:16px;line-height:44px;transition:all .2s}.wz-date-range-picker-value.active{color:#0599f7;background:#eaf6ff;border-color:#0599f7;font-weight:700}.wz-date-range-picker-sep{color:#333;align-items:center;height:44px;margin:0 8px;font-size:14px;display:flex}.wz-date-range-picker-picker{margin-top:8px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import './index.css';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.wz-date-range-picker-row{justify-content:center;align-items:center;gap:16px;display:flex}.wz-date-range-picker-col{flex-direction:column;flex:1;align-items:center;display:flex}.wz-date-range-picker-label-row{justify-content:space-between;column-gap:65px;margin-bottom:8px;display:flex}.wz-date-range-picker-label{text-align:center;color:#333;flex:1;font-size:15px}.wz-date-range-picker-value{color:#bbb;text-align:center;cursor:pointer;background:#fff;border:1.5px solid #0000;border-radius:8px;min-width:100%;height:44px;font-size:16px;line-height:44px;transition:all .2s}.wz-date-range-picker-value.active{color:#0599f7;background:#eaf6ff;border-color:#0599f7;font-weight:700}.wz-date-range-picker-sep{color:#333;align-items:center;height:44px;margin:0 8px;font-size:14px;display:flex}.wz-date-range-picker-picker{margin-top:8px}.wz-date-picker{background:var(--wz-date-picker-bg,#f5f5f5);-webkit-user-select:none;user-select:none;touch-action:pan-y;width:100%;position:relative;overflow:hidden}.wz-date-picker-columns{flex-direction:row;width:100%;height:100%;display:flex}.wz-date-picker-list{-webkit-overflow-scrolling:touch;scrollbar-width:none;z-index:2;flex:1 1 0;min-width:0;position:relative;overflow-y:scroll}.wz-date-picker-list::-webkit-scrollbar{display:none}.wz-date-picker-item{color:var(--wz-date-picker-item-color,#bbb);background:0 0;justify-content:center;align-items:center;font-family:"阿里巴巴普惠体 2.0";font-size:20px;font-weight:600;transition:color .2s;display:flex}.wz-date-picker-item.active{color:var(--wz-date-picker-active-color,#000)}.wz-date-picker-mask{z-index:3;pointer-events:none;position:absolute;left:0;right:0}.wz-date-picker-mask-top{background:linear-gradient(to bottom,var(--wz-date-picker-bg,#f5f5f5)20%,#f5f5f500);top:0}.wz-date-picker-mask-bottom{background:linear-gradient(to top,var(--wz-date-picker-bg,#f5f5f5)20%,#f5f5f500);bottom:0}.wz-date-picker-indicator{z-index:1;pointer-events:none;border-radius:var(--wz-date-picker-radius,10px);background:var(--wz-date-picker-active-bg,#fff);position:absolute;top:50%;left:10px;right:10px;transform:translateY(-50%)}
|