djm-ui 0.72.0 → 0.73.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/dist/djm-ui.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! DJM UI v0.72.0 · MIT · 2026-10-26 */
1
+ /*! DJM UI v0.73.0 · MIT · 2026-10-26 */
2
2
 
3
3
  /* ---- tokens.css ---- */
4
4
 
@@ -43,6 +43,11 @@
43
43
  --djm-hover: #eef3f9;
44
44
  --djm-brand-soft: #eaf3fd;
45
45
  --djm-glass: rgba(248, 250, 253, 0.96);
46
+ /* 毛玻璃:默认关闭,data-djm-glass="on" 或 .djm-glass 时生效 */
47
+ --djm-glass-bg: rgba(255, 255, 255, 0.72);
48
+ --djm-glass-border: rgba(255, 255, 255, 0.6);
49
+ --djm-glass-blur: 16px;
50
+ --djm-glass-shadow: 0 10px 30px -12px rgba(16, 40, 70, 0.28);
46
51
  --djm-loading-mask: rgba(255, 255, 255, 0.74);
47
52
  --djm-border: #dde6f0;
48
53
  --djm-border-strong: #cbd7e5;
@@ -154,6 +159,9 @@
154
159
  --djm-hover: #262e38;
155
160
  --djm-brand-soft: #1a3049;
156
161
  --djm-glass: rgba(20, 25, 31, 0.94);
162
+ --djm-glass-bg: rgba(25, 31, 38, 0.72);
163
+ --djm-glass-border: rgba(255, 255, 255, 0.12);
164
+ --djm-glass-shadow: 0 12px 30px -10px rgba(0, 0, 0, 0.6);
157
165
  --djm-loading-mask: rgba(25, 31, 38, 0.78);
158
166
  --djm-border: #2b333d;
159
167
  --djm-border-strong: #3c4652;
