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.
@@ -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
  "use strict";
3
3
  var DjmUI = (() => {
4
4
  var __defProp = Object.defineProperty;
@@ -1040,6 +1040,7 @@ Minimum version required to store current data is: ` + i + `.
1040
1040
  djmMessage: () => djmMessage,
1041
1041
  djmMessages: () => djmMessages,
1042
1042
  getLocale: () => getLocale,
1043
+ glass: () => glass,
1043
1044
  hasPermission: () => hasPermission,
1044
1045
  initTheme: () => initTheme,
1045
1046
  install: () => install,
@@ -1049,6 +1050,7 @@ Minimum version required to store current data is: ` + i + `.
1049
1050
  primaryColor: () => primaryColor,
1050
1051
  resetPrimaryColor: () => resetPrimaryColor,
1051
1052
  sanitizeHtml: () => sanitizeHtml,
1053
+ setGlass: () => setGlass,
1052
1054
  setLocale: () => setLocale,
1053
1055
  setPermissions: () => setPermissions,
1054
1056
  setPrimaryColor: () => setPrimaryColor,
@@ -4253,12 +4255,18 @@ Minimum version required to store current data is: ` + i + `.
4253
4255
  name: "DjmProgress",
4254
4256
  props: {
4255
4257
  percent: { type: Number, default: 0 },
4258
+ // line 横向 / circle 环形
4259
+ type: { type: String, default: "line" },
4256
4260
  // '' / success / error / warning
4257
4261
  status: { type: String, default: "" },
4258
4262
  showText: { type: Boolean, default: true },
4259
4263
  strokeWidth: { type: Number, default: 6 },
4260
4264
  // 自定义进度色,不传由状态决定
4261
- color: { type: String, default: "" }
4265
+ color: { type: String, default: "" },
4266
+ // 环形直径(px)
4267
+ size: { type: Number, default: 96 },
4268
+ // 无障碍名称,默认「进度」
4269
+ label: { type: String, default: "" }
4262
4270
  },
4263
4271
  computed: {
4264
4272
  safePercent() {
@@ -4271,10 +4279,72 @@ Minimum version required to store current data is: ` + i + `.
4271
4279
  },
4272
4280
  trackStyle() {
4273
4281
  return { height: this.strokeWidth + "px" };
4282
+ },
4283
+ circleSize() {
4284
+ return Math.max(48, Number(this.size) || 96);
4285
+ },
4286
+ circleRadius() {
4287
+ return (this.circleSize - this.strokeWidth) / 2;
4288
+ },
4289
+ circleLength() {
4290
+ return 2 * Math.PI * this.circleRadius;
4291
+ },
4292
+ circleOffset() {
4293
+ return this.circleLength * (1 - this.safePercent / 100);
4294
+ },
4295
+ circleStyle() {
4296
+ return { width: this.circleSize + "px", height: this.circleSize + "px" };
4297
+ },
4298
+ circleLabelStyle() {
4299
+ return { fontSize: Math.max(12, Math.round(this.circleSize / 5)) + "px" };
4274
4300
  }
4275
4301
  },
4276
4302
  template: `
4277
- <div class="djm-progress-line" :class="status ? 'djm-is-' + status : ''">
4303
+ <div
4304
+ v-if="type === 'circle'"
4305
+ class="djm-progress-circle"
4306
+ :class="status ? 'djm-is-' + status : ''"
4307
+ :style="circleStyle"
4308
+ role="progressbar"
4309
+ :aria-label="label || '\u8FDB\u5EA6'"
4310
+ :aria-valuenow="safePercent"
4311
+ aria-valuemin="0"
4312
+ aria-valuemax="100"
4313
+ >
4314
+ <svg :viewBox="'0 0 ' + circleSize + ' ' + circleSize" aria-hidden="true">
4315
+ <circle
4316
+ class="djm-progress-circle-track"
4317
+ :cx="circleSize / 2"
4318
+ :cy="circleSize / 2"
4319
+ :r="circleRadius"
4320
+ :stroke-width="strokeWidth"
4321
+ fill="none"
4322
+ />
4323
+ <circle
4324
+ class="djm-progress-circle-bar"
4325
+ :cx="circleSize / 2"
4326
+ :cy="circleSize / 2"
4327
+ :r="circleRadius"
4328
+ :stroke-width="strokeWidth"
4329
+ fill="none"
4330
+ stroke-linecap="round"
4331
+ :stroke-dasharray="circleLength"
4332
+ :stroke-dashoffset="circleOffset"
4333
+ :style="color ? { stroke: color } : null"
4334
+ />
4335
+ </svg>
4336
+ <span v-if="showText" class="djm-progress-circle-label" :style="circleLabelStyle">{{ safePercent }}%</span>
4337
+ </div>
4338
+ <div
4339
+ v-else
4340
+ class="djm-progress-line"
4341
+ :class="status ? 'djm-is-' + status : ''"
4342
+ role="progressbar"
4343
+ :aria-label="label || '\u8FDB\u5EA6'"
4344
+ :aria-valuenow="safePercent"
4345
+ aria-valuemin="0"
4346
+ aria-valuemax="100"
4347
+ >
4278
4348
  <div class="djm-progress" :style="trackStyle">
4279
4349
  <div class="djm-progress-bar" :style="barStyle"></div>
4280
4350
  </div>
@@ -5480,39 +5550,81 @@ Minimum version required to store current data is: ` + i + `.
5480
5550
  name: "DjmSpin",
5481
5551
  props: {
5482
5552
  spinning: { type: Boolean, default: true },
5483
- size: { type: String, default: "md" },
5484
5553
  // sm | md | lg
5485
- tip: { type: String, default: "" }
5554
+ size: { type: String, default: "md" },
5555
+ // ring 环形 / dots 点状 / bars 柱状 / pulse 脉冲
5556
+ type: { type: String, default: "ring" },
5557
+ tip: { type: String, default: "" },
5558
+ // 延迟多少毫秒后显示,0 表示立即
5559
+ delay: { type: Number, default: 0 },
5560
+ // 全屏加载:遮罩铺满视口
5561
+ fullscreen: { type: Boolean, default: false },
5562
+ // 自定义指示器颜色,默认跟随品牌色
5563
+ color: { type: String, default: "" }
5564
+ },
5565
+ setup(props) {
5566
+ const visible = ref(false);
5567
+ let timer = null;
5568
+ function sync() {
5569
+ window.clearTimeout(timer);
5570
+ timer = null;
5571
+ if (!props.spinning) {
5572
+ visible.value = false;
5573
+ return;
5574
+ }
5575
+ if (props.delay > 0) {
5576
+ timer = window.setTimeout(() => {
5577
+ visible.value = true;
5578
+ }, props.delay);
5579
+ } else {
5580
+ visible.value = true;
5581
+ }
5582
+ }
5583
+ watch(() => [props.spinning, props.delay], sync, { immediate: true });
5584
+ onBeforeUnmount(() => window.clearTimeout(timer));
5585
+ return { visible };
5486
5586
  },
5487
5587
  computed: {
5488
- // 有默认插槽即为包裹模式
5489
5588
  wrapped() {
5490
5589
  return !!this.$slots.default;
5590
+ },
5591
+ rootClass() {
5592
+ return [
5593
+ "djm-spin",
5594
+ "djm-spin-" + this.size,
5595
+ {
5596
+ "djm-spin-wrap": this.wrapped && !this.fullscreen,
5597
+ "djm-spin-inline": !this.wrapped && !this.fullscreen,
5598
+ "djm-spin-fullscreen": this.fullscreen
5599
+ }
5600
+ ];
5491
5601
  }
5492
5602
  },
5493
5603
  template: `
5494
5604
  <div
5495
- v-if="wrapped"
5496
- class="djm-spin-wrap"
5497
- :class="'djm-spin-' + size"
5498
- :aria-busy="String(spinning)"
5605
+ v-if="fullscreen || wrapped || visible"
5606
+ :class="rootClass"
5607
+ :aria-busy="String(visible)"
5608
+ :role="visible ? 'status' : undefined"
5609
+ :aria-label="!wrapped && !fullscreen && !tip && visible ? '\u52A0\u8F7D\u4E2D' : undefined"
5499
5610
  >
5500
- <slot />
5501
- <div v-if="spinning" class="djm-spin-mask" role="status">
5502
- <span class="djm-spinner"></span>
5611
+ <slot v-if="wrapped && !fullscreen" />
5612
+ <div v-if="visible" class="djm-spin-mask">
5613
+ <span class="djm-spin-indicator" :class="'djm-spin-' + type" :style="color ? { color } : null">
5614
+ <slot name="indicator">
5615
+ <i v-if="type === 'ring'" class="djm-spinner"></i>
5616
+ <template v-else-if="type === 'dots'">
5617
+ <i></i><i></i><i></i>
5618
+ </template>
5619
+ <template v-else-if="type === 'bars'">
5620
+ <i></i><i></i><i></i><i></i>
5621
+ </template>
5622
+ <i v-else class="djm-spin-core"></i>
5623
+ </slot>
5624
+ </span>
5503
5625
  <span v-if="tip" class="djm-spin-tip">{{ tip }}</span>
5504
5626
  </div>
5505
5627
  </div>
5506
- <span
5507
- v-else
5508
- class="djm-spin-inline"
5509
- :class="'djm-spin-' + size"
5510
- role="status"
5511
- :aria-label="tip ? undefined : '\u52A0\u8F7D\u4E2D'"
5512
- >
5513
- <span class="djm-spinner"></span>
5514
- <span v-if="tip" class="djm-spin-tip">{{ tip }}</span>
5515
- </span>
5516
5628
  `
5517
5629
  };
5518
5630
 
@@ -6118,7 +6230,9 @@ Minimum version required to store current data is: ` + i + `.
6118
6230
  // src/theme/index.js
6119
6231
  var KEY = "djm-theme";
6120
6232
  var COLOR_KEY = "djm-primary";
6233
+ var GLASS_KEY = "djm-glass";
6121
6234
  var theme = ref("light");
6235
+ var glass = ref(false);
6122
6236
  var PRESET_COLORS = [
6123
6237
  { name: "\u9ED8\u8BA4\u84DD", value: "#1a6fc4" },
6124
6238
  { name: "\u79D1\u6280\u84DD", value: "#2563eb" },
@@ -6251,6 +6365,15 @@ Minimum version required to store current data is: ` + i + `.
6251
6365
  function toggleTheme() {
6252
6366
  setTheme(theme.value === "dark" ? "light" : "dark");
6253
6367
  }
6368
+ function setGlass(enabled) {
6369
+ glass.value = !!enabled;
6370
+ document.documentElement.dataset.djmGlass = glass.value ? "on" : "";
6371
+ try {
6372
+ if (glass.value) localStorage.setItem(GLASS_KEY, "1");
6373
+ else localStorage.removeItem(GLASS_KEY);
6374
+ } catch (error) {
6375
+ }
6376
+ }
6254
6377
  function initTheme() {
6255
6378
  let saved = "";
6256
6379
  try {
@@ -6270,9 +6393,16 @@ Minimum version required to store current data is: ` + i + `.
6270
6393
  } catch (error) {
6271
6394
  color = "";
6272
6395
  }
6396
+ let glassSaved = false;
6397
+ try {
6398
+ glassSaved = localStorage.getItem(GLASS_KEY) === "1";
6399
+ } catch (error) {
6400
+ glassSaved = false;
6401
+ }
6273
6402
  if (color) primaryColor.value = color;
6274
6403
  const next = param === "dark" || param === "light" ? param : saved || "light";
6275
6404
  setTheme(next);
6405
+ setGlass(glassSaved);
6276
6406
  }
6277
6407
 
6278
6408
  // src/components/watermark/index.js
@@ -8167,7 +8297,9 @@ Minimum version required to store current data is: ` + i + `.
8167
8297
  // 点击遮罩关闭
8168
8298
  maskClosable: { type: Boolean, default: true },
8169
8299
  showClose: { type: Boolean, default: true },
8170
- closeOnEsc: { type: Boolean, default: true }
8300
+ closeOnEsc: { type: Boolean, default: true },
8301
+ // 毛玻璃底
8302
+ glass: { type: Boolean, default: false }
8171
8303
  },
8172
8304
  emits: ["update:modelValue", "open", "close"],
8173
8305
  setup(props, { emit }) {
@@ -8230,7 +8362,7 @@ Minimum version required to store current data is: ` + i + `.
8230
8362
  <aside
8231
8363
  ref="panelRef"
8232
8364
  class="djm-drawer"
8233
- :class="'djm-drawer-' + placement"
8365
+ :class="['djm-drawer-' + placement, { 'djm-is-glass': glass }]"
8234
8366
  :style="panelStyle"
8235
8367
  role="dialog"
8236
8368
  aria-modal="true"
@@ -8279,7 +8411,9 @@ Minimum version required to store current data is: ` + i + `.
8279
8411
  // 是否允许 Esc 关闭
8280
8412
  closeOnEsc: { type: Boolean, default: true },
8281
8413
  // 全屏铺满,适合配置类大表单
8282
- fullscreen: { type: Boolean, default: false }
8414
+ fullscreen: { type: Boolean, default: false },
8415
+ // 毛玻璃底:需要显示背后页面时使用
8416
+ glass: { type: Boolean, default: false }
8283
8417
  },
8284
8418
  emits: ["update:modelValue", "open", "close"],
8285
8419
  setup(props, { emit }) {
@@ -8345,7 +8479,7 @@ Minimum version required to store current data is: ` + i + `.
8345
8479
  <div
8346
8480
  ref="dialogRef"
8347
8481
  class="djm-modal"
8348
- :class="{ 'djm-is-fullscreen': fullscreen }"
8482
+ :class="{ 'djm-is-fullscreen': fullscreen, 'djm-is-glass': glass }"
8349
8483
  :style="dialogStyle"
8350
8484
  role="dialog"
8351
8485
  aria-modal="true"
@@ -16031,7 +16165,7 @@ Minimum version required to store current data is: ` + i + `.
16031
16165
  org_chart_default,
16032
16166
  page_tabs_default
16033
16167
  ];
16034
- var version = "0.72.0";
16168
+ var version = "0.73.0";
16035
16169
  function install(app, options = {}) {
16036
16170
  if (options.locale) setLocale(options.locale);
16037
16171
  components.forEach((component) => app.component(component.name, component));