djm-ui 0.72.0 → 0.73.1

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/dist/djm-ui.css CHANGED
@@ -1,4 +1,8 @@
1
- /*! DJM UI v0.72.0 · MIT · 2026-10-26 */
1
+ /*!
2
+ * DJM UI v0.73.1 · 企业级中后台 Vue 3 组件库
3
+ * Copyright (c) 2026 上海多聚米科技有限公司. All rights reserved.
4
+ * MIT License · https://ui.duojumi.com · Build 2026-10-26
5
+ */
2
6
 
3
7
  /* ---- tokens.css ---- */
4
8
 
@@ -43,6 +47,19 @@
43
47
  --djm-hover: #eef3f9;
44
48
  --djm-brand-soft: #eaf3fd;
45
49
  --djm-glass: rgba(248, 250, 253, 0.96);
50
+ /* 毛玻璃:默认关闭,data-djm-glass="on" 或 .djm-glass 时生效 */
51
+ --djm-glass-bg: rgba(255, 255, 255, 0.72);
52
+ /* 弹窗、抽屉这类大面积阅读面用更实的底色,表单不发灰 */
53
+ --djm-glass-bg-strong: rgba(255, 255, 255, 0.8);
54
+ --djm-glass-border: rgba(255, 255, 255, 0.72);
55
+ --djm-glass-highlight: rgba(255, 255, 255, 0.92);
56
+ --djm-glass-divider: rgba(16, 40, 70, 0.08);
57
+ /* 开了毛玻璃后遮罩压淡,页面颜色才透得出来 */
58
+ --djm-glass-mask: rgba(18, 34, 54, 0.22);
59
+ --djm-glass-blur: 16px;
60
+ /* 弹窗、抽屉用更大的模糊半径,背后的表格不会糊成条纹 */
61
+ --djm-glass-blur-strong: 24px;
62
+ --djm-glass-shadow: 0 10px 30px -12px rgba(16, 40, 70, 0.28);
46
63
  --djm-loading-mask: rgba(255, 255, 255, 0.74);
47
64
  --djm-border: #dde6f0;
48
65
  --djm-border-strong: #cbd7e5;
@@ -154,6 +171,13 @@
154
171
  --djm-hover: #262e38;
155
172
  --djm-brand-soft: #1a3049;
156
173
  --djm-glass: rgba(20, 25, 31, 0.94);
174
+ --djm-glass-bg: rgba(25, 31, 38, 0.72);
175
+ --djm-glass-bg-strong: rgba(30, 37, 46, 0.86);
176
+ --djm-glass-border: rgba(255, 255, 255, 0.14);
177
+ --djm-glass-highlight: rgba(255, 255, 255, 0.08);
178
+ --djm-glass-divider: rgba(255, 255, 255, 0.1);
179
+ --djm-glass-mask: rgba(0, 0, 0, 0.5);
180
+ --djm-glass-shadow: 0 12px 30px -10px rgba(0, 0, 0, 0.6);
157
181
  --djm-loading-mask: rgba(25, 31, 38, 0.78);
158
182
  --djm-border: #2b333d;
159
183
  --djm-border-strong: #3c4652;
