@ryanhe919/lumen-ui 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/{LMBadge-OEGi87jW.js → LMBadge-BBDOGTps.js} +3 -3
- package/dist/{LMBadge-OEGi87jW.js.map → LMBadge-BBDOGTps.js.map} +1 -1
- package/dist/{LMBadge-1rGc3lqC.cjs → LMBadge-D95iccla.cjs} +3 -3
- package/dist/{LMBadge-1rGc3lqC.cjs.map → LMBadge-D95iccla.cjs.map} +1 -1
- package/dist/{LMCard-Sulq0Yjh.js → LMCard-D7ABNC95.js} +2 -2
- package/dist/{LMCard-Sulq0Yjh.js.map → LMCard-D7ABNC95.js.map} +1 -1
- package/dist/{LMCard-C48UclOk.cjs → LMCard-D_K051f2.cjs} +2 -2
- package/dist/{LMCard-C48UclOk.cjs.map → LMCard-D_K051f2.cjs.map} +1 -1
- package/dist/{LMDatePicker-BlKctoyr.cjs → LMDatePicker-BlUwN4On.cjs} +12 -12
- package/dist/LMDatePicker-BlUwN4On.cjs.map +1 -0
- package/dist/{LMDatePicker-CXiYSome.js → LMDatePicker-DSv28BFH.js} +12 -12
- package/dist/LMDatePicker-DSv28BFH.js.map +1 -0
- package/dist/{LMDrawer-BcVtcYCN.cjs → LMDrawer--lFV_a3m.cjs} +3 -3
- package/dist/{LMDrawer-BcVtcYCN.cjs.map → LMDrawer--lFV_a3m.cjs.map} +1 -1
- package/dist/{LMDrawer-DcPqwiuo.js → LMDrawer-DJ5ugeZR.js} +3 -3
- package/dist/{LMDrawer-DcPqwiuo.js.map → LMDrawer-DJ5ugeZR.js.map} +1 -1
- package/dist/{LMStatCard-4mDqhlHt.js → LMStatCard-D5HV9r6d.js} +4 -4
- package/dist/{LMStatCard-4mDqhlHt.js.map → LMStatCard-D5HV9r6d.js.map} +1 -1
- package/dist/{LMStatCard-Du5Mti-p.cjs → LMStatCard-MXs9Z0qH.cjs} +4 -4
- package/dist/{LMStatCard-Du5Mti-p.cjs.map → LMStatCard-MXs9Z0qH.cjs.map} +1 -1
- package/dist/{LMSwitch-CVFdgSPh.js → LMSwitch-CP1_nrfU.js} +2 -2
- package/dist/LMSwitch-CP1_nrfU.js.map +1 -0
- package/dist/{LMSwitch-CKnrY30F.cjs → LMSwitch-DYoSH6wE.cjs} +2 -2
- package/dist/LMSwitch-DYoSH6wE.cjs.map +1 -0
- package/dist/{LMTabs-DZFAU58t.js → LMTabs-D5n9lB8X.js} +3 -3
- package/dist/{LMTabs-DZFAU58t.js.map → LMTabs-D5n9lB8X.js.map} +1 -1
- package/dist/{LMTabs-DCVaqbrn.cjs → LMTabs-NPmOzPat.cjs} +3 -3
- package/dist/{LMTabs-DCVaqbrn.cjs.map → LMTabs-NPmOzPat.cjs.map} +1 -1
- package/dist/{LMUpload-B_GA4O8W.js → LMUpload-BwXoxIfE.js} +5 -5
- package/dist/LMUpload-BwXoxIfE.js.map +1 -0
- package/dist/{LMUpload-BpISVQGz.cjs → LMUpload-CJopkWc6.cjs} +5 -5
- package/dist/LMUpload-CJopkWc6.cjs.map +1 -0
- package/dist/components/Chat/LMChatBubble/LMChatBubble.d.ts +28 -0
- package/dist/components/Chat/LMChatBubble/LMChatBubble.d.ts.map +1 -0
- package/dist/components/Chat/LMChatBubble/LMChatBubble.stories.d.ts +25 -0
- package/dist/components/Chat/LMChatBubble/LMChatBubble.stories.d.ts.map +1 -0
- package/dist/components/Chat/LMChatBubble/index.d.ts +3 -0
- package/dist/components/Chat/LMChatBubble/index.d.ts.map +1 -0
- package/dist/components/Chat/LMChatContainer/LMChatContainer.d.ts +85 -0
- package/dist/components/Chat/LMChatContainer/LMChatContainer.d.ts.map +1 -0
- package/dist/components/Chat/LMChatContainer/LMChatContainer.stories.d.ts +23 -0
- package/dist/components/Chat/LMChatContainer/LMChatContainer.stories.d.ts.map +1 -0
- package/dist/components/Chat/LMChatContainer/index.d.ts +3 -0
- package/dist/components/Chat/LMChatContainer/index.d.ts.map +1 -0
- package/dist/components/Chat/LMChatInput/LMChatInput.d.ts +55 -0
- package/dist/components/Chat/LMChatInput/LMChatInput.d.ts.map +1 -0
- package/dist/components/Chat/LMChatInput/LMChatInput.stories.d.ts +27 -0
- package/dist/components/Chat/LMChatInput/LMChatInput.stories.d.ts.map +1 -0
- package/dist/components/Chat/LMChatInput/index.d.ts +3 -0
- package/dist/components/Chat/LMChatInput/index.d.ts.map +1 -0
- package/dist/components/Chat/LMChatList/LMChatList.d.ts +60 -0
- package/dist/components/Chat/LMChatList/LMChatList.d.ts.map +1 -0
- package/dist/components/Chat/LMChatList/LMChatList.stories.d.ts +21 -0
- package/dist/components/Chat/LMChatList/LMChatList.stories.d.ts.map +1 -0
- package/dist/components/Chat/LMChatList/index.d.ts +3 -0
- package/dist/components/Chat/LMChatList/index.d.ts.map +1 -0
- package/dist/components/Chat/LMChatMessage/LMChatMessage.d.ts +56 -0
- package/dist/components/Chat/LMChatMessage/LMChatMessage.d.ts.map +1 -0
- package/dist/components/Chat/LMChatMessage/LMChatMessage.stories.d.ts +27 -0
- package/dist/components/Chat/LMChatMessage/LMChatMessage.stories.d.ts.map +1 -0
- package/dist/components/Chat/LMChatMessage/index.d.ts +3 -0
- package/dist/components/Chat/LMChatMessage/index.d.ts.map +1 -0
- package/dist/components/Chat/LMCodeBlock/LMCodeBlock.d.ts +32 -0
- package/dist/components/Chat/LMCodeBlock/LMCodeBlock.d.ts.map +1 -0
- package/dist/components/Chat/LMCodeBlock/LMCodeBlock.stories.d.ts +27 -0
- package/dist/components/Chat/LMCodeBlock/LMCodeBlock.stories.d.ts.map +1 -0
- package/dist/components/Chat/LMCodeBlock/index.d.ts +3 -0
- package/dist/components/Chat/LMCodeBlock/index.d.ts.map +1 -0
- package/dist/components/Chat/LMMarkdownRenderer/LMMarkdownRenderer.d.ts +24 -0
- package/dist/components/Chat/LMMarkdownRenderer/LMMarkdownRenderer.d.ts.map +1 -0
- package/dist/components/Chat/LMMarkdownRenderer/LMMarkdownRenderer.stories.d.ts +23 -0
- package/dist/components/Chat/LMMarkdownRenderer/LMMarkdownRenderer.stories.d.ts.map +1 -0
- package/dist/components/Chat/LMMarkdownRenderer/index.d.ts +3 -0
- package/dist/components/Chat/LMMarkdownRenderer/index.d.ts.map +1 -0
- package/dist/components/Chat/LMTypingIndicator/LMTypingIndicator.d.ts +21 -0
- package/dist/components/Chat/LMTypingIndicator/LMTypingIndicator.d.ts.map +1 -0
- package/dist/components/Chat/LMTypingIndicator/LMTypingIndicator.stories.d.ts +25 -0
- package/dist/components/Chat/LMTypingIndicator/LMTypingIndicator.stories.d.ts.map +1 -0
- package/dist/components/Chat/LMTypingIndicator/index.d.ts +3 -0
- package/dist/components/Chat/LMTypingIndicator/index.d.ts.map +1 -0
- package/dist/components/Chat/index.d.ts +9 -0
- package/dist/components/Chat/index.d.ts.map +1 -0
- package/dist/components/badge/index.cjs +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/card/index.cjs +1 -1
- package/dist/components/card/index.js +1 -1
- package/dist/components/date-picker/index.cjs +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/drawer/index.cjs +1 -1
- package/dist/components/drawer/index.js +1 -1
- package/dist/components/stat-card/index.cjs +1 -1
- package/dist/components/stat-card/index.js +1 -1
- package/dist/components/switch/index.cjs +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/tabs/index.cjs +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/upload/index.cjs +1 -1
- package/dist/components/upload/index.js +1 -1
- package/dist/index.cjs +2017 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2023 -13
- package/dist/index.js.map +1 -1
- package/dist/style.css +254 -2
- package/package.json +7 -7
- package/dist/LMDatePicker-BlKctoyr.cjs.map +0 -1
- package/dist/LMDatePicker-CXiYSome.js.map +0 -1
- package/dist/LMSwitch-CKnrY30F.cjs.map +0 -1
- package/dist/LMSwitch-CVFdgSPh.js.map +0 -1
- package/dist/LMUpload-B_GA4O8W.js.map +0 -1
- package/dist/LMUpload-BpISVQGz.cjs.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Yufan He
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -110,11 +110,11 @@ const LMBadge = ({
|
|
|
110
110
|
dot && /* @__PURE__ */ jsx(
|
|
111
111
|
"span",
|
|
112
112
|
{
|
|
113
|
-
className: `${currentSize.dotSize} rounded-full mr-1.5
|
|
113
|
+
className: `${currentSize.dotSize} rounded-full mr-1.5 shrink-0`,
|
|
114
114
|
style: { backgroundColor: getDotColor() }
|
|
115
115
|
}
|
|
116
116
|
),
|
|
117
|
-
icon && /* @__PURE__ */ jsx("span", { className: `${currentSize.iconSize} mr-1.5
|
|
117
|
+
icon && /* @__PURE__ */ jsx("span", { className: `${currentSize.iconSize} mr-1.5 shrink-0`, children: icon }),
|
|
118
118
|
/* @__PURE__ */ jsx("span", { className: "truncate", children })
|
|
119
119
|
]
|
|
120
120
|
}
|
|
@@ -123,4 +123,4 @@ const LMBadge = ({
|
|
|
123
123
|
export {
|
|
124
124
|
LMBadge as L
|
|
125
125
|
};
|
|
126
|
-
//# sourceMappingURL=LMBadge-
|
|
126
|
+
//# sourceMappingURL=LMBadge-BBDOGTps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LMBadge-
|
|
1
|
+
{"version":3,"file":"LMBadge-BBDOGTps.js","sources":["../src/components/General/LMBadge/LMBadge.tsx"],"sourcesContent":["import React from 'react'\n\nexport type LMBadgeVariant =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'warning'\n | 'error'\n | 'info'\n | 'neutral'\n\nexport type LMBadgeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport interface LMBadgeProps {\n /** Badge content */\n children: React.ReactNode\n /** Color variant */\n variant?: LMBadgeVariant\n /** Size */\n size?: LMBadgeSize\n /** Custom class name */\n className?: string\n /** Show dot */\n dot?: boolean\n /** Icon */\n icon?: React.ReactNode\n}\n\nconst sizeConfig = {\n xs: {\n padding: 'px-2 py-0.5',\n fontSize: 'text-xs',\n dotSize: 'w-1.5 h-1.5',\n iconSize: 'text-xs',\n },\n sm: {\n padding: 'px-3 py-1',\n fontSize: 'text-xs',\n dotSize: 'w-2 h-2',\n iconSize: 'text-xs',\n },\n md: {\n padding: 'px-3.5 py-1.5',\n fontSize: 'text-sm',\n dotSize: 'w-2 h-2',\n iconSize: 'text-sm',\n },\n lg: {\n padding: 'px-4 py-2',\n fontSize: 'text-sm',\n dotSize: 'w-2.5 h-2.5',\n iconSize: 'text-sm',\n },\n xl: {\n padding: 'px-5 py-2.5',\n fontSize: 'text-base',\n dotSize: 'w-3 h-3',\n iconSize: 'text-base',\n },\n '2xl': {\n padding: 'px-6 py-3',\n fontSize: 'text-lg',\n dotSize: 'w-3.5 h-3.5',\n iconSize: 'text-lg',\n },\n}\n\nconst LMBadge: React.FC<LMBadgeProps> = ({\n children,\n variant = 'primary',\n size = 'sm',\n className = '',\n dot = false,\n icon,\n}) => {\n const getVariantStyles = (): React.CSSProperties => {\n const variantMap: Record<LMBadgeVariant, React.CSSProperties> = {\n primary: {\n backgroundColor: 'var(--lm-primary-100)',\n color: 'var(--lm-primary-700)',\n borderColor: 'var(--lm-primary-200)',\n },\n secondary: {\n backgroundColor: 'var(--lm-gray-100)',\n color: 'var(--lm-gray-700)',\n borderColor: 'var(--lm-gray-200)',\n },\n success: {\n backgroundColor: 'var(--lm-success-100)',\n color: 'var(--lm-success-700)',\n borderColor: 'var(--lm-success-200)',\n },\n warning: {\n backgroundColor: 'var(--lm-warning-100)',\n color: 'var(--lm-warning-700)',\n borderColor: 'var(--lm-warning-200)',\n },\n error: {\n backgroundColor: 'var(--lm-error-100)',\n color: 'var(--lm-error-700)',\n borderColor: 'var(--lm-error-200)',\n },\n info: {\n backgroundColor: 'var(--lm-info-100)',\n color: 'var(--lm-info-700)',\n borderColor: 'var(--lm-info-200)',\n },\n neutral: {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-secondary)',\n borderColor: 'var(--lm-border-default)',\n },\n }\n\n return variantMap[variant]\n }\n\n const getDotColor = (): string => {\n const dotColorMap: Record<LMBadgeVariant, string> = {\n primary: 'var(--lm-primary-500)',\n secondary: 'var(--lm-gray-500)',\n success: 'var(--lm-success-500)',\n warning: 'var(--lm-warning-500)',\n error: 'var(--lm-error-500)',\n info: 'var(--lm-info-500)',\n neutral: 'var(--lm-text-disabled)',\n }\n\n return dotColorMap[variant]\n }\n\n const currentSize = sizeConfig[size]\n\n // Apple-like refined badge styling\n return (\n <span\n className={`inline-flex items-center justify-center ${currentSize.padding} ${currentSize.fontSize} rounded-full border font-medium select-none ${className}`}\n style={{\n ...getVariantStyles(),\n transition: 'all var(--lm-transition-fast) var(--lm-ease-out)',\n }}\n >\n {dot && (\n <span\n className={`${currentSize.dotSize} rounded-full mr-1.5 shrink-0`}\n style={{ backgroundColor: getDotColor() }}\n />\n )}\n {icon && (\n <span className={`${currentSize.iconSize} mr-1.5 shrink-0`}>\n {icon}\n </span>\n )}\n <span className=\"truncate\">{children}</span>\n </span>\n )\n}\n\nexport default LMBadge\n"],"names":[],"mappings":";AA4BA,MAAM,aAAa;AAAA,EACjB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAEd;AAEA,MAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,MAAM;AAAA,EACN;AACF,MAAM;AACJ,QAAM,mBAAmB,MAA2B;AAClD,UAAM,aAA0D;AAAA,MAC9D,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,WAAW;AAAA,QACT,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,MAAM;AAAA,QACJ,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IACf;AAGF,WAAO,WAAW,OAAO;AAAA,EAC3B;AAEA,QAAM,cAAc,MAAc;AAChC,UAAM,cAA8C;AAAA,MAClD,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAGX,WAAO,YAAY,OAAO;AAAA,EAC5B;AAEA,QAAM,cAAc,WAAW,IAAI;AAGnC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,2CAA2C,YAAY,OAAO,IAAI,YAAY,QAAQ,gDAAgD,SAAS;AAAA,MAC1J,OAAO;AAAA,QACL,GAAG,iBAAA;AAAA,QACH,YAAY;AAAA,MAAA;AAAA,MAGb,UAAA;AAAA,QAAA,OACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,GAAG,YAAY,OAAO;AAAA,YACjC,OAAO,EAAE,iBAAiB,YAAA,EAAY;AAAA,UAAE;AAAA,QAAA;AAAA,QAG3C,4BACE,QAAA,EAAK,WAAW,GAAG,YAAY,QAAQ,oBACrC,UAAA,KAAA,CACH;AAAA,QAEF,oBAAC,QAAA,EAAK,WAAU,YAAY,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG3C;"}
|
|
@@ -111,15 +111,15 @@ const LMBadge = ({
|
|
|
111
111
|
dot && /* @__PURE__ */ jsxRuntime.jsx(
|
|
112
112
|
"span",
|
|
113
113
|
{
|
|
114
|
-
className: `${currentSize.dotSize} rounded-full mr-1.5
|
|
114
|
+
className: `${currentSize.dotSize} rounded-full mr-1.5 shrink-0`,
|
|
115
115
|
style: { backgroundColor: getDotColor() }
|
|
116
116
|
}
|
|
117
117
|
),
|
|
118
|
-
icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${currentSize.iconSize} mr-1.5
|
|
118
|
+
icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${currentSize.iconSize} mr-1.5 shrink-0`, children: icon }),
|
|
119
119
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children })
|
|
120
120
|
]
|
|
121
121
|
}
|
|
122
122
|
);
|
|
123
123
|
};
|
|
124
124
|
exports.LMBadge = LMBadge;
|
|
125
|
-
//# sourceMappingURL=LMBadge-
|
|
125
|
+
//# sourceMappingURL=LMBadge-D95iccla.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LMBadge-
|
|
1
|
+
{"version":3,"file":"LMBadge-D95iccla.cjs","sources":["../src/components/General/LMBadge/LMBadge.tsx"],"sourcesContent":["import React from 'react'\n\nexport type LMBadgeVariant =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'warning'\n | 'error'\n | 'info'\n | 'neutral'\n\nexport type LMBadgeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport interface LMBadgeProps {\n /** Badge content */\n children: React.ReactNode\n /** Color variant */\n variant?: LMBadgeVariant\n /** Size */\n size?: LMBadgeSize\n /** Custom class name */\n className?: string\n /** Show dot */\n dot?: boolean\n /** Icon */\n icon?: React.ReactNode\n}\n\nconst sizeConfig = {\n xs: {\n padding: 'px-2 py-0.5',\n fontSize: 'text-xs',\n dotSize: 'w-1.5 h-1.5',\n iconSize: 'text-xs',\n },\n sm: {\n padding: 'px-3 py-1',\n fontSize: 'text-xs',\n dotSize: 'w-2 h-2',\n iconSize: 'text-xs',\n },\n md: {\n padding: 'px-3.5 py-1.5',\n fontSize: 'text-sm',\n dotSize: 'w-2 h-2',\n iconSize: 'text-sm',\n },\n lg: {\n padding: 'px-4 py-2',\n fontSize: 'text-sm',\n dotSize: 'w-2.5 h-2.5',\n iconSize: 'text-sm',\n },\n xl: {\n padding: 'px-5 py-2.5',\n fontSize: 'text-base',\n dotSize: 'w-3 h-3',\n iconSize: 'text-base',\n },\n '2xl': {\n padding: 'px-6 py-3',\n fontSize: 'text-lg',\n dotSize: 'w-3.5 h-3.5',\n iconSize: 'text-lg',\n },\n}\n\nconst LMBadge: React.FC<LMBadgeProps> = ({\n children,\n variant = 'primary',\n size = 'sm',\n className = '',\n dot = false,\n icon,\n}) => {\n const getVariantStyles = (): React.CSSProperties => {\n const variantMap: Record<LMBadgeVariant, React.CSSProperties> = {\n primary: {\n backgroundColor: 'var(--lm-primary-100)',\n color: 'var(--lm-primary-700)',\n borderColor: 'var(--lm-primary-200)',\n },\n secondary: {\n backgroundColor: 'var(--lm-gray-100)',\n color: 'var(--lm-gray-700)',\n borderColor: 'var(--lm-gray-200)',\n },\n success: {\n backgroundColor: 'var(--lm-success-100)',\n color: 'var(--lm-success-700)',\n borderColor: 'var(--lm-success-200)',\n },\n warning: {\n backgroundColor: 'var(--lm-warning-100)',\n color: 'var(--lm-warning-700)',\n borderColor: 'var(--lm-warning-200)',\n },\n error: {\n backgroundColor: 'var(--lm-error-100)',\n color: 'var(--lm-error-700)',\n borderColor: 'var(--lm-error-200)',\n },\n info: {\n backgroundColor: 'var(--lm-info-100)',\n color: 'var(--lm-info-700)',\n borderColor: 'var(--lm-info-200)',\n },\n neutral: {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-secondary)',\n borderColor: 'var(--lm-border-default)',\n },\n }\n\n return variantMap[variant]\n }\n\n const getDotColor = (): string => {\n const dotColorMap: Record<LMBadgeVariant, string> = {\n primary: 'var(--lm-primary-500)',\n secondary: 'var(--lm-gray-500)',\n success: 'var(--lm-success-500)',\n warning: 'var(--lm-warning-500)',\n error: 'var(--lm-error-500)',\n info: 'var(--lm-info-500)',\n neutral: 'var(--lm-text-disabled)',\n }\n\n return dotColorMap[variant]\n }\n\n const currentSize = sizeConfig[size]\n\n // Apple-like refined badge styling\n return (\n <span\n className={`inline-flex items-center justify-center ${currentSize.padding} ${currentSize.fontSize} rounded-full border font-medium select-none ${className}`}\n style={{\n ...getVariantStyles(),\n transition: 'all var(--lm-transition-fast) var(--lm-ease-out)',\n }}\n >\n {dot && (\n <span\n className={`${currentSize.dotSize} rounded-full mr-1.5 shrink-0`}\n style={{ backgroundColor: getDotColor() }}\n />\n )}\n {icon && (\n <span className={`${currentSize.iconSize} mr-1.5 shrink-0`}>\n {icon}\n </span>\n )}\n <span className=\"truncate\">{children}</span>\n </span>\n )\n}\n\nexport default LMBadge\n"],"names":["jsxs","jsx"],"mappings":";;AA4BA,MAAM,aAAa;AAAA,EACjB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,IAAI;AAAA,IACF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAEd;AAEA,MAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,MAAM;AAAA,EACN;AACF,MAAM;AACJ,QAAM,mBAAmB,MAA2B;AAClD,UAAM,aAA0D;AAAA,MAC9D,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,WAAW;AAAA,QACT,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,MAAM;AAAA,QACJ,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IACf;AAGF,WAAO,WAAW,OAAO;AAAA,EAC3B;AAEA,QAAM,cAAc,MAAc;AAChC,UAAM,cAA8C;AAAA,MAClD,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAGX,WAAO,YAAY,OAAO;AAAA,EAC5B;AAEA,QAAM,cAAc,WAAW,IAAI;AAGnC,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,2CAA2C,YAAY,OAAO,IAAI,YAAY,QAAQ,gDAAgD,SAAS;AAAA,MAC1J,OAAO;AAAA,QACL,GAAG,iBAAA;AAAA,QACH,YAAY;AAAA,MAAA;AAAA,MAGb,UAAA;AAAA,QAAA,OACCC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,GAAG,YAAY,OAAO;AAAA,YACjC,OAAO,EAAE,iBAAiB,YAAA,EAAY;AAAA,UAAE;AAAA,QAAA;AAAA,QAG3C,uCACE,QAAA,EAAK,WAAW,GAAG,YAAY,QAAQ,oBACrC,UAAA,KAAA,CACH;AAAA,QAEFA,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG3C;;"}
|
|
@@ -172,7 +172,7 @@ const LMCard = ({
|
|
|
172
172
|
children: actions.map((action, index) => /* @__PURE__ */ jsx(
|
|
173
173
|
"div",
|
|
174
174
|
{
|
|
175
|
-
className: `flex-1 flex items-center justify-center py-3 transition-colors duration-200 hover:bg-
|
|
175
|
+
className: `flex-1 flex items-center justify-center py-3 transition-colors duration-200 hover:bg-(--lm-bg-hover) ${index !== actions.length - 1 ? "border-r" : ""}`,
|
|
176
176
|
style: {
|
|
177
177
|
borderColor: "var(--lm-border-light)",
|
|
178
178
|
color: "var(--lm-text-secondary)"
|
|
@@ -204,4 +204,4 @@ const LMCard = ({
|
|
|
204
204
|
export {
|
|
205
205
|
LMCard as L
|
|
206
206
|
};
|
|
207
|
-
//# sourceMappingURL=LMCard-
|
|
207
|
+
//# sourceMappingURL=LMCard-D7ABNC95.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LMCard-Sulq0Yjh.js","sources":["../src/components/DataDisplay/LMCard/LMCard.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport {\n COMPONENT_SIZE_ORDER,\n SIZE_PADDING_CLASSES,\n SIZE_TEXT_CLASSES,\n SIZE_GAP_CLASSES,\n clampComponentSize,\n} from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Card title */\n title?: React.ReactNode\n /** Extra content in the top-right corner */\n extra?: React.ReactNode\n /** Card content */\n children: React.ReactNode\n /** Card size */\n size?: ComponentSize\n /** Show border */\n bordered?: boolean\n /** Hoverable effect */\n hoverable?: boolean\n /** Loading state - shows skeleton */\n loading?: boolean\n /** Cover image at top */\n cover?: React.ReactNode\n /** Actions at bottom */\n actions?: React.ReactNode[]\n /** Visual variant */\n variant?: 'default' | 'elevated' | 'outline' | 'soft'\n /** Custom class name */\n className?: string\n}\n\nconst LMCard: React.FC<LMCardProps> = ({\n title,\n extra,\n children,\n size = 'md',\n bordered = true,\n hoverable = false,\n loading = false,\n cover,\n actions,\n variant = 'default',\n className = '',\n ...rest\n}) => {\n const resolvedSize = clampComponentSize(size, COMPONENT_SIZE_ORDER)\n const [isHovered, setIsHovered] = useState(false)\n\n const titleTextClasses: Record<ComponentSize, string> = {\n xs: 'text-sm',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n }\n\n // Apple-like refined border radius\n const roundedClasses = 'rounded-xl'\n const borderClasses = bordered ? 'border' : ''\n const hoverableClasses = hoverable ? 'cursor-pointer' : ''\n\n // Apple-like card styling\n const baseClassName = `\n ${roundedClasses} ${borderClasses} ${hoverableClasses}\n overflow-hidden\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getCardStyles = (): React.CSSProperties => {\n // Apple-like refined card styles with smooth transitions\n const baseStyles: React.CSSProperties = {\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n transition: 'all var(--lm-transition-normal) var(--lm-ease-out)',\n }\n\n switch (variant) {\n case 'elevated':\n return {\n ...baseStyles,\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'outline':\n return {\n ...baseStyles,\n backgroundColor: 'transparent',\n borderColor: 'var(--lm-border-strong)',\n boxShadow: 'none',\n }\n case 'soft':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-light)',\n boxShadow: 'none',\n }\n default:\n return baseStyles\n }\n }\n\n // Apple-like subtle hover with scale effect (not translateY)\n const getHoverStyles = (): React.CSSProperties => {\n if (!hoverable) return {}\n\n const baseHover: React.CSSProperties = {\n boxShadow: 'var(--lm-shadow-lg)',\n borderColor: 'var(--lm-border-strong)',\n transform: 'scale(1.01)',\n }\n\n switch (variant) {\n case 'elevated':\n return {\n ...baseHover,\n boxShadow: 'var(--lm-shadow-xl)',\n }\n case 'outline':\n return {\n ...baseHover,\n backgroundColor: 'var(--lm-bg-hover)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'soft':\n return {\n ...baseHover,\n backgroundColor: 'var(--lm-bg-hover)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n default:\n return baseHover\n }\n }\n\n const currentStyles = isHovered && hoverable ? { ...getCardStyles(), ...getHoverStyles() } : getCardStyles()\n\n // Loading skeleton\n const renderSkeleton = () => (\n <div className=\"animate-pulse\">\n {title && (\n <div className=\"mb-4\">\n <div\n className=\"h-4 rounded w-1/3\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n </div>\n )}\n <div className=\"space-y-3\">\n <div\n className=\"h-4 rounded w-full\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n <div\n className=\"h-4 rounded w-5/6\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n <div\n className=\"h-4 rounded w-4/6\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n </div>\n </div>\n )\n\n // Header section\n const renderHeader = () => {\n if (!title && !extra) return null\n\n return (\n <div\n className={`flex items-center justify-between ${SIZE_GAP_CLASSES[resolvedSize]} border-b`}\n style={{\n borderColor: 'var(--lm-border-light)',\n padding: `${SIZE_PADDING_CLASSES[resolvedSize].split(' ')[0].replace('px-', '')}rem ${SIZE_PADDING_CLASSES[resolvedSize].split(' ')[1]?.replace('py-', '') || '1'}rem`,\n paddingLeft: '1rem',\n paddingRight: '1rem',\n paddingTop: '0.75rem',\n paddingBottom: '0.75rem',\n }}\n >\n {title && (\n <div\n className={`${titleTextClasses[resolvedSize]} font-semibold`}\n style={{ color: 'var(--lm-text-primary)' }}\n >\n {title}\n </div>\n )}\n {extra && (\n <div\n className={SIZE_TEXT_CLASSES[resolvedSize]}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n {extra}\n </div>\n )}\n </div>\n )\n }\n\n // Actions section\n const renderActions = () => {\n if (!actions || actions.length === 0) return null\n\n return (\n <div\n className=\"flex items-center border-t\"\n style={{ borderColor: 'var(--lm-border-light)' }}\n >\n {actions.map((action, index) => (\n <div\n key={index}\n className={`flex-1 flex items-center justify-center py-3 transition-colors duration-200 hover:bg-[var(--lm-bg-hover)] ${\n index !== actions.length - 1 ? 'border-r' : ''\n }`}\n style={{\n borderColor: 'var(--lm-border-light)',\n color: 'var(--lm-text-secondary)',\n }}\n >\n {action}\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n className={baseClassName}\n style={currentStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...rest}\n >\n {/* Cover image */}\n {cover && (\n <div className=\"w-full overflow-hidden\">\n {cover}\n </div>\n )}\n\n {/* Header */}\n {renderHeader()}\n\n {/* Body */}\n <div className={SIZE_PADDING_CLASSES[resolvedSize]}>\n {loading ? renderSkeleton() : children}\n </div>\n\n {/* Actions */}\n {renderActions()}\n </div>\n )\n}\n\nexport default LMCard\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LMCard-D7ABNC95.js","sources":["../src/components/DataDisplay/LMCard/LMCard.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport {\n COMPONENT_SIZE_ORDER,\n SIZE_PADDING_CLASSES,\n SIZE_TEXT_CLASSES,\n SIZE_GAP_CLASSES,\n clampComponentSize,\n} from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Card title */\n title?: React.ReactNode\n /** Extra content in the top-right corner */\n extra?: React.ReactNode\n /** Card content */\n children: React.ReactNode\n /** Card size */\n size?: ComponentSize\n /** Show border */\n bordered?: boolean\n /** Hoverable effect */\n hoverable?: boolean\n /** Loading state - shows skeleton */\n loading?: boolean\n /** Cover image at top */\n cover?: React.ReactNode\n /** Actions at bottom */\n actions?: React.ReactNode[]\n /** Visual variant */\n variant?: 'default' | 'elevated' | 'outline' | 'soft'\n /** Custom class name */\n className?: string\n}\n\nconst LMCard: React.FC<LMCardProps> = ({\n title,\n extra,\n children,\n size = 'md',\n bordered = true,\n hoverable = false,\n loading = false,\n cover,\n actions,\n variant = 'default',\n className = '',\n ...rest\n}) => {\n const resolvedSize = clampComponentSize(size, COMPONENT_SIZE_ORDER)\n const [isHovered, setIsHovered] = useState(false)\n\n const titleTextClasses: Record<ComponentSize, string> = {\n xs: 'text-sm',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n }\n\n // Apple-like refined border radius\n const roundedClasses = 'rounded-xl'\n const borderClasses = bordered ? 'border' : ''\n const hoverableClasses = hoverable ? 'cursor-pointer' : ''\n\n // Apple-like card styling\n const baseClassName = `\n ${roundedClasses} ${borderClasses} ${hoverableClasses}\n overflow-hidden\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getCardStyles = (): React.CSSProperties => {\n // Apple-like refined card styles with smooth transitions\n const baseStyles: React.CSSProperties = {\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n transition: 'all var(--lm-transition-normal) var(--lm-ease-out)',\n }\n\n switch (variant) {\n case 'elevated':\n return {\n ...baseStyles,\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'outline':\n return {\n ...baseStyles,\n backgroundColor: 'transparent',\n borderColor: 'var(--lm-border-strong)',\n boxShadow: 'none',\n }\n case 'soft':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-light)',\n boxShadow: 'none',\n }\n default:\n return baseStyles\n }\n }\n\n // Apple-like subtle hover with scale effect (not translateY)\n const getHoverStyles = (): React.CSSProperties => {\n if (!hoverable) return {}\n\n const baseHover: React.CSSProperties = {\n boxShadow: 'var(--lm-shadow-lg)',\n borderColor: 'var(--lm-border-strong)',\n transform: 'scale(1.01)',\n }\n\n switch (variant) {\n case 'elevated':\n return {\n ...baseHover,\n boxShadow: 'var(--lm-shadow-xl)',\n }\n case 'outline':\n return {\n ...baseHover,\n backgroundColor: 'var(--lm-bg-hover)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'soft':\n return {\n ...baseHover,\n backgroundColor: 'var(--lm-bg-hover)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n default:\n return baseHover\n }\n }\n\n const currentStyles = isHovered && hoverable ? { ...getCardStyles(), ...getHoverStyles() } : getCardStyles()\n\n // Loading skeleton\n const renderSkeleton = () => (\n <div className=\"animate-pulse\">\n {title && (\n <div className=\"mb-4\">\n <div\n className=\"h-4 rounded w-1/3\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n </div>\n )}\n <div className=\"space-y-3\">\n <div\n className=\"h-4 rounded w-full\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n <div\n className=\"h-4 rounded w-5/6\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n <div\n className=\"h-4 rounded w-4/6\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n </div>\n </div>\n )\n\n // Header section\n const renderHeader = () => {\n if (!title && !extra) return null\n\n return (\n <div\n className={`flex items-center justify-between ${SIZE_GAP_CLASSES[resolvedSize]} border-b`}\n style={{\n borderColor: 'var(--lm-border-light)',\n padding: `${SIZE_PADDING_CLASSES[resolvedSize].split(' ')[0].replace('px-', '')}rem ${SIZE_PADDING_CLASSES[resolvedSize].split(' ')[1]?.replace('py-', '') || '1'}rem`,\n paddingLeft: '1rem',\n paddingRight: '1rem',\n paddingTop: '0.75rem',\n paddingBottom: '0.75rem',\n }}\n >\n {title && (\n <div\n className={`${titleTextClasses[resolvedSize]} font-semibold`}\n style={{ color: 'var(--lm-text-primary)' }}\n >\n {title}\n </div>\n )}\n {extra && (\n <div\n className={SIZE_TEXT_CLASSES[resolvedSize]}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n {extra}\n </div>\n )}\n </div>\n )\n }\n\n // Actions section\n const renderActions = () => {\n if (!actions || actions.length === 0) return null\n\n return (\n <div\n className=\"flex items-center border-t\"\n style={{ borderColor: 'var(--lm-border-light)' }}\n >\n {actions.map((action, index) => (\n <div\n key={index}\n className={`flex-1 flex items-center justify-center py-3 transition-colors duration-200 hover:bg-(--lm-bg-hover) ${\n index !== actions.length - 1 ? 'border-r' : ''\n }`}\n style={{\n borderColor: 'var(--lm-border-light)',\n color: 'var(--lm-text-secondary)',\n }}\n >\n {action}\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n className={baseClassName}\n style={currentStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...rest}\n >\n {/* Cover image */}\n {cover && (\n <div className=\"w-full overflow-hidden\">\n {cover}\n </div>\n )}\n\n {/* Header */}\n {renderHeader()}\n\n {/* Body */}\n <div className={SIZE_PADDING_CLASSES[resolvedSize]}>\n {loading ? renderSkeleton() : children}\n </div>\n\n {/* Actions */}\n {renderActions()}\n </div>\n )\n}\n\nexport default LMCard\n"],"names":[],"mappings":"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"}
|
|
@@ -173,7 +173,7 @@ const LMCard = ({
|
|
|
173
173
|
children: actions.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
174
174
|
"div",
|
|
175
175
|
{
|
|
176
|
-
className: `flex-1 flex items-center justify-center py-3 transition-colors duration-200 hover:bg-
|
|
176
|
+
className: `flex-1 flex items-center justify-center py-3 transition-colors duration-200 hover:bg-(--lm-bg-hover) ${index !== actions.length - 1 ? "border-r" : ""}`,
|
|
177
177
|
style: {
|
|
178
178
|
borderColor: "var(--lm-border-light)",
|
|
179
179
|
color: "var(--lm-text-secondary)"
|
|
@@ -203,4 +203,4 @@ const LMCard = ({
|
|
|
203
203
|
);
|
|
204
204
|
};
|
|
205
205
|
exports.LMCard = LMCard;
|
|
206
|
-
//# sourceMappingURL=LMCard-
|
|
206
|
+
//# sourceMappingURL=LMCard-D_K051f2.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LMCard-C48UclOk.cjs","sources":["../src/components/DataDisplay/LMCard/LMCard.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport {\n COMPONENT_SIZE_ORDER,\n SIZE_PADDING_CLASSES,\n SIZE_TEXT_CLASSES,\n SIZE_GAP_CLASSES,\n clampComponentSize,\n} from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Card title */\n title?: React.ReactNode\n /** Extra content in the top-right corner */\n extra?: React.ReactNode\n /** Card content */\n children: React.ReactNode\n /** Card size */\n size?: ComponentSize\n /** Show border */\n bordered?: boolean\n /** Hoverable effect */\n hoverable?: boolean\n /** Loading state - shows skeleton */\n loading?: boolean\n /** Cover image at top */\n cover?: React.ReactNode\n /** Actions at bottom */\n actions?: React.ReactNode[]\n /** Visual variant */\n variant?: 'default' | 'elevated' | 'outline' | 'soft'\n /** Custom class name */\n className?: string\n}\n\nconst LMCard: React.FC<LMCardProps> = ({\n title,\n extra,\n children,\n size = 'md',\n bordered = true,\n hoverable = false,\n loading = false,\n cover,\n actions,\n variant = 'default',\n className = '',\n ...rest\n}) => {\n const resolvedSize = clampComponentSize(size, COMPONENT_SIZE_ORDER)\n const [isHovered, setIsHovered] = useState(false)\n\n const titleTextClasses: Record<ComponentSize, string> = {\n xs: 'text-sm',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n }\n\n // Apple-like refined border radius\n const roundedClasses = 'rounded-xl'\n const borderClasses = bordered ? 'border' : ''\n const hoverableClasses = hoverable ? 'cursor-pointer' : ''\n\n // Apple-like card styling\n const baseClassName = `\n ${roundedClasses} ${borderClasses} ${hoverableClasses}\n overflow-hidden\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getCardStyles = (): React.CSSProperties => {\n // Apple-like refined card styles with smooth transitions\n const baseStyles: React.CSSProperties = {\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n transition: 'all var(--lm-transition-normal) var(--lm-ease-out)',\n }\n\n switch (variant) {\n case 'elevated':\n return {\n ...baseStyles,\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'outline':\n return {\n ...baseStyles,\n backgroundColor: 'transparent',\n borderColor: 'var(--lm-border-strong)',\n boxShadow: 'none',\n }\n case 'soft':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-light)',\n boxShadow: 'none',\n }\n default:\n return baseStyles\n }\n }\n\n // Apple-like subtle hover with scale effect (not translateY)\n const getHoverStyles = (): React.CSSProperties => {\n if (!hoverable) return {}\n\n const baseHover: React.CSSProperties = {\n boxShadow: 'var(--lm-shadow-lg)',\n borderColor: 'var(--lm-border-strong)',\n transform: 'scale(1.01)',\n }\n\n switch (variant) {\n case 'elevated':\n return {\n ...baseHover,\n boxShadow: 'var(--lm-shadow-xl)',\n }\n case 'outline':\n return {\n ...baseHover,\n backgroundColor: 'var(--lm-bg-hover)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'soft':\n return {\n ...baseHover,\n backgroundColor: 'var(--lm-bg-hover)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n default:\n return baseHover\n }\n }\n\n const currentStyles = isHovered && hoverable ? { ...getCardStyles(), ...getHoverStyles() } : getCardStyles()\n\n // Loading skeleton\n const renderSkeleton = () => (\n <div className=\"animate-pulse\">\n {title && (\n <div className=\"mb-4\">\n <div\n className=\"h-4 rounded w-1/3\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n </div>\n )}\n <div className=\"space-y-3\">\n <div\n className=\"h-4 rounded w-full\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n <div\n className=\"h-4 rounded w-5/6\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n <div\n className=\"h-4 rounded w-4/6\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n </div>\n </div>\n )\n\n // Header section\n const renderHeader = () => {\n if (!title && !extra) return null\n\n return (\n <div\n className={`flex items-center justify-between ${SIZE_GAP_CLASSES[resolvedSize]} border-b`}\n style={{\n borderColor: 'var(--lm-border-light)',\n padding: `${SIZE_PADDING_CLASSES[resolvedSize].split(' ')[0].replace('px-', '')}rem ${SIZE_PADDING_CLASSES[resolvedSize].split(' ')[1]?.replace('py-', '') || '1'}rem`,\n paddingLeft: '1rem',\n paddingRight: '1rem',\n paddingTop: '0.75rem',\n paddingBottom: '0.75rem',\n }}\n >\n {title && (\n <div\n className={`${titleTextClasses[resolvedSize]} font-semibold`}\n style={{ color: 'var(--lm-text-primary)' }}\n >\n {title}\n </div>\n )}\n {extra && (\n <div\n className={SIZE_TEXT_CLASSES[resolvedSize]}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n {extra}\n </div>\n )}\n </div>\n )\n }\n\n // Actions section\n const renderActions = () => {\n if (!actions || actions.length === 0) return null\n\n return (\n <div\n className=\"flex items-center border-t\"\n style={{ borderColor: 'var(--lm-border-light)' }}\n >\n {actions.map((action, index) => (\n <div\n key={index}\n className={`flex-1 flex items-center justify-center py-3 transition-colors duration-200 hover:bg-[var(--lm-bg-hover)] ${\n index !== actions.length - 1 ? 'border-r' : ''\n }`}\n style={{\n borderColor: 'var(--lm-border-light)',\n color: 'var(--lm-text-secondary)',\n }}\n >\n {action}\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n className={baseClassName}\n style={currentStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...rest}\n >\n {/* Cover image */}\n {cover && (\n <div className=\"w-full overflow-hidden\">\n {cover}\n </div>\n )}\n\n {/* Header */}\n {renderHeader()}\n\n {/* Body */}\n <div className={SIZE_PADDING_CLASSES[resolvedSize]}>\n {loading ? renderSkeleton() : children}\n </div>\n\n {/* Actions */}\n {renderActions()}\n </div>\n )\n}\n\nexport default LMCard\n"],"names":["clampComponentSize","COMPONENT_SIZE_ORDER","useState","jsxs","jsx","SIZE_GAP_CLASSES","SIZE_PADDING_CLASSES","SIZE_TEXT_CLASSES"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LMCard-D_K051f2.cjs","sources":["../src/components/DataDisplay/LMCard/LMCard.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport {\n COMPONENT_SIZE_ORDER,\n SIZE_PADDING_CLASSES,\n SIZE_TEXT_CLASSES,\n SIZE_GAP_CLASSES,\n clampComponentSize,\n} from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Card title */\n title?: React.ReactNode\n /** Extra content in the top-right corner */\n extra?: React.ReactNode\n /** Card content */\n children: React.ReactNode\n /** Card size */\n size?: ComponentSize\n /** Show border */\n bordered?: boolean\n /** Hoverable effect */\n hoverable?: boolean\n /** Loading state - shows skeleton */\n loading?: boolean\n /** Cover image at top */\n cover?: React.ReactNode\n /** Actions at bottom */\n actions?: React.ReactNode[]\n /** Visual variant */\n variant?: 'default' | 'elevated' | 'outline' | 'soft'\n /** Custom class name */\n className?: string\n}\n\nconst LMCard: React.FC<LMCardProps> = ({\n title,\n extra,\n children,\n size = 'md',\n bordered = true,\n hoverable = false,\n loading = false,\n cover,\n actions,\n variant = 'default',\n className = '',\n ...rest\n}) => {\n const resolvedSize = clampComponentSize(size, COMPONENT_SIZE_ORDER)\n const [isHovered, setIsHovered] = useState(false)\n\n const titleTextClasses: Record<ComponentSize, string> = {\n xs: 'text-sm',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n }\n\n // Apple-like refined border radius\n const roundedClasses = 'rounded-xl'\n const borderClasses = bordered ? 'border' : ''\n const hoverableClasses = hoverable ? 'cursor-pointer' : ''\n\n // Apple-like card styling\n const baseClassName = `\n ${roundedClasses} ${borderClasses} ${hoverableClasses}\n overflow-hidden\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getCardStyles = (): React.CSSProperties => {\n // Apple-like refined card styles with smooth transitions\n const baseStyles: React.CSSProperties = {\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n transition: 'all var(--lm-transition-normal) var(--lm-ease-out)',\n }\n\n switch (variant) {\n case 'elevated':\n return {\n ...baseStyles,\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'outline':\n return {\n ...baseStyles,\n backgroundColor: 'transparent',\n borderColor: 'var(--lm-border-strong)',\n boxShadow: 'none',\n }\n case 'soft':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-light)',\n boxShadow: 'none',\n }\n default:\n return baseStyles\n }\n }\n\n // Apple-like subtle hover with scale effect (not translateY)\n const getHoverStyles = (): React.CSSProperties => {\n if (!hoverable) return {}\n\n const baseHover: React.CSSProperties = {\n boxShadow: 'var(--lm-shadow-lg)',\n borderColor: 'var(--lm-border-strong)',\n transform: 'scale(1.01)',\n }\n\n switch (variant) {\n case 'elevated':\n return {\n ...baseHover,\n boxShadow: 'var(--lm-shadow-xl)',\n }\n case 'outline':\n return {\n ...baseHover,\n backgroundColor: 'var(--lm-bg-hover)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'soft':\n return {\n ...baseHover,\n backgroundColor: 'var(--lm-bg-hover)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n default:\n return baseHover\n }\n }\n\n const currentStyles = isHovered && hoverable ? { ...getCardStyles(), ...getHoverStyles() } : getCardStyles()\n\n // Loading skeleton\n const renderSkeleton = () => (\n <div className=\"animate-pulse\">\n {title && (\n <div className=\"mb-4\">\n <div\n className=\"h-4 rounded w-1/3\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n </div>\n )}\n <div className=\"space-y-3\">\n <div\n className=\"h-4 rounded w-full\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n <div\n className=\"h-4 rounded w-5/6\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n <div\n className=\"h-4 rounded w-4/6\"\n style={{ backgroundColor: 'var(--lm-bg-active)' }}\n />\n </div>\n </div>\n )\n\n // Header section\n const renderHeader = () => {\n if (!title && !extra) return null\n\n return (\n <div\n className={`flex items-center justify-between ${SIZE_GAP_CLASSES[resolvedSize]} border-b`}\n style={{\n borderColor: 'var(--lm-border-light)',\n padding: `${SIZE_PADDING_CLASSES[resolvedSize].split(' ')[0].replace('px-', '')}rem ${SIZE_PADDING_CLASSES[resolvedSize].split(' ')[1]?.replace('py-', '') || '1'}rem`,\n paddingLeft: '1rem',\n paddingRight: '1rem',\n paddingTop: '0.75rem',\n paddingBottom: '0.75rem',\n }}\n >\n {title && (\n <div\n className={`${titleTextClasses[resolvedSize]} font-semibold`}\n style={{ color: 'var(--lm-text-primary)' }}\n >\n {title}\n </div>\n )}\n {extra && (\n <div\n className={SIZE_TEXT_CLASSES[resolvedSize]}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n {extra}\n </div>\n )}\n </div>\n )\n }\n\n // Actions section\n const renderActions = () => {\n if (!actions || actions.length === 0) return null\n\n return (\n <div\n className=\"flex items-center border-t\"\n style={{ borderColor: 'var(--lm-border-light)' }}\n >\n {actions.map((action, index) => (\n <div\n key={index}\n className={`flex-1 flex items-center justify-center py-3 transition-colors duration-200 hover:bg-(--lm-bg-hover) ${\n index !== actions.length - 1 ? 'border-r' : ''\n }`}\n style={{\n borderColor: 'var(--lm-border-light)',\n color: 'var(--lm-text-secondary)',\n }}\n >\n {action}\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n className={baseClassName}\n style={currentStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...rest}\n >\n {/* Cover image */}\n {cover && (\n <div className=\"w-full overflow-hidden\">\n {cover}\n </div>\n )}\n\n {/* Header */}\n {renderHeader()}\n\n {/* Body */}\n <div className={SIZE_PADDING_CLASSES[resolvedSize]}>\n {loading ? renderSkeleton() : children}\n </div>\n\n {/* Actions */}\n {renderActions()}\n </div>\n )\n}\n\nexport default LMCard\n"],"names":["clampComponentSize","COMPONENT_SIZE_ORDER","useState","jsxs","jsx","SIZE_GAP_CLASSES","SIZE_PADDING_CLASSES","SIZE_TEXT_CLASSES"],"mappings":"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"}
|
|
@@ -52,7 +52,7 @@ const TimeColumn = ({ options, value, onChange, listRef }) => /* @__PURE__ */ js
|
|
|
52
52
|
className: `
|
|
53
53
|
w-full h-8 text-sm flex items-center justify-center rounded-md
|
|
54
54
|
transition-colors duration-150
|
|
55
|
-
hover:bg-
|
|
55
|
+
hover:bg-(--lm-bg-hover)
|
|
56
56
|
`,
|
|
57
57
|
style: {
|
|
58
58
|
backgroundColor: opt === value ? "var(--lm-primary-500)" : "transparent",
|
|
@@ -354,12 +354,12 @@ const LMDatePicker = ({
|
|
|
354
354
|
children: [
|
|
355
355
|
/* @__PURE__ */ jsxRuntime.jsx("style", { children: timeScrollbarStyles }),
|
|
356
356
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: hasTime ? "flex gap-3" : "", children: [
|
|
357
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
357
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "shrink-0", style: { width: "256px" }, children: [
|
|
358
358
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-3", children: [
|
|
359
359
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
360
360
|
"button",
|
|
361
361
|
{
|
|
362
|
-
className: "p-1 rounded hover:bg-
|
|
362
|
+
className: "p-1 rounded hover:bg-(--lm-bg-hover) transition-colors",
|
|
363
363
|
onClick: handlePrevYear,
|
|
364
364
|
style: { color: "var(--lm-text-secondary)" },
|
|
365
365
|
children: /* @__PURE__ */ jsxRuntime.jsx(DoubleChevronLeftIcon, {})
|
|
@@ -368,7 +368,7 @@ const LMDatePicker = ({
|
|
|
368
368
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
369
369
|
"button",
|
|
370
370
|
{
|
|
371
|
-
className: "p-1 rounded hover:bg-
|
|
371
|
+
className: "p-1 rounded hover:bg-(--lm-bg-hover) transition-colors",
|
|
372
372
|
onClick: handlePrevMonth,
|
|
373
373
|
style: { color: "var(--lm-text-secondary)" },
|
|
374
374
|
children: /* @__PURE__ */ jsxRuntime.jsx(ChevronLeftIcon, {})
|
|
@@ -389,7 +389,7 @@ const LMDatePicker = ({
|
|
|
389
389
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
390
390
|
"button",
|
|
391
391
|
{
|
|
392
|
-
className: "p-1 rounded hover:bg-
|
|
392
|
+
className: "p-1 rounded hover:bg-(--lm-bg-hover) transition-colors",
|
|
393
393
|
onClick: handleNextMonth,
|
|
394
394
|
style: { color: "var(--lm-text-secondary)" },
|
|
395
395
|
children: /* @__PURE__ */ jsxRuntime.jsx(ChevronRightIcon, {})
|
|
@@ -398,7 +398,7 @@ const LMDatePicker = ({
|
|
|
398
398
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
399
399
|
"button",
|
|
400
400
|
{
|
|
401
|
-
className: "p-1 rounded hover:bg-
|
|
401
|
+
className: "p-1 rounded hover:bg-(--lm-bg-hover) transition-colors",
|
|
402
402
|
onClick: handleNextYear,
|
|
403
403
|
style: { color: "var(--lm-text-secondary)" },
|
|
404
404
|
children: /* @__PURE__ */ jsxRuntime.jsx(DoubleChevronRightIcon, {})
|
|
@@ -422,7 +422,7 @@ const LMDatePicker = ({
|
|
|
422
422
|
className: `
|
|
423
423
|
w-8 h-8 rounded-lg text-sm flex items-center justify-center
|
|
424
424
|
transition-colors duration-150
|
|
425
|
-
${!isDisabled ? "hover:bg-
|
|
425
|
+
${!isDisabled ? "hover:bg-(--lm-bg-hover)" : ""}
|
|
426
426
|
`,
|
|
427
427
|
style: getDayStyles(day),
|
|
428
428
|
onClick: () => handleDateSelect(day.date),
|
|
@@ -442,7 +442,7 @@ const LMDatePicker = ({
|
|
|
442
442
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
443
443
|
"div",
|
|
444
444
|
{
|
|
445
|
-
className: "text-xs font-medium mb-2 text-center
|
|
445
|
+
className: "text-xs font-medium mb-2 text-center shrink-0",
|
|
446
446
|
style: { color: "var(--lm-text-tertiary)" },
|
|
447
447
|
children: "选择时间"
|
|
448
448
|
}
|
|
@@ -484,7 +484,7 @@ const LMDatePicker = ({
|
|
|
484
484
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
485
485
|
"button",
|
|
486
486
|
{
|
|
487
|
-
className: "py-1.5 px-3 text-sm rounded-lg hover:bg-
|
|
487
|
+
className: "py-1.5 px-3 text-sm rounded-lg hover:bg-(--lm-bg-hover) transition-colors",
|
|
488
488
|
style: { color: "var(--lm-primary-600)" },
|
|
489
489
|
onClick: hasTime ? handleNow : () => handleDateSelect(/* @__PURE__ */ new Date()),
|
|
490
490
|
children: hasTime ? "此刻" : "今天"
|
|
@@ -534,7 +534,7 @@ const LMDatePicker = ({
|
|
|
534
534
|
allowClear && displayValue && isHovered && !disabled ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
535
535
|
"span",
|
|
536
536
|
{
|
|
537
|
-
className: "
|
|
537
|
+
className: "shrink-0 p-0.5 rounded hover:bg-(--lm-bg-hover)",
|
|
538
538
|
style: { color: "var(--lm-text-tertiary)" },
|
|
539
539
|
onClick: handleClear,
|
|
540
540
|
children: /* @__PURE__ */ jsxRuntime.jsx(ClearIcon, {})
|
|
@@ -542,7 +542,7 @@ const LMDatePicker = ({
|
|
|
542
542
|
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
543
543
|
"span",
|
|
544
544
|
{
|
|
545
|
-
className: "
|
|
545
|
+
className: "shrink-0",
|
|
546
546
|
style: { color: "var(--lm-text-tertiary)" },
|
|
547
547
|
children: /* @__PURE__ */ jsxRuntime.jsx(CalendarIcon, {})
|
|
548
548
|
}
|
|
@@ -562,4 +562,4 @@ const LMDatePicker = ({
|
|
|
562
562
|
] });
|
|
563
563
|
};
|
|
564
564
|
exports.LMDatePicker = LMDatePicker;
|
|
565
|
-
//# sourceMappingURL=LMDatePicker-
|
|
565
|
+
//# sourceMappingURL=LMDatePicker-BlUwN4On.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LMDatePicker-BlUwN4On.cjs","sources":["../src/components/Form/LMDatePicker/LMDatePicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n COMPONENT_SIZE_ORDER,\n SIZE_TEXT_CLASSES,\n SIZE_INPUT_CONFIG,\n clampComponentSize,\n} from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface TimePickerOptions {\n /** Show hour selector */\n showHour?: boolean\n /** Show minute selector */\n showMinute?: boolean\n /** Show second selector */\n showSecond?: boolean\n /** Hour step */\n hourStep?: number\n /** Minute step */\n minuteStep?: number\n /** Second step */\n secondStep?: number\n /** Use 12-hour format */\n use12Hours?: boolean\n}\n\nexport interface LMDatePickerProps {\n /** Selected date value */\n value?: Date | string | null\n /** Default value */\n defaultValue?: Date | string\n /** Change handler */\n onChange?: (date: Date | null, dateString: string) => void\n /** Date format */\n format?: string\n /** Placeholder */\n placeholder?: string\n /** Disabled state */\n disabled?: boolean\n /** Component size */\n size?: ComponentSize\n /** Allow clear */\n allowClear?: boolean\n /** Disable specific dates */\n disabledDate?: (date: Date) => boolean\n /** Picker type (reserved for future use) */\n picker?: 'date' | 'month' | 'year'\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Custom class name */\n className?: string\n /** Enable time picker */\n showTime?: boolean | TimePickerOptions\n}\n\nconst CalendarIcon: React.FC = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n)\n\nconst ClearIcon: React.FC = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\nconst ChevronLeftIcon: React.FC = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n)\n\nconst ChevronRightIcon: React.FC = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n)\n\nconst DoubleChevronLeftIcon: React.FC = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18 19l-7-7 7-7\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11 19l-7-7 7-7\" />\n </svg>\n)\n\nconst DoubleChevronRightIcon: React.FC = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 5l7 7-7 7\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13 5l7 7-7 7\" />\n </svg>\n)\n\nconst WEEKDAYS = ['日', '一', '二', '三', '四', '五', '六']\nconst MONTHS = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']\n\n// Scrollbar styles for time columns\nconst timeScrollbarStyles = `\n .lm-time-scrollbar::-webkit-scrollbar {\n width: 4px;\n }\n .lm-time-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n }\n .lm-time-scrollbar::-webkit-scrollbar-thumb {\n background: var(--lm-border-default);\n border-radius: 4px;\n }\n .lm-time-scrollbar::-webkit-scrollbar-thumb:hover {\n background: var(--lm-text-tertiary);\n }\n .lm-time-scrollbar {\n scrollbar-width: thin;\n scrollbar-color: var(--lm-border-default) transparent;\n }\n`\n\n// Fixed height for time columns to match calendar height\nconst TIME_COLUMN_HEIGHT = 252\n\n// TimeColumn component moved outside to avoid re-creation during render\nconst TimeColumn: React.FC<{\n options: number[]\n value: number\n onChange: (val: number) => void\n listRef: React.RefObject<HTMLDivElement | null>\n}> = ({ options, value, onChange, listRef }) => (\n <div\n ref={listRef as React.RefObject<HTMLDivElement>}\n className=\"flex-1 overflow-y-auto lm-time-scrollbar\"\n style={{\n height: `${TIME_COLUMN_HEIGHT}px`,\n maxHeight: `${TIME_COLUMN_HEIGHT}px`,\n }}\n >\n {options.map((opt) => (\n <button\n key={opt}\n className={`\n w-full h-8 text-sm flex items-center justify-center rounded-md\n transition-colors duration-150\n hover:bg-(--lm-bg-hover)\n `}\n style={{\n backgroundColor: opt === value ? 'var(--lm-primary-500)' : 'transparent',\n color: opt === value ? 'white' : 'var(--lm-text-primary)',\n }}\n onClick={() => onChange(opt)}\n >\n {String(opt).padStart(2, '0')}\n </button>\n ))}\n </div>\n)\n\nconst formatDate = (date: Date, format: string): string => {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n const hours = String(date.getHours()).padStart(2, '0')\n const minutes = String(date.getMinutes()).padStart(2, '0')\n const seconds = String(date.getSeconds()).padStart(2, '0')\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds)\n}\n\nconst parseDate = (value: Date | string | null | undefined): Date | null => {\n if (!value) return null\n if (value instanceof Date) return value\n const parsed = new Date(value)\n return isNaN(parsed.getTime()) ? null : parsed\n}\n\nconst LMDatePicker: React.FC<LMDatePickerProps> = ({\n value,\n defaultValue,\n onChange,\n format: formatProp,\n placeholder = '请选择日期',\n disabled = false,\n size = 'md',\n allowClear = true,\n disabledDate,\n picker: _picker = 'date',\n error = false,\n errorMessage,\n className = '',\n showTime = false,\n}) => {\n const resolvedSize = clampComponentSize(size, COMPONENT_SIZE_ORDER)\n const inputConfig = SIZE_INPUT_CONFIG[resolvedSize]\n\n // Parse time options\n const timeOptions: TimePickerOptions = typeof showTime === 'object' ? showTime : {}\n const {\n showHour = true,\n showMinute = true,\n showSecond = true,\n hourStep = 1,\n minuteStep = 1,\n secondStep = 1,\n } = timeOptions\n const hasTime = showTime !== false\n\n // Auto-determine format\n const format = formatProp || (hasTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD')\n\n const [isOpen, setIsOpen] = useState(false)\n const [internalValue, setInternalValue] = useState<Date | null>(() => parseDate(defaultValue))\n const [viewDate, setViewDate] = useState<Date>(() => parseDate(defaultValue) || new Date())\n const [position, setPosition] = useState({ top: 0, left: 0 })\n const [isHovered, setIsHovered] = useState(false)\n\n // Time state for pending selection\n const [tempDate, setTempDate] = useState<Date | null>(null)\n // Track user-modified time separately from selected date time\n const [userModifiedTime, setUserModifiedTime] = useState<{hour: number, minute: number, second: number} | null>(null)\n\n const triggerRef = useRef<HTMLDivElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const hourListRef = useRef<HTMLDivElement>(null)\n const minuteListRef = useRef<HTMLDivElement>(null)\n const secondListRef = useRef<HTMLDivElement>(null)\n\n const selectedDate = value !== undefined ? parseDate(value) : internalValue\n\n const displayValue = selectedDate ? formatDate(selectedDate, format) : ''\n\n // Derive temp time values - use user modified values if set, otherwise from selectedDate\n const tempHour = userModifiedTime?.hour ?? selectedDate?.getHours() ?? 0\n const tempMinute = userModifiedTime?.minute ?? selectedDate?.getMinutes() ?? 0\n const tempSecond = userModifiedTime?.second ?? selectedDate?.getSeconds() ?? 0\n\n // Reset user modified time when panel closes or selection changes\n const prevSelectedDateRef = useRef(selectedDate)\n if (prevSelectedDateRef.current !== selectedDate) {\n prevSelectedDateRef.current = selectedDate\n if (userModifiedTime !== null) {\n setUserModifiedTime(null)\n }\n }\n\n // Scroll time columns to selected values when panel opens\n useEffect(() => {\n if (isOpen && hasTime) {\n setTimeout(() => {\n const scrollToSelected = (ref: React.RefObject<HTMLDivElement | null>, value: number, step: number) => {\n if (ref.current) {\n const index = Math.floor(value / step)\n const itemHeight = 32 // height of each item (h-8)\n ref.current.scrollTop = index * itemHeight\n }\n }\n scrollToSelected(hourListRef, tempHour, hourStep)\n scrollToSelected(minuteListRef, tempMinute, minuteStep)\n scrollToSelected(secondListRef, tempSecond, secondStep)\n }, 50)\n }\n }, [isOpen, hasTime, tempHour, tempMinute, tempSecond, hourStep, minuteStep, secondStep])\n\n // Update position\n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !dropdownRef.current) return\n\n const triggerRect = triggerRef.current.getBoundingClientRect()\n const dropdownRect = dropdownRef.current.getBoundingClientRect()\n const scrollY = window.scrollY\n const scrollX = window.scrollX\n\n let top = triggerRect.bottom + scrollY + 4\n let left = triggerRect.left + scrollX\n\n // Boundary check\n if (left + dropdownRect.width > window.innerWidth + scrollX) {\n left = window.innerWidth + scrollX - dropdownRect.width - 8\n }\n if (top + dropdownRect.height > window.innerHeight + scrollY) {\n top = triggerRect.top + scrollY - dropdownRect.height - 4\n }\n\n setPosition({ top, left })\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n updatePosition()\n }\n }, [isOpen, updatePosition])\n\n useEffect(() => {\n if (isOpen) {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n triggerRef.current &&\n !triggerRef.current.contains(e.target as Node) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n const handleScroll = () => updatePosition()\n\n document.addEventListener('mousedown', handleClickOutside)\n window.addEventListener('scroll', handleScroll, true)\n window.addEventListener('resize', handleScroll)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n window.removeEventListener('scroll', handleScroll, true)\n window.removeEventListener('resize', handleScroll)\n }\n }\n }, [isOpen, updatePosition])\n\n const handleDateSelect = (date: Date) => {\n if (disabledDate?.(date)) return\n\n if (hasTime) {\n // When time picker is enabled, store temp date and wait for confirm\n setTempDate(date)\n const newDate = new Date(date)\n newDate.setHours(tempHour, tempMinute, tempSecond)\n setTempDate(newDate)\n } else {\n // No time picker, confirm immediately\n const newDate = new Date(date)\n if (value === undefined) {\n setInternalValue(newDate)\n }\n onChange?.(newDate, formatDate(newDate, format))\n setIsOpen(false)\n }\n }\n\n const handleTimeChange = (type: 'hour' | 'minute' | 'second', val: number) => {\n setUserModifiedTime(prev => ({\n hour: type === 'hour' ? val : (prev?.hour ?? tempHour),\n minute: type === 'minute' ? val : (prev?.minute ?? tempMinute),\n second: type === 'second' ? val : (prev?.second ?? tempSecond),\n }))\n }\n\n const handleConfirm = () => {\n const baseDate = tempDate || selectedDate || new Date()\n const newDate = new Date(baseDate)\n newDate.setHours(tempHour, tempMinute, tempSecond)\n\n if (value === undefined) {\n setInternalValue(newDate)\n }\n onChange?.(newDate, formatDate(newDate, format))\n setIsOpen(false)\n }\n\n const handleNow = () => {\n const now = new Date()\n setUserModifiedTime({\n hour: now.getHours(),\n minute: now.getMinutes(),\n second: now.getSeconds(),\n })\n setTempDate(now)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (value === undefined) {\n setInternalValue(null)\n }\n onChange?.(null, '')\n }\n\n const handlePrevMonth = () => {\n setViewDate((prev) => new Date(prev.getFullYear(), prev.getMonth() - 1, 1))\n }\n\n const handleNextMonth = () => {\n setViewDate((prev) => new Date(prev.getFullYear(), prev.getMonth() + 1, 1))\n }\n\n const handlePrevYear = () => {\n setViewDate((prev) => new Date(prev.getFullYear() - 1, prev.getMonth(), 1))\n }\n\n const handleNextYear = () => {\n setViewDate((prev) => new Date(prev.getFullYear() + 1, prev.getMonth(), 1))\n }\n\n // Generate calendar days\n const calendarDays = useMemo(() => {\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n\n const firstDay = new Date(year, month, 1)\n const lastDay = new Date(year, month + 1, 0)\n\n const days: { date: Date; isCurrentMonth: boolean }[] = []\n\n // Previous month days\n const firstDayOfWeek = firstDay.getDay()\n for (let i = firstDayOfWeek - 1; i >= 0; i--) {\n const date = new Date(year, month, -i)\n days.push({ date, isCurrentMonth: false })\n }\n\n // Current month days\n for (let i = 1; i <= lastDay.getDate(); i++) {\n const date = new Date(year, month, i)\n days.push({ date, isCurrentMonth: true })\n }\n\n // Next month days\n const remainingDays = 42 - days.length\n for (let i = 1; i <= remainingDays; i++) {\n const date = new Date(year, month + 1, i)\n days.push({ date, isCurrentMonth: false })\n }\n\n return days\n }, [viewDate])\n\n const isToday = (date: Date) => {\n const today = new Date()\n return (\n date.getFullYear() === today.getFullYear() &&\n date.getMonth() === today.getMonth() &&\n date.getDate() === today.getDate()\n )\n }\n\n const isSelected = (date: Date) => {\n // In time picker mode, check tempDate first for pending selection\n const checkDate = hasTime && tempDate ? tempDate : selectedDate\n if (!checkDate) return false\n return (\n date.getFullYear() === checkDate.getFullYear() &&\n date.getMonth() === checkDate.getMonth() &&\n date.getDate() === checkDate.getDate()\n )\n }\n\n const getInputStyles = (): React.CSSProperties => {\n const base: React.CSSProperties = {\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: error ? 'var(--lm-error-300)' : 'var(--lm-border-default)',\n color: 'var(--lm-text-primary)',\n }\n\n if (disabled) {\n return {\n ...base,\n backgroundColor: 'var(--lm-bg-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n }\n }\n\n return base\n }\n\n const getDayStyles = (day: { date: Date; isCurrentMonth: boolean }): React.CSSProperties => {\n const isDisabled = disabledDate?.(day.date)\n const selected = isSelected(day.date)\n const today = isToday(day.date)\n\n if (isDisabled) {\n return {\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n }\n }\n\n if (selected) {\n return {\n backgroundColor: 'var(--lm-primary-500)',\n color: 'white',\n }\n }\n\n if (today) {\n return {\n color: 'var(--lm-primary-600)',\n fontWeight: 600,\n }\n }\n\n if (!day.isCurrentMonth) {\n return {\n color: 'var(--lm-text-tertiary)',\n }\n }\n\n return {\n color: 'var(--lm-text-primary)',\n }\n }\n\n // Generate time options\n const generateTimeOptions = (max: number, step: number) => {\n const options: number[] = []\n for (let i = 0; i < max; i += step) {\n options.push(i)\n }\n return options\n }\n\n const hourOptions = generateTimeOptions(24, hourStep)\n const minuteOptions = generateTimeOptions(60, minuteStep)\n const secondOptions = generateTimeOptions(60, secondStep)\n\n const calendar = (\n <div\n ref={dropdownRef}\n className=\"rounded-xl border backdrop-blur-md shadow-lg p-3\"\n style={{\n position: 'absolute',\n top: position.top,\n left: position.left,\n zIndex: 1000,\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: 'var(--lm-border-default)',\n width: hasTime ? '460px' : '280px',\n }}\n >\n <style>{timeScrollbarStyles}</style>\n <div className={hasTime ? 'flex gap-3' : ''}>\n {/* Calendar Panel */}\n <div className=\"shrink-0\" style={{ width: '256px' }}>\n {/* Header */}\n <div className=\"flex items-center justify-between mb-3\">\n <button\n className=\"p-1 rounded hover:bg-(--lm-bg-hover) transition-colors\"\n onClick={handlePrevYear}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n <DoubleChevronLeftIcon />\n </button>\n <button\n className=\"p-1 rounded hover:bg-(--lm-bg-hover) transition-colors\"\n onClick={handlePrevMonth}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n <ChevronLeftIcon />\n </button>\n <span\n className=\"font-medium\"\n style={{ color: 'var(--lm-text-primary)' }}\n >\n {viewDate.getFullYear()} 年 {MONTHS[viewDate.getMonth()]}\n </span>\n <button\n className=\"p-1 rounded hover:bg-(--lm-bg-hover) transition-colors\"\n onClick={handleNextMonth}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n <ChevronRightIcon />\n </button>\n <button\n className=\"p-1 rounded hover:bg-(--lm-bg-hover) transition-colors\"\n onClick={handleNextYear}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n <DoubleChevronRightIcon />\n </button>\n </div>\n\n {/* Weekdays */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {WEEKDAYS.map((day) => (\n <div\n key={day}\n className=\"text-center text-xs font-medium py-1\"\n style={{ color: 'var(--lm-text-tertiary)' }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Days */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((day, index) => {\n const isDisabled = disabledDate?.(day.date)\n return (\n <button\n key={index}\n className={`\n w-8 h-8 rounded-lg text-sm flex items-center justify-center\n transition-colors duration-150\n ${!isDisabled ? 'hover:bg-(--lm-bg-hover)' : ''}\n `}\n style={getDayStyles(day)}\n onClick={() => handleDateSelect(day.date)}\n disabled={isDisabled}\n >\n {day.date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Time Picker Panel */}\n {hasTime && (\n <div\n className=\"border-l pl-3 flex flex-col\"\n style={{ borderColor: 'var(--lm-border-light)', width: '170px' }}\n >\n <div\n className=\"text-xs font-medium mb-2 text-center shrink-0\"\n style={{ color: 'var(--lm-text-tertiary)' }}\n >\n 选择时间\n </div>\n <div className=\"flex gap-1\">\n {showHour && (\n <TimeColumn\n options={hourOptions}\n value={tempHour}\n onChange={(val) => handleTimeChange('hour', val)}\n listRef={hourListRef}\n />\n )}\n {showMinute && (\n <TimeColumn\n options={minuteOptions}\n value={tempMinute}\n onChange={(val) => handleTimeChange('minute', val)}\n listRef={minuteListRef}\n />\n )}\n {showSecond && (\n <TimeColumn\n options={secondOptions}\n value={tempSecond}\n onChange={(val) => handleTimeChange('second', val)}\n listRef={secondListRef}\n />\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"mt-3 pt-3 border-t flex items-center justify-between\" style={{ borderColor: 'var(--lm-border-light)' }}>\n <button\n className=\"py-1.5 px-3 text-sm rounded-lg hover:bg-(--lm-bg-hover) transition-colors\"\n style={{ color: 'var(--lm-primary-600)' }}\n onClick={hasTime ? handleNow : () => handleDateSelect(new Date())}\n >\n {hasTime ? '此刻' : '今天'}\n </button>\n {hasTime && (\n <button\n className=\"py-1.5 px-4 text-sm rounded-lg transition-colors\"\n style={{\n backgroundColor: 'var(--lm-primary-500)',\n color: 'white',\n }}\n onClick={handleConfirm}\n >\n 确定\n </button>\n )}\n </div>\n </div>\n )\n\n return (\n <div className={`inline-block ${className}`}>\n <div\n ref={triggerRef}\n className={`\n ${inputConfig.padding} ${inputConfig.height} ${inputConfig.fontSize}\n rounded-xl border backdrop-blur-md\n flex items-center gap-2\n transition-all duration-200\n ${disabled ? '' : 'cursor-pointer'}\n `}\n style={getInputStyles()}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <span\n className=\"flex-1 truncate\"\n style={{ color: displayValue ? 'var(--lm-text-primary)' : 'var(--lm-text-tertiary)' }}\n >\n {displayValue || placeholder}\n </span>\n\n {allowClear && displayValue && isHovered && !disabled ? (\n <span\n className=\"shrink-0 p-0.5 rounded hover:bg-(--lm-bg-hover)\"\n style={{ color: 'var(--lm-text-tertiary)' }}\n onClick={handleClear}\n >\n <ClearIcon />\n </span>\n ) : (\n <span\n className=\"shrink-0\"\n style={{ color: 'var(--lm-text-tertiary)' }}\n >\n <CalendarIcon />\n </span>\n )}\n </div>\n\n {/* Error message */}\n {error && errorMessage && (\n <p\n className={`mt-1 ${SIZE_TEXT_CLASSES[resolvedSize]}`}\n style={{ color: 'var(--lm-error-500)' }}\n >\n {errorMessage}\n </p>\n )}\n\n {/* Calendar dropdown */}\n {isOpen && typeof document !== 'undefined' && createPortal(calendar, document.body)}\n </div>\n )\n}\n\nexport default LMDatePicker\n"],"names":["jsx","jsxs","clampComponentSize","COMPONENT_SIZE_ORDER","SIZE_INPUT_CONFIG","useState","useRef","useEffect","value","useCallback","useMemo","SIZE_TEXT_CLASSES","createPortal"],"mappings":"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"}
|
|
@@ -51,7 +51,7 @@ const TimeColumn = ({ options, value, onChange, listRef }) => /* @__PURE__ */ js
|
|
|
51
51
|
className: `
|
|
52
52
|
w-full h-8 text-sm flex items-center justify-center rounded-md
|
|
53
53
|
transition-colors duration-150
|
|
54
|
-
hover:bg-
|
|
54
|
+
hover:bg-(--lm-bg-hover)
|
|
55
55
|
`,
|
|
56
56
|
style: {
|
|
57
57
|
backgroundColor: opt === value ? "var(--lm-primary-500)" : "transparent",
|
|
@@ -353,12 +353,12 @@ const LMDatePicker = ({
|
|
|
353
353
|
children: [
|
|
354
354
|
/* @__PURE__ */ jsx("style", { children: timeScrollbarStyles }),
|
|
355
355
|
/* @__PURE__ */ jsxs("div", { className: hasTime ? "flex gap-3" : "", children: [
|
|
356
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
356
|
+
/* @__PURE__ */ jsxs("div", { className: "shrink-0", style: { width: "256px" }, children: [
|
|
357
357
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-3", children: [
|
|
358
358
|
/* @__PURE__ */ jsx(
|
|
359
359
|
"button",
|
|
360
360
|
{
|
|
361
|
-
className: "p-1 rounded hover:bg-
|
|
361
|
+
className: "p-1 rounded hover:bg-(--lm-bg-hover) transition-colors",
|
|
362
362
|
onClick: handlePrevYear,
|
|
363
363
|
style: { color: "var(--lm-text-secondary)" },
|
|
364
364
|
children: /* @__PURE__ */ jsx(DoubleChevronLeftIcon, {})
|
|
@@ -367,7 +367,7 @@ const LMDatePicker = ({
|
|
|
367
367
|
/* @__PURE__ */ jsx(
|
|
368
368
|
"button",
|
|
369
369
|
{
|
|
370
|
-
className: "p-1 rounded hover:bg-
|
|
370
|
+
className: "p-1 rounded hover:bg-(--lm-bg-hover) transition-colors",
|
|
371
371
|
onClick: handlePrevMonth,
|
|
372
372
|
style: { color: "var(--lm-text-secondary)" },
|
|
373
373
|
children: /* @__PURE__ */ jsx(ChevronLeftIcon, {})
|
|
@@ -388,7 +388,7 @@ const LMDatePicker = ({
|
|
|
388
388
|
/* @__PURE__ */ jsx(
|
|
389
389
|
"button",
|
|
390
390
|
{
|
|
391
|
-
className: "p-1 rounded hover:bg-
|
|
391
|
+
className: "p-1 rounded hover:bg-(--lm-bg-hover) transition-colors",
|
|
392
392
|
onClick: handleNextMonth,
|
|
393
393
|
style: { color: "var(--lm-text-secondary)" },
|
|
394
394
|
children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
|
|
@@ -397,7 +397,7 @@ const LMDatePicker = ({
|
|
|
397
397
|
/* @__PURE__ */ jsx(
|
|
398
398
|
"button",
|
|
399
399
|
{
|
|
400
|
-
className: "p-1 rounded hover:bg-
|
|
400
|
+
className: "p-1 rounded hover:bg-(--lm-bg-hover) transition-colors",
|
|
401
401
|
onClick: handleNextYear,
|
|
402
402
|
style: { color: "var(--lm-text-secondary)" },
|
|
403
403
|
children: /* @__PURE__ */ jsx(DoubleChevronRightIcon, {})
|
|
@@ -421,7 +421,7 @@ const LMDatePicker = ({
|
|
|
421
421
|
className: `
|
|
422
422
|
w-8 h-8 rounded-lg text-sm flex items-center justify-center
|
|
423
423
|
transition-colors duration-150
|
|
424
|
-
${!isDisabled ? "hover:bg-
|
|
424
|
+
${!isDisabled ? "hover:bg-(--lm-bg-hover)" : ""}
|
|
425
425
|
`,
|
|
426
426
|
style: getDayStyles(day),
|
|
427
427
|
onClick: () => handleDateSelect(day.date),
|
|
@@ -441,7 +441,7 @@ const LMDatePicker = ({
|
|
|
441
441
|
/* @__PURE__ */ jsx(
|
|
442
442
|
"div",
|
|
443
443
|
{
|
|
444
|
-
className: "text-xs font-medium mb-2 text-center
|
|
444
|
+
className: "text-xs font-medium mb-2 text-center shrink-0",
|
|
445
445
|
style: { color: "var(--lm-text-tertiary)" },
|
|
446
446
|
children: "选择时间"
|
|
447
447
|
}
|
|
@@ -483,7 +483,7 @@ const LMDatePicker = ({
|
|
|
483
483
|
/* @__PURE__ */ jsx(
|
|
484
484
|
"button",
|
|
485
485
|
{
|
|
486
|
-
className: "py-1.5 px-3 text-sm rounded-lg hover:bg-
|
|
486
|
+
className: "py-1.5 px-3 text-sm rounded-lg hover:bg-(--lm-bg-hover) transition-colors",
|
|
487
487
|
style: { color: "var(--lm-primary-600)" },
|
|
488
488
|
onClick: hasTime ? handleNow : () => handleDateSelect(/* @__PURE__ */ new Date()),
|
|
489
489
|
children: hasTime ? "此刻" : "今天"
|
|
@@ -533,7 +533,7 @@ const LMDatePicker = ({
|
|
|
533
533
|
allowClear && displayValue && isHovered && !disabled ? /* @__PURE__ */ jsx(
|
|
534
534
|
"span",
|
|
535
535
|
{
|
|
536
|
-
className: "
|
|
536
|
+
className: "shrink-0 p-0.5 rounded hover:bg-(--lm-bg-hover)",
|
|
537
537
|
style: { color: "var(--lm-text-tertiary)" },
|
|
538
538
|
onClick: handleClear,
|
|
539
539
|
children: /* @__PURE__ */ jsx(ClearIcon, {})
|
|
@@ -541,7 +541,7 @@ const LMDatePicker = ({
|
|
|
541
541
|
) : /* @__PURE__ */ jsx(
|
|
542
542
|
"span",
|
|
543
543
|
{
|
|
544
|
-
className: "
|
|
544
|
+
className: "shrink-0",
|
|
545
545
|
style: { color: "var(--lm-text-tertiary)" },
|
|
546
546
|
children: /* @__PURE__ */ jsx(CalendarIcon, {})
|
|
547
547
|
}
|
|
@@ -563,4 +563,4 @@ const LMDatePicker = ({
|
|
|
563
563
|
export {
|
|
564
564
|
LMDatePicker as L
|
|
565
565
|
};
|
|
566
|
-
//# sourceMappingURL=LMDatePicker-
|
|
566
|
+
//# sourceMappingURL=LMDatePicker-DSv28BFH.js.map
|