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.cjs 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
  "use strict";
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1039,6 +1039,7 @@ __export(index_exports, {
1039
1039
  djmMessage: () => djmMessage,
1040
1040
  djmMessages: () => djmMessages,
1041
1041
  getLocale: () => getLocale,
1042
+ glass: () => glass,
1042
1043
  hasPermission: () => hasPermission,
1043
1044
  initTheme: () => initTheme,
1044
1045
  install: () => install,
@@ -1048,6 +1049,7 @@ __export(index_exports, {
1048
1049
  primaryColor: () => primaryColor,
1049
1050
  resetPrimaryColor: () => resetPrimaryColor,
1050
1051
  sanitizeHtml: () => sanitizeHtml,
1052
+ setGlass: () => setGlass,
1051
1053
  setLocale: () => setLocale,
1052
1054
  setPermissions: () => setPermissions,
1053
1055
  setPrimaryColor: () => setPrimaryColor,
@@ -1872,7 +1874,7 @@ function t(key, params) {
1872
1874
  // src/utils/panel.js
1873
1875
  var PANEL_HIDDEN_STYLE = { position: "fixed", left: "0px", top: "0px", visibility: "hidden" };
1874
1876
  function bindPanelListeners({ root, panel, onClose, onReposition, esc = true }) {
1875
- const el = (ref50) => typeof ref50 === "function" ? ref50() : ref50;
1877
+ const el = (ref51) => typeof ref51 === "function" ? ref51() : ref51;
1876
1878
  function onDocumentMousedown(event) {
1877
1879
  const rootEl = el(root);
1878
1880
  const panelEl = el(panel);
@@ -4245,12 +4247,18 @@ var progress_default = {
4245
4247
  name: "DjmProgress",
4246
4248
  props: {
4247
4249
  percent: { type: Number, default: 0 },
4250
+ // line 横向 / circle 环形
4251
+ type: { type: String, default: "line" },
4248
4252
  // '' / success / error / warning
4249
4253
  status: { type: String, default: "" },
4250
4254
  showText: { type: Boolean, default: true },
4251
4255
  strokeWidth: { type: Number, default: 6 },
4252
4256
  // 自定义进度色,不传由状态决定
4253
- color: { type: String, default: "" }
4257
+ color: { type: String, default: "" },
4258
+ // 环形直径(px)
4259
+ size: { type: Number, default: 96 },
4260
+ // 无障碍名称,默认「进度」
4261
+ label: { type: String, default: "" }
4254
4262
  },
4255
4263
  computed: {
4256
4264
  safePercent() {
@@ -4263,10 +4271,72 @@ var progress_default = {
4263
4271
  },
4264
4272
  trackStyle() {
4265
4273
  return { height: this.strokeWidth + "px" };
4274
+ },
4275
+ circleSize() {
4276
+ return Math.max(48, Number(this.size) || 96);
4277
+ },
4278
+ circleRadius() {
4279
+ return (this.circleSize - this.strokeWidth) / 2;
4280
+ },
4281
+ circleLength() {
4282
+ return 2 * Math.PI * this.circleRadius;
4283
+ },
4284
+ circleOffset() {
4285
+ return this.circleLength * (1 - this.safePercent / 100);
4286
+ },
4287
+ circleStyle() {
4288
+ return { width: this.circleSize + "px", height: this.circleSize + "px" };
4289
+ },
4290
+ circleLabelStyle() {
4291
+ return { fontSize: Math.max(12, Math.round(this.circleSize / 5)) + "px" };
4266
4292
  }
4267
4293
  },
4268
4294
  template: `
4269
- <div class="djm-progress-line" :class="status ? 'djm-is-' + status : ''">
4295
+ <div
4296
+ v-if="type === 'circle'"
4297
+ class="djm-progress-circle"
4298
+ :class="status ? 'djm-is-' + status : ''"
4299
+ :style="circleStyle"
4300
+ role="progressbar"
4301
+ :aria-label="label || '\u8FDB\u5EA6'"
4302
+ :aria-valuenow="safePercent"
4303
+ aria-valuemin="0"
4304
+ aria-valuemax="100"
4305
+ >
4306
+ <svg :viewBox="'0 0 ' + circleSize + ' ' + circleSize" aria-hidden="true">
4307
+ <circle
4308
+ class="djm-progress-circle-track"
4309
+ :cx="circleSize / 2"
4310
+ :cy="circleSize / 2"
4311
+ :r="circleRadius"
4312
+ :stroke-width="strokeWidth"
4313
+ fill="none"
4314
+ />
4315
+ <circle
4316
+ class="djm-progress-circle-bar"
4317
+ :cx="circleSize / 2"
4318
+ :cy="circleSize / 2"
4319
+ :r="circleRadius"
4320
+ :stroke-width="strokeWidth"
4321
+ fill="none"
4322
+ stroke-linecap="round"
4323
+ :stroke-dasharray="circleLength"
4324
+ :stroke-dashoffset="circleOffset"
4325
+ :style="color ? { stroke: color } : null"
4326
+ />
4327
+ </svg>
4328
+ <span v-if="showText" class="djm-progress-circle-label" :style="circleLabelStyle">{{ safePercent }}%</span>
4329
+ </div>
4330
+ <div
4331
+ v-else
4332
+ class="djm-progress-line"
4333
+ :class="status ? 'djm-is-' + status : ''"
4334
+ role="progressbar"
4335
+ :aria-label="label || '\u8FDB\u5EA6'"
4336
+ :aria-valuenow="safePercent"
4337
+ aria-valuemin="0"
4338
+ aria-valuemax="100"
4339
+ >
4270
4340
  <div class="djm-progress" :style="trackStyle">
4271
4341
  <div class="djm-progress-bar" :style="barStyle"></div>
4272
4342
  </div>
@@ -5468,48 +5538,91 @@ var alert_default = {
5468
5538
  };
5469
5539
 
5470
5540
  // src/components/spin/index.js
5541
+ var import_vue7 = require("vue");
5471
5542
  var spin_default = {
5472
5543
  name: "DjmSpin",
5473
5544
  props: {
5474
5545
  spinning: { type: Boolean, default: true },
5475
- size: { type: String, default: "md" },
5476
5546
  // sm | md | lg
5477
- tip: { type: String, default: "" }
5547
+ size: { type: String, default: "md" },
5548
+ // ring 环形 / dots 点状 / bars 柱状 / pulse 脉冲
5549
+ type: { type: String, default: "ring" },
5550
+ tip: { type: String, default: "" },
5551
+ // 延迟多少毫秒后显示,0 表示立即
5552
+ delay: { type: Number, default: 0 },
5553
+ // 全屏加载:遮罩铺满视口
5554
+ fullscreen: { type: Boolean, default: false },
5555
+ // 自定义指示器颜色,默认跟随品牌色
5556
+ color: { type: String, default: "" }
5557
+ },
5558
+ setup(props) {
5559
+ const visible = (0, import_vue7.ref)(false);
5560
+ let timer = null;
5561
+ function sync() {
5562
+ window.clearTimeout(timer);
5563
+ timer = null;
5564
+ if (!props.spinning) {
5565
+ visible.value = false;
5566
+ return;
5567
+ }
5568
+ if (props.delay > 0) {
5569
+ timer = window.setTimeout(() => {
5570
+ visible.value = true;
5571
+ }, props.delay);
5572
+ } else {
5573
+ visible.value = true;
5574
+ }
5575
+ }
5576
+ (0, import_vue7.watch)(() => [props.spinning, props.delay], sync, { immediate: true });
5577
+ (0, import_vue7.onBeforeUnmount)(() => window.clearTimeout(timer));
5578
+ return { visible };
5478
5579
  },
5479
5580
  computed: {
5480
- // 有默认插槽即为包裹模式
5481
5581
  wrapped() {
5482
5582
  return !!this.$slots.default;
5583
+ },
5584
+ rootClass() {
5585
+ return [
5586
+ "djm-spin",
5587
+ "djm-spin-" + this.size,
5588
+ {
5589
+ "djm-spin-wrap": this.wrapped && !this.fullscreen,
5590
+ "djm-spin-inline": !this.wrapped && !this.fullscreen,
5591
+ "djm-spin-fullscreen": this.fullscreen
5592
+ }
5593
+ ];
5483
5594
  }
5484
5595
  },
5485
5596
  template: `
5486
5597
  <div
5487
- v-if="wrapped"
5488
- class="djm-spin-wrap"
5489
- :class="'djm-spin-' + size"
5490
- :aria-busy="String(spinning)"
5598
+ v-if="fullscreen || wrapped || visible"
5599
+ :class="rootClass"
5600
+ :aria-busy="String(visible)"
5601
+ :role="visible ? 'status' : undefined"
5602
+ :aria-label="!wrapped && !fullscreen && !tip && visible ? '\u52A0\u8F7D\u4E2D' : undefined"
5491
5603
  >
5492
- <slot />
5493
- <div v-if="spinning" class="djm-spin-mask" role="status">
5494
- <span class="djm-spinner"></span>
5604
+ <slot v-if="wrapped && !fullscreen" />
5605
+ <div v-if="visible" class="djm-spin-mask">
5606
+ <span class="djm-spin-indicator" :class="'djm-spin-' + type" :style="color ? { color } : null">
5607
+ <slot name="indicator">
5608
+ <i v-if="type === 'ring'" class="djm-spinner"></i>
5609
+ <template v-else-if="type === 'dots'">
5610
+ <i></i><i></i><i></i>
5611
+ </template>
5612
+ <template v-else-if="type === 'bars'">
5613
+ <i></i><i></i><i></i><i></i>
5614
+ </template>
5615
+ <i v-else class="djm-spin-core"></i>
5616
+ </slot>
5617
+ </span>
5495
5618
  <span v-if="tip" class="djm-spin-tip">{{ tip }}</span>
5496
5619
  </div>
5497
5620
  </div>
5498
- <span
5499
- v-else
5500
- class="djm-spin-inline"
5501
- :class="'djm-spin-' + size"
5502
- role="status"
5503
- :aria-label="tip ? undefined : '\u52A0\u8F7D\u4E2D'"
5504
- >
5505
- <span class="djm-spinner"></span>
5506
- <span v-if="tip" class="djm-spin-tip">{{ tip }}</span>
5507
- </span>
5508
5621
  `
5509
5622
  };
5510
5623
 
5511
5624
  // src/components/popconfirm/index.js
5512
- var import_vue7 = require("vue");
5625
+ var import_vue8 = require("vue");
5513
5626
  var popconfirm_default = {
5514
5627
  name: "DjmPopconfirm",
5515
5628
  components: { DjmIcon: icon_default },
@@ -5525,10 +5638,10 @@ var popconfirm_default = {
5525
5638
  },
5526
5639
  emits: ["confirm", "cancel", "visible-change"],
5527
5640
  setup(props, { emit }) {
5528
- const open = (0, import_vue7.ref)(false);
5529
- const root = (0, import_vue7.ref)(null);
5530
- const panelEl = (0, import_vue7.ref)(null);
5531
- const panelStyle = (0, import_vue7.ref)({});
5641
+ const open = (0, import_vue8.ref)(false);
5642
+ const root = (0, import_vue8.ref)(null);
5643
+ const panelEl = (0, import_vue8.ref)(null);
5644
+ const panelStyle = (0, import_vue8.ref)({});
5532
5645
  const PANEL_WIDTH = 244;
5533
5646
  let detachPanel = null;
5534
5647
  function syncTriggerA11y() {
@@ -5543,8 +5656,8 @@ var popconfirm_default = {
5543
5656
  target.setAttribute("aria-haspopup", "dialog");
5544
5657
  target.setAttribute("aria-expanded", String(open.value));
5545
5658
  }
5546
- (0, import_vue7.onMounted)(() => (0, import_vue7.nextTick)(syncTriggerA11y));
5547
- (0, import_vue7.watch)(open, () => (0, import_vue7.nextTick)(syncTriggerA11y));
5659
+ (0, import_vue8.onMounted)(() => (0, import_vue8.nextTick)(syncTriggerA11y));
5660
+ (0, import_vue8.watch)(open, () => (0, import_vue8.nextTick)(syncTriggerA11y));
5548
5661
  function updatePosition() {
5549
5662
  if (!open.value || !root.value) return;
5550
5663
  const rect = root.value.getBoundingClientRect();
@@ -5567,7 +5680,7 @@ var popconfirm_default = {
5567
5680
  onReposition: updatePosition
5568
5681
  });
5569
5682
  requestAnimationFrame(updatePosition);
5570
- (0, import_vue7.nextTick)(() => {
5683
+ (0, import_vue8.nextTick)(() => {
5571
5684
  const first = panelEl.value && panelEl.value.querySelector("button");
5572
5685
  if (first) first.focus();
5573
5686
  });
@@ -5583,7 +5696,7 @@ var popconfirm_default = {
5583
5696
  detachPanel = null;
5584
5697
  }
5585
5698
  if (hadFocus) {
5586
- (0, import_vue7.nextTick)(() => {
5699
+ (0, import_vue8.nextTick)(() => {
5587
5700
  const wrapper = root.value && root.value.querySelector(".djm-popconfirm-trigger");
5588
5701
  const target = wrapper && (wrapper.querySelector('button, a[href], [role="button"]') || wrapper);
5589
5702
  if (target) target.focus();
@@ -5603,7 +5716,7 @@ var popconfirm_default = {
5603
5716
  emit("cancel");
5604
5717
  close2();
5605
5718
  }
5606
- (0, import_vue7.onBeforeUnmount)(close2);
5719
+ (0, import_vue8.onBeforeUnmount)(close2);
5607
5720
  return { open, root, panelEl, panelStyle, toggle, close: close2, confirm, cancel };
5608
5721
  },
5609
5722
  template: `
@@ -5647,7 +5760,7 @@ var popconfirm_default = {
5647
5760
  };
5648
5761
 
5649
5762
  // src/components/anchor/index.js
5650
- var import_vue8 = require("vue");
5763
+ var import_vue9 = require("vue");
5651
5764
  var anchor_default = {
5652
5765
  name: "DjmAnchor",
5653
5766
  props: {
@@ -5660,8 +5773,8 @@ var anchor_default = {
5660
5773
  },
5661
5774
  emits: ["change"],
5662
5775
  setup(props, { emit }) {
5663
- const root = (0, import_vue8.ref)(null);
5664
- const activeKey = (0, import_vue8.ref)("");
5776
+ const root = (0, import_vue9.ref)(null);
5777
+ const activeKey = (0, import_vue9.ref)("");
5665
5778
  let scrollEl = null;
5666
5779
  let target = null;
5667
5780
  function resolveContainer() {
@@ -5715,9 +5828,9 @@ var anchor_default = {
5715
5828
  activeKey.value = item.href;
5716
5829
  emit("change", item.href);
5717
5830
  }
5718
- (0, import_vue8.onMounted)(bind);
5719
- (0, import_vue8.watch)(() => props.container, bind);
5720
- (0, import_vue8.onBeforeUnmount)(unbind);
5831
+ (0, import_vue9.onMounted)(bind);
5832
+ (0, import_vue9.watch)(() => props.container, bind);
5833
+ (0, import_vue9.onBeforeUnmount)(unbind);
5721
5834
  return { root, activeKey, go };
5722
5835
  },
5723
5836
  template: `
@@ -5739,7 +5852,7 @@ var anchor_default = {
5739
5852
  };
5740
5853
 
5741
5854
  // src/components/backtop/index.js
5742
- var import_vue9 = require("vue");
5855
+ var import_vue10 = require("vue");
5743
5856
  var backtop_default = {
5744
5857
  name: "DjmBacktop",
5745
5858
  components: { DjmIcon: icon_default },
@@ -5752,8 +5865,8 @@ var backtop_default = {
5752
5865
  },
5753
5866
  emits: ["click"],
5754
5867
  setup(props, { emit }) {
5755
- const visible = (0, import_vue9.ref)(false);
5756
- const root = (0, import_vue9.ref)(null);
5868
+ const visible = (0, import_vue10.ref)(false);
5869
+ const root = (0, import_vue10.ref)(null);
5757
5870
  let target = null;
5758
5871
  let scrollEl = null;
5759
5872
  function resolveContainer() {
@@ -5786,8 +5899,8 @@ var backtop_default = {
5786
5899
  else target.scrollTo({ top: 0, behavior });
5787
5900
  emit("click");
5788
5901
  }
5789
- (0, import_vue9.onMounted)(bind);
5790
- (0, import_vue9.onBeforeUnmount)(unbind);
5902
+ (0, import_vue10.onMounted)(bind);
5903
+ (0, import_vue10.onBeforeUnmount)(unbind);
5791
5904
  return { visible, root, toTop };
5792
5905
  },
5793
5906
  template: `
@@ -5864,7 +5977,7 @@ var space_default = {
5864
5977
  };
5865
5978
 
5866
5979
  // src/components/affix/index.js
5867
- var import_vue10 = require("vue");
5980
+ var import_vue11 = require("vue");
5868
5981
  var affix_default = {
5869
5982
  name: "DjmAffix",
5870
5983
  props: {
@@ -5875,10 +5988,10 @@ var affix_default = {
5875
5988
  zIndex: { type: Number, default: 900 }
5876
5989
  },
5877
5990
  setup(props) {
5878
- const root = (0, import_vue10.ref)(null);
5879
- const fixed = (0, import_vue10.ref)(false);
5880
- const affixStyle = (0, import_vue10.ref)({});
5881
- const holderStyle = (0, import_vue10.ref)({});
5991
+ const root = (0, import_vue11.ref)(null);
5992
+ const fixed = (0, import_vue11.ref)(false);
5993
+ const affixStyle = (0, import_vue11.ref)({});
5994
+ const holderStyle = (0, import_vue11.ref)({});
5882
5995
  let target = null;
5883
5996
  let scrollEl = null;
5884
5997
  function resolveContainer() {
@@ -5933,8 +6046,8 @@ var affix_default = {
5933
6046
  scrollEl = null;
5934
6047
  target = null;
5935
6048
  }
5936
- (0, import_vue10.onMounted)(bind);
5937
- (0, import_vue10.onBeforeUnmount)(unbind);
6049
+ (0, import_vue11.onMounted)(bind);
6050
+ (0, import_vue11.onBeforeUnmount)(unbind);
5938
6051
  return { root, fixed, affixStyle, holderStyle };
5939
6052
  },
5940
6053
  template: `
@@ -5985,7 +6098,7 @@ var segmented_default = {
5985
6098
  };
5986
6099
 
5987
6100
  // src/components/image/index.js
5988
- var import_vue11 = require("vue");
6101
+ var import_vue12 = require("vue");
5989
6102
 
5990
6103
  // src/utils/scroll-lock.js
5991
6104
  var count = 0;
@@ -6032,11 +6145,11 @@ var image_default = {
6032
6145
  preview: { type: Boolean, default: true }
6033
6146
  },
6034
6147
  setup(props) {
6035
- const failed = (0, import_vue11.ref)(false);
6036
- const open = (0, import_vue11.ref)(false);
6037
- const zoomRef = (0, import_vue11.ref)(null);
6038
- const closeRef = (0, import_vue11.ref)(null);
6039
- (0, import_vue11.watch)(() => props.src, () => {
6148
+ const failed = (0, import_vue12.ref)(false);
6149
+ const open = (0, import_vue12.ref)(false);
6150
+ const zoomRef = (0, import_vue12.ref)(null);
6151
+ const closeRef = (0, import_vue12.ref)(null);
6152
+ (0, import_vue12.watch)(() => props.src, () => {
6040
6153
  failed.value = false;
6041
6154
  });
6042
6155
  function toSize(value) {
@@ -6050,7 +6163,7 @@ var image_default = {
6050
6163
  open.value = true;
6051
6164
  lockScroll();
6052
6165
  document.addEventListener("keydown", onKeydown);
6053
- await (0, import_vue11.nextTick)();
6166
+ await (0, import_vue12.nextTick)();
6054
6167
  if (closeRef.value) closeRef.value.focus();
6055
6168
  }
6056
6169
  function closePreview() {
@@ -6060,7 +6173,7 @@ var image_default = {
6060
6173
  document.removeEventListener("keydown", onKeydown);
6061
6174
  if (zoomRef.value) zoomRef.value.focus();
6062
6175
  }
6063
- (0, import_vue11.onBeforeUnmount)(closePreview);
6176
+ (0, import_vue12.onBeforeUnmount)(closePreview);
6064
6177
  return { failed, open, zoomRef, closeRef, toSize, openPreview, closePreview, t };
6065
6178
  },
6066
6179
  template: `
@@ -6115,13 +6228,15 @@ var image_default = {
6115
6228
  };
6116
6229
 
6117
6230
  // src/components/watermark/index.js
6118
- var import_vue13 = require("vue");
6231
+ var import_vue14 = require("vue");
6119
6232
 
6120
6233
  // src/theme/index.js
6121
- var import_vue12 = require("vue");
6234
+ var import_vue13 = require("vue");
6122
6235
  var KEY = "djm-theme";
6123
6236
  var COLOR_KEY = "djm-primary";
6124
- var theme = (0, import_vue12.ref)("light");
6237
+ var GLASS_KEY = "djm-glass";
6238
+ var theme = (0, import_vue13.ref)("light");
6239
+ var glass = (0, import_vue13.ref)(false);
6125
6240
  var PRESET_COLORS = [
6126
6241
  { name: "\u9ED8\u8BA4\u84DD", value: "#1a6fc4" },
6127
6242
  { name: "\u79D1\u6280\u84DD", value: "#2563eb" },
@@ -6132,7 +6247,7 @@ var PRESET_COLORS = [
6132
6247
  { name: "\u6731\u7802\u7EA2", value: "#c0392b" },
6133
6248
  { name: "\u77F3\u58A8\u7070", value: "#4b5b6b" }
6134
6249
  ];
6135
- var primaryColor = (0, import_vue12.ref)("");
6250
+ var primaryColor = (0, import_vue13.ref)("");
6136
6251
  var BRAND_VARS = [
6137
6252
  "--djm-brand-50",
6138
6253
  "--djm-brand-100",
@@ -6254,6 +6369,15 @@ function setTheme(name) {
6254
6369
  function toggleTheme() {
6255
6370
  setTheme(theme.value === "dark" ? "light" : "dark");
6256
6371
  }
6372
+ function setGlass(enabled) {
6373
+ glass.value = !!enabled;
6374
+ document.documentElement.dataset.djmGlass = glass.value ? "on" : "";
6375
+ try {
6376
+ if (glass.value) localStorage.setItem(GLASS_KEY, "1");
6377
+ else localStorage.removeItem(GLASS_KEY);
6378
+ } catch (error) {
6379
+ }
6380
+ }
6257
6381
  function initTheme() {
6258
6382
  let saved = "";
6259
6383
  try {
@@ -6273,9 +6397,16 @@ function initTheme() {
6273
6397
  } catch (error) {
6274
6398
  color = "";
6275
6399
  }
6400
+ let glassSaved = false;
6401
+ try {
6402
+ glassSaved = localStorage.getItem(GLASS_KEY) === "1";
6403
+ } catch (error) {
6404
+ glassSaved = false;
6405
+ }
6276
6406
  if (color) primaryColor.value = color;
6277
6407
  const next = param === "dark" || param === "light" ? param : saved || "light";
6278
6408
  setTheme(next);
6409
+ setGlass(glassSaved);
6279
6410
  }
6280
6411
 
6281
6412
  // src/components/watermark/index.js
@@ -6291,7 +6422,7 @@ var watermark_default = {
6291
6422
  zIndex: { type: Number, default: 10 }
6292
6423
  },
6293
6424
  setup(props) {
6294
- const dataUrl = (0, import_vue13.ref)("");
6425
+ const dataUrl = (0, import_vue14.ref)("");
6295
6426
  let canvasEl = null;
6296
6427
  function build() {
6297
6428
  const lines = (Array.isArray(props.content) ? props.content : [props.content]).filter(Boolean);
@@ -6328,13 +6459,13 @@ var watermark_default = {
6328
6459
  });
6329
6460
  dataUrl.value = canvasEl.toDataURL("image/png");
6330
6461
  }
6331
- const layerStyle = (0, import_vue13.computed)(() => ({
6462
+ const layerStyle = (0, import_vue14.computed)(() => ({
6332
6463
  backgroundImage: dataUrl.value ? "url(" + dataUrl.value + ")" : "none",
6333
6464
  zIndex: props.zIndex
6334
6465
  }));
6335
- (0, import_vue13.onMounted)(build);
6336
- (0, import_vue13.watch)(() => [props.content, props.gap, props.fontSize, props.color, props.rotate, theme.value], build, { deep: true });
6337
- (0, import_vue13.onBeforeUnmount)(() => {
6466
+ (0, import_vue14.onMounted)(build);
6467
+ (0, import_vue14.watch)(() => [props.content, props.gap, props.fontSize, props.color, props.rotate, theme.value], build, { deep: true });
6468
+ (0, import_vue14.onBeforeUnmount)(() => {
6338
6469
  canvasEl = null;
6339
6470
  });
6340
6471
  return { layerStyle };
@@ -6524,7 +6655,7 @@ var autocomplete_default = {
6524
6655
  };
6525
6656
 
6526
6657
  // src/components/splitter/index.js
6527
- var import_vue14 = require("vue");
6658
+ var import_vue15 = require("vue");
6528
6659
  var splitter_default = {
6529
6660
  name: "DjmSplitter",
6530
6661
  props: {
@@ -6537,9 +6668,9 @@ var splitter_default = {
6537
6668
  },
6538
6669
  emits: ["update:modelValue", "change"],
6539
6670
  setup(props, { emit }) {
6540
- const root = (0, import_vue14.ref)(null);
6541
- const dragging = (0, import_vue14.ref)(false);
6542
- const ratio = (0, import_vue14.computed)(() => {
6671
+ const root = (0, import_vue15.ref)(null);
6672
+ const dragging = (0, import_vue15.ref)(false);
6673
+ const ratio = (0, import_vue15.computed)(() => {
6543
6674
  const value = Number(props.modelValue);
6544
6675
  const safe = Number.isFinite(value) ? value : 50;
6545
6676
  return Math.min(props.max, Math.max(props.min, safe));
@@ -6583,7 +6714,7 @@ var splitter_default = {
6583
6714
  commit(ratio.value + step);
6584
6715
  }
6585
6716
  }
6586
- (0, import_vue14.onBeforeUnmount)(stopDrag);
6717
+ (0, import_vue15.onBeforeUnmount)(stopDrag);
6587
6718
  return { root, dragging, ratio, startDrag, onKeydown };
6588
6719
  },
6589
6720
  template: `
@@ -6620,7 +6751,7 @@ var splitter_default = {
6620
6751
  };
6621
6752
 
6622
6753
  // src/components/carousel/index.js
6623
- var import_vue15 = require("vue");
6754
+ var import_vue16 = require("vue");
6624
6755
  var carousel_default = {
6625
6756
  name: "DjmCarousel",
6626
6757
  components: { DjmIcon: icon_default },
@@ -6634,7 +6765,7 @@ var carousel_default = {
6634
6765
  },
6635
6766
  emits: ["change"],
6636
6767
  setup(props, { emit }) {
6637
- const index = (0, import_vue15.ref)(0);
6768
+ const index = (0, import_vue16.ref)(0);
6638
6769
  let timer = null;
6639
6770
  const boxStyle = () => ({
6640
6771
  height: typeof props.height === "number" ? props.height + "px" : props.height
@@ -6671,15 +6802,15 @@ var carousel_default = {
6671
6802
  next();
6672
6803
  }
6673
6804
  }
6674
- (0, import_vue15.onMounted)(start);
6675
- (0, import_vue15.watch)(() => [props.autoplay, props.interval, props.items.length], start);
6805
+ (0, import_vue16.onMounted)(start);
6806
+ (0, import_vue16.watch)(() => [props.autoplay, props.interval, props.items.length], start);
6676
6807
  function pause() {
6677
6808
  if (props.autoplay) stop();
6678
6809
  }
6679
6810
  function resume() {
6680
6811
  if (props.autoplay) start();
6681
6812
  }
6682
- (0, import_vue15.onBeforeUnmount)(stop);
6813
+ (0, import_vue16.onBeforeUnmount)(stop);
6683
6814
  return { index, boxStyle, go, next, prev, onKeydown, pause, resume };
6684
6815
  },
6685
6816
  template: `
@@ -6739,7 +6870,7 @@ var carousel_default = {
6739
6870
  };
6740
6871
 
6741
6872
  // src/components/tour/index.js
6742
- var import_vue16 = require("vue");
6873
+ var import_vue17 = require("vue");
6743
6874
  var tour_default = {
6744
6875
  name: "DjmTour",
6745
6876
  components: { DjmIcon: icon_default },
@@ -6751,11 +6882,11 @@ var tour_default = {
6751
6882
  },
6752
6883
  emits: ["update:modelValue", "change", "finish"],
6753
6884
  setup(props, { emit }) {
6754
- const current = (0, import_vue16.ref)(0);
6755
- const highlight = (0, import_vue16.ref)({ top: "0px", left: "0px", width: "0px", height: "0px" });
6756
- const cardStyle = (0, import_vue16.ref)({ position: "fixed", left: "0px", top: "0px", visibility: "hidden" });
6757
- const card = (0, import_vue16.ref)(null);
6758
- const step = (0, import_vue16.computed)(() => props.steps[current.value] || null);
6885
+ const current = (0, import_vue17.ref)(0);
6886
+ const highlight = (0, import_vue17.ref)({ top: "0px", left: "0px", width: "0px", height: "0px" });
6887
+ const cardStyle = (0, import_vue17.ref)({ position: "fixed", left: "0px", top: "0px", visibility: "hidden" });
6888
+ const card = (0, import_vue17.ref)(null);
6889
+ const step = (0, import_vue17.computed)(() => props.steps[current.value] || null);
6759
6890
  function update() {
6760
6891
  const scene = step.value;
6761
6892
  if (!scene) return;
@@ -6785,7 +6916,7 @@ var tour_default = {
6785
6916
  document.addEventListener("keydown", onKeydown);
6786
6917
  window.addEventListener("resize", update);
6787
6918
  window.addEventListener("scroll", update, true);
6788
- (0, import_vue16.nextTick)(() => {
6919
+ (0, import_vue17.nextTick)(() => {
6789
6920
  update();
6790
6921
  if (card.value) card.value.focus({ preventScroll: true });
6791
6922
  });
@@ -6807,22 +6938,22 @@ var tour_default = {
6807
6938
  }
6808
6939
  current.value += 1;
6809
6940
  emit("change", current.value);
6810
- (0, import_vue16.nextTick)(update);
6941
+ (0, import_vue17.nextTick)(update);
6811
6942
  }
6812
6943
  function prev() {
6813
6944
  if (current.value === 0) return;
6814
6945
  current.value -= 1;
6815
6946
  emit("change", current.value);
6816
- (0, import_vue16.nextTick)(update);
6947
+ (0, import_vue17.nextTick)(update);
6817
6948
  }
6818
- (0, import_vue16.watch)(() => props.modelValue, (value) => {
6949
+ (0, import_vue17.watch)(() => props.modelValue, (value) => {
6819
6950
  if (value) startScene();
6820
6951
  else stopScene();
6821
6952
  });
6822
- (0, import_vue16.onMounted)(() => {
6953
+ (0, import_vue17.onMounted)(() => {
6823
6954
  if (props.modelValue) startScene();
6824
6955
  });
6825
- (0, import_vue16.onBeforeUnmount)(stopScene);
6956
+ (0, import_vue17.onBeforeUnmount)(stopScene);
6826
6957
  return { current, step, highlight, cardStyle, card, close: close2, next, prev, t };
6827
6958
  },
6828
6959
  template: `
@@ -6860,7 +6991,7 @@ var tour_default = {
6860
6991
  };
6861
6992
 
6862
6993
  // src/components/calendar/index.js
6863
- var import_vue17 = require("vue");
6994
+ var import_vue18 = require("vue");
6864
6995
  function pad2(num) {
6865
6996
  return String(num).padStart(2, "0");
6866
6997
  }
@@ -6890,16 +7021,16 @@ var calendar_default = {
6890
7021
  const today = /* @__PURE__ */ new Date();
6891
7022
  const todayKey = toKey(today.getFullYear(), today.getMonth(), today.getDate());
6892
7023
  const initial = parse(props.modelValue);
6893
- const viewYear = (0, import_vue17.ref)(initial ? initial.year : today.getFullYear());
6894
- const viewMonth = (0, import_vue17.ref)(initial ? initial.month : today.getMonth());
6895
- const weekNames = (0, import_vue17.computed)(() => {
7024
+ const viewYear = (0, import_vue18.ref)(initial ? initial.year : today.getFullYear());
7025
+ const viewMonth = (0, import_vue18.ref)(initial ? initial.month : today.getMonth());
7026
+ const weekNames = (0, import_vue18.computed)(() => {
6896
7027
  const base = ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D"];
6897
7028
  return base.slice(props.firstDay).concat(base.slice(0, props.firstDay));
6898
7029
  });
6899
- const markSet = (0, import_vue17.computed)(() => new Set(
7030
+ const markSet = (0, import_vue18.computed)(() => new Set(
6900
7031
  props.marks.map((item) => typeof item === "string" ? item : item.date).filter(Boolean)
6901
7032
  ));
6902
- const cells = (0, import_vue17.computed)(() => {
7033
+ const cells = (0, import_vue18.computed)(() => {
6903
7034
  const first = new Date(viewYear.value, viewMonth.value, 1);
6904
7035
  const offset = (first.getDay() - props.firstDay + 7) % 7;
6905
7036
  const start = new Date(viewYear.value, viewMonth.value, 1 - offset);
@@ -6914,7 +7045,7 @@ var calendar_default = {
6914
7045
  }
6915
7046
  return list;
6916
7047
  });
6917
- const weeks = (0, import_vue17.computed)(() => {
7048
+ const weeks = (0, import_vue18.computed)(() => {
6918
7049
  const list = cells.value;
6919
7050
  return Array.from({ length: 6 }, (_, index) => list.slice(index * 7, index * 7 + 7));
6920
7051
  });
@@ -6957,7 +7088,7 @@ var calendar_default = {
6957
7088
  event.preventDefault();
6958
7089
  list[next].focus();
6959
7090
  }
6960
- (0, import_vue17.watch)(() => props.modelValue, (value) => {
7091
+ (0, import_vue18.watch)(() => props.modelValue, (value) => {
6961
7092
  const parts = parse(value);
6962
7093
  if (parts && (parts.year !== viewYear.value || parts.month !== viewMonth.value)) {
6963
7094
  viewYear.value = parts.year;
@@ -7011,7 +7142,7 @@ var calendar_default = {
7011
7142
  };
7012
7143
 
7013
7144
  // src/components/float-button/index.js
7014
- var import_vue18 = require("vue");
7145
+ var import_vue19 = require("vue");
7015
7146
  var float_button_default = {
7016
7147
  name: "DjmFloatButton",
7017
7148
  components: { DjmIcon: icon_default },
@@ -7027,7 +7158,7 @@ var float_button_default = {
7027
7158
  },
7028
7159
  emits: ["click", "select"],
7029
7160
  setup(props, { emit }) {
7030
- const open = (0, import_vue18.ref)(false);
7161
+ const open = (0, import_vue19.ref)(false);
7031
7162
  function onKeydown(event) {
7032
7163
  if (event.key === "Escape") close2();
7033
7164
  }
@@ -7062,7 +7193,7 @@ var float_button_default = {
7062
7193
  emit("select", item);
7063
7194
  if (typeof item.onClick === "function") item.onClick(item);
7064
7195
  }
7065
- (0, import_vue18.onBeforeUnmount)(close2);
7196
+ (0, import_vue19.onBeforeUnmount)(close2);
7066
7197
  return { open, onMainClick, choose };
7067
7198
  },
7068
7199
  template: `
@@ -7097,7 +7228,7 @@ var float_button_default = {
7097
7228
  };
7098
7229
 
7099
7230
  // src/components/mentions/index.js
7100
- var import_vue19 = require("vue");
7231
+ var import_vue20 = require("vue");
7101
7232
  var uidSeed3 = 0;
7102
7233
  var mentions_default = {
7103
7234
  name: "DjmMentions",
@@ -7112,26 +7243,26 @@ var mentions_default = {
7112
7243
  },
7113
7244
  emits: ["update:modelValue", "input", "select"],
7114
7245
  setup(props, { emit }) {
7115
- const root = (0, import_vue19.ref)(null);
7116
- const input = (0, import_vue19.ref)(null);
7117
- const text = (0, import_vue19.ref)(props.modelValue);
7118
- const open = (0, import_vue19.ref)(false);
7119
- const keyword = (0, import_vue19.ref)("");
7120
- const activeIndex = (0, import_vue19.ref)(-1);
7246
+ const root = (0, import_vue20.ref)(null);
7247
+ const input = (0, import_vue20.ref)(null);
7248
+ const text = (0, import_vue20.ref)(props.modelValue);
7249
+ const open = (0, import_vue20.ref)(false);
7250
+ const keyword = (0, import_vue20.ref)("");
7251
+ const activeIndex = (0, import_vue20.ref)(-1);
7121
7252
  const listId = "djm-mentions-" + ++uidSeed3;
7122
- const panelStyle = (0, import_vue19.ref)({ ...PANEL_HIDDEN_STYLE });
7253
+ const panelStyle = (0, import_vue20.ref)({ ...PANEL_HIDDEN_STYLE });
7123
7254
  let triggerIndex = -1;
7124
7255
  let detachPanel = null;
7125
- (0, import_vue19.watch)(() => props.modelValue, (value) => {
7256
+ (0, import_vue20.watch)(() => props.modelValue, (value) => {
7126
7257
  text.value = value;
7127
7258
  });
7128
- const normalized = (0, import_vue19.computed)(() => props.options.map((item) => typeof item === "string" ? { value: item, label: item } : item));
7129
- const filtered = (0, import_vue19.computed)(() => {
7259
+ const normalized = (0, import_vue20.computed)(() => props.options.map((item) => typeof item === "string" ? { value: item, label: item } : item));
7260
+ const filtered = (0, import_vue20.computed)(() => {
7130
7261
  const key = keyword.value.trim().toLowerCase();
7131
7262
  const list = key ? normalized.value.filter((item) => String(item.label).toLowerCase().indexOf(key) > -1) : normalized.value;
7132
7263
  return list.slice(0, 6);
7133
7264
  });
7134
- const activeId = (0, import_vue19.computed)(() => activeIndex.value > -1 ? listId + "-" + activeIndex.value : void 0);
7265
+ const activeId = (0, import_vue20.computed)(() => activeIndex.value > -1 ? listId + "-" + activeIndex.value : void 0);
7135
7266
  function updatePosition() {
7136
7267
  if (!open.value || !root.value) return;
7137
7268
  const rect = root.value.getBoundingClientRect();
@@ -7151,7 +7282,7 @@ var mentions_default = {
7151
7282
  onReposition: updatePosition,
7152
7283
  esc: false
7153
7284
  });
7154
- (0, import_vue19.nextTick)(updatePosition);
7285
+ (0, import_vue20.nextTick)(updatePosition);
7155
7286
  }
7156
7287
  function closePanel() {
7157
7288
  if (!open.value) return;
@@ -7178,7 +7309,7 @@ var mentions_default = {
7178
7309
  keyword.value = match[1];
7179
7310
  activeIndex.value = -1;
7180
7311
  if (!open.value) openPanel();
7181
- else (0, import_vue19.nextTick)(updatePosition);
7312
+ else (0, import_vue20.nextTick)(updatePosition);
7182
7313
  }
7183
7314
  function onKeydown(event) {
7184
7315
  if (!open.value) return;
@@ -7208,14 +7339,14 @@ var mentions_default = {
7208
7339
  emit("update:modelValue", next);
7209
7340
  emit("select", item);
7210
7341
  closePanel();
7211
- (0, import_vue19.nextTick)(() => {
7342
+ (0, import_vue20.nextTick)(() => {
7212
7343
  if (!input.value) return;
7213
7344
  const pos = triggerIndex + item.label.length + 2;
7214
7345
  input.value.focus();
7215
7346
  input.value.setSelectionRange(pos, pos);
7216
7347
  });
7217
7348
  }
7218
- (0, import_vue19.onBeforeUnmount)(closePanel);
7349
+ (0, import_vue20.onBeforeUnmount)(closePanel);
7219
7350
  return {
7220
7351
  root,
7221
7352
  input,
@@ -7489,7 +7620,7 @@ var input_tag_default = {
7489
7620
  };
7490
7621
 
7491
7622
  // src/components/password/index.js
7492
- var import_vue20 = require("vue");
7623
+ var import_vue21 = require("vue");
7493
7624
  var password_default = {
7494
7625
  name: "DjmPassword",
7495
7626
  components: { DjmIcon: icon_default },
@@ -7503,8 +7634,8 @@ var password_default = {
7503
7634
  },
7504
7635
  emits: ["update:modelValue", "input", "change", "enter", "focus", "blur"],
7505
7636
  setup(props, { emit }) {
7506
- const visible = (0, import_vue20.ref)(false);
7507
- const score = (0, import_vue20.computed)(() => {
7637
+ const visible = (0, import_vue21.ref)(false);
7638
+ const score = (0, import_vue21.computed)(() => {
7508
7639
  const value = props.modelValue || "";
7509
7640
  if (!value) return 0;
7510
7641
  let total = 0;
@@ -7514,12 +7645,12 @@ var password_default = {
7514
7645
  if (/[^a-zA-Z\d]/.test(value)) total += 1;
7515
7646
  return total;
7516
7647
  });
7517
- const level = (0, import_vue20.computed)(() => {
7648
+ const level = (0, import_vue21.computed)(() => {
7518
7649
  if (score.value <= 1) return 1;
7519
7650
  if (score.value <= 3) return 2;
7520
7651
  return 3;
7521
7652
  });
7522
- const label = (0, import_vue20.computed)(() => {
7653
+ const label = (0, import_vue21.computed)(() => {
7523
7654
  const key = ["", "password.weak", "password.medium", "password.strong"][level.value];
7524
7655
  return t(key);
7525
7656
  });
@@ -7569,7 +7700,7 @@ var password_default = {
7569
7700
  };
7570
7701
 
7571
7702
  // src/components/command-palette/index.js
7572
- var import_vue21 = require("vue");
7703
+ var import_vue22 = require("vue");
7573
7704
 
7574
7705
  // src/utils/focus-trap.js
7575
7706
  var FOCUSABLE = [
@@ -7622,14 +7753,14 @@ var command_palette_default = {
7622
7753
  },
7623
7754
  emits: ["update:modelValue", "run"],
7624
7755
  setup(props, { emit }) {
7625
- const open = (0, import_vue21.ref)(false);
7626
- const keyword = (0, import_vue21.ref)("");
7627
- const activeIndex = (0, import_vue21.ref)(-1);
7628
- const searchInput = (0, import_vue21.ref)(null);
7629
- const panelEl = (0, import_vue21.ref)(null);
7756
+ const open = (0, import_vue22.ref)(false);
7757
+ const keyword = (0, import_vue22.ref)("");
7758
+ const activeIndex = (0, import_vue22.ref)(-1);
7759
+ const searchInput = (0, import_vue22.ref)(null);
7760
+ const panelEl = (0, import_vue22.ref)(null);
7630
7761
  const listId = "djm-command-list-" + ++uidSeed4;
7631
7762
  let releaseTrap = null;
7632
- const filtered = (0, import_vue21.computed)(() => {
7763
+ const filtered = (0, import_vue22.computed)(() => {
7633
7764
  const key = keyword.value.trim().toLowerCase();
7634
7765
  if (!key) return props.commands;
7635
7766
  return props.commands.filter((item) => {
@@ -7637,7 +7768,7 @@ var command_palette_default = {
7637
7768
  return text.indexOf(key) > -1;
7638
7769
  });
7639
7770
  });
7640
- const activeId = (0, import_vue21.computed)(() => activeIndex.value > -1 ? listId + "-" + activeIndex.value : void 0);
7771
+ const activeId = (0, import_vue22.computed)(() => activeIndex.value > -1 ? listId + "-" + activeIndex.value : void 0);
7641
7772
  function show() {
7642
7773
  if (open.value) return;
7643
7774
  open.value = true;
@@ -7646,7 +7777,7 @@ var command_palette_default = {
7646
7777
  emit("update:modelValue", true);
7647
7778
  lockScroll();
7648
7779
  document.addEventListener("keydown", onDocumentKeydown);
7649
- (0, import_vue21.nextTick)(() => {
7780
+ (0, import_vue22.nextTick)(() => {
7650
7781
  releaseTrap = trapFocus(panelEl.value);
7651
7782
  if (searchInput.value) searchInput.value.focus();
7652
7783
  });
@@ -7709,12 +7840,12 @@ var command_palette_default = {
7709
7840
  if (typeof item.run === "function") item.run(item);
7710
7841
  hide();
7711
7842
  }
7712
- (0, import_vue21.watch)(() => props.modelValue, (value) => {
7843
+ (0, import_vue22.watch)(() => props.modelValue, (value) => {
7713
7844
  if (value) show();
7714
7845
  else hide();
7715
7846
  });
7716
- (0, import_vue21.onMounted)(() => window.addEventListener("keydown", onGlobalKeydown));
7717
- (0, import_vue21.onBeforeUnmount)(() => {
7847
+ (0, import_vue22.onMounted)(() => window.addEventListener("keydown", onGlobalKeydown));
7848
+ (0, import_vue22.onBeforeUnmount)(() => {
7718
7849
  window.removeEventListener("keydown", onGlobalKeydown);
7719
7850
  hide();
7720
7851
  });
@@ -7766,7 +7897,7 @@ var command_palette_default = {
7766
7897
  };
7767
7898
 
7768
7899
  // src/components/qrcode/index.js
7769
- var import_vue22 = require("vue");
7900
+ var import_vue23 = require("vue");
7770
7901
  var qrcode_default = {
7771
7902
  name: "DjmQRCode",
7772
7903
  props: {
@@ -7781,8 +7912,8 @@ var qrcode_default = {
7781
7912
  alt: { type: String, default: "\u4E8C\u7EF4\u7801" }
7782
7913
  },
7783
7914
  setup(props) {
7784
- const src = (0, import_vue22.ref)("");
7785
- const error = (0, import_vue22.ref)("");
7915
+ const src = (0, import_vue23.ref)("");
7916
+ const error = (0, import_vue23.ref)("");
7786
7917
  let lib = null;
7787
7918
  let seq2 = 0;
7788
7919
  async function ensureLib() {
@@ -7818,8 +7949,8 @@ var qrcode_default = {
7818
7949
  error.value = "\u4E8C\u7EF4\u7801\u751F\u6210\u5931\u8D25";
7819
7950
  }
7820
7951
  }
7821
- (0, import_vue22.onMounted)(render);
7822
- (0, import_vue22.watch)(() => [props.value, props.size, props.level, props.margin, props.dark, props.light], render);
7952
+ (0, import_vue23.onMounted)(render);
7953
+ (0, import_vue23.watch)(() => [props.value, props.size, props.level, props.margin, props.dark, props.light], render);
7823
7954
  return { src, error };
7824
7955
  },
7825
7956
  template: `
@@ -7858,7 +7989,7 @@ var status_default = {
7858
7989
  };
7859
7990
 
7860
7991
  // src/components/tooltip/index.js
7861
- var import_vue23 = require("vue");
7992
+ var import_vue24 = require("vue");
7862
7993
  var uid2 = 0;
7863
7994
  var tooltip_default = {
7864
7995
  name: "DjmTooltip",
@@ -7869,11 +8000,11 @@ var tooltip_default = {
7869
8000
  delay: { type: Number, default: 80 }
7870
8001
  },
7871
8002
  setup(props) {
7872
- const visible = (0, import_vue23.ref)(false);
7873
- const rootRef = (0, import_vue23.ref)(null);
7874
- const contentRef = (0, import_vue23.ref)(null);
7875
- const actualPlacement = (0, import_vue23.ref)(props.placement);
7876
- const panelStyle = (0, import_vue23.ref)({});
8003
+ const visible = (0, import_vue24.ref)(false);
8004
+ const rootRef = (0, import_vue24.ref)(null);
8005
+ const contentRef = (0, import_vue24.ref)(null);
8006
+ const actualPlacement = (0, import_vue24.ref)(props.placement);
8007
+ const panelStyle = (0, import_vue24.ref)({});
7877
8008
  const tipId = "djm-tooltip-" + ++uid2;
7878
8009
  let timer = null;
7879
8010
  function triggerEl() {
@@ -7931,7 +8062,7 @@ var tooltip_default = {
7931
8062
  window.clearTimeout(timer);
7932
8063
  timer = window.setTimeout(async () => {
7933
8064
  visible.value = true;
7934
- await (0, import_vue23.nextTick)();
8065
+ await (0, import_vue24.nextTick)();
7935
8066
  position();
7936
8067
  bindTrigger(true);
7937
8068
  bindReposition(true);
@@ -7944,7 +8075,7 @@ var tooltip_default = {
7944
8075
  bindTrigger(false);
7945
8076
  bindReposition(false);
7946
8077
  }
7947
- (0, import_vue23.onBeforeUnmount)(() => {
8078
+ (0, import_vue24.onBeforeUnmount)(() => {
7948
8079
  window.clearTimeout(timer);
7949
8080
  bindReposition(false);
7950
8081
  });
@@ -7969,7 +8100,7 @@ var tooltip_default = {
7969
8100
  };
7970
8101
 
7971
8102
  // src/components/dropdown/index.js
7972
- var import_vue24 = require("vue");
8103
+ var import_vue25 = require("vue");
7973
8104
  var dropdown_default = {
7974
8105
  name: "DjmDropdown",
7975
8106
  components: { DjmIcon: icon_default },
@@ -7986,10 +8117,10 @@ var dropdown_default = {
7986
8117
  },
7987
8118
  emits: ["select", "visible-change"],
7988
8119
  setup(props, { emit }) {
7989
- const open = (0, import_vue24.ref)(false);
7990
- const root = (0, import_vue24.ref)(null);
7991
- const menuEl = (0, import_vue24.ref)(null);
7992
- const panelStyle = (0, import_vue24.ref)({});
8120
+ const open = (0, import_vue25.ref)(false);
8121
+ const root = (0, import_vue25.ref)(null);
8122
+ const menuEl = (0, import_vue25.ref)(null);
8123
+ const panelStyle = (0, import_vue25.ref)({});
7993
8124
  let detachPanel = null;
7994
8125
  function syncTriggerA11y() {
7995
8126
  const wrapper = root.value && root.value.querySelector(".djm-dropdown-trigger");
@@ -8002,8 +8133,8 @@ var dropdown_default = {
8002
8133
  if (props.disabled) target.setAttribute("aria-disabled", "true");
8003
8134
  else target.removeAttribute("aria-disabled");
8004
8135
  }
8005
- (0, import_vue24.onMounted)(() => (0, import_vue24.nextTick)(syncTriggerA11y));
8006
- (0, import_vue24.watch)(open, () => (0, import_vue24.nextTick)(syncTriggerA11y));
8136
+ (0, import_vue25.onMounted)(() => (0, import_vue25.nextTick)(syncTriggerA11y));
8137
+ (0, import_vue25.watch)(open, () => (0, import_vue25.nextTick)(syncTriggerA11y));
8007
8138
  function updatePosition() {
8008
8139
  if (!open.value || !root.value) return;
8009
8140
  const rect = root.value.getBoundingClientRect();
@@ -8047,7 +8178,7 @@ var dropdown_default = {
8047
8178
  returnFocus();
8048
8179
  }
8049
8180
  function focusFirstItem() {
8050
- (0, import_vue24.nextTick)(() => {
8181
+ (0, import_vue25.nextTick)(() => {
8051
8182
  const el = menuEl.value && menuEl.value.querySelector(".djm-dropdown-item:not(:disabled)");
8052
8183
  if (el) el.focus();
8053
8184
  });
@@ -8106,7 +8237,7 @@ var dropdown_default = {
8106
8237
  emit("select", item);
8107
8238
  if (props.closeOnSelect) close2();
8108
8239
  }
8109
- (0, import_vue24.onBeforeUnmount)(() => {
8240
+ (0, import_vue25.onBeforeUnmount)(() => {
8110
8241
  window.clearTimeout(hoverTimer);
8111
8242
  close2();
8112
8243
  });
@@ -8171,7 +8302,7 @@ var dropdown_default = {
8171
8302
  };
8172
8303
 
8173
8304
  // src/components/drawer/index.js
8174
- var import_vue25 = require("vue");
8305
+ var import_vue26 = require("vue");
8175
8306
  var uid3 = 0;
8176
8307
  var drawer_default = {
8177
8308
  name: "DjmDrawer",
@@ -8184,11 +8315,13 @@ var drawer_default = {
8184
8315
  // 点击遮罩关闭
8185
8316
  maskClosable: { type: Boolean, default: true },
8186
8317
  showClose: { type: Boolean, default: true },
8187
- closeOnEsc: { type: Boolean, default: true }
8318
+ closeOnEsc: { type: Boolean, default: true },
8319
+ // 毛玻璃底
8320
+ glass: { type: Boolean, default: false }
8188
8321
  },
8189
8322
  emits: ["update:modelValue", "open", "close"],
8190
8323
  setup(props, { emit }) {
8191
- const panelRef = (0, import_vue25.ref)(null);
8324
+ const panelRef = (0, import_vue26.ref)(null);
8192
8325
  const titleId = `djm-drawer-title-${++uid3}`;
8193
8326
  let locked = false;
8194
8327
  let releaseTrap = null;
@@ -8209,7 +8342,7 @@ var drawer_default = {
8209
8342
  lockScroll();
8210
8343
  locked = true;
8211
8344
  emit("open");
8212
- await (0, import_vue25.nextTick)();
8345
+ await (0, import_vue26.nextTick)();
8213
8346
  releaseTrap = trapFocus(panelRef.value);
8214
8347
  }
8215
8348
  function deactivate() {
@@ -8221,14 +8354,14 @@ var drawer_default = {
8221
8354
  }
8222
8355
  emit("close");
8223
8356
  }
8224
- (0, import_vue25.watch)(() => props.modelValue, (open) => {
8357
+ (0, import_vue26.watch)(() => props.modelValue, (open) => {
8225
8358
  if (open) activate();
8226
8359
  else deactivate();
8227
8360
  });
8228
- (0, import_vue25.onMounted)(() => {
8361
+ (0, import_vue26.onMounted)(() => {
8229
8362
  if (props.modelValue) activate();
8230
8363
  });
8231
- (0, import_vue25.onBeforeUnmount)(() => {
8364
+ (0, import_vue26.onBeforeUnmount)(() => {
8232
8365
  document.removeEventListener("keydown", onKeydown);
8233
8366
  release();
8234
8367
  if (locked) unlockScroll();
@@ -8247,7 +8380,7 @@ var drawer_default = {
8247
8380
  <aside
8248
8381
  ref="panelRef"
8249
8382
  class="djm-drawer"
8250
- :class="'djm-drawer-' + placement"
8383
+ :class="['djm-drawer-' + placement, { 'djm-is-glass': glass }]"
8251
8384
  :style="panelStyle"
8252
8385
  role="dialog"
8253
8386
  aria-modal="true"
@@ -8282,7 +8415,7 @@ var drawer_default = {
8282
8415
  };
8283
8416
 
8284
8417
  // src/components/modal/index.js
8285
- var import_vue26 = require("vue");
8418
+ var import_vue27 = require("vue");
8286
8419
  var uid4 = 0;
8287
8420
  var modal_default = {
8288
8421
  name: "DjmModal",
@@ -8297,11 +8430,13 @@ var modal_default = {
8297
8430
  // 是否允许 Esc 关闭
8298
8431
  closeOnEsc: { type: Boolean, default: true },
8299
8432
  // 全屏铺满,适合配置类大表单
8300
- fullscreen: { type: Boolean, default: false }
8433
+ fullscreen: { type: Boolean, default: false },
8434
+ // 毛玻璃底:需要显示背后页面时使用
8435
+ glass: { type: Boolean, default: false }
8301
8436
  },
8302
8437
  emits: ["update:modelValue", "open", "close"],
8303
8438
  setup(props, { emit }) {
8304
- const dialogRef = (0, import_vue26.ref)(null);
8439
+ const dialogRef = (0, import_vue27.ref)(null);
8305
8440
  const titleId = `djm-modal-title-${++uid4}`;
8306
8441
  let locked = false;
8307
8442
  let releaseTrap = null;
@@ -8322,7 +8457,7 @@ var modal_default = {
8322
8457
  lockScroll();
8323
8458
  locked = true;
8324
8459
  emit("open");
8325
- await (0, import_vue26.nextTick)();
8460
+ await (0, import_vue27.nextTick)();
8326
8461
  releaseTrap = trapFocus(dialogRef.value);
8327
8462
  }
8328
8463
  function deactivate() {
@@ -8334,14 +8469,14 @@ var modal_default = {
8334
8469
  }
8335
8470
  emit("close");
8336
8471
  }
8337
- (0, import_vue26.watch)(() => props.modelValue, (open) => {
8472
+ (0, import_vue27.watch)(() => props.modelValue, (open) => {
8338
8473
  if (open) activate();
8339
8474
  else deactivate();
8340
8475
  });
8341
- (0, import_vue26.onMounted)(() => {
8476
+ (0, import_vue27.onMounted)(() => {
8342
8477
  if (props.modelValue) activate();
8343
8478
  });
8344
- (0, import_vue26.onBeforeUnmount)(() => {
8479
+ (0, import_vue27.onBeforeUnmount)(() => {
8345
8480
  document.removeEventListener("keydown", onKey);
8346
8481
  release();
8347
8482
  if (locked) unlockScroll();
@@ -8351,7 +8486,7 @@ var modal_default = {
8351
8486
  dialogRef,
8352
8487
  titleId,
8353
8488
  t,
8354
- dialogStyle: (0, import_vue26.computed)(
8489
+ dialogStyle: (0, import_vue27.computed)(
8355
8490
  () => props.fullscreen ? { width: "calc(100vw - 32px)", height: "calc(100vh - 48px)" } : { width: props.width }
8356
8491
  )
8357
8492
  };
@@ -8363,7 +8498,7 @@ var modal_default = {
8363
8498
  <div
8364
8499
  ref="dialogRef"
8365
8500
  class="djm-modal"
8366
- :class="{ 'djm-is-fullscreen': fullscreen }"
8501
+ :class="{ 'djm-is-fullscreen': fullscreen, 'djm-is-glass': glass }"
8367
8502
  :style="dialogStyle"
8368
8503
  role="dialog"
8369
8504
  aria-modal="true"
@@ -8461,7 +8596,7 @@ var confirm_dialog_default = {
8461
8596
  };
8462
8597
 
8463
8598
  // src/components/pagination/index.js
8464
- var import_vue27 = require("vue");
8599
+ var import_vue28 = require("vue");
8465
8600
  var pagination_default = {
8466
8601
  name: "DjmPagination",
8467
8602
  components: { Icon: icon_default },
@@ -8473,10 +8608,10 @@ var pagination_default = {
8473
8608
  },
8474
8609
  emits: ["update:page", "update:pageSize", "change"],
8475
8610
  setup(props, { emit }) {
8476
- const jumpText = (0, import_vue27.ref)("");
8477
- const pageCount = (0, import_vue27.computed)(() => Math.max(1, Math.ceil(props.total / Math.max(1, props.pageSize))));
8478
- const current = (0, import_vue27.computed)(() => Math.min(Math.max(1, props.page), pageCount.value));
8479
- const pages = (0, import_vue27.computed)(() => {
8611
+ const jumpText = (0, import_vue28.ref)("");
8612
+ const pageCount = (0, import_vue28.computed)(() => Math.max(1, Math.ceil(props.total / Math.max(1, props.pageSize))));
8613
+ const current = (0, import_vue28.computed)(() => Math.min(Math.max(1, props.page), pageCount.value));
8614
+ const pages = (0, import_vue28.computed)(() => {
8480
8615
  const count2 = pageCount.value;
8481
8616
  const currentPage = current.value;
8482
8617
  if (count2 <= 7) {
@@ -8573,7 +8708,7 @@ var pagination_default = {
8573
8708
  };
8574
8709
 
8575
8710
  // src/components/tabs/index.js
8576
- var import_vue28 = require("vue");
8711
+ var import_vue29 = require("vue");
8577
8712
  var uid5 = 0;
8578
8713
  var tabs_default = {
8579
8714
  name: "DjmTabs",
@@ -8589,7 +8724,7 @@ var tabs_default = {
8589
8724
  emits: ["update:modelValue", "close"],
8590
8725
  setup(props, { emit }) {
8591
8726
  const panelId = `djm-tabs-panel-${++uid5}`;
8592
- const activeItem = (0, import_vue28.computed)(
8727
+ const activeItem = (0, import_vue29.computed)(
8593
8728
  () => props.items.find((item) => item.key === props.modelValue) || { label: String(props.modelValue) }
8594
8729
  );
8595
8730
  function tabId(item) {
@@ -8693,7 +8828,7 @@ var tabs_default = {
8693
8828
  };
8694
8829
 
8695
8830
  // src/components/context-menu/index.js
8696
- var import_vue29 = require("vue");
8831
+ var import_vue30 = require("vue");
8697
8832
  var context_menu_default = {
8698
8833
  name: "DjmContextMenu",
8699
8834
  components: { Icon: icon_default },
@@ -8705,8 +8840,8 @@ var context_menu_default = {
8705
8840
  },
8706
8841
  emits: ["update:modelValue", "select"],
8707
8842
  setup(props, { emit }) {
8708
- const menuRef = (0, import_vue29.ref)(null);
8709
- const pos = (0, import_vue29.ref)({ left: 0, top: 0 });
8843
+ const menuRef = (0, import_vue30.ref)(null);
8844
+ const pos = (0, import_vue30.ref)({ left: 0, top: 0 });
8710
8845
  const margin = 8;
8711
8846
  function close2() {
8712
8847
  emit("update:modelValue", false);
@@ -8726,7 +8861,7 @@ var context_menu_default = {
8726
8861
  }
8727
8862
  async function openAtCursor() {
8728
8863
  pos.value = { left: props.x, top: props.y };
8729
- await (0, import_vue29.nextTick)();
8864
+ await (0, import_vue30.nextTick)();
8730
8865
  place();
8731
8866
  const first = menuRef.value && menuRef.value.querySelector(".djm-context-menu-item:not(:disabled)");
8732
8867
  if (first) first.focus();
@@ -8768,7 +8903,7 @@ var context_menu_default = {
8768
8903
  detach = null;
8769
8904
  }
8770
8905
  }
8771
- (0, import_vue29.watch)(
8906
+ (0, import_vue30.watch)(
8772
8907
  () => props.modelValue,
8773
8908
  (open) => {
8774
8909
  if (open) {
@@ -8779,10 +8914,10 @@ var context_menu_default = {
8779
8914
  }
8780
8915
  }
8781
8916
  );
8782
- (0, import_vue29.watch)([() => props.x, () => props.y], () => {
8917
+ (0, import_vue30.watch)([() => props.x, () => props.y], () => {
8783
8918
  if (props.modelValue) openAtCursor();
8784
8919
  });
8785
- (0, import_vue29.onBeforeUnmount)(unbind);
8920
+ (0, import_vue30.onBeforeUnmount)(unbind);
8786
8921
  return { menuRef, pos, close: close2, onSelect, onKeydown, t };
8787
8922
  },
8788
8923
  template: `
@@ -8821,7 +8956,7 @@ var context_menu_default = {
8821
8956
  };
8822
8957
 
8823
8958
  // src/components/date-picker/index.js
8824
- var import_vue30 = require("vue");
8959
+ var import_vue31 = require("vue");
8825
8960
  var uidSeed5 = 0;
8826
8961
  function pad3(value) {
8827
8962
  return String(value).padStart(2, "0");
@@ -8856,36 +8991,36 @@ var date_picker_default = {
8856
8991
  },
8857
8992
  emits: ["update:modelValue", "change", "visible-change"],
8858
8993
  setup(props, { emit }) {
8859
- const open = (0, import_vue30.ref)(false);
8860
- (0, import_vue30.watch)(open, (value) => emit("visible-change", value));
8861
- const root = (0, import_vue30.ref)(null);
8862
- const panel = (0, import_vue30.ref)(null);
8994
+ const open = (0, import_vue31.ref)(false);
8995
+ (0, import_vue31.watch)(open, (value) => emit("visible-change", value));
8996
+ const root = (0, import_vue31.ref)(null);
8997
+ const panel = (0, import_vue31.ref)(null);
8863
8998
  const panelId = "djm-date-panel-" + ++uidSeed5;
8864
- const panelStyle = (0, import_vue30.ref)({ ...PANEL_HIDDEN_STYLE });
8999
+ const panelStyle = (0, import_vue31.ref)({ ...PANEL_HIDDEN_STYLE });
8865
9000
  let detachPanel = null;
8866
9001
  const today = /* @__PURE__ */ new Date();
8867
9002
  const todayKey = toKey2(today.getFullYear(), today.getMonth(), today.getDate());
8868
- const values = (0, import_vue30.computed)(() => {
9003
+ const values = (0, import_vue31.computed)(() => {
8869
9004
  if (props.range) return Array.isArray(props.modelValue) ? props.modelValue : [];
8870
9005
  return props.modelValue ? [props.modelValue] : [];
8871
9006
  });
8872
- const displayText = (0, import_vue30.computed)(() => {
9007
+ const displayText = (0, import_vue31.computed)(() => {
8873
9008
  if (!props.range) return values.value[0] || "";
8874
9009
  const [start, end] = values.value;
8875
9010
  if (!start) return "";
8876
9011
  return end ? `${start} ~ ${end}` : `${start} ~ ${t("datePicker.rangeEnd")}`;
8877
9012
  });
8878
9013
  const initial = parse2(values.value[0]);
8879
- const viewYear = (0, import_vue30.ref)(initial ? initial.year : today.getFullYear());
8880
- const viewMonth = (0, import_vue30.ref)(initial ? initial.month : today.getMonth());
8881
- const pendingStart = (0, import_vue30.ref)(values.value[0] || "");
8882
- const pendingEnd = (0, import_vue30.ref)(values.value[1] || "");
8883
- const placeholderText = (0, import_vue30.computed)(() => {
9014
+ const viewYear = (0, import_vue31.ref)(initial ? initial.year : today.getFullYear());
9015
+ const viewMonth = (0, import_vue31.ref)(initial ? initial.month : today.getMonth());
9016
+ const pendingStart = (0, import_vue31.ref)(values.value[0] || "");
9017
+ const pendingEnd = (0, import_vue31.ref)(values.value[1] || "");
9018
+ const placeholderText = (0, import_vue31.computed)(() => {
8884
9019
  if (props.placeholder) return props.placeholder;
8885
9020
  return t(props.range ? "datePicker.rangePlaceholder" : "datePicker.placeholder");
8886
9021
  });
8887
- const weeks = (0, import_vue30.computed)(() => t("datePicker.weeks").split(","));
8888
- const narrow = (0, import_vue30.ref)(false);
9022
+ const weeks = (0, import_vue31.computed)(() => t("datePicker.weeks").split(","));
9023
+ const narrow = (0, import_vue31.ref)(false);
8889
9024
  let media = null;
8890
9025
  const onMediaChange = (event) => {
8891
9026
  narrow.value = event.matches;
@@ -8896,14 +9031,14 @@ var date_picker_default = {
8896
9031
  if (media.addEventListener) media.addEventListener("change", onMediaChange);
8897
9032
  else media.addListener(onMediaChange);
8898
9033
  }
8899
- (0, import_vue30.onBeforeUnmount)(() => {
9034
+ (0, import_vue31.onBeforeUnmount)(() => {
8900
9035
  if (!media) return;
8901
9036
  if (media.removeEventListener) media.removeEventListener("change", onMediaChange);
8902
9037
  else media.removeListener(onMediaChange);
8903
9038
  });
8904
- const panelCount = (0, import_vue30.computed)(() => props.range ? Math.min(narrow.value ? 1 : 2, Math.max(1, props.panels)) : 1);
8905
- const hoverKey = (0, import_vue30.ref)("");
8906
- const hoverRange = (0, import_vue30.computed)(() => {
9039
+ const panelCount = (0, import_vue31.computed)(() => props.range ? Math.min(narrow.value ? 1 : 2, Math.max(1, props.panels)) : 1);
9040
+ const hoverKey = (0, import_vue31.ref)("");
9041
+ const hoverRange = (0, import_vue31.computed)(() => {
8907
9042
  if (!props.range || !pendingStart.value || pendingEnd.value || !hoverKey.value) return null;
8908
9043
  const a = pendingStart.value;
8909
9044
  const b = hoverKey.value;
@@ -8939,7 +9074,7 @@ var date_picker_default = {
8939
9074
  };
8940
9075
  });
8941
9076
  }
8942
- const panels = (0, import_vue30.computed)(
9077
+ const panels = (0, import_vue31.computed)(
8943
9078
  () => Array.from({ length: panelCount.value }, (_, offset) => {
8944
9079
  const { year, month } = monthAt(offset);
8945
9080
  return {
@@ -8954,7 +9089,7 @@ var date_picker_default = {
8954
9089
  if (props.max && key > props.max) return true;
8955
9090
  return typeof props.disabledDate === "function" ? Boolean(props.disabledDate(key)) : false;
8956
9091
  }
8957
- const presetList = (0, import_vue30.computed)(() => {
9092
+ const presetList = (0, import_vue31.computed)(() => {
8958
9093
  if (!props.range) return [];
8959
9094
  return (props.presets || []).map((preset) => {
8960
9095
  const value = typeof preset.value === "function" ? preset.value() : preset.value;
@@ -9082,7 +9217,7 @@ var date_picker_default = {
9082
9217
  pendingEnd.value = "";
9083
9218
  closePanel();
9084
9219
  }
9085
- (0, import_vue30.onBeforeUnmount)(() => {
9220
+ (0, import_vue31.onBeforeUnmount)(() => {
9086
9221
  if (detachPanel) {
9087
9222
  detachPanel();
9088
9223
  detachPanel = null;
@@ -9211,7 +9346,7 @@ var date_picker_default = {
9211
9346
  };
9212
9347
 
9213
9348
  // src/components/tree-select/index.js
9214
- var import_vue31 = require("vue");
9349
+ var import_vue32 = require("vue");
9215
9350
  function collectLeaves(node, keyOf2, out = []) {
9216
9351
  if (node.children && node.children.length) {
9217
9352
  node.children.forEach((child) => collectLeaves(child, keyOf2, out));
@@ -9247,13 +9382,13 @@ var tree_select_default = {
9247
9382
  },
9248
9383
  emits: ["update:modelValue", "change", "visible-change"],
9249
9384
  setup(props, { emit }) {
9250
- const open = (0, import_vue31.ref)(false);
9251
- const root = (0, import_vue31.ref)(null);
9252
- const panel = (0, import_vue31.ref)(null);
9253
- const searchInput = (0, import_vue31.ref)(null);
9254
- const search = (0, import_vue31.ref)("");
9255
- const temp = (0, import_vue31.ref)([]);
9256
- const panelStyle = (0, import_vue31.ref)({ ...PANEL_HIDDEN_STYLE });
9385
+ const open = (0, import_vue32.ref)(false);
9386
+ const root = (0, import_vue32.ref)(null);
9387
+ const panel = (0, import_vue32.ref)(null);
9388
+ const searchInput = (0, import_vue32.ref)(null);
9389
+ const search = (0, import_vue32.ref)("");
9390
+ const temp = (0, import_vue32.ref)([]);
9391
+ const panelStyle = (0, import_vue32.ref)({ ...PANEL_HIDDEN_STYLE });
9257
9392
  let detachPanel = null;
9258
9393
  function keyOf2(node) {
9259
9394
  return node ? node[props.nodeKey] : void 0;
@@ -9262,26 +9397,26 @@ var tree_select_default = {
9262
9397
  const value = node ? node[props.labelKey] : "";
9263
9398
  return value === null || value === void 0 ? "" : String(value);
9264
9399
  }
9265
- const expandedIds = (0, import_vue31.ref)(
9400
+ const expandedIds = (0, import_vue32.ref)(
9266
9401
  new Set(
9267
9402
  collectNodes(props.options).filter((node) => node.children && node.children.length).map((node) => keyOf2(node))
9268
9403
  )
9269
9404
  );
9270
- const nodeMap = (0, import_vue31.computed)(() => {
9405
+ const nodeMap = (0, import_vue32.computed)(() => {
9271
9406
  const map = /* @__PURE__ */ new Map();
9272
9407
  collectNodes(props.options).forEach((node) => map.set(keyOf2(node), node));
9273
9408
  return map;
9274
9409
  });
9275
- (0, import_vue31.watch)(() => props.options, (options) => {
9410
+ (0, import_vue32.watch)(() => props.options, (options) => {
9276
9411
  if (!options || !options.length || expandedIds.value.size) return;
9277
9412
  expandedIds.value = new Set(
9278
9413
  collectNodes(options).filter((node) => node.children && node.children.length).map((node) => keyOf2(node))
9279
9414
  );
9280
9415
  });
9281
- const selectedNodes = (0, import_vue31.computed)(
9416
+ const selectedNodes = (0, import_vue32.computed)(
9282
9417
  () => props.modelValue.map((id) => nodeMap.value.get(id)).filter(Boolean).map((node) => ({ key: keyOf2(node), label: labelOf(node) }))
9283
9418
  );
9284
- const searchState = (0, import_vue31.computed)(() => {
9419
+ const searchState = (0, import_vue32.computed)(() => {
9285
9420
  const text = search.value.trim().toLowerCase();
9286
9421
  if (!text) return null;
9287
9422
  const visible = /* @__PURE__ */ new Set();
@@ -9300,7 +9435,7 @@ var tree_select_default = {
9300
9435
  walk(props.options);
9301
9436
  return visible;
9302
9437
  });
9303
- const rows = (0, import_vue31.computed)(() => {
9438
+ const rows = (0, import_vue32.computed)(() => {
9304
9439
  const result = [];
9305
9440
  const walk = (nodes, depth) => {
9306
9441
  nodes.forEach((node) => {
@@ -9375,7 +9510,7 @@ var tree_select_default = {
9375
9510
  onClose: closePanel,
9376
9511
  onReposition: updatePosition
9377
9512
  });
9378
- (0, import_vue31.nextTick)(() => {
9513
+ (0, import_vue32.nextTick)(() => {
9379
9514
  updatePosition();
9380
9515
  if (searchInput.value) searchInput.value.focus();
9381
9516
  });
@@ -9431,7 +9566,7 @@ var tree_select_default = {
9431
9566
  emit("change", []);
9432
9567
  temp.value = [];
9433
9568
  }
9434
- (0, import_vue31.onBeforeUnmount)(() => {
9569
+ (0, import_vue32.onBeforeUnmount)(() => {
9435
9570
  if (detachPanel) {
9436
9571
  detachPanel();
9437
9572
  detachPanel = null;
@@ -9570,10 +9705,10 @@ var tree_select_default = {
9570
9705
  };
9571
9706
 
9572
9707
  // src/components/rich-editor/index.js
9573
- var import_vue33 = require("vue");
9708
+ var import_vue34 = require("vue");
9574
9709
 
9575
9710
  // src/components/media-picker/index.js
9576
- var import_vue32 = require("vue");
9711
+ var import_vue33 = require("vue");
9577
9712
  var media_picker_default = {
9578
9713
  name: "DjmMediaPicker",
9579
9714
  components: { DjmModal: modal_default, DjmPagination: pagination_default, DjmIcon: icon_default },
@@ -9592,11 +9727,11 @@ var media_picker_default = {
9592
9727
  },
9593
9728
  emits: ["update:modelValue", "change"],
9594
9729
  setup(props, { emit }) {
9595
- const open = (0, import_vue32.ref)(false);
9596
- const keyword = (0, import_vue32.ref)("");
9597
- const page = (0, import_vue32.ref)(1);
9598
- const temp = (0, import_vue32.ref)([]);
9599
- const selectedIds = (0, import_vue32.computed)(() => {
9730
+ const open = (0, import_vue33.ref)(false);
9731
+ const keyword = (0, import_vue33.ref)("");
9732
+ const page = (0, import_vue33.ref)(1);
9733
+ const temp = (0, import_vue33.ref)([]);
9734
+ const selectedIds = (0, import_vue33.computed)(() => {
9600
9735
  if (props.multiple) return Array.isArray(props.modelValue) ? props.modelValue : [];
9601
9736
  if (props.modelValue === "" || props.modelValue === null || props.modelValue === void 0) return [];
9602
9737
  return [props.modelValue];
@@ -9605,7 +9740,7 @@ var media_picker_default = {
9605
9740
  if (item.type) return item.type === "image";
9606
9741
  return /\.(png|jpe?g|gif|webp|svg|avif)$/i.test(item.url || "");
9607
9742
  }
9608
- const filtered = (0, import_vue32.computed)(() => {
9743
+ const filtered = (0, import_vue33.computed)(() => {
9609
9744
  const key = keyword.value.trim().toLowerCase();
9610
9745
  return props.items.filter((item) => {
9611
9746
  if (props.accept === "image" && !isImage(item)) return false;
@@ -9614,14 +9749,14 @@ var media_picker_default = {
9614
9749
  return true;
9615
9750
  });
9616
9751
  });
9617
- const paged = (0, import_vue32.computed)(() => {
9752
+ const paged = (0, import_vue33.computed)(() => {
9618
9753
  const start = (page.value - 1) * props.pageSize;
9619
9754
  return filtered.value.slice(start, start + props.pageSize);
9620
9755
  });
9621
- (0, import_vue32.watch)(keyword, () => {
9756
+ (0, import_vue33.watch)(keyword, () => {
9622
9757
  page.value = 1;
9623
9758
  });
9624
- (0, import_vue32.watch)(
9759
+ (0, import_vue33.watch)(
9625
9760
  () => filtered.value.length,
9626
9761
  () => {
9627
9762
  const max = Math.max(1, Math.ceil(filtered.value.length / props.pageSize));
@@ -9955,18 +10090,18 @@ var rich_editor_default = {
9955
10090
  },
9956
10091
  emits: ["update:modelValue", "upload-error"],
9957
10092
  setup(props, { emit }) {
9958
- const editor = (0, import_vue33.ref)(null);
9959
- const fileInput = (0, import_vue33.ref)(null);
9960
- const sourceMode = (0, import_vue33.ref)(false);
9961
- const source = (0, import_vue33.ref)(props.modelValue);
9962
- const fullscreen = (0, import_vue33.ref)(false);
9963
- const panel = (0, import_vue33.ref)("");
9964
- const uploadCount = (0, import_vue33.ref)(0);
9965
- const textColor = (0, import_vue33.ref)(COLORS[0]);
9966
- const bgColor = (0, import_vue33.ref)("#fdf3c4");
9967
- const fontSize = (0, import_vue33.ref)("");
9968
- const count2 = (0, import_vue33.ref)(0);
9969
- const formats = (0, import_vue33.ref)({
10093
+ const editor = (0, import_vue34.ref)(null);
10094
+ const fileInput = (0, import_vue34.ref)(null);
10095
+ const sourceMode = (0, import_vue34.ref)(false);
10096
+ const source = (0, import_vue34.ref)(props.modelValue);
10097
+ const fullscreen = (0, import_vue34.ref)(false);
10098
+ const panel = (0, import_vue34.ref)("");
10099
+ const uploadCount = (0, import_vue34.ref)(0);
10100
+ const textColor = (0, import_vue34.ref)(COLORS[0]);
10101
+ const bgColor = (0, import_vue34.ref)("#fdf3c4");
10102
+ const fontSize = (0, import_vue34.ref)("");
10103
+ const count2 = (0, import_vue34.ref)(0);
10104
+ const formats = (0, import_vue34.ref)({
9970
10105
  bold: false,
9971
10106
  italic: false,
9972
10107
  underline: false,
@@ -9977,15 +10112,15 @@ var rich_editor_default = {
9977
10112
  list: ""
9978
10113
  });
9979
10114
  let savedRange = null;
9980
- const ready = (0, import_vue33.computed)(() => !props.disabled && !sourceMode.value);
9981
- const toolbarGroups = (0, import_vue33.computed)(() => {
10115
+ const ready = (0, import_vue34.computed)(() => !props.disabled && !sourceMode.value);
10116
+ const toolbarGroups = (0, import_vue34.computed)(() => {
9982
10117
  const list = Array.isArray(props.toolbar) ? props.toolbar : TOOLBAR_PRESETS[props.toolbar] || TOOLBAR_PRESETS.full;
9983
10118
  return new Set(list);
9984
10119
  });
9985
10120
  function has(group) {
9986
10121
  return toolbarGroups.value.has(group);
9987
10122
  }
9988
- const mediaLibrary = (0, import_vue33.computed)(
10123
+ const mediaLibrary = (0, import_vue34.computed)(
9989
10124
  () => (props.media || []).map((item, index) => {
9990
10125
  if (typeof item === "string") {
9991
10126
  return { id: "media-" + index, url: item, name: "", type: "image" };
@@ -10360,7 +10495,7 @@ var rich_editor_default = {
10360
10495
  panel.value = "";
10361
10496
  }
10362
10497
  }
10363
- (0, import_vue33.watch)(
10498
+ (0, import_vue34.watch)(
10364
10499
  () => props.modelValue,
10365
10500
  (value) => {
10366
10501
  if (sourceMode.value) {
@@ -10372,14 +10507,14 @@ var rich_editor_default = {
10372
10507
  count2.value = plainText(next).trim().length;
10373
10508
  }
10374
10509
  );
10375
- (0, import_vue33.onMounted)(() => {
10510
+ (0, import_vue34.onMounted)(() => {
10376
10511
  if (editor.value) editor.value.innerHTML = clean(props.modelValue);
10377
10512
  count2.value = plainText(props.modelValue).trim().length;
10378
10513
  document.addEventListener("selectionchange", syncFormats);
10379
10514
  document.addEventListener("click", onDocumentClick);
10380
10515
  document.addEventListener("keydown", onKeydown);
10381
10516
  });
10382
- (0, import_vue33.onBeforeUnmount)(() => {
10517
+ (0, import_vue34.onBeforeUnmount)(() => {
10383
10518
  document.removeEventListener("selectionchange", syncFormats);
10384
10519
  document.removeEventListener("click", onDocumentClick);
10385
10520
  document.removeEventListener("keydown", onKeydown);
@@ -10682,7 +10817,7 @@ var rich_editor_default = {
10682
10817
  };
10683
10818
 
10684
10819
  // src/components/floating-window/index.js
10685
- var import_vue34 = require("vue");
10820
+ var import_vue35 = require("vue");
10686
10821
  function clamp(value, min, max) {
10687
10822
  return Math.min(Math.max(value, min), Math.max(min, max));
10688
10823
  }
@@ -10700,12 +10835,12 @@ var floating_window_default = {
10700
10835
  },
10701
10836
  emits: ["close", "focus"],
10702
10837
  setup(props, { emit }) {
10703
- const root = (0, import_vue34.ref)(null);
10704
- const pos = (0, import_vue34.ref)({ x: props.initialX, y: props.initialY });
10705
- const size = (0, import_vue34.ref)({ w: props.width, h: props.height });
10706
- const minimized = (0, import_vue34.ref)(false);
10707
- const maximized = (0, import_vue34.ref)(false);
10708
- const saved = (0, import_vue34.ref)(null);
10838
+ const root = (0, import_vue35.ref)(null);
10839
+ const pos = (0, import_vue35.ref)({ x: props.initialX, y: props.initialY });
10840
+ const size = (0, import_vue35.ref)({ w: props.width, h: props.height });
10841
+ const minimized = (0, import_vue35.ref)(false);
10842
+ const maximized = (0, import_vue35.ref)(false);
10843
+ const saved = (0, import_vue35.ref)(null);
10709
10844
  let drag = null;
10710
10845
  let resize = null;
10711
10846
  function stage() {
@@ -10793,7 +10928,7 @@ var floating_window_default = {
10793
10928
  }
10794
10929
  emit("focus");
10795
10930
  }
10796
- (0, import_vue34.onBeforeUnmount)(() => {
10931
+ (0, import_vue35.onBeforeUnmount)(() => {
10797
10932
  window.removeEventListener("pointermove", onDrag);
10798
10933
  window.removeEventListener("pointerup", endDrag);
10799
10934
  window.removeEventListener("pointermove", onResize);
@@ -10841,7 +10976,7 @@ var floating_window_default = {
10841
10976
  };
10842
10977
 
10843
10978
  // src/components/upload/index.js
10844
- var import_vue35 = require("vue");
10979
+ var import_vue36 = require("vue");
10845
10980
  var uidSeed6 = 0;
10846
10981
  function extension(name) {
10847
10982
  const index = name.lastIndexOf(".");
@@ -10891,11 +11026,11 @@ var upload_default = {
10891
11026
  },
10892
11027
  emits: ["update:modelValue", "change", "success", "error", "remove", "exceed"],
10893
11028
  setup(props, { emit }) {
10894
- const files = (0, import_vue35.ref)([]);
10895
- const dragActive = (0, import_vue35.ref)(false);
10896
- const inputRef = (0, import_vue35.ref)(null);
11029
+ const files = (0, import_vue36.ref)([]);
11030
+ const dragActive = (0, import_vue36.ref)(false);
11031
+ const inputRef = (0, import_vue36.ref)(null);
10897
11032
  const tasks = /* @__PURE__ */ new Map();
10898
- (0, import_vue35.watch)(
11033
+ (0, import_vue36.watch)(
10899
11034
  () => props.modelValue,
10900
11035
  (list) => {
10901
11036
  const next = list || [];
@@ -10989,7 +11124,7 @@ var upload_default = {
10989
11124
  if (pass === false) continue;
10990
11125
  }
10991
11126
  uidSeed6 += 1;
10992
- const item = (0, import_vue35.reactive)({
11127
+ const item = (0, import_vue36.reactive)({
10993
11128
  uid: uidSeed6,
10994
11129
  name: raw.name,
10995
11130
  size: raw.size,
@@ -11049,7 +11184,7 @@ var upload_default = {
11049
11184
  files.value = [];
11050
11185
  emitList();
11051
11186
  }
11052
- (0, import_vue35.onBeforeUnmount)(() => {
11187
+ (0, import_vue36.onBeforeUnmount)(() => {
11053
11188
  files.value.forEach((item) => {
11054
11189
  if (item.url) URL.revokeObjectURL(item.url);
11055
11190
  });
@@ -11197,7 +11332,7 @@ var upload_default = {
11197
11332
  };
11198
11333
 
11199
11334
  // src/components/tree/index.js
11200
- var import_vue36 = require("vue");
11335
+ var import_vue37 = require("vue");
11201
11336
  var tree_default = {
11202
11337
  name: "DjmTree",
11203
11338
  components: { Icon: icon_default },
@@ -11229,17 +11364,17 @@ var tree_default = {
11229
11364
  },
11230
11365
  emits: ["update:checked", "update:expanded", "node-click", "check", "node-drop", "load-error"],
11231
11366
  setup(props, { emit }) {
11232
- const lazyChildren = (0, import_vue36.ref)({});
11233
- const loadingKeys = (0, import_vue36.ref)([]);
11234
- const innerExpanded = (0, import_vue36.ref)([...props.expanded]);
11235
- const innerChecked = (0, import_vue36.ref)([...props.checked]);
11236
- (0, import_vue36.watch)(
11367
+ const lazyChildren = (0, import_vue37.ref)({});
11368
+ const loadingKeys = (0, import_vue37.ref)([]);
11369
+ const innerExpanded = (0, import_vue37.ref)([...props.expanded]);
11370
+ const innerChecked = (0, import_vue37.ref)([...props.checked]);
11371
+ (0, import_vue37.watch)(
11237
11372
  () => props.expanded,
11238
11373
  (value) => {
11239
11374
  if (Array.isArray(value)) innerExpanded.value = value;
11240
11375
  }
11241
11376
  );
11242
- (0, import_vue36.watch)(
11377
+ (0, import_vue37.watch)(
11243
11378
  () => props.checked,
11244
11379
  (value) => {
11245
11380
  if (Array.isArray(value)) innerChecked.value = value;
@@ -11277,7 +11412,7 @@ var tree_default = {
11277
11412
  });
11278
11413
  return out;
11279
11414
  }
11280
- (0, import_vue36.watch)(
11415
+ (0, import_vue37.watch)(
11281
11416
  () => props.data,
11282
11417
  () => {
11283
11418
  if (props.defaultExpandAll) innerExpanded.value = collectExpandable(props.data);
@@ -11294,7 +11429,7 @@ var tree_default = {
11294
11429
  const children = childrenOf(node);
11295
11430
  return Boolean(children && children.some((child) => matchSubtree(child)));
11296
11431
  }
11297
- const rows = (0, import_vue36.computed)(() => {
11432
+ const rows = (0, import_vue37.computed)(() => {
11298
11433
  const result = [];
11299
11434
  const walk = (nodes, level) => {
11300
11435
  nodes.forEach((node) => {
@@ -11365,8 +11500,8 @@ var tree_default = {
11365
11500
  function isActive(node) {
11366
11501
  return props.activeKey !== "" && node[props.nodeKey] === props.activeKey;
11367
11502
  }
11368
- const rootEl = (0, import_vue36.ref)(null);
11369
- const focusIndex = (0, import_vue36.ref)(-1);
11503
+ const rootEl = (0, import_vue37.ref)(null);
11504
+ const focusIndex = (0, import_vue37.ref)(-1);
11370
11505
  function tabIndexOf(index) {
11371
11506
  return (focusIndex.value === -1 ? 0 : focusIndex.value) === index ? 0 : -1;
11372
11507
  }
@@ -11423,9 +11558,9 @@ var tree_default = {
11423
11558
  function rowClassOf(node, level) {
11424
11559
  return typeof props.rowClass === "function" ? props.rowClass(node, level) : props.rowClass;
11425
11560
  }
11426
- const dragKey = (0, import_vue36.ref)("");
11427
- const dropKey = (0, import_vue36.ref)("");
11428
- const dropPosition = (0, import_vue36.ref)("");
11561
+ const dragKey = (0, import_vue37.ref)("");
11562
+ const dropKey = (0, import_vue37.ref)("");
11563
+ const dropPosition = (0, import_vue37.ref)("");
11429
11564
  function findNodeByKey(key, nodes = props.data) {
11430
11565
  for (const node of nodes) {
11431
11566
  if (node[props.nodeKey] === key) return node;
@@ -11537,7 +11672,7 @@ var tree_default = {
11537
11672
  onDrop,
11538
11673
  onDragEnd,
11539
11674
  labelOf,
11540
- emptyLabel: (0, import_vue36.computed)(() => props.emptyText || t("tree.empty")),
11675
+ emptyLabel: (0, import_vue37.computed)(() => props.emptyText || t("tree.empty")),
11541
11676
  t
11542
11677
  };
11543
11678
  },
@@ -11606,7 +11741,7 @@ var tree_default = {
11606
11741
  };
11607
11742
 
11608
11743
  // src/components/editable-table/index.js
11609
- var import_vue37 = require("vue");
11744
+ var import_vue38 = require("vue");
11610
11745
  var ACTIONS_KEY = "__editable_actions";
11611
11746
  function isEmpty(value) {
11612
11747
  if (value === "" || value === null || value === void 0) return true;
@@ -11629,13 +11764,13 @@ var editable_table_default = {
11629
11764
  },
11630
11765
  emits: ["edit", "save", "cancel"],
11631
11766
  setup(props, { emit }) {
11632
- const slots = (0, import_vue37.useSlots)();
11633
- const editingKey = (0, import_vue37.ref)("");
11634
- const draft = (0, import_vue37.reactive)({});
11635
- const errors = (0, import_vue37.reactive)({});
11636
- const tableRef = (0, import_vue37.ref)(null);
11637
- const editableColumns = (0, import_vue37.computed)(() => props.columns.filter((column) => column.editor));
11638
- const renderColumns = (0, import_vue37.computed)(() => {
11767
+ const slots = (0, import_vue38.useSlots)();
11768
+ const editingKey = (0, import_vue38.ref)("");
11769
+ const draft = (0, import_vue38.reactive)({});
11770
+ const errors = (0, import_vue38.reactive)({});
11771
+ const tableRef = (0, import_vue38.ref)(null);
11772
+ const editableColumns = (0, import_vue38.computed)(() => props.columns.filter((column) => column.editor));
11773
+ const renderColumns = (0, import_vue38.computed)(() => {
11639
11774
  if (!props.showActions) return props.columns;
11640
11775
  return props.columns.concat({
11641
11776
  key: ACTIONS_KEY,
@@ -11647,7 +11782,7 @@ var editable_table_default = {
11647
11782
  exportable: false
11648
11783
  });
11649
11784
  });
11650
- const forwardedSlotNames = (0, import_vue37.computed)(() => {
11785
+ const forwardedSlotNames = (0, import_vue38.computed)(() => {
11651
11786
  const taken = new Set(editableColumns.value.map((column) => "cell-" + column.key));
11652
11787
  taken.add("cell-" + ACTIONS_KEY);
11653
11788
  return Object.keys(slots).filter((name) => !taken.has(name));
@@ -11722,7 +11857,7 @@ var editable_table_default = {
11722
11857
  return false;
11723
11858
  }
11724
11859
  if (!validate()) {
11725
- (0, import_vue37.nextTick)(() => {
11860
+ (0, import_vue38.nextTick)(() => {
11726
11861
  const el = tableRef.value && tableRef.value.$el ? tableRef.value.$el.querySelector(".djm-cell-error") : null;
11727
11862
  if (el) el.scrollIntoView({ block: "nearest" });
11728
11863
  });
@@ -11742,7 +11877,7 @@ var editable_table_default = {
11742
11877
  clearErrors();
11743
11878
  return true;
11744
11879
  }
11745
- (0, import_vue37.watch)(
11880
+ (0, import_vue38.watch)(
11746
11881
  () => props.rows,
11747
11882
  () => {
11748
11883
  if (editingKey.value && !findRow(editingKey.value)) {
@@ -11878,8 +12013,8 @@ var descriptions_default = {
11878
12013
  };
11879
12014
 
11880
12015
  // src/components/message/index.js
11881
- var import_vue38 = require("vue");
11882
- var djmMessages = (0, import_vue38.reactive)([]);
12016
+ var import_vue39 = require("vue");
12017
+ var djmMessages = (0, import_vue39.reactive)([]);
11883
12018
  var seq = 0;
11884
12019
  function close(id) {
11885
12020
  const index = djmMessages.findIndex((item) => item.id === id);
@@ -11924,7 +12059,7 @@ var message_default = {
11924
12059
  };
11925
12060
 
11926
12061
  // src/components/org-picker/index.js
11927
- var import_vue39 = require("vue");
12062
+ var import_vue40 = require("vue");
11928
12063
  var org_picker_default = {
11929
12064
  name: "DjmOrgPicker",
11930
12065
  components: { DjmIcon: icon_default },
@@ -11943,13 +12078,13 @@ var org_picker_default = {
11943
12078
  },
11944
12079
  emits: ["update:modelValue", "change", "visible-change"],
11945
12080
  setup(props, { emit }) {
11946
- const open = (0, import_vue39.ref)(false);
11947
- const root = (0, import_vue39.ref)(null);
11948
- const searchRef = (0, import_vue39.ref)(null);
11949
- const keyword = (0, import_vue39.ref)("");
11950
- const activeDept = (0, import_vue39.ref)("");
11951
- const temp = (0, import_vue39.ref)([]);
11952
- const expandedIds = (0, import_vue39.ref)(/* @__PURE__ */ new Set());
12081
+ const open = (0, import_vue40.ref)(false);
12082
+ const root = (0, import_vue40.ref)(null);
12083
+ const searchRef = (0, import_vue40.ref)(null);
12084
+ const keyword = (0, import_vue40.ref)("");
12085
+ const activeDept = (0, import_vue40.ref)("");
12086
+ const temp = (0, import_vue40.ref)([]);
12087
+ const expandedIds = (0, import_vue40.ref)(/* @__PURE__ */ new Set());
11953
12088
  let detachPanel = null;
11954
12089
  function collectDeptIds(nodes, out = []) {
11955
12090
  nodes.forEach((node) => {
@@ -11979,22 +12114,22 @@ var org_picker_default = {
11979
12114
  walk([root2]);
11980
12115
  return ids;
11981
12116
  }
11982
- const staffMap = (0, import_vue39.computed)(() => {
12117
+ const staffMap = (0, import_vue40.computed)(() => {
11983
12118
  const map = /* @__PURE__ */ new Map();
11984
12119
  props.staff.forEach((item) => map.set(item.id, item));
11985
12120
  return map;
11986
12121
  });
11987
- const appliedStaff = (0, import_vue39.computed)(
12122
+ const appliedStaff = (0, import_vue40.computed)(
11988
12123
  () => props.modelValue.map((id) => staffMap.value.get(id)).filter(Boolean)
11989
12124
  );
11990
- const visibleTags = (0, import_vue39.computed)(() => {
12125
+ const visibleTags = (0, import_vue40.computed)(() => {
11991
12126
  if (props.maxTagCount <= 0) return appliedStaff.value;
11992
12127
  return appliedStaff.value.slice(0, props.maxTagCount);
11993
12128
  });
11994
- const restTagCount = (0, import_vue39.computed)(
12129
+ const restTagCount = (0, import_vue40.computed)(
11995
12130
  () => Math.max(0, appliedStaff.value.length - visibleTags.value.length)
11996
12131
  );
11997
- const visibleStaff = (0, import_vue39.computed)(() => {
12132
+ const visibleStaff = (0, import_vue40.computed)(() => {
11998
12133
  const key = keyword.value.trim().toLowerCase();
11999
12134
  if (key) {
12000
12135
  return props.staff.filter(
@@ -12005,7 +12140,7 @@ var org_picker_default = {
12005
12140
  const scope = deptScope(activeDept.value);
12006
12141
  return props.staff.filter((item) => scope.has(item.deptId));
12007
12142
  });
12008
- const deptRows = (0, import_vue39.computed)(() => {
12143
+ const deptRows = (0, import_vue40.computed)(() => {
12009
12144
  const rows = [];
12010
12145
  const walk = (nodes, depth) => {
12011
12146
  nodes.forEach((node) => {
@@ -12017,11 +12152,11 @@ var org_picker_default = {
12017
12152
  walk(props.departments, 0);
12018
12153
  return rows;
12019
12154
  });
12020
- const selectedCount = (0, import_vue39.computed)(() => temp.value.length);
12021
- const placeholderText = (0, import_vue39.computed)(() => props.placeholder || t("orgPicker.placeholder"));
12022
- const emptyLabel = (0, import_vue39.computed)(() => props.emptyText || t("orgPicker.empty"));
12023
- const panel = (0, import_vue39.ref)(null);
12024
- const panelStyle = (0, import_vue39.ref)({ ...PANEL_HIDDEN_STYLE });
12155
+ const selectedCount = (0, import_vue40.computed)(() => temp.value.length);
12156
+ const placeholderText = (0, import_vue40.computed)(() => props.placeholder || t("orgPicker.placeholder"));
12157
+ const emptyLabel = (0, import_vue40.computed)(() => props.emptyText || t("orgPicker.empty"));
12158
+ const panel = (0, import_vue40.ref)(null);
12159
+ const panelStyle = (0, import_vue40.ref)({ ...PANEL_HIDDEN_STYLE });
12025
12160
  const PANEL_HEIGHT = 342;
12026
12161
  function updatePosition() {
12027
12162
  if (!open.value || !root.value) return;
@@ -12038,7 +12173,7 @@ var org_picker_default = {
12038
12173
  expandedIds.value = new Set(collectDeptIds(props.departments));
12039
12174
  }
12040
12175
  expandAll();
12041
- (0, import_vue39.watch)(() => props.departments, () => {
12176
+ (0, import_vue40.watch)(() => props.departments, () => {
12042
12177
  expandedIds.value = /* @__PURE__ */ new Set([...expandedIds.value, ...collectDeptIds(props.departments)]);
12043
12178
  });
12044
12179
  function initialOf(item) {
@@ -12127,7 +12262,7 @@ var org_picker_default = {
12127
12262
  function clearTemp() {
12128
12263
  temp.value = [];
12129
12264
  }
12130
- (0, import_vue39.onBeforeUnmount)(() => {
12265
+ (0, import_vue40.onBeforeUnmount)(() => {
12131
12266
  if (detachPanel) {
12132
12267
  detachPanel();
12133
12268
  detachPanel = null;
@@ -12313,7 +12448,7 @@ var org_picker_default = {
12313
12448
  };
12314
12449
 
12315
12450
  // src/components/schema-form/index.js
12316
- var import_vue40 = require("vue");
12451
+ var import_vue41 = require("vue");
12317
12452
  var CONTROL_MAP = {
12318
12453
  input: input_default,
12319
12454
  number: input_number_default,
@@ -12349,26 +12484,26 @@ var schema_form_default = {
12349
12484
  },
12350
12485
  emits: ["update:modelValue", "change"],
12351
12486
  setup(props, { emit }) {
12352
- const innerForm = (0, import_vue40.ref)(null);
12353
- const model = (0, import_vue40.reactive)({ ...props.modelValue });
12354
- (0, import_vue40.watch)(() => props.fields, (fields) => {
12487
+ const innerForm = (0, import_vue41.ref)(null);
12488
+ const model = (0, import_vue41.reactive)({ ...props.modelValue });
12489
+ (0, import_vue41.watch)(() => props.fields, (fields) => {
12355
12490
  fields.forEach((field) => {
12356
12491
  if (model[field.key] === void 0 && field.default !== void 0) {
12357
12492
  model[field.key] = typeof field.default === "function" ? field.default() : field.default;
12358
12493
  }
12359
12494
  });
12360
12495
  }, { immediate: true, deep: true });
12361
- (0, import_vue40.watch)(() => props.modelValue, (value) => {
12496
+ (0, import_vue41.watch)(() => props.modelValue, (value) => {
12362
12497
  if (!value) return;
12363
12498
  Object.keys(value).forEach((key) => {
12364
12499
  if (model[key] !== value[key]) model[key] = value[key];
12365
12500
  });
12366
12501
  }, { deep: true });
12367
- (0, import_vue40.watch)(model, () => {
12502
+ (0, import_vue41.watch)(model, () => {
12368
12503
  emit("update:modelValue", { ...model });
12369
12504
  emit("change", { ...model });
12370
12505
  }, { deep: true });
12371
- const formRules = (0, import_vue40.computed)(() => {
12506
+ const formRules = (0, import_vue41.computed)(() => {
12372
12507
  const merged = { ...props.rules };
12373
12508
  props.fields.forEach((field) => {
12374
12509
  if (!field.required && !field.rules) return;
@@ -12381,7 +12516,7 @@ var schema_form_default = {
12381
12516
  });
12382
12517
  return merged;
12383
12518
  });
12384
- const visibleFields = (0, import_vue40.computed)(
12519
+ const visibleFields = (0, import_vue41.computed)(
12385
12520
  () => props.fields.filter((field) => {
12386
12521
  if (typeof field.visibleWhen !== "function") return true;
12387
12522
  return Boolean(field.visibleWhen(model));
@@ -12575,7 +12710,7 @@ var approval_flow_default = {
12575
12710
  };
12576
12711
 
12577
12712
  // src/components/query-filter/index.js
12578
- var import_vue41 = require("vue");
12713
+ var import_vue42 = require("vue");
12579
12714
  var CONTROL_MAP2 = {
12580
12715
  input: input_default,
12581
12716
  number: input_number_default,
@@ -12600,26 +12735,26 @@ var query_filter_default = {
12600
12735
  },
12601
12736
  emits: ["update:modelValue", "search", "reset"],
12602
12737
  setup(props, { emit }) {
12603
- const expanded = (0, import_vue41.ref)(false);
12604
- const model = (0, import_vue41.reactive)({ ...props.modelValue });
12605
- (0, import_vue41.watch)(() => props.fields, (fields) => {
12738
+ const expanded = (0, import_vue42.ref)(false);
12739
+ const model = (0, import_vue42.reactive)({ ...props.modelValue });
12740
+ (0, import_vue42.watch)(() => props.fields, (fields) => {
12606
12741
  fields.forEach((field) => {
12607
12742
  if (model[field.key] === void 0 && field.default !== void 0) {
12608
12743
  model[field.key] = typeof field.default === "function" ? field.default() : field.default;
12609
12744
  }
12610
12745
  });
12611
12746
  }, { immediate: true, deep: true });
12612
- (0, import_vue41.watch)(() => props.modelValue, (value) => {
12747
+ (0, import_vue42.watch)(() => props.modelValue, (value) => {
12613
12748
  if (!value) return;
12614
12749
  Object.keys(value).forEach((key) => {
12615
12750
  if (model[key] !== value[key]) model[key] = value[key];
12616
12751
  });
12617
12752
  }, { deep: true });
12618
- (0, import_vue41.watch)(model, () => {
12753
+ (0, import_vue42.watch)(model, () => {
12619
12754
  emit("update:modelValue", { ...model });
12620
12755
  }, { deep: true });
12621
- const collapsible = (0, import_vue41.computed)(() => props.fields.length > props.visibleCount);
12622
- const visibleFields = (0, import_vue41.computed)(() => {
12756
+ const collapsible = (0, import_vue42.computed)(() => props.fields.length > props.visibleCount);
12757
+ const visibleFields = (0, import_vue42.computed)(() => {
12623
12758
  if (!collapsible.value || expanded.value) return props.fields;
12624
12759
  return props.fields.slice(0, props.visibleCount);
12625
12760
  });
@@ -12749,7 +12884,7 @@ var filter_tags_default = {
12749
12884
  };
12750
12885
 
12751
12886
  // src/components/kanban/index.js
12752
- var import_vue42 = require("vue");
12887
+ var import_vue43 = require("vue");
12753
12888
  function cloneColumns(list) {
12754
12889
  return (list || []).map((col) => ({ ...col, cards: (col.cards || []).slice() }));
12755
12890
  }
@@ -12766,15 +12901,15 @@ var kanban_default = {
12766
12901
  },
12767
12902
  emits: ["update:columns", "change", "card-move", "card-click", "card-add"],
12768
12903
  setup(props, { emit }) {
12769
- const inner = (0, import_vue42.ref)(cloneColumns(props.columns));
12770
- (0, import_vue42.watch)(
12904
+ const inner = (0, import_vue43.ref)(cloneColumns(props.columns));
12905
+ (0, import_vue43.watch)(
12771
12906
  () => props.columns,
12772
12907
  (list) => {
12773
12908
  inner.value = cloneColumns(list);
12774
12909
  }
12775
12910
  );
12776
- const dragCard = (0, import_vue42.ref)(null);
12777
- const dropTarget = (0, import_vue42.ref)(null);
12911
+ const dragCard = (0, import_vue43.ref)(null);
12912
+ const dropTarget = (0, import_vue43.ref)(null);
12778
12913
  function columnOf(key) {
12779
12914
  return inner.value.find((col) => col.key === key);
12780
12915
  }
@@ -12937,7 +13072,7 @@ var kanban_default = {
12937
13072
  };
12938
13073
 
12939
13074
  // src/components/attachment-list/index.js
12940
- var import_vue43 = require("vue");
13075
+ var import_vue44 = require("vue");
12941
13076
  var IMAGE_EXTS = ["png", "jpg", "jpeg", "gif", "webp", "bmp", "svg"];
12942
13077
  function extOf(file) {
12943
13078
  if (file.ext) return String(file.ext).toLowerCase();
@@ -12961,14 +13096,14 @@ var attachment_list_default = {
12961
13096
  },
12962
13097
  emits: ["preview", "download", "remove"],
12963
13098
  setup(props, { emit }) {
12964
- const list = (0, import_vue43.computed)(
13099
+ const list = (0, import_vue44.computed)(
12965
13100
  () => props.files.map((file, index) => {
12966
13101
  const ext = extOf(file);
12967
13102
  const isImage = file.type === "image" || IMAGE_EXTS.includes(ext);
12968
13103
  return { ...file, _key: file.uid !== void 0 ? file.uid : index, _ext: ext, _isImage: isImage };
12969
13104
  })
12970
13105
  );
12971
- const emptyLabel = (0, import_vue43.computed)(() => props.emptyText || t("attachment.empty"));
13106
+ const emptyLabel = (0, import_vue44.computed)(() => props.emptyText || t("attachment.empty"));
12972
13107
  function onPreview(file) {
12973
13108
  emit("preview", file);
12974
13109
  }
@@ -13074,7 +13209,7 @@ var attachment_list_default = {
13074
13209
  };
13075
13210
 
13076
13211
  // src/components/notification/index.js
13077
- var import_vue44 = require("vue");
13212
+ var import_vue45 = require("vue");
13078
13213
  var TYPE_MAP = {
13079
13214
  info: { icon: "info", cls: "djm-is-info" },
13080
13215
  success: { icon: "check", cls: "djm-is-success" },
@@ -13094,8 +13229,8 @@ var notification_default = {
13094
13229
  },
13095
13230
  emits: ["click", "read", "read-all", "remove", "clear"],
13096
13231
  setup(props, { emit }) {
13097
- const unreadCount = (0, import_vue44.computed)(() => props.items.filter((item) => !item.read).length);
13098
- const emptyLabel = (0, import_vue44.computed)(() => props.emptyText || t("notification.empty"));
13232
+ const unreadCount = (0, import_vue45.computed)(() => props.items.filter((item) => !item.read).length);
13233
+ const emptyLabel = (0, import_vue45.computed)(() => props.emptyText || t("notification.empty"));
13099
13234
  function typeOf(item) {
13100
13235
  return TYPE_MAP[item.type] || TYPE_MAP.info;
13101
13236
  }
@@ -13106,7 +13241,7 @@ var notification_default = {
13106
13241
  function onReadAll() {
13107
13242
  emit("read-all");
13108
13243
  }
13109
- const clearing = (0, import_vue44.ref)(false);
13244
+ const clearing = (0, import_vue45.ref)(false);
13110
13245
  let clearTimer = null;
13111
13246
  function onClear() {
13112
13247
  if (!clearing.value) {
@@ -13120,7 +13255,7 @@ var notification_default = {
13120
13255
  clearing.value = false;
13121
13256
  emit("clear");
13122
13257
  }
13123
- (0, import_vue44.onBeforeUnmount)(() => window.clearTimeout(clearTimer));
13258
+ (0, import_vue45.onBeforeUnmount)(() => window.clearTimeout(clearTimer));
13124
13259
  function onRemove(item) {
13125
13260
  emit("remove", item);
13126
13261
  }
@@ -13195,7 +13330,7 @@ var notification_default = {
13195
13330
  };
13196
13331
 
13197
13332
  // src/components/config-provider/index.js
13198
- var import_vue45 = require("vue");
13333
+ var import_vue46 = require("vue");
13199
13334
  var SIZE_HEIGHT = { xs: "24px", sm: "28px", md: "30px", lg: "34px" };
13200
13335
  var config_provider_default = {
13201
13336
  name: "DjmConfigProvider",
@@ -13205,7 +13340,7 @@ var config_provider_default = {
13205
13340
  },
13206
13341
  setup(props) {
13207
13342
  if (props.locale) setLocale(props.locale);
13208
- (0, import_vue45.watch)(
13343
+ (0, import_vue46.watch)(
13209
13344
  () => props.locale,
13210
13345
  (code) => {
13211
13346
  if (code) setLocale(code);
@@ -13227,7 +13362,7 @@ var config_provider_default = {
13227
13362
  };
13228
13363
 
13229
13364
  // src/components/date-time-picker/index.js
13230
- var import_vue46 = require("vue");
13365
+ var import_vue47 = require("vue");
13231
13366
  var uidSeed7 = 0;
13232
13367
  var pad4 = (value) => String(value).padStart(2, "0");
13233
13368
  function toDateKey(year, month, day) {
@@ -13260,31 +13395,31 @@ var date_time_picker_default = {
13260
13395
  },
13261
13396
  emits: ["update:modelValue", "change", "visible-change"],
13262
13397
  setup(props, { emit }) {
13263
- const open = (0, import_vue46.ref)(false);
13264
- (0, import_vue46.watch)(open, (value) => emit("visible-change", value));
13265
- const root = (0, import_vue46.ref)(null);
13266
- const panel = (0, import_vue46.ref)(null);
13398
+ const open = (0, import_vue47.ref)(false);
13399
+ (0, import_vue47.watch)(open, (value) => emit("visible-change", value));
13400
+ const root = (0, import_vue47.ref)(null);
13401
+ const panel = (0, import_vue47.ref)(null);
13267
13402
  const panelId = "djm-datetime-panel-" + ++uidSeed7;
13268
- const panelStyle = (0, import_vue46.ref)({ ...PANEL_HIDDEN_STYLE });
13403
+ const panelStyle = (0, import_vue47.ref)({ ...PANEL_HIDDEN_STYLE });
13269
13404
  let detachPanel = null;
13270
13405
  const today = /* @__PURE__ */ new Date();
13271
13406
  const todayKey = toDateKey(today.getFullYear(), today.getMonth(), today.getDate());
13272
- const hasSeconds = (0, import_vue46.computed)(() => props.format.indexOf("ss") > -1);
13273
- const draft = (0, import_vue46.ref)({ date: "", h: "00", m: "00", s: "00" });
13407
+ const hasSeconds = (0, import_vue47.computed)(() => props.format.indexOf("ss") > -1);
13408
+ const draft = (0, import_vue47.ref)({ date: "", h: "00", m: "00", s: "00" });
13274
13409
  const initial = parseDate(parseValue(props.modelValue).date);
13275
- const viewYear = (0, import_vue46.ref)(initial ? initial.year : today.getFullYear());
13276
- const viewMonth = (0, import_vue46.ref)(initial ? initial.month : today.getMonth());
13277
- const displayText = (0, import_vue46.computed)(() => props.modelValue || "");
13278
- const placeholderText = (0, import_vue46.computed)(() => props.placeholder || t("dateTimePicker.placeholder"));
13279
- const weeks = (0, import_vue46.computed)(() => t("datePicker.weeks").split(","));
13280
- const hours = (0, import_vue46.computed)(() => Array.from({ length: 24 }, (_, index) => pad4(index)));
13281
- const minutes = (0, import_vue46.computed)(() => {
13410
+ const viewYear = (0, import_vue47.ref)(initial ? initial.year : today.getFullYear());
13411
+ const viewMonth = (0, import_vue47.ref)(initial ? initial.month : today.getMonth());
13412
+ const displayText = (0, import_vue47.computed)(() => props.modelValue || "");
13413
+ const placeholderText = (0, import_vue47.computed)(() => props.placeholder || t("dateTimePicker.placeholder"));
13414
+ const weeks = (0, import_vue47.computed)(() => t("datePicker.weeks").split(","));
13415
+ const hours = (0, import_vue47.computed)(() => Array.from({ length: 24 }, (_, index) => pad4(index)));
13416
+ const minutes = (0, import_vue47.computed)(() => {
13282
13417
  const list = [];
13283
13418
  for (let value = 0; value < 60; value += Math.max(1, props.minuteStep)) list.push(pad4(value));
13284
13419
  return list;
13285
13420
  });
13286
- const seconds = (0, import_vue46.computed)(() => Array.from({ length: 60 }, (_, index) => pad4(index)));
13287
- const timeCols = (0, import_vue46.computed)(() => {
13421
+ const seconds = (0, import_vue47.computed)(() => Array.from({ length: 60 }, (_, index) => pad4(index)));
13422
+ const timeCols = (0, import_vue47.computed)(() => {
13288
13423
  const cols = [
13289
13424
  { key: "h", list: hours.value },
13290
13425
  { key: "m", list: minutes.value }
@@ -13292,8 +13427,8 @@ var date_time_picker_default = {
13292
13427
  if (hasSeconds.value) cols.push({ key: "s", list: seconds.value });
13293
13428
  return cols;
13294
13429
  });
13295
- const monthLabel = (0, import_vue46.computed)(() => t("datePicker.title", { year: viewYear.value, month: viewMonth.value + 1 }));
13296
- const cells = (0, import_vue46.computed)(() => {
13430
+ const monthLabel = (0, import_vue47.computed)(() => t("datePicker.title", { year: viewYear.value, month: viewMonth.value + 1 }));
13431
+ const cells = (0, import_vue47.computed)(() => {
13297
13432
  const first = new Date(viewYear.value, viewMonth.value, 1);
13298
13433
  const offset = (first.getDay() + 6) % 7;
13299
13434
  const start = new Date(viewYear.value, viewMonth.value, 1 - offset);
@@ -13429,7 +13564,7 @@ var date_time_picker_default = {
13429
13564
  emit("change", "");
13430
13565
  closePanel();
13431
13566
  }
13432
- (0, import_vue46.onBeforeUnmount)(() => {
13567
+ (0, import_vue47.onBeforeUnmount)(() => {
13433
13568
  if (detachPanel) {
13434
13569
  detachPanel();
13435
13570
  detachPanel = null;
@@ -13554,7 +13689,7 @@ var date_time_picker_default = {
13554
13689
  };
13555
13690
 
13556
13691
  // src/components/virtual-list/index.js
13557
- var import_vue47 = require("vue");
13692
+ var import_vue48 = require("vue");
13558
13693
  var virtual_list_default = {
13559
13694
  name: "DjmVirtualList",
13560
13695
  props: {
@@ -13571,14 +13706,14 @@ var virtual_list_default = {
13571
13706
  },
13572
13707
  emits: ["scroll", "reach-bottom", "item-click"],
13573
13708
  setup(props, { emit, expose }) {
13574
- const viewport = (0, import_vue47.ref)(null);
13575
- const scrollTop = (0, import_vue47.ref)(0);
13576
- const viewHeight = (0, import_vue47.ref)(typeof props.height === "number" ? props.height : 320);
13709
+ const viewport = (0, import_vue48.ref)(null);
13710
+ const scrollTop = (0, import_vue48.ref)(0);
13711
+ const viewHeight = (0, import_vue48.ref)(typeof props.height === "number" ? props.height : 320);
13577
13712
  let bottomFired = false;
13578
13713
  function rowHeight(item, index) {
13579
13714
  return typeof props.itemHeight === "function" ? Math.max(1, Number(props.itemHeight(item, index)) || 1) : Math.max(1, props.itemHeight);
13580
13715
  }
13581
- const offsets = (0, import_vue47.computed)(() => {
13716
+ const offsets = (0, import_vue48.computed)(() => {
13582
13717
  const list = [0];
13583
13718
  let sum = 0;
13584
13719
  props.items.forEach((item, index) => {
@@ -13587,7 +13722,7 @@ var virtual_list_default = {
13587
13722
  });
13588
13723
  return list;
13589
13724
  });
13590
- const totalHeight = (0, import_vue47.computed)(() => offsets.value[offsets.value.length - 1]);
13725
+ const totalHeight = (0, import_vue48.computed)(() => offsets.value[offsets.value.length - 1]);
13591
13726
  function findStart(top) {
13592
13727
  const list = offsets.value;
13593
13728
  let low = 0;
@@ -13599,7 +13734,7 @@ var virtual_list_default = {
13599
13734
  }
13600
13735
  return Math.max(0, low - 1);
13601
13736
  }
13602
- const range = (0, import_vue47.computed)(() => {
13737
+ const range = (0, import_vue48.computed)(() => {
13603
13738
  const total = props.items.length;
13604
13739
  if (!total) return { start: 0, end: 0 };
13605
13740
  const start = Math.max(0, findStart(scrollTop.value) - props.overscan);
@@ -13608,7 +13743,7 @@ var virtual_list_default = {
13608
13743
  while (end < total && offsets.value[end] < limit) end += 1;
13609
13744
  return { start, end: Math.min(total, end + props.overscan) };
13610
13745
  });
13611
- const visibleRows = (0, import_vue47.computed)(() => {
13746
+ const visibleRows = (0, import_vue48.computed)(() => {
13612
13747
  const { start, end } = range.value;
13613
13748
  return props.items.slice(start, end).map((item, index) => {
13614
13749
  const realIndex = start + index;
@@ -13643,7 +13778,7 @@ var virtual_list_default = {
13643
13778
  else if (start < el.scrollTop) el.scrollTop = start;
13644
13779
  else if (end > el.scrollTop + el.clientHeight) el.scrollTop = end - el.clientHeight;
13645
13780
  }
13646
- (0, import_vue47.watch)(
13781
+ (0, import_vue48.watch)(
13647
13782
  () => props.height,
13648
13783
  () => {
13649
13784
  if (viewport.value) viewHeight.value = viewport.value.clientHeight;
@@ -13653,14 +13788,14 @@ var virtual_list_default = {
13653
13788
  if (viewport.value) viewHeight.value = viewport.value.clientHeight;
13654
13789
  }
13655
13790
  let resizeObserver = null;
13656
- (0, import_vue47.onMounted)(() => {
13791
+ (0, import_vue48.onMounted)(() => {
13657
13792
  measure();
13658
13793
  if (window.ResizeObserver && viewport.value) {
13659
13794
  resizeObserver = new ResizeObserver(() => measure());
13660
13795
  resizeObserver.observe(viewport.value);
13661
13796
  }
13662
13797
  });
13663
- (0, import_vue47.onBeforeUnmount)(() => {
13798
+ (0, import_vue48.onBeforeUnmount)(() => {
13664
13799
  if (resizeObserver) resizeObserver.disconnect();
13665
13800
  });
13666
13801
  function onItemClick(row) {
@@ -13705,7 +13840,7 @@ var virtual_list_default = {
13705
13840
  };
13706
13841
 
13707
13842
  // src/components/batch-bar/index.js
13708
- var import_vue48 = require("vue");
13843
+ var import_vue49 = require("vue");
13709
13844
  var batch_bar_default = {
13710
13845
  name: "DjmBatchBar",
13711
13846
  props: {
@@ -13720,8 +13855,8 @@ var batch_bar_default = {
13720
13855
  },
13721
13856
  emits: ["clear", "select-all"],
13722
13857
  setup(props, { emit }) {
13723
- const text = (0, import_vue48.computed)(() => props.label || t("batchBar.selected", { count: props.count }));
13724
- const canSelectAll = (0, import_vue48.computed)(() => props.total > props.count);
13858
+ const text = (0, import_vue49.computed)(() => props.label || t("batchBar.selected", { count: props.count }));
13859
+ const canSelectAll = (0, import_vue49.computed)(() => props.total > props.count);
13725
13860
  return {
13726
13861
  text,
13727
13862
  canSelectAll,
@@ -13749,7 +13884,7 @@ var batch_bar_default = {
13749
13884
  };
13750
13885
 
13751
13886
  // src/components/import-wizard/index.js
13752
- var import_vue49 = require("vue");
13887
+ var import_vue50 = require("vue");
13753
13888
  function matchAccept2(name, accept) {
13754
13889
  if (!accept) return true;
13755
13890
  const ext = "." + String(name).split(".").pop().toLowerCase();
@@ -13776,19 +13911,19 @@ var import_wizard_default = {
13776
13911
  },
13777
13912
  emits: ["update:step", "update:mapping", "file-change", "submit", "retry"],
13778
13913
  setup(props, { emit }) {
13779
- const innerStep = (0, import_vue49.ref)(props.step || 1);
13780
- (0, import_vue49.watch)(
13914
+ const innerStep = (0, import_vue50.ref)(props.step || 1);
13915
+ (0, import_vue50.watch)(
13781
13916
  () => props.step,
13782
13917
  (value) => {
13783
13918
  if (value) innerStep.value = value;
13784
13919
  }
13785
13920
  );
13786
- const file = (0, import_vue49.ref)(null);
13787
- const fileError = (0, import_vue49.ref)("");
13788
- const mappingError = (0, import_vue49.ref)("");
13789
- const fileInput = (0, import_vue49.ref)(null);
13790
- const innerMapping = (0, import_vue49.ref)({ ...props.mapping });
13791
- (0, import_vue49.watch)(
13921
+ const file = (0, import_vue50.ref)(null);
13922
+ const fileError = (0, import_vue50.ref)("");
13923
+ const mappingError = (0, import_vue50.ref)("");
13924
+ const fileInput = (0, import_vue50.ref)(null);
13925
+ const innerMapping = (0, import_vue50.ref)({ ...props.mapping });
13926
+ (0, import_vue50.watch)(
13792
13927
  () => props.mapping,
13793
13928
  (value) => {
13794
13929
  innerMapping.value = { ...value };
@@ -13799,7 +13934,7 @@ var import_wizard_default = {
13799
13934
  innerStep.value = next;
13800
13935
  emit("update:step", next);
13801
13936
  }
13802
- const steps = (0, import_vue49.computed)(() => [
13937
+ const steps = (0, import_vue50.computed)(() => [
13803
13938
  { index: 1, title: t("importWizard.stepFile") },
13804
13939
  { index: 2, title: t("importWizard.stepMapping") },
13805
13940
  { index: 3, title: t("importWizard.stepResult") }
@@ -13841,7 +13976,7 @@ var import_wizard_default = {
13841
13976
  mappingError.value = "";
13842
13977
  emit("update:mapping", next);
13843
13978
  }
13844
- const missingRequired = (0, import_vue49.computed)(
13979
+ const missingRequired = (0, import_vue50.computed)(
13845
13980
  () => props.columns.filter((col) => col.required && !innerMapping.value[col.key])
13846
13981
  );
13847
13982
  function submit() {
@@ -13853,7 +13988,7 @@ var import_wizard_default = {
13853
13988
  }
13854
13989
  emit("submit", { ...innerMapping.value });
13855
13990
  }
13856
- (0, import_vue49.watch)(
13991
+ (0, import_vue50.watch)(
13857
13992
  () => props.result,
13858
13993
  (value) => {
13859
13994
  if (value && (value.total || value.success || value.failed || value.errors && value.errors.length)) {
@@ -13874,7 +14009,7 @@ var import_wizard_default = {
13874
14009
  emit("retry");
13875
14010
  goStep(2);
13876
14011
  }
13877
- const stats = (0, import_vue49.computed)(() => {
14012
+ const stats = (0, import_vue50.computed)(() => {
13878
14013
  const data = props.result || {};
13879
14014
  return {
13880
14015
  total: data.total || 0,
@@ -14020,7 +14155,7 @@ var import_wizard_default = {
14020
14155
  };
14021
14156
 
14022
14157
  // src/components/diff/index.js
14023
- var import_vue50 = require("vue");
14158
+ var import_vue51 = require("vue");
14024
14159
 
14025
14160
  // src/utils/text-diff.js
14026
14161
  var MAX_CELLS = 1e6;
@@ -14084,8 +14219,8 @@ var diff_default = {
14084
14219
  afterLabel: { type: String, default: "" }
14085
14220
  },
14086
14221
  setup(props) {
14087
- const rows = (0, import_vue50.computed)(() => diffLines(props.before, props.after));
14088
- const stats = (0, import_vue50.computed)(() => {
14222
+ const rows = (0, import_vue51.computed)(() => diffLines(props.before, props.after));
14223
+ const stats = (0, import_vue51.computed)(() => {
14089
14224
  let add = 0;
14090
14225
  let remove = 0;
14091
14226
  rows.value.forEach((row) => {
@@ -14094,11 +14229,11 @@ var diff_default = {
14094
14229
  });
14095
14230
  return { add, remove };
14096
14231
  });
14097
- const expandedBlocks = (0, import_vue50.ref)([]);
14232
+ const expandedBlocks = (0, import_vue51.ref)([]);
14098
14233
  function expand(index) {
14099
14234
  expandedBlocks.value = expandedBlocks.value.concat(index);
14100
14235
  }
14101
- const displayRows = (0, import_vue50.computed)(() => {
14236
+ const displayRows = (0, import_vue51.computed)(() => {
14102
14237
  const ctx = Math.max(0, props.context);
14103
14238
  const list = rows.value;
14104
14239
  if (!ctx) return list;
@@ -14129,7 +14264,7 @@ var diff_default = {
14129
14264
  }
14130
14265
  return out;
14131
14266
  });
14132
- const splitRows = (0, import_vue50.computed)(() => {
14267
+ const splitRows = (0, import_vue51.computed)(() => {
14133
14268
  const list = displayRows.value;
14134
14269
  const out = [];
14135
14270
  let i = 0;
@@ -14154,8 +14289,8 @@ var diff_default = {
14154
14289
  }
14155
14290
  return out;
14156
14291
  });
14157
- const beforeLabelText = (0, import_vue50.computed)(() => props.beforeLabel || t("diff.before"));
14158
- const afterLabelText = (0, import_vue50.computed)(() => props.afterLabel || t("diff.after"));
14292
+ const beforeLabelText = (0, import_vue51.computed)(() => props.beforeLabel || t("diff.before"));
14293
+ const afterLabelText = (0, import_vue51.computed)(() => props.afterLabel || t("diff.after"));
14159
14294
  return {
14160
14295
  stats,
14161
14296
  displayRows,
@@ -14221,7 +14356,7 @@ var diff_default = {
14221
14356
  };
14222
14357
 
14223
14358
  // src/components/tree-table/index.js
14224
- var import_vue51 = require("vue");
14359
+ var import_vue52 = require("vue");
14225
14360
  function keyOf(row, rowKey) {
14226
14361
  return row && row[rowKey] !== void 0 ? row[rowKey] : row && row.id;
14227
14362
  }
@@ -14260,23 +14395,23 @@ var tree_table_default = {
14260
14395
  eachNode(props.data, (row) => keys.push(keyOf(row, props.rowKey)));
14261
14396
  return keys;
14262
14397
  }
14263
- const innerExpanded = (0, import_vue51.ref)(
14398
+ const innerExpanded = (0, import_vue52.ref)(
14264
14399
  props.expandedKeys ? props.expandedKeys.slice() : props.defaultExpandAll ? allKeys() : []
14265
14400
  );
14266
- (0, import_vue51.watch)(
14401
+ (0, import_vue52.watch)(
14267
14402
  () => props.expandedKeys,
14268
14403
  (value) => {
14269
14404
  if (value) innerExpanded.value = value.slice();
14270
14405
  }
14271
14406
  );
14272
- const innerChecked = (0, import_vue51.ref)(props.checkedKeys ? props.checkedKeys.slice() : []);
14273
- (0, import_vue51.watch)(
14407
+ const innerChecked = (0, import_vue52.ref)(props.checkedKeys ? props.checkedKeys.slice() : []);
14408
+ (0, import_vue52.watch)(
14274
14409
  () => props.checkedKeys,
14275
14410
  (value) => {
14276
14411
  if (value) innerChecked.value = value.slice();
14277
14412
  }
14278
14413
  );
14279
- const rows = (0, import_vue51.computed)(() => {
14414
+ const rows = (0, import_vue52.computed)(() => {
14280
14415
  const out = [];
14281
14416
  function walk(list, level, parentKey) {
14282
14417
  ;
@@ -14291,7 +14426,7 @@ var tree_table_default = {
14291
14426
  walk(props.data, 1, null);
14292
14427
  return out;
14293
14428
  });
14294
- const descendantMap = (0, import_vue51.computed)(() => {
14429
+ const descendantMap = (0, import_vue52.computed)(() => {
14295
14430
  const map = {};
14296
14431
  function collect(row) {
14297
14432
  const key = keyOf(row, props.rowKey);
@@ -14306,16 +14441,16 @@ var tree_table_default = {
14306
14441
  (props.data || []).forEach(collect);
14307
14442
  return map;
14308
14443
  });
14309
- const leafKeys = (0, import_vue51.computed)(() => {
14444
+ const leafKeys = (0, import_vue52.computed)(() => {
14310
14445
  const keys = [];
14311
14446
  eachNode(props.data, (row) => {
14312
14447
  if (!row.children || !row.children.length) keys.push(keyOf(row, props.rowKey));
14313
14448
  });
14314
14449
  return keys;
14315
14450
  });
14316
- const checkedSet = (0, import_vue51.computed)(() => new Set(innerChecked.value));
14317
- const allChecked = (0, import_vue51.computed)(() => leafKeys.value.length > 0 && leafKeys.value.every((key) => checkedSet.value.has(key)));
14318
- const someChecked = (0, import_vue51.computed)(() => !allChecked.value && leafKeys.value.some((key) => checkedSet.value.has(key)));
14451
+ const checkedSet = (0, import_vue52.computed)(() => new Set(innerChecked.value));
14452
+ const allChecked = (0, import_vue52.computed)(() => leafKeys.value.length > 0 && leafKeys.value.every((key) => checkedSet.value.has(key)));
14453
+ const someChecked = (0, import_vue52.computed)(() => !allChecked.value && leafKeys.value.some((key) => checkedSet.value.has(key)));
14319
14454
  function isIndeterminate(row) {
14320
14455
  if (!props.selectable || props.checkStrictly) return false;
14321
14456
  const desc = descendantMap.value[keyOf(row, props.rowKey)] || [];
@@ -14349,7 +14484,7 @@ var tree_table_default = {
14349
14484
  }
14350
14485
  emitChecked(Array.from(set));
14351
14486
  }
14352
- const nodeMap = (0, import_vue51.computed)(() => {
14487
+ const nodeMap = (0, import_vue52.computed)(() => {
14353
14488
  const map = {};
14354
14489
  eachNode(props.data, (row, level, parentKey) => {
14355
14490
  map[keyOf(row, props.rowKey)] = { row, parentKey };
@@ -14396,11 +14531,11 @@ var tree_table_default = {
14396
14531
  function onRowClick(item) {
14397
14532
  emit("row-click", item.row, item);
14398
14533
  }
14399
- const scrollStyle = (0, import_vue51.computed)(() => {
14534
+ const scrollStyle = (0, import_vue52.computed)(() => {
14400
14535
  if (!props.maxHeight) return null;
14401
14536
  return { maxHeight: typeof props.maxHeight === "number" ? props.maxHeight + "px" : props.maxHeight };
14402
14537
  });
14403
- const emptyLabel = (0, import_vue51.computed)(() => props.emptyText || t("treeTable.empty"));
14538
+ const emptyLabel = (0, import_vue52.computed)(() => props.emptyText || t("treeTable.empty"));
14404
14539
  return {
14405
14540
  rows,
14406
14541
  innerExpanded,
@@ -14502,7 +14637,7 @@ var tree_table_default = {
14502
14637
  };
14503
14638
 
14504
14639
  // src/components/schedule/index.js
14505
- var import_vue52 = require("vue");
14640
+ var import_vue53 = require("vue");
14506
14641
  var pad5 = (value) => String(value).padStart(2, "0");
14507
14642
  function toKey3(date) {
14508
14643
  return `${date.getFullYear()}-${pad5(date.getMonth() + 1)}-${pad5(date.getDate())}`;
@@ -14534,13 +14669,13 @@ var schedule_default = {
14534
14669
  emits: ["update:modelValue", "event-click", "slot-click", "week-change"],
14535
14670
  setup(props, { emit }) {
14536
14671
  const todayKey = toKey3(/* @__PURE__ */ new Date());
14537
- const nowMinutes = (0, import_vue52.ref)((/* @__PURE__ */ new Date()).getHours() * 60 + (/* @__PURE__ */ new Date()).getMinutes());
14672
+ const nowMinutes = (0, import_vue53.ref)((/* @__PURE__ */ new Date()).getHours() * 60 + (/* @__PURE__ */ new Date()).getMinutes());
14538
14673
  const timer = window.setInterval(() => {
14539
14674
  const now = /* @__PURE__ */ new Date();
14540
14675
  nowMinutes.value = now.getHours() * 60 + now.getMinutes();
14541
14676
  }, 6e4);
14542
- const anchor = (0, import_vue52.ref)(props.modelValue || todayKey);
14543
- (0, import_vue52.watch)(
14677
+ const anchor = (0, import_vue53.ref)(props.modelValue || todayKey);
14678
+ (0, import_vue53.watch)(
14544
14679
  () => props.modelValue,
14545
14680
  (value) => {
14546
14681
  if (value) anchor.value = value;
@@ -14552,8 +14687,8 @@ var schedule_default = {
14552
14687
  const offset = (day + 6) % 7;
14553
14688
  return new Date(date.getFullYear(), date.getMonth(), date.getDate() - offset);
14554
14689
  }
14555
- const weekStartDate = (0, import_vue52.computed)(() => startOfWeek(anchor.value));
14556
- const weekdays = (0, import_vue52.computed)(() => t("schedule.weekdays").split(","));
14690
+ const weekStartDate = (0, import_vue53.computed)(() => startOfWeek(anchor.value));
14691
+ const weekdays = (0, import_vue53.computed)(() => t("schedule.weekdays").split(","));
14557
14692
  function layoutDay(list) {
14558
14693
  const sorted = list.map((item) => {
14559
14694
  const startMin = toMinutes(item.start, props.startHour * 60);
@@ -14586,7 +14721,7 @@ var schedule_default = {
14586
14721
  };
14587
14722
  });
14588
14723
  }
14589
- const days = (0, import_vue52.computed)(() => {
14724
+ const days = (0, import_vue53.computed)(() => {
14590
14725
  const start = weekStartDate.value;
14591
14726
  const list = Array.from({ length: 7 }, (_, index) => {
14592
14727
  const date = new Date(start.getFullYear(), start.getMonth(), start.getDate() + index);
@@ -14604,20 +14739,20 @@ var schedule_default = {
14604
14739
  });
14605
14740
  return props.showWeekend ? list : list.slice(0, 5);
14606
14741
  });
14607
- const hours = (0, import_vue52.computed)(() => {
14742
+ const hours = (0, import_vue53.computed)(() => {
14608
14743
  const list = [];
14609
14744
  for (let hour = props.startHour; hour < props.endHour; hour++) list.push(hour);
14610
14745
  return list;
14611
14746
  });
14612
- const bodyHeight = (0, import_vue52.computed)(() => (props.endHour - props.startHour) * props.hourHeight);
14613
- const gridStyle = (0, import_vue52.computed)(() => ({
14747
+ const bodyHeight = (0, import_vue53.computed)(() => (props.endHour - props.startHour) * props.hourHeight);
14748
+ const gridStyle = (0, import_vue53.computed)(() => ({
14614
14749
  gridTemplateColumns: "56px repeat(" + Math.max(1, days.value.length) + ", minmax(0, 1fr))"
14615
14750
  }));
14616
- const nowTop = (0, import_vue52.computed)(() => (nowMinutes.value - props.startHour * 60) / 60 * props.hourHeight);
14617
- const showNowLine = (0, import_vue52.computed)(
14751
+ const nowTop = (0, import_vue53.computed)(() => (nowMinutes.value - props.startHour * 60) / 60 * props.hourHeight);
14752
+ const showNowLine = (0, import_vue53.computed)(
14618
14753
  () => nowMinutes.value >= props.startHour * 60 && nowMinutes.value <= props.endHour * 60 && days.value.some((day) => day.today)
14619
14754
  );
14620
- const rangeLabel = (0, import_vue52.computed)(() => {
14755
+ const rangeLabel = (0, import_vue53.computed)(() => {
14621
14756
  const list = days.value;
14622
14757
  if (!list.length) return "";
14623
14758
  const first = list[0];
@@ -14647,7 +14782,7 @@ var schedule_default = {
14647
14782
  const minute = minutes % 60;
14648
14783
  emit("slot-click", { date: day.key, time: `${pad5(hour)}:${pad5(minute)}` });
14649
14784
  }
14650
- (0, import_vue52.onBeforeUnmount)(() => window.clearInterval(timer));
14785
+ (0, import_vue53.onBeforeUnmount)(() => window.clearInterval(timer));
14651
14786
  return {
14652
14787
  days,
14653
14788
  hours,
@@ -14747,7 +14882,7 @@ var schedule_default = {
14747
14882
  };
14748
14883
 
14749
14884
  // src/components/comment/index.js
14750
- var import_vue53 = require("vue");
14885
+ var import_vue54 = require("vue");
14751
14886
  var comment_default = {
14752
14887
  name: "DjmComment",
14753
14888
  components: { DjmAvatar: avatar_default, DjmIcon: icon_default },
@@ -14764,16 +14899,16 @@ var comment_default = {
14764
14899
  },
14765
14900
  emits: ["submit", "reply", "remove"],
14766
14901
  setup(props, { emit }) {
14767
- const content = (0, import_vue53.ref)("");
14768
- const replyTarget = (0, import_vue53.ref)(null);
14769
- const placeholderText = (0, import_vue53.computed)(() => {
14902
+ const content = (0, import_vue54.ref)("");
14903
+ const replyTarget = (0, import_vue54.ref)(null);
14904
+ const placeholderText = (0, import_vue54.computed)(() => {
14770
14905
  if (replyTarget.value) return t("comment.replyPlaceholder", { name: replyTarget.value.author });
14771
14906
  return props.placeholder || t("comment.placeholder");
14772
14907
  });
14773
- const submitLabel = (0, import_vue53.computed)(() => props.submitText || t("comment.submit"));
14774
- const emptyLabel = (0, import_vue53.computed)(() => props.emptyText || t("comment.empty"));
14775
- const overLimit = (0, import_vue53.computed)(() => content.value.length > props.maxLength);
14776
- const canSubmit = (0, import_vue53.computed)(() => content.value.trim().length > 0 && !overLimit.value && !props.disabled && !props.loading);
14908
+ const submitLabel = (0, import_vue54.computed)(() => props.submitText || t("comment.submit"));
14909
+ const emptyLabel = (0, import_vue54.computed)(() => props.emptyText || t("comment.empty"));
14910
+ const overLimit = (0, import_vue54.computed)(() => content.value.length > props.maxLength);
14911
+ const canSubmit = (0, import_vue54.computed)(() => content.value.trim().length > 0 && !overLimit.value && !props.disabled && !props.loading);
14777
14912
  function onInput(event) {
14778
14913
  content.value = event.target.value;
14779
14914
  }
@@ -14878,7 +15013,7 @@ var comment_default = {
14878
15013
  };
14879
15014
 
14880
15015
  // src/components/signature/index.js
14881
- var import_vue54 = require("vue");
15016
+ var import_vue55 = require("vue");
14882
15017
  var signature_default = {
14883
15018
  name: "DjmSignature",
14884
15019
  props: {
@@ -14892,10 +15027,10 @@ var signature_default = {
14892
15027
  },
14893
15028
  emits: ["update:modelValue", "change", "start", "end", "clear"],
14894
15029
  setup(props, { emit }) {
14895
- const canvas = (0, import_vue54.ref)(null);
14896
- const root = (0, import_vue54.ref)(null);
14897
- const strokes = (0, import_vue54.ref)([]);
14898
- const hasImage = (0, import_vue54.ref)(false);
15030
+ const canvas = (0, import_vue55.ref)(null);
15031
+ const root = (0, import_vue55.ref)(null);
15032
+ const strokes = (0, import_vue55.ref)([]);
15033
+ const hasImage = (0, import_vue55.ref)(false);
14899
15034
  let imageCache = null;
14900
15035
  let drawing = false;
14901
15036
  let current = null;
@@ -15010,7 +15145,7 @@ var signature_default = {
15010
15145
  return canvas.value ? canvas.value.toDataURL("image/png") : "";
15011
15146
  }
15012
15147
  const isEmpty2 = () => strokes.value.length === 0 && !hasImage.value;
15013
- (0, import_vue54.watch)(
15148
+ (0, import_vue55.watch)(
15014
15149
  () => props.modelValue,
15015
15150
  (value) => {
15016
15151
  if (value === lastEmitted) return;
@@ -15032,7 +15167,7 @@ var signature_default = {
15032
15167
  img.src = value;
15033
15168
  }
15034
15169
  );
15035
- (0, import_vue54.onMounted)(() => {
15170
+ (0, import_vue55.onMounted)(() => {
15036
15171
  setupCanvas();
15037
15172
  if (props.modelValue) {
15038
15173
  const img = new Image();
@@ -15048,7 +15183,7 @@ var signature_default = {
15048
15183
  if (root.value) observer.observe(root.value);
15049
15184
  }
15050
15185
  });
15051
- (0, import_vue54.onBeforeUnmount)(() => {
15186
+ (0, import_vue55.onBeforeUnmount)(() => {
15052
15187
  if (observer) observer.disconnect();
15053
15188
  });
15054
15189
  return {
@@ -15088,7 +15223,7 @@ var signature_default = {
15088
15223
  };
15089
15224
 
15090
15225
  // src/components/print/index.js
15091
- var import_vue55 = require("vue");
15226
+ var import_vue56 = require("vue");
15092
15227
  function escapeHtml(text) {
15093
15228
  return String(text).replace(/[&<>"]/g, (ch) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[ch]);
15094
15229
  }
@@ -15104,8 +15239,8 @@ var print_default = {
15104
15239
  },
15105
15240
  emits: ["before-print", "after-print"],
15106
15241
  setup(props, { emit }) {
15107
- const content = (0, import_vue55.ref)(null);
15108
- const label = (0, import_vue55.computed)(() => props.buttonText || t("print.button"));
15242
+ const content = (0, import_vue56.ref)(null);
15243
+ const label = (0, import_vue56.computed)(() => props.buttonText || t("print.button"));
15109
15244
  function collectStyles() {
15110
15245
  return Array.from(document.querySelectorAll('link[rel="stylesheet"], style')).map((el) => el.outerHTML).join("");
15111
15246
  }
@@ -15154,7 +15289,7 @@ var print_default = {
15154
15289
  };
15155
15290
 
15156
15291
  // src/components/gantt/index.js
15157
- var import_vue56 = require("vue");
15292
+ var import_vue57 = require("vue");
15158
15293
  var DAY = 864e5;
15159
15294
  var pad6 = (value) => String(value).padStart(2, "0");
15160
15295
  function parseDate3(value) {
@@ -15190,7 +15325,7 @@ var gantt_default = {
15190
15325
  emits: ["task-click"],
15191
15326
  setup(props, { emit }) {
15192
15327
  const todayKey = toKey4(/* @__PURE__ */ new Date());
15193
- const range = (0, import_vue56.computed)(() => {
15328
+ const range = (0, import_vue57.computed)(() => {
15194
15329
  const starts = props.tasks.map((task) => task.start).filter(Boolean).sort();
15195
15330
  const ends = props.tasks.map((task) => task.end || task.start).filter(Boolean).sort();
15196
15331
  let start = props.startDate || starts[0] || todayKey;
@@ -15203,7 +15338,7 @@ var gantt_default = {
15203
15338
  }
15204
15339
  return { start, end };
15205
15340
  });
15206
- const days = (0, import_vue56.computed)(() => {
15341
+ const days = (0, import_vue57.computed)(() => {
15207
15342
  const total = dayDiff(range.value.end, range.value.start) + 1;
15208
15343
  const base = parseDate3(range.value.start);
15209
15344
  return Array.from({ length: total }, (_, index) => {
@@ -15220,9 +15355,9 @@ var gantt_default = {
15220
15355
  };
15221
15356
  });
15222
15357
  });
15223
- const trackWidth = (0, import_vue56.computed)(() => days.value.length * props.dayWidth);
15224
- const innerWidth = (0, import_vue56.computed)(() => props.nameWidth + trackWidth.value);
15225
- const bars = (0, import_vue56.computed)(
15358
+ const trackWidth = (0, import_vue57.computed)(() => days.value.length * props.dayWidth);
15359
+ const innerWidth = (0, import_vue57.computed)(() => props.nameWidth + trackWidth.value);
15360
+ const bars = (0, import_vue57.computed)(
15226
15361
  () => props.tasks.map((task, index) => {
15227
15362
  const start = task.start || range.value.start;
15228
15363
  const end = task.end || start;
@@ -15238,12 +15373,12 @@ var gantt_default = {
15238
15373
  };
15239
15374
  })
15240
15375
  );
15241
- const todayLeft = (0, import_vue56.computed)(() => {
15376
+ const todayLeft = (0, import_vue57.computed)(() => {
15242
15377
  const index = days.value.findIndex((day) => day.today);
15243
15378
  if (index === -1) return null;
15244
15379
  return props.nameWidth + index * props.dayWidth + props.dayWidth / 2;
15245
15380
  });
15246
- const emptyLabel = (0, import_vue56.computed)(() => props.emptyText || t("gantt.empty"));
15381
+ const emptyLabel = (0, import_vue57.computed)(() => props.emptyText || t("gantt.empty"));
15247
15382
  function onClick(bar) {
15248
15383
  emit("task-click", bar.task);
15249
15384
  }
@@ -15325,7 +15460,7 @@ var gantt_default = {
15325
15460
  };
15326
15461
 
15327
15462
  // src/components/field-list/index.js
15328
- var import_vue57 = require("vue");
15463
+ var import_vue58 = require("vue");
15329
15464
  var uidSeed8 = 0;
15330
15465
  var field_list_default = {
15331
15466
  name: "DjmFieldList",
@@ -15345,7 +15480,7 @@ var field_list_default = {
15345
15480
  },
15346
15481
  emits: ["update:modelValue", "add", "remove", "change"],
15347
15482
  setup(props, { emit }) {
15348
- const uids = (0, import_vue57.ref)([]);
15483
+ const uids = (0, import_vue58.ref)([]);
15349
15484
  function syncUids() {
15350
15485
  const length = props.modelValue.length;
15351
15486
  if (uids.value.length === length) return;
@@ -15354,12 +15489,12 @@ var field_list_default = {
15354
15489
  uids.value = next;
15355
15490
  }
15356
15491
  syncUids();
15357
- (0, import_vue57.watch)(() => props.modelValue.length, syncUids);
15358
- const errors = (0, import_vue57.ref)({});
15359
- const addLabel = (0, import_vue57.computed)(() => props.addText || t("fieldList.add"));
15360
- const emptyLabel = (0, import_vue57.computed)(() => props.emptyText || t("fieldList.empty"));
15361
- const canAdd = (0, import_vue57.computed)(() => !props.disabled && (!props.max || props.modelValue.length < props.max));
15362
- const canRemove = (0, import_vue57.computed)(() => !props.disabled && props.modelValue.length > props.min);
15492
+ (0, import_vue58.watch)(() => props.modelValue.length, syncUids);
15493
+ const errors = (0, import_vue58.ref)({});
15494
+ const addLabel = (0, import_vue58.computed)(() => props.addText || t("fieldList.add"));
15495
+ const emptyLabel = (0, import_vue58.computed)(() => props.emptyText || t("fieldList.empty"));
15496
+ const canAdd = (0, import_vue58.computed)(() => !props.disabled && (!props.max || props.modelValue.length < props.max));
15497
+ const canRemove = (0, import_vue58.computed)(() => !props.disabled && props.modelValue.length > props.min);
15363
15498
  function commit(list) {
15364
15499
  emit("update:modelValue", list);
15365
15500
  emit("change", list);
@@ -15521,7 +15656,7 @@ var field_list_default = {
15521
15656
  };
15522
15657
 
15523
15658
  // src/components/chat/index.js
15524
- var import_vue58 = require("vue");
15659
+ var import_vue59 = require("vue");
15525
15660
  var chat_default = {
15526
15661
  name: "DjmChat",
15527
15662
  components: { DjmAvatar: avatar_default },
@@ -15538,19 +15673,19 @@ var chat_default = {
15538
15673
  },
15539
15674
  emits: ["submit"],
15540
15675
  setup(props, { emit }) {
15541
- const content = (0, import_vue58.ref)("");
15542
- const listRef = (0, import_vue58.ref)(null);
15543
- const placeholderText = (0, import_vue58.computed)(() => props.placeholder || t("chat.placeholder"));
15544
- const sendLabel = (0, import_vue58.computed)(() => props.sendText || t("chat.send"));
15545
- const emptyLabel = (0, import_vue58.computed)(() => props.emptyText || t("chat.empty"));
15546
- const canSend = (0, import_vue58.computed)(() => content.value.trim().length > 0 && !props.disabled && !props.loading);
15676
+ const content = (0, import_vue59.ref)("");
15677
+ const listRef = (0, import_vue59.ref)(null);
15678
+ const placeholderText = (0, import_vue59.computed)(() => props.placeholder || t("chat.placeholder"));
15679
+ const sendLabel = (0, import_vue59.computed)(() => props.sendText || t("chat.send"));
15680
+ const emptyLabel = (0, import_vue59.computed)(() => props.emptyText || t("chat.empty"));
15681
+ const canSend = (0, import_vue59.computed)(() => content.value.trim().length > 0 && !props.disabled && !props.loading);
15547
15682
  function scrollToBottom() {
15548
15683
  const el = listRef.value;
15549
15684
  if (el) el.scrollTop = el.scrollHeight;
15550
15685
  }
15551
- (0, import_vue58.watch)(
15686
+ (0, import_vue59.watch)(
15552
15687
  () => props.messages.length,
15553
- () => (0, import_vue58.nextTick)(scrollToBottom)
15688
+ () => (0, import_vue59.nextTick)(scrollToBottom)
15554
15689
  );
15555
15690
  function onInput(event) {
15556
15691
  content.value = event.target.value;
@@ -15661,7 +15796,7 @@ var chat_default = {
15661
15796
  };
15662
15797
 
15663
15798
  // src/components/org-chart/index.js
15664
- var import_vue59 = require("vue");
15799
+ var import_vue60 = require("vue");
15665
15800
  var org_chart_default = {
15666
15801
  name: "DjmOrgChart",
15667
15802
  components: { DjmAvatar: avatar_default, DjmIcon: icon_default },
@@ -15694,11 +15829,11 @@ var org_chart_default = {
15694
15829
  walk(node);
15695
15830
  return keys;
15696
15831
  }
15697
- const collapsed = (0, import_vue59.ref)(props.defaultExpandAll ? [] : collapsedByDefault(props.data));
15698
- (0, import_vue59.watch)(() => props.data, (data) => {
15832
+ const collapsed = (0, import_vue60.ref)(props.defaultExpandAll ? [] : collapsedByDefault(props.data));
15833
+ (0, import_vue60.watch)(() => props.data, (data) => {
15699
15834
  collapsed.value = props.defaultExpandAll ? [] : collapsedByDefault(data);
15700
15835
  });
15701
- const layout = (0, import_vue59.computed)(() => {
15836
+ const layout = (0, import_vue60.computed)(() => {
15702
15837
  if (!props.data) return { nodes: [], links: [], width: 0, height: 0 };
15703
15838
  const rowH = props.nodeHeight + props.verticalGap;
15704
15839
  let cursor = 0;
@@ -15763,7 +15898,7 @@ var org_chart_default = {
15763
15898
  function onClick(item) {
15764
15899
  emit("node-click", item.node);
15765
15900
  }
15766
- const emptyLabel = (0, import_vue59.computed)(() => props.emptyText || t("orgChart.empty"));
15901
+ const emptyLabel = (0, import_vue60.computed)(() => props.emptyText || t("orgChart.empty"));
15767
15902
  return {
15768
15903
  layout,
15769
15904
  toggle,
@@ -15824,7 +15959,7 @@ var org_chart_default = {
15824
15959
  };
15825
15960
 
15826
15961
  // src/components/page-tabs/index.js
15827
- var import_vue60 = require("vue");
15962
+ var import_vue61 = require("vue");
15828
15963
  var page_tabs_default = {
15829
15964
  name: "DjmPageTabs",
15830
15965
  components: { DjmIcon: icon_default },
@@ -15835,7 +15970,7 @@ var page_tabs_default = {
15835
15970
  },
15836
15971
  emits: ["update:modelValue", "change", "close"],
15837
15972
  setup(props, { emit }) {
15838
- const label = (0, import_vue60.computed)(() => t("pageTabs.label"));
15973
+ const label = (0, import_vue61.computed)(() => t("pageTabs.label"));
15839
15974
  function canClose(tab) {
15840
15975
  return tab.closable === void 0 ? props.closable : tab.closable;
15841
15976
  }
@@ -15945,8 +16080,8 @@ function moveRows(rows, dragIndex, dropIndex, position = "before") {
15945
16080
  }
15946
16081
 
15947
16082
  // src/utils/permission.js
15948
- var import_vue61 = require("vue");
15949
- var state2 = (0, import_vue61.reactive)({
16083
+ var import_vue62 = require("vue");
16084
+ var state2 = (0, import_vue62.reactive)({
15950
16085
  codes: /* @__PURE__ */ new Set()
15951
16086
  });
15952
16087
  function setPermissions(list) {
@@ -16088,7 +16223,7 @@ var components = [
16088
16223
  org_chart_default,
16089
16224
  page_tabs_default
16090
16225
  ];
16091
- var version = "0.72.0";
16226
+ var version = "0.73.0";
16092
16227
  function install(app, options = {}) {
16093
16228
  if (options.locale) setLocale(options.locale);
16094
16229
  components.forEach((component) => app.component(component.name, component));
@@ -16210,6 +16345,7 @@ var index_default = { install, version };
16210
16345
  djmMessage,
16211
16346
  djmMessages,
16212
16347
  getLocale,
16348
+ glass,
16213
16349
  hasPermission,
16214
16350
  initTheme,
16215
16351
  install,
@@ -16219,6 +16355,7 @@ var index_default = { install, version };
16219
16355
  primaryColor,
16220
16356
  resetPrimaryColor,
16221
16357
  sanitizeHtml,
16358
+ setGlass,
16222
16359
  setLocale,
16223
16360
  setPermissions,
16224
16361
  setPrimaryColor,