@@ -3252,12 +3276,19 @@ button.djm-breadcrumb-text {
3252
3276
 
3253
3277
  /* DJM UI · 加载中 */
3254
3278
 
3279
+ .djm-spin {
3280
+ display: inline-flex;
3281
+ align-items: center;
3282
+ color: var(--djm-brand-600);
3283
+ }
3284
+
3285
+ /* 包裹模式:内容上方盖一层遮罩 */
3255
3286
  .djm-spin-wrap {
3256
3287
  position: relative;
3288
+ display: block;
3257
3289
  min-height: 60px;
3258
3290
  }
3259
3291
 
3260
- /* 遮罩铺满被包裹内容,圆角跟随容器 */
3261
3292
  .djm-spin-mask {
3262
3293
  position: absolute;
3263
3294
  inset: 0;
@@ -3269,13 +3300,35 @@ button.djm-breadcrumb-text {
3269
3300
  gap: 8px;
3270
3301
  border-radius: inherit;
3271
3302
  background: var(--djm-loading-mask);
3272
- backdrop-filter: blur(1px);
3303
+ -webkit-backdrop-filter: blur(2px);
3304
+ backdrop-filter: blur(2px);
3305
+ }
3306
+
3307
+ /* 内联模式:指示器与文字并排,不铺底 */
3308
+ .djm-spin-inline .djm-spin-mask {
3309
+ position: static;
3310
+ flex-direction: row;
3311
+ gap: 8px;
3312
+ border-radius: 0;
3313
+ background: none;
3314
+ -webkit-backdrop-filter: none;
3315
+ backdrop-filter: none;
3316
+ }
3317
+
3318
+ /* 全屏模式:遮罩铺满视口 */
3319
+ .djm-spin-fullscreen {
3320
+ position: fixed;
3321
+ inset: 0;
3322
+ z-index: var(--djm-z-toast);
3323
+ display: flex;
3273
3324
  }
3274
3325
 
3275
- .djm-spin-inline {
3326
+ .djm-spin-indicator {
3276
3327
  display: inline-flex;
3277
3328
  align-items: center;
3278
- gap: 8px;
3329
+ justify-content: center;
3330
+ gap: 4px;
3331
+ color: inherit;
3279
3332
  }
3280
3333
 
3281
3334
  .djm-spin-tip {
@@ -3283,6 +3336,8 @@ button.djm-breadcrumb-text {
3283
3336
  color: var(--djm-text-2);
3284
3337
  }
3285
3338
 
3339
+ /* ---------------- 尺寸 ---------------- */
3340
+
3286
3341
  .djm-spin-sm .djm-spinner {
3287
3342
  width: 11px;
3288
3343
  height: 11px;
@@ -3295,6 +3350,127 @@ button.djm-breadcrumb-text {
3295
3350
  border-width: 2.5px;
3296
3351
  }
3297
3352
 
3353
+ /* ---------------- 形态 ---------------- */
3354
+
3355
+ /* 环形:颜色跟随 color 属性 */
3356
+ .djm-spin-ring .djm-spinner {
3357
+ border-top-color: currentColor;
3358
+ }
3359
+
3360
+ /* 点状:三点依次弹起 */
3361
+ .djm-spin-dots i {
3362
+ width: 6px;
3363
+ height: 6px;
3364
+ border-radius: 50%;
3365
+ background: currentColor;
3366
+ animation: djm-spin-dot 1s ease-in-out infinite;
3367
+ }
3368
+
3369
+ .djm-spin-dots i:nth-child(2) {
3370
+ animation-delay: 0.15s;
3371
+ }
3372
+
3373
+ .djm-spin-dots i:nth-child(3) {
3374
+ animation-delay: 0.3s;
3375
+ }
3376
+
3377
+ .djm-spin-sm .djm-spin-dots i {
3378
+ width: 4px;
3379
+ height: 4px;
3380
+ }
3381
+
3382
+ .djm-spin-lg .djm-spin-dots i {
3383
+ width: 8px;
3384
+ height: 8px;
3385
+ }
3386
+
3387
+ @keyframes djm-spin-dot {
3388
+ 0%,
3389
+ 80%,
3390
+ 100% {
3391
+ transform: scale(0.55);
3392
+ opacity: 0.45;
3393
+ }
3394
+ 40% {
3395
+ transform: scale(1);
3396
+ opacity: 1;
3397
+ }
3398
+ }
3399
+
3400
+ /* 柱状:四根竖条错峰伸缩 */
3401
+ .djm-spin-bars i {
3402
+ width: 3px;
3403
+ height: 14px;
3404
+ border-radius: 2px;
3405
+ background: currentColor;
3406
+ animation: djm-spin-bar 1s ease-in-out infinite;
3407
+ }
3408
+
3409
+ .djm-spin-bars i:nth-child(2) {
3410
+ animation-delay: 0.12s;
3411
+ }
3412
+
3413
+ .djm-spin-bars i:nth-child(3) {
3414
+ animation-delay: 0.24s;
3415
+ }
3416
+
3417
+ .djm-spin-bars i:nth-child(4) {
3418
+ animation-delay: 0.36s;
3419
+ }
3420
+
3421
+ .djm-spin-sm .djm-spin-bars i {
3422
+ width: 2.5px;
3423
+ height: 10px;
3424
+ }
3425
+
3426
+ .djm-spin-lg .djm-spin-bars i {
3427
+ width: 4px;
3428
+ height: 18px;
3429
+ }
3430
+
3431
+ @keyframes djm-spin-bar {
3432
+ 0%,
3433
+ 100% {
3434
+ transform: scaleY(0.45);
3435
+ opacity: 0.5;
3436
+ }
3437
+ 50% {
3438
+ transform: scaleY(1);
3439
+ opacity: 1;
3440
+ }
3441
+ }
3442
+
3443
+ /* 脉冲:实心圆呼吸 */
3444
+ .djm-spin-pulse .djm-spin-core {
3445
+ width: 16px;
3446
+ height: 16px;
3447
+ border-radius: 50%;
3448
+ background: currentColor;
3449
+ animation: djm-spin-pulse 1.2s ease-in-out infinite;
3450
+ }
3451
+
3452
+ .djm-spin-sm .djm-spin-pulse .djm-spin-core {
3453
+ width: 12px;
3454
+ height: 12px;
3455
+ }
3456
+
3457
+ .djm-spin-lg .djm-spin-pulse .djm-spin-core {
3458
+ width: 22px;
3459
+ height: 22px;
3460
+ }
3461
+
3462
+ @keyframes djm-spin-pulse {
3463
+ 0%,
3464
+ 100% {
3465
+ transform: scale(0.65);
3466
+ opacity: 0.45;
3467
+ }
3468
+ 50% {
3469
+ transform: scale(1);
3470
+ opacity: 1;
3471
+ }
3472
+ }
3473
+
3298
3474
  /* ---- components/popconfirm.css ---- */
3299
3475
 
3300
3476
  /* DJM UI · 气泡确认 */
@@ -5971,6 +6147,52 @@ input[type="date"] {
5971
6147
  background: var(--djm-amber);
5972
6148
  }
5973
6149
 
6150
+ /* 环形进度:SVG 逆时针起点在顶部,进度用 dashoffset 控制 */
6151
+ .djm-progress-circle {
6152
+ position: relative;
6153
+ display: inline-flex;
6154
+ align-items: center;
6155
+ justify-content: center;
6156
+ }
6157
+
6158
+ .djm-progress-circle svg {
6159
+ width: 100%;
6160
+ height: 100%;
6161
+ transform: rotate(-90deg);
6162
+ }
6163
+
6164
+ .djm-progress-circle-track {
6165
+ stroke: var(--djm-border);
6166
+ }
6167
+
6168
+ .djm-progress-circle-bar {
6169
+ stroke: var(--djm-brand-600);
6170
+ transition: stroke-dashoffset 0.3s;
6171
+ }
6172
+
6173
+ .djm-progress-circle.djm-is-success .djm-progress-circle-bar {
6174
+ stroke: var(--djm-green-strong);
6175
+ }
6176
+
6177
+ .djm-progress-circle.djm-is-error .djm-progress-circle-bar {
6178
+ stroke: var(--djm-red-strong);
6179
+ }
6180
+
6181
+ .djm-progress-circle.djm-is-warning .djm-progress-circle-bar {
6182
+ stroke: var(--djm-amber);
6183
+ }
6184
+
6185
+ .djm-progress-circle-label {
6186
+ position: absolute;
6187
+ inset: 0;
6188
+ display: flex;
6189
+ align-items: center;
6190
+ justify-content: center;
6191
+ color: var(--djm-text);
6192
+ font-weight: 600;
6193
+ font-variant-numeric: tabular-nums;
6194
+ }
6195
+
5974
6196
  /* 骨架屏组件:头像 + 正文的行结构 */
5975
6197
  .djm-skeleton-block {
5976
6198
  display: flex;
@@ -12550,3 +12772,96 @@ input[type="date"] {
12550
12772
  color: var(--djm-green);
12551
12773
  font-size: 10px;
12552
12774
  }
12775
+
12776
+ /* ---- components/glass.css ---- */
12777
+
12778
+ /* DJM UI · 毛玻璃 */
12779
+
12780
+ /* 工具类:直接加在任意容器上 */
12781
+ .djm-glass {
12782
+ background: var(--djm-glass-bg);
12783
+ border: 1px solid var(--djm-glass-border);
12784
+ box-shadow: var(--djm-glass-shadow);
12785
+ -webkit-backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12786
+ backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12787
+ }
12788
+
12789
+ /* 模糊半径两档 */
12790
+ .djm-glass-strong {
12791
+ --djm-glass-blur: 26px;
12792
+ }
12793
+
12794
+ .djm-glass-soft {
12795
+ --djm-glass-blur: 8px;
12796
+ }
12797
+
12798
+ /* 弹窗 / 抽屉:面积大、要读表单,底色更实,并加一道顶边高光 */
12799
+ .djm-modal.djm-is-glass,
12800
+ .djm-drawer.djm-is-glass,
12801
+ :root[data-djm-glass='on'] .djm-modal,
12802
+ :root[data-djm-glass='on'] .djm-drawer {
12803
+ background: var(--djm-glass-bg-strong);
12804
+ border: 1px solid var(--djm-glass-border);
12805
+ box-shadow: var(--djm-glass-shadow), inset 0 1px 0 var(--djm-glass-highlight);
12806
+ -webkit-backdrop-filter: blur(var(--djm-glass-blur-strong)) saturate(1.4);
12807
+ backdrop-filter: blur(var(--djm-glass-blur-strong)) saturate(1.4);
12808
+ }
12809
+
12810
+ /* 浮层与面板:面积小,透一点更好看 */
12811
+ :root[data-djm-glass='on'] .djm-popover-panel,
12812
+ :root[data-djm-glass='on'] .djm-dropdown-menu,
12813
+ :root[data-djm-glass='on'] .djm-panel,
12814
+ :root[data-djm-glass='on'] .djm-card {
12815
+ background: var(--djm-glass-bg);
12816
+ border-color: var(--djm-glass-border);
12817
+ box-shadow: var(--djm-glass-shadow), inset 0 1px 0 var(--djm-glass-highlight);
12818
+ -webkit-backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12819
+ backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12820
+ }
12821
+
12822
+ /* 玻璃容器里的头尾不再另起底色,和主体连成一片 */
12823
+ .djm-modal.djm-is-glass .djm-modal-head,
12824
+ :root[data-djm-glass='on'] .djm-modal .djm-modal-head,
12825
+ .djm-drawer.djm-is-glass .djm-drawer-head,
12826
+ :root[data-djm-glass='on'] .djm-drawer .djm-drawer-head {
12827
+ border-bottom-color: var(--djm-glass-divider);
12828
+ }
12829
+
12830
+ .djm-modal.djm-is-glass .djm-modal-foot,
12831
+ :root[data-djm-glass='on'] .djm-modal .djm-modal-foot,
12832
+ .djm-drawer.djm-is-glass .djm-drawer-foot,
12833
+ :root[data-djm-glass='on'] .djm-drawer .djm-drawer-foot {
12834
+ background: transparent;
12835
+ border-top-color: var(--djm-glass-divider);
12836
+ }
12837
+
12838
+ /* 遮罩压淡,页面颜色透上来,玻璃才像玻璃而不是灰板 */
12839
+ :root[data-djm-glass='on'] .djm-modal-mask,
12840
+ :root[data-djm-glass='on'] .djm-drawer-mask {
12841
+ background: var(--djm-glass-mask);
12842
+ }
12843
+
12844
+ /* 浏览器不支持 backdrop-filter 时退回实心底,保证内容可读 */
12845
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
12846
+ .djm-glass,
12847
+ .djm-modal.djm-is-glass,
12848
+ .djm-drawer.djm-is-glass,
12849
+ :root[data-djm-glass='on'] .djm-modal,
12850
+ :root[data-djm-glass='on'] .djm-drawer,
12851
+ :root[data-djm-glass='on'] .djm-popover-panel,
12852
+ :root[data-djm-glass='on'] .djm-dropdown-menu,
12853
+ :root[data-djm-glass='on'] .djm-panel,
12854
+ :root[data-djm-glass='on'] .djm-card {
12855
+ background: var(--djm-surface);
12856
+ }
12857
+
12858
+ :root[data-djm-glass='on'] .djm-modal-mask,
12859
+ :root[data-djm-glass='on'] .djm-drawer-mask {
12860
+ background: var(--djm-mask);
12861
+ }
12862
+
12863
+ :root[data-djm-glass='on'] .djm-modal .djm-modal-foot,
12864
+ .djm-modal.djm-is-glass .djm-modal-foot {
12865
+ background: var(--djm-surface-2);
12866
+ }
12867
+ }