hamster-charts 0.0.7 → 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/README.md CHANGED
@@ -1,83 +1,393 @@
1
- ![HamsterCharts](http://hamster-charts.hejiu45.top/hamster-charts.png)
2
-
3
- # Hamster Charts
4
-
5
- 作者:鹤酒、hejiu45
6
-
7
- [官方文档](http://hamster-charts.hejiu45.top)
8
-
9
- ## 介绍:
10
-
11
- Hamster Charts是一个基于Vite 与 Vue3 开发的可视化组件库,由鹤酒(和就5)独立开发,如果大家感兴趣也可以加入我们一起开发和完善我们组件库,这是一个简约、简单、易上手的组件库。
12
-
13
- ## 安装与卸载:
14
-
15
- ```sh
16
- # 安装
17
- npm i hamster-charts
18
-
19
- # 卸载
20
- npm uninstall hamster-charts
21
- ```
22
-
23
- ## 引用方式:
24
-
25
- 注意:支持vue3
26
-
27
- ### 全局 引用:
28
-
29
- ```js
30
- import { createApp } from 'vue'
31
- import './style.css'
32
- import App from './App.vue'
33
-
34
- // 手动引用样式
35
- import HamsterCharts from 'hamster-charts'
36
- import '/node_modules/hamster-charts/dist/hamster-charts.css'
37
-
38
- createApp(App).use(HamsterCharts).mount('#app')
39
-
40
- ```
41
-
42
- ### 局部 引用
43
-
44
- ```html
45
- <script setup>
46
- import bg01 from "./assets/bg.png"
47
- import header from "./assets/header.png"
48
- import bg02 from "./assets/bg01.png"
49
- // 局部引入
50
- import { hBody, hHeader, hContent } from "h-hamster-charts"
51
- </script>
52
-
53
- <template>
54
- <h-body :imgUrl="bg01">
55
- <h-header :imgUrl="header"></h-header>
56
- <h-content :imgUrl="bg02"></h-content>
57
- </h-body>
58
- </template>
59
-
60
- <style scoped>
61
- </style>
62
-
63
- ```
64
-
65
- ## 关于我们:
66
-
67
- ## [鹤酒开源](http://hamster-charts.hejiu45.top/src/team/#鹤酒开源)
68
-
69
- 大家好,
70
-
71
- 我是鹤酒,来自一个充满激情和技术热忱的团队——“鹤酒开源”。我们是一群热爱技术的极客,专注于探索从前端到后端的各种开发技术和最佳实践。我们的名字来源于对技术如鹤般优雅而专注的追求,以及像美酒一样醇厚的技术分享精神。
72
-
73
- 作为一名直男癌患者(自嘲),我对技术的痴迷已经达到了废寝忘食的地步。无论是深入研究算法优化,还是探讨最新的Web框架,或是解决复杂的系统架构问题,我都乐此不疲。我的技能栈非常广泛,涵盖了从前端的用户体验设计与实现(HTML/CSS/JavaScript等)到后端的服务端逻辑处理(Java, Python, Node.js等)、数据库管理(MySQL, MongoDB等),甚至包括云服务部署和维护等方面。
74
-
75
- 在“鹤酒开源”这个团队里,我们秉持开放共享的理念,致力于通过开源项目贡献自己的力量,并积极参加各种技术社区活动,与其他开发者交流学习心得和技术经验。我们相信,只有不断进步才能在这个快速发展的行业中立于不败之地。
76
-
77
- 如果您也是一位对技术充满热情的朋友,欢迎随时与我或“鹤酒开源”的其他成员交流互动!
78
-
79
- ## 加入我们:
80
-
81
- Wechat(微信):stf8264
82
-
83
- QQ:3171292158
1
+
2
+
3
+ # Hamster Charts
4
+
5
+ ![hamster-charts](./public/logo.png)
6
+
7
+ > 基于 Vite 与 Vue3 开发的可视化组件库
8
+
9
+ [官方文档](http://hamster-charts.hejiu45.top) | [GitHub](https://gitee.com/hejiu45/hamster-charts) | [English](./README_EN.md)
10
+
11
+ ## 介绍
12
+
13
+ Hamster Charts(仓鼠图表)是一个简约、简单、易上手的可视化组件库,由鹤酒(hejiu45)独立开发。该组件库基于 Vite 和 Vue3 构建,提供丰富的可视化图表和布局组件,适用于数据可视化大屏、监控系统仪表盘等场景。
14
+
15
+ ### 特性
16
+
17
+ - 🚀 基于 Vite + Vue3 构建,开发体验流畅
18
+ - 📦 组件丰富,覆盖多种可视化场景
19
+ - 🎨 主题样式灵活可定制
20
+ - 📱 响应式设计,适配多种屏幕
21
+ - 🔌 插件化架构,易于扩展
22
+
23
+ ## 效果展示
24
+
25
+ | 全组件使用展示![](./doc/img/hejiu45_2026-02-27_15-29-14.png) | 身体组件使用展示![](./doc/img/hejiu45_2026-02-27_15-30-05.png) |
26
+ | ------------------------------------------------------------ | ------------------------------------------------------------ |
27
+ | 头部标题组件使用展示![](./doc/img/hejiu45_2026-02-27_15-30-24.png) | 滚动数据列表组件使用展示![](./doc/img/hejiu45_2026-02-27_15-30-40.png) |
28
+
29
+ ## 组件列表
30
+
31
+ | 组件 | 描述 |
32
+ |------|------|
33
+ | `h-body` | 页面主体容器 |
34
+ | `h-header` | 页面头部组件 |
35
+ | `h-content` | 内容区域组件 |
36
+ | `h-bottom` | 底部组件 |
37
+ | `h-left` / `h-right` / `h-center` | 左右中布局组件 |
38
+ | `h-top` | 顶部组件 |
39
+ | `h-chart` | 图表容器 |
40
+ | `h-chart-title` | 图表标题 |
41
+ | `h-item-chart` | 单项图表 |
42
+ | `h-counters` | 数字计数器 |
43
+ | `h-data-label` | 数据标签 |
44
+ | `h-button` | 按钮组件 |
45
+ | `h-button-group` | 按钮组 |
46
+ | `h-grid` | 网格布局 |
47
+ | `h-list` | 列表组件 |
48
+ | `h-diy` | 自定义组件 |
49
+
50
+ ## 安装
51
+
52
+ ### NPM
53
+
54
+ ```sh
55
+ npm i hamster-charts
56
+ ```
57
+
58
+ ### PNPM
59
+
60
+ ```sh
61
+ pnpm i hamster-charts
62
+ ```
63
+
64
+ ## 卸载
65
+
66
+ ```sh
67
+ npm uninstall hamster-charts
68
+ ```
69
+
70
+ ## 快速开始
71
+
72
+ ### 全局引用
73
+
74
+ ```js
75
+ import { createApp } from 'vue'
76
+ import './style.css'
77
+ import App from './App.vue'
78
+
79
+ // 手动引用样式
80
+ import HamsterCharts from 'hamster-charts'
81
+ import 'hamster-charts/dist/hamster-charts.css'
82
+
83
+ createApp(App).use(HamsterCharts).mount('#app')
84
+ ```
85
+
86
+ ### 局部引用
87
+
88
+ ```html
89
+ <script setup>
90
+ import bg01 from "./assets/bg.png"
91
+ import header from "./assets/header.png"
92
+ import bg02 from "./assets/bg01.png"
93
+ // 局部引入
94
+ import { hBody, hHeader, hContent } from "hamster-charts"
95
+ </script>
96
+
97
+ <template>
98
+ <h-body :imgUrl="bg01">
99
+ <h-header :imgUrl="header"></h-header>
100
+ <h-content :imgUrl="bg02"></h-content>
101
+ </h-body>
102
+ </template>
103
+ ```
104
+
105
+ ## 项目结构
106
+
107
+ ```
108
+ hamster-charts/
109
+ ├── packages/ # 组件源码
110
+ │ ├── body/ # 主体容器
111
+ │ ├── header/ # 头部组件
112
+ │ ├── content/ # 内容区域
113
+ │ ├── chart/ # 图表组件
114
+ │ ├── counters/ # 数字计数器
115
+ │ ├── dataLabel/ # 数据标签
116
+ │ ├── grid/ # 网格布局
117
+ │ ├── list/ # 列表组件
118
+ │ └── ... # 其他组件
119
+ ├── public/ # 静态资源
120
+ ├── src/ # 示例代码
121
+ └── vite.config.js # Vite 配置
122
+ ```
123
+
124
+ ## 开发指南
125
+
126
+ ```sh
127
+ # 克隆项目
128
+ git clone https://gitee.com/hejiu45/hamster-charts.git
129
+
130
+ # 安装依赖
131
+ npm install
132
+ # 或
133
+ pnpm install
134
+
135
+ # 启动开发服务器
136
+ npm run dev
137
+
138
+ # 构建生产版本
139
+ npm run build
140
+ ```
141
+
142
+ ## 浏览器支持
143
+
144
+ 支持现代浏览器(Chrome、Firefox、Safari、Edge)和 Vue3 支持的浏览器。
145
+
146
+ ## 扩展插件
147
+
148
+ **插件名称**: dgpx-to-viewport
149
+
150
+ **网址**:http://hamster-charts.hejiu45.top
151
+
152
+ **插件介绍**:
153
+
154
+ ## PostCSS dgpx 自适应单位插件详细说明
155
+
156
+ ### 1. 插件功能
157
+
158
+ 将自定义单位 `dgpx` 转换为 `vw`(视口宽度单位)或 `vh`(视口高度单位),实现大屏(如 1920x1080)的响应式布局。
159
+
160
+ ---
161
+
162
+ ### 2. 换算公式
163
+
164
+ #### 2.1 基础公式
165
+
166
+ - **`dgpx` → `px`**
167
+ $$ 1dgpx = \text{dgpxRatio} \times px $$
168
+ - 默认:`dgpxRatio = 2`,即 `1dgpx = 2px`。
169
+ - **`px` → `vw`(宽度相关属性)**
170
+ $$ vw = \left( \frac{\text{pxValue}}{\text{designWidth}} \right) \times 100 $$
171
+ - `designWidth`:设计稿宽度(默认 `1920px`)。
172
+ - **`px` → `vh`(高度相关属性)**
173
+ $$ vh = \left( \frac{\text{pxValue}}{\text{designHeight}} \right) \times 100 $$
174
+ - `designHeight`:设计稿高度(默认 `1080px`)。
175
+
176
+ ---
177
+
178
+ #### 2.2 完整公式
179
+
180
+ - **宽度相关属性(如 `width`、`font-size`)**
181
+ $$ vw = \left( \frac{\text{dgpxValue} \times \text{dgpxRatio}}{\text{designWidth}} \right) \times 100 $$
182
+ - **高度相关属性(如 `height`、`top`)**
183
+ $$ vh = \left( \frac{\text{dgpxValue} \times \text{dgpxRatio}}{\text{designHeight}} \right) \times 100 $$
184
+
185
+ ---
186
+
187
+ #### 2.3 示例计算
188
+
189
+ | dgpx值 | 转换为 px | 转换为 vw (designWidth=1920) | 转换为 vh (designHeight=1080) |
190
+ | ------ | --------- | ---------------------------- | ----------------------------- |
191
+ | 50dgpx | 100px | 100/1920×100=5.2083*v**w* | 100/1080×100=9.2593*v**h* |
192
+ | 16dgpx | 32px | 32/1920×100=1.6667*v**w* | 32/1080×100=2.9630*v**h* |
193
+
194
+ ---
195
+
196
+ ### 3. 插件安装
197
+
198
+ #### 3.1 通过 npm 安装
199
+
200
+ ```sh
201
+ pnpm add vite-plugin-dgpx-viewport
202
+ ```
203
+
204
+ #### 3.2 在 Vite 项目中配置
205
+
206
+ ```js
207
+ // vite.config.js
208
+ import { defineConfig } from 'vite';
209
+ import vue from '@vitejs/plugin-vue';
210
+ import { createDgpxViewportPlugin } from 'vite-plugin-dgpx-viewport';
211
+
212
+ export default defineConfig({
213
+ plugins: [
214
+ vue(),
215
+ createDgpxViewportPlugin({
216
+ designWidth: 1920, // 设计稿宽度
217
+ designHeight: 1080, // 设计稿高度
218
+ dgpxRatio: 2, // 1dgpx = 2px
219
+ unitPrecision: 4, // 保留4位小数
220
+ widthProps: ['font-size', 'width', 'left', 'right'], // 使用 vw 的属性
221
+ heightProps: ['height', 'top', 'bottom'] // 使用 vh 的属性
222
+ })
223
+ ]
224
+ });
225
+ ```
226
+
227
+ ---
228
+
229
+ ### 4. 使用示例
230
+
231
+ #### 4.1 在 Vue 组件中编写 CSS
232
+
233
+ ```html
234
+ <template>
235
+ <div class="container">
236
+ <h1 class="title">大屏标题</h1>
237
+ <div class="content"></div>
238
+ </div>
239
+ </template>
240
+
241
+ <style scoped>
242
+ .title {
243
+ font-size: 16dgpx; /* 转换为 1.6667vw */
244
+ margin: 8dgpx; /* 转换为 0.8333vw */
245
+ }
246
+
247
+ .content {
248
+ width: 960dgpx; /* 转换为 100vw */
249
+ height: 540dgpx; /* 转换为 100vh */
250
+ padding-top: 16dgpx;/* 转换为 1.4815vh */
251
+ }
252
+ </style>
253
+ ```
254
+
255
+ #### 4.2 转换后的 CSS
256
+
257
+ ```css
258
+ .title {
259
+ font-size: 1.6667vw;
260
+ margin: 0.8333vw;
261
+ }
262
+
263
+ .content {
264
+ width: 100vw;
265
+ height: 100vh;
266
+ padding-top: 1.4815vh;
267
+ }
268
+ ```
269
+
270
+ ---
271
+
272
+ ### 5. 配置参数说明
273
+
274
+ | 参数名 | 类型 | 默认值 | 说明 |
275
+ | --------------- | -------- | ------------------------------------------------------------ | ----------------------------------------------------- |
276
+ | `designWidth` | number | 1920 | 设计稿宽度(单位:px),用于 `vw` 转换。 |
277
+ | `designHeight` | number | 1080 | 设计稿高度(单位:px),用于 `vh` 转换。 |
278
+ | `dgpxRatio` | number | 2 | `dgpx` 到 `px` 的转换比例(1dgpx = dgpxRatio * px)。 |
279
+ | `unitPrecision` | number | 4 | 转换后的 `vw`/`vh` 值保留的小数位数。 |
280
+ | `widthProps` | string[] | `['font-size', 'width', 'left', 'right', 'margin', 'padding']` | 使用 `vw` 单位的 CSS 属性列表。 |
281
+ | `heightProps` | string[] | `['height', 'top', 'bottom']` | 使用 `vh` 单位的 CSS 属性列表。 |
282
+
283
+ ---
284
+
285
+ ### 6. 高级用法
286
+
287
+ #### 6.1 动态设计稿尺寸(构建时)
288
+
289
+ 通过环境变量动态设置设计稿尺寸:
290
+
291
+ ```js
292
+ // vite.config.js
293
+ import { loadEnv } from 'vite';
294
+
295
+ export default defineConfig(({ mode }) => {
296
+ const env = loadEnv(mode, process.cwd());
297
+ return {
298
+ plugins: [
299
+ createDgpxViewportPlugin({
300
+ designWidth: parseInt(env.VITE_DESIGN_WIDTH) || 1920,
301
+ designHeight: parseInt(env.VITE_DESIGN_HEIGHT) || 1080,
302
+ })
303
+ ]
304
+ };
305
+ });
306
+ ```
307
+
308
+ #### 6.2 运行时动态调整(结合 VueUse)
309
+
310
+ 在 Vue 组件中实时响应屏幕变化:
311
+
312
+ ```html
313
+ <script setup>
314
+ import { useWindowSize } from '@vueuse/core';
315
+ import { computed } from 'vue';
316
+
317
+ const { width: screenWidth, height: screenHeight } = useWindowSize();
318
+
319
+ // 动态计算 dgpx 转换比例
320
+ const dgpxToVw = (value) => ((value * 2) / screenWidth.value) * 100;
321
+ const dgpxToVh = (value) => ((value * 2) / screenHeight.value) * 100;
322
+
323
+ const elementStyle = computed(() => ({
324
+ width: `${dgpxToVw(960)}vw`, // 960dgpx → 100vw
325
+ height: `${dgpxToVh(540)}vh` // 540dgpx → 100vh
326
+ }));
327
+ </script>
328
+
329
+ <template>
330
+ <div class="dynamic-box" :style="elementStyle"></div>
331
+ </template>
332
+ ```
333
+
334
+ ---
335
+
336
+ ### 7. 注意事项
337
+
338
+ 1. **属性分类**:确保 `widthProps` 和 `heightProps` 包含所有需要转换的属性。
339
+
340
+ 2. **极端屏幕适配**:使用媒体查询为小屏幕设置最小值:
341
+
342
+ ```css
343
+ .title {
344
+ font-size: 16dgpx;
345
+ }
346
+
347
+ @media (max-width: 768px) {
348
+ .title {
349
+ font-size: 24px; /* 小屏幕固定值兜底 */
350
+ }
351
+ }
352
+ ```
353
+
354
+ 3. **单位冲突**:避免与其他 CSS 单位(如 `rem`)混用,可能导致计算混乱。
355
+
356
+ ---
357
+
358
+ ### 8. 插件源码与扩展
359
+
360
+ - **GitHub 仓库**:[vite-plugin-dgpx-viewport](https://github.com/your-repo/vite-plugin-dgpx-viewport)
361
+
362
+ - 扩展功能建议
363
+
364
+
365
+
366
+ - 支持 `dgrpx`(基于高度的自定义单位)。
367
+ - 添加 CSS 变量模式(如 `--dgpx-ratio`)。
368
+
369
+ ---
370
+
371
+ 通过以上配置和公式,你可以轻松实现大屏场景下的自适应布局!
372
+
373
+ ## 贡献指南
374
+
375
+ 欢迎提交 Issue 和 Pull Request!
376
+
377
+ ## 许可证
378
+
379
+ AGPL-3.0 License
380
+
381
+ ## 关于我们
382
+
383
+ ### 鹤酒开源
384
+
385
+ 大家好,我是鹤酒,来自"鹤酒开源"团队。我们是一群热爱技术的极客,专注于探索从前端到后端的各种开发技术和最佳实践。
386
+
387
+ 作为独立开发者,我对技术的痴迷已经达到了废寝忘食的地步。无论是深入研究算法优化,还是探讨最新的 Web 框架,或是解决复杂的系统架构问题,我都乐此不疲。
388
+
389
+ 在"鹤酒开源"这个团队里,我们秉持开放共享的理念,致力于通过开源项目贡献自己的力量,并积极参加各种技术社区活动。
390
+
391
+ ---
392
+
393
+ Made with ❤️ by [鹤酒开源](http://hamster-charts.hejiu45.top/src/team/#鹤酒开源)
@@ -1 +1 @@
1
- .h-body[data-v-831a46fa]{width:100%;height:100%;background-size:100% 100%;background-repeat:no-repeat;position:relative}.h-content[data-v-20ff18fe]{width:100%}.h-header[data-v-eecc2e14],.h-chart[data-v-d9c87d18]{background-size:100% 100%;background-repeat:no-repeat}.h-top[data-v-77b0bb2e],.h-bottom[data-v-041860f7]{width:100%}.h-chart-title[data-v-7b0af14a],.h-item-chart[data-v-fbdfc65a]{background-size:100% 100%;background-repeat:no-repeat}[data-v-c5f6707c]::-webkit-scrollbar{width:0px}[data-v-c5f6707c]::-webkit-scrollbar-track{background:#31313181}[data-v-c5f6707c]::-webkit-scrollbar-thumb{background:#444;border-radius:10px}[data-v-c5f6707c]::-webkit-scrollbar-thumb:hover{background:#555}.h-list[data-v-c5f6707c]{overflow:hidden;position:relative}.h-list .h-list-item[data-v-c5f6707c]{border-bottom:1px solid rgba(108,128,151,.5);display:flex;color:#fff}.h-list .h-list-item .h-list-item-col[data-v-c5f6707c]{flex:1;color:#fff}.h-list-item-header[data-v-c5f6707c]{color:#fff}.h-list-item-header .h-list-item-header-item[data-v-c5f6707c]{flex:1}.scroll-wrapper[data-v-c5f6707c]{position:relative;width:100%}.data-list[data-v-c5f6707c]{width:100%}.data-list-item[data-v-c5f6707c]{display:flex;transition:background-color .3s}.data-item-p[data-v-c5f6707c]{flex:1;display:flex;justify-content:center;align-items:center}.highlight[data-v-c5f6707c]{background:#06f;box-shadow:0 2px 4px #0000001a;transform:scale(1.02);color:#fff}.data-list-header[data-v-c5f6707c]{height:50px;display:flex;background:#fff;position:absolute;top:0;left:0;z-index:2;width:100%}.data-list-header p[data-v-c5f6707c]{flex:1;display:flex;justify-content:center;align-items:center}.h-data-label[data-v-0ed710d6]{background-repeat:no-repeat;background-size:100% 100%}.h-button[data-v-b498a0b7]{outline:none;background-repeat:no-repeat;background-size:100% 100%}.h-grid[data-v-34e7422b]{border:1px solid red}.h-grid .h-grid-item[data-v-34e7422b]{border:1px solid rebeccapurple}.h-counters .h-counters-item[data-v-d7eb7b07]{background-size:100% 100%;background-repeat:no-repeat}
1
+ .h-body[data-v-6cdf2831]{width:100%;height:100%;background-size:100% 100%;background-repeat:no-repeat}.h-content[data-v-cc468725]{width:100%}.h-header[data-v-c7358838],.h-chart[data-v-dd6721bf]{background-size:100% 100%;background-repeat:no-repeat}.h-chart .chart[data-v-dd6721bf]{width:100%}.h-left[data-v-65e91535],.h-right[data-v-e897c957]{height:100%}.h-top[data-v-54014ba4],.h-bottom[data-v-086bec2a]{width:100%}.h-chart-title[data-v-9d08b8ee]{width:100%;background-size:100% 100%;background-repeat:no-repeat}.h-item-chart[data-v-60d70cba]{background-size:100% 100%;background-repeat:no-repeat}[data-v-8e79f3bf]::-webkit-scrollbar{width:0px}[data-v-8e79f3bf]::-webkit-scrollbar-track{background:#31313181}[data-v-8e79f3bf]::-webkit-scrollbar-thumb{background:#444;border-radius:10px}[data-v-8e79f3bf]::-webkit-scrollbar-thumb:hover{background:#555}.h-list[data-v-8e79f3bf]{overflow:hidden;position:relative}.h-list .h-list-item[data-v-8e79f3bf]{border-bottom:1px solid rgba(108,128,151,.5);display:flex;color:#fff}.h-list .h-list-item .h-list-item-col[data-v-8e79f3bf]{flex:1;color:#fff}.h-list-item-header[data-v-8e79f3bf]{color:#fff}.h-list-item-header .h-list-item-header-item[data-v-8e79f3bf]{flex:1}.scroll-wrapper[data-v-8e79f3bf]{position:relative;width:100%}.data-list[data-v-8e79f3bf]{width:100%}.data-list-item[data-v-8e79f3bf]{display:flex;transition:background-color .3s}.data-item-p[data-v-8e79f3bf]{flex:1;display:flex;justify-content:center;align-items:center}.highlight[data-v-8e79f3bf]{background:#06f;box-shadow:0 2px 4px #0000001a;transform:scale(1.02);color:#fff}.data-list-header[data-v-8e79f3bf]{height:50px;display:flex;background:#fff;position:absolute;top:0;left:0;z-index:2;width:100%}.data-list-header p[data-v-8e79f3bf]{flex:1;display:flex;justify-content:center;align-items:center}.h-data-label[data-v-0ed710d6]{background-repeat:no-repeat;background-size:100% 100%}.h-button[data-v-43a919b8]{outline:none;background-repeat:no-repeat;background-size:100% 100%;border-radius:2px;border:none}.h-grid[data-v-34e7422b]{border:1px solid red}.h-grid .h-grid-item[data-v-34e7422b]{border:1px solid rebeccapurple}.h-counters .h-counters-item[data-v-d7eb7b07]{background-size:100% 100%;background-repeat:no-repeat}.h-time-picker[data-v-7d99771d]{position:relative;border-radius:3px;padding:0 20px;height:30px;max-width:300px}input[type=text][data-v-7d99771d]{outline:none;background-image:url(data:image/png;base64,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);background-position:95% 50%;background-size:20px 20px;background-repeat:no-repeat}.h-time-picker-input[data-v-7d99771d]{width:100%;padding:10px 15px;border:1px solid #d9d9d9;border-radius:6px;font-size:1rem;transition:all .3s;height:40px;position:relative}.h-time-picker-input[data-v-7d99771d]:focus{border-color:#40a9ff;outline:none;box-shadow:0 0 0 2px #1890ff33}.h-time-picker-input[data-v-7d99771d]:hover{border-color:#40a9ff}.h-picker-container[data-v-7d99771d]{position:absolute;left:0}.date-time-picker[data-v-7d99771d]{background:#fff;border-radius:8px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;width:320px;z-index:1050;position:absolute;top:100%;left:0;margin-top:5px;overflow:hidden}.picker-header[data-v-7d99771d]{display:flex;justify-content:space-between;align-items:center;padding:15px 20px;border-bottom:1px solid #f0f0f0}.picker-header button[data-v-7d99771d]{background:none;border:none;width:28px;height:28px;border-radius:4px;cursor:pointer;font-size:16px;color:#00000073;display:flex;align-items:center;justify-content:center}.picker-header button[data-v-7d99771d]:hover{background:#f5f5f5;color:#1890ff}.current-month[data-v-7d99771d]{font-weight:500;color:#262626;font-size:1.1rem}.weekdays[data-v-7d99771d]{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;padding:10px 15px 5px;font-size:.9rem;color:#595959;border-bottom:1px solid #f0f0f0}.days-grid[data-v-7d99771d]{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;padding:10px 15px}.day-cell[data-v-7d99771d]{height:36px;display:flex;align-items:center;justify-content:center;border-radius:4px;cursor:pointer;font-size:.95rem;transition:all .2s;position:relative}.day-cell[data-v-7d99771d]:hover{background:#e6f7ff;color:#1890ff}.day-cell.today[data-v-7d99771d]{font-weight:700;color:#1890ff}.day-cell.today[data-v-7d99771d]:before{content:"";position:absolute;top:0;right:0;width:0;height:0;border-top:10px solid #1890ff;border-left:10px solid transparent}.day-cell.selected[data-v-7d99771d]{background:#1890ff;color:#fff}.day-cell.other-month[data-v-7d99771d]{color:#bfbfbf}.day-cell.in-range[data-v-7d99771d]{background:#e6f7ff}.day-cell.range-start[data-v-7d99771d],.day-cell.range-end[data-v-7d99771d]{background:#1890ff;color:#fff}.day-cell.disabled[data-v-7d99771d]{color:#bfbfbf;cursor:not-allowed;background:#f5f5f5}.day-cell.disabled[data-v-7d99771d]:hover{background:#f5f5f5;color:#bfbfbf}.time-panel[data-v-7d99771d]{border-top:1px solid #f0f0f0;padding:15px;display:flex;justify-content:center;gap:10px}.time-selector[data-v-7d99771d]{display:flex;flex-direction:column;align-items:center}.time-label[data-v-7d99771d]{font-size:.85rem;color:#8c8c8c;margin-bottom:5px}.time-input[data-v-7d99771d]{width:60px;padding:5px 10px;border:1px solid #d9d9d9;border-radius:4px;text-align:center;font-size:1rem}.time-input[data-v-7d99771d]:focus{outline:none;border-color:#40a9ff}.footer[data-v-7d99771d]{padding:15px;border-top:1px solid #f0f0f0;display:flex;justify-content:space-between;align-items:center}.today-btn[data-v-7d99771d]{background:none;border:none;color:#1890ff;cursor:pointer;font-weight:500;padding:5px 10px;border-radius:4px;font-size:.95rem}.today-btn[data-v-7d99771d]:hover{background:#e6f7ff}.confirm-btn[data-v-7d99771d]{background:#1890ff;color:#fff;border:none;padding:6px 16px;border-radius:4px;cursor:pointer;font-weight:500;transition:all .3s}.confirm-btn[data-v-7d99771d]:hover{background:#40a9ff}[data-v-7d99771d]::-webkit-calendar-picker-indicator{background-image:url(data:image/png;base64,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)}