@@ -3252,12 +3260,19 @@ button.djm-breadcrumb-text {
3252
3260
 
3253
3261
  /* DJM UI · 加载中 */
3254
3262
 
3263
+ .djm-spin {
3264
+ display: inline-flex;
3265
+ align-items: center;
3266
+ color: var(--djm-brand-600);
3267
+ }
3268
+
3269
+ /* 包裹模式:内容上方盖一层遮罩 */
3255
3270
  .djm-spin-wrap {
3256
3271
  position: relative;
3272
+ display: block;
3257
3273
  min-height: 60px;
3258
3274
  }
3259
3275
 
3260
- /* 遮罩铺满被包裹内容,圆角跟随容器 */
3261
3276
  .djm-spin-mask {
3262
3277
  position: absolute;
3263
3278
  inset: 0;
@@ -3269,13 +3284,35 @@ button.djm-breadcrumb-text {
3269
3284
  gap: 8px;
3270
3285
  border-radius: inherit;
3271
3286
  background: var(--djm-loading-mask);
3272
- backdrop-filter: blur(1px);
3287
+ -webkit-backdrop-filter: blur(2px);
3288
+ backdrop-filter: blur(2px);
3289
+ }
3290
+
3291
+ /* 内联模式:指示器与文字并排,不铺底 */
3292
+ .djm-spin-inline .djm-spin-mask {
3293
+ position: static;
3294
+ flex-direction: row;
3295
+ gap: 8px;
3296
+ border-radius: 0;
3297
+ background: none;
3298
+ -webkit-backdrop-filter: none;
3299
+ backdrop-filter: none;
3300
+ }
3301
+
3302
+ /* 全屏模式:遮罩铺满视口 */
3303
+ .djm-spin-fullscreen {
3304
+ position: fixed;
3305
+ inset: 0;
3306
+ z-index: var(--djm-z-toast);
3307
+ display: flex;
3273
3308
  }
3274
3309
 
3275
- .djm-spin-inline {
3310
+ .djm-spin-indicator {
3276
3311
  display: inline-flex;
3277
3312
  align-items: center;
3278
- gap: 8px;
3313
+ justify-content: center;
3314
+ gap: 4px;
3315
+ color: inherit;
3279
3316
  }
3280
3317
 
3281
3318
  .djm-spin-tip {
@@ -3283,6 +3320,8 @@ button.djm-breadcrumb-text {
3283
3320
  color: var(--djm-text-2);
3284
3321
  }
3285
3322
 
3323
+ /* ---------------- 尺寸 ---------------- */
3324
+
3286
3325
  .djm-spin-sm .djm-spinner {
3287
3326
  width: 11px;
3288
3327
  height: 11px;
@@ -3295,6 +3334,127 @@ button.djm-breadcrumb-text {
3295
3334
  border-width: 2.5px;
3296
3335
  }
3297
3336
 
3337
+ /* ---------------- 形态 ---------------- */
3338
+
3339
+ /* 环形:颜色跟随 color 属性 */
3340
+ .djm-spin-ring .djm-spinner {
3341
+ border-top-color: currentColor;
3342
+ }
3343
+
3344
+ /* 点状:三点依次弹起 */
3345
+ .djm-spin-dots i {
3346
+ width: 6px;
3347
+ height: 6px;
3348
+ border-radius: 50%;
3349
+ background: currentColor;
3350
+ animation: djm-spin-dot 1s ease-in-out infinite;
3351
+ }
3352
+
3353
+ .djm-spin-dots i:nth-child(2) {
3354
+ animation-delay: 0.15s;
3355
+ }
3356
+
3357
+ .djm-spin-dots i:nth-child(3) {
3358
+ animation-delay: 0.3s;
3359
+ }
3360
+
3361
+ .djm-spin-sm .djm-spin-dots i {
3362
+ width: 4px;
3363
+ height: 4px;
3364
+ }
3365
+
3366
+ .djm-spin-lg .djm-spin-dots i {
3367
+ width: 8px;
3368
+ height: 8px;
3369
+ }
3370
+
3371
+ @keyframes djm-spin-dot {
3372
+ 0%,
3373
+ 80%,
3374
+ 100% {
3375
+ transform: scale(0.55);
3376
+ opacity: 0.45;
3377
+ }
3378
+ 40% {
3379
+ transform: scale(1);
3380
+ opacity: 1;
3381
+ }
3382
+ }
3383
+
3384
+ /* 柱状:四根竖条错峰伸缩 */
3385
+ .djm-spin-bars i {
3386
+ width: 3px;
3387
+ height: 14px;
3388
+ border-radius: 2px;
3389
+ background: currentColor;
3390
+ animation: djm-spin-bar 1s ease-in-out infinite;
3391
+ }
3392
+
3393
+ .djm-spin-bars i:nth-child(2) {
3394
+ animation-delay: 0.12s;
3395
+ }
3396
+
3397
+ .djm-spin-bars i:nth-child(3) {
3398
+ animation-delay: 0.24s;
3399
+ }
3400
+
3401
+ .djm-spin-bars i:nth-child(4) {
3402
+ animation-delay: 0.36s;
3403
+ }
3404
+
3405
+ .djm-spin-sm .djm-spin-bars i {
3406
+ width: 2.5px;
3407
+ height: 10px;
3408
+ }
3409
+
3410
+ .djm-spin-lg .djm-spin-bars i {
3411
+ width: 4px;
3412
+ height: 18px;
3413
+ }
3414
+
3415
+ @keyframes djm-spin-bar {
3416
+ 0%,
3417
+ 100% {
3418
+ transform: scaleY(0.45);
3419
+ opacity: 0.5;
3420
+ }
3421
+ 50% {
3422
+ transform: scaleY(1);
3423
+ opacity: 1;
3424
+ }
3425
+ }
3426
+
3427
+ /* 脉冲:实心圆呼吸 */
3428
+ .djm-spin-pulse .djm-spin-core {
3429
+ width: 16px;
3430
+ height: 16px;
3431
+ border-radius: 50%;
3432
+ background: currentColor;
3433
+ animation: djm-spin-pulse 1.2s ease-in-out infinite;
3434
+ }
3435
+
3436
+ .djm-spin-sm .djm-spin-pulse .djm-spin-core {
3437
+ width: 12px;
3438
+ height: 12px;
3439
+ }
3440
+
3441
+ .djm-spin-lg .djm-spin-pulse .djm-spin-core {
3442
+ width: 22px;
3443
+ height: 22px;
3444
+ }
3445
+
3446
+ @keyframes djm-spin-pulse {
3447
+ 0%,
3448
+ 100% {
3449
+ transform: scale(0.65);
3450
+ opacity: 0.45;
3451
+ }
3452
+ 50% {
3453
+ transform: scale(1);
3454
+ opacity: 1;
3455
+ }
3456
+ }
3457
+
3298
3458
  /* ---- components/popconfirm.css ---- */
3299
3459
 
3300
3460
  /* DJM UI · 气泡确认 */
@@ -5971,6 +6131,52 @@ input[type="date"] {
5971
6131
  background: var(--djm-amber);
5972
6132
  }
5973
6133
 
6134
+ /* 环形进度:SVG 逆时针起点在顶部,进度用 dashoffset 控制 */
6135
+ .djm-progress-circle {
6136
+ position: relative;
6137
+ display: inline-flex;
6138
+ align-items: center;
6139
+ justify-content: center;
6140
+ }
6141
+
6142
+ .djm-progress-circle svg {
6143
+ width: 100%;
6144
+ height: 100%;
6145
+ transform: rotate(-90deg);
6146
+ }
6147
+
6148
+ .djm-progress-circle-track {
6149
+ stroke: var(--djm-border);
6150
+ }
6151
+
6152
+ .djm-progress-circle-bar {
6153
+ stroke: var(--djm-brand-600);
6154
+ transition: stroke-dashoffset 0.3s;
6155
+ }
6156
+
6157
+ .djm-progress-circle.djm-is-success .djm-progress-circle-bar {
6158
+ stroke: var(--djm-green-strong);
6159
+ }
6160
+
6161
+ .djm-progress-circle.djm-is-error .djm-progress-circle-bar {
6162
+ stroke: var(--djm-red-strong);
6163
+ }
6164
+
6165
+ .djm-progress-circle.djm-is-warning .djm-progress-circle-bar {
6166
+ stroke: var(--djm-amber);
6167
+ }
6168
+
6169
+ .djm-progress-circle-label {
6170
+ position: absolute;
6171
+ inset: 0;
6172
+ display: flex;
6173
+ align-items: center;
6174
+ justify-content: center;
6175
+ color: var(--djm-text);
6176
+ font-weight: 600;
6177
+ font-variant-numeric: tabular-nums;
6178
+ }
6179
+
5974
6180
  /* 骨架屏组件:头像 + 正文的行结构 */
5975
6181
  .djm-skeleton-block {
5976
6182
  display: flex;
@@ -12550,3 +12756,64 @@ input[type="date"] {
12550
12756
  color: var(--djm-green);
12551
12757
  font-size: 10px;
12552
12758
  }
12759
+
12760
+ /* ---- components/glass.css ---- */
12761
+
12762
+ /* DJM UI · 毛玻璃 */
12763
+
12764
+ /* 工具类:直接加在任意容器上 */
12765
+ .djm-glass {
12766
+ background: var(--djm-glass-bg);
12767
+ border: 1px solid var(--djm-glass-border);
12768
+ box-shadow: var(--djm-glass-shadow);
12769
+ -webkit-backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12770
+ backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12771
+ }
12772
+
12773
+ /* 模糊半径两档 */
12774
+ .djm-glass-strong {
12775
+ --djm-glass-blur: 26px;
12776
+ }
12777
+
12778
+ .djm-glass-soft {
12779
+ --djm-glass-blur: 8px;
12780
+ }
12781
+
12782
+ /* 组件级开关:Modal / Drawer 的 glass 属性 */
12783
+ .djm-modal.djm-is-glass,
12784
+ .djm-drawer.djm-is-glass {
12785
+ background: var(--djm-glass-bg);
12786
+ border: 1px solid var(--djm-glass-border);
12787
+ box-shadow: var(--djm-glass-shadow);
12788
+ -webkit-backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12789
+ backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12790
+ }
12791
+
12792
+ /* 全局开关:弹窗、抽屉、浮层、面板与卡片 */
12793
+ :root[data-djm-glass='on'] .djm-modal,
12794
+ :root[data-djm-glass='on'] .djm-drawer,
12795
+ :root[data-djm-glass='on'] .djm-popover-panel,
12796
+ :root[data-djm-glass='on'] .djm-dropdown-menu,
12797
+ :root[data-djm-glass='on'] .djm-panel,
12798
+ :root[data-djm-glass='on'] .djm-card {
12799
+ background: var(--djm-glass-bg);
12800
+ border-color: var(--djm-glass-border);
12801
+ box-shadow: var(--djm-glass-shadow);
12802
+ -webkit-backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12803
+ backdrop-filter: blur(var(--djm-glass-blur)) saturate(1.4);
12804
+ }
12805
+
12806
+ /* 浏览器不支持 backdrop-filter 时退回实心底,保证内容可读 */
12807
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
12808
+ .djm-glass,
12809
+ .djm-modal.djm-is-glass,
12810
+ .djm-drawer.djm-is-glass,
12811
+ :root[data-djm-glass='on'] .djm-modal,
12812
+ :root[data-djm-glass='on'] .djm-drawer,
12813
+ :root[data-djm-glass='on'] .djm-popover-panel,
12814
+ :root[data-djm-glass='on'] .djm-dropdown-menu,
12815
+ :root[data-djm-glass='on'] .djm-panel,
12816
+ :root[data-djm-glass='on'] .djm-card {
12817
+ background: var(--djm-surface);
12818
+ }
12819
+ }