djm-ui 0.67.4 → 0.72.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +38 -2
  3. package/dist/djm-ui.cjs +1032 -347
  4. package/dist/djm-ui.cjs.map +4 -4
  5. package/dist/djm-ui.css +752 -17
  6. package/dist/djm-ui.esm.js +1105 -420
  7. package/dist/djm-ui.esm.js.map +4 -4
  8. package/dist/djm-ui.esm.min.js +373 -227
  9. package/dist/djm-ui.min.cjs +373 -227
  10. package/dist/djm-ui.min.css +2 -2
  11. package/dist/djm-ui.umd.js +944 -259
  12. package/dist/djm-ui.umd.min.js +373 -227
  13. package/dist/mcp/manifest.json +12195 -0
  14. package/dist/mcp/server.js +90 -0
  15. package/package.json +12 -4
  16. package/src/components/icon/index.js +13 -1
  17. package/src/components/rich-editor/index.js +724 -61
  18. package/src/index.js +1 -1
  19. package/src/locale/en-US.js +33 -1
  20. package/src/locale/zh-CN.js +33 -1
  21. package/src/styles/base.css +2 -3
  22. package/src/styles/components/button.css +2 -1
  23. package/src/styles/components/console.css +5 -0
  24. package/src/styles/components/content.css +517 -0
  25. package/src/styles/components/form.css +5 -0
  26. package/src/styles/components/layout.css +326 -0
  27. package/src/styles/components/media-picker.css +3 -3
  28. package/src/styles/components/menu.css +2 -1
  29. package/src/styles/components/org-picker.css +1 -1
  30. package/src/styles/components/responsive.css +86 -0
  31. package/src/styles/components/rich-editor.css +206 -7
  32. package/src/styles/components/skin.css +54 -0
  33. package/src/styles/components/template.css +5 -0
  34. package/src/styles/index.css +1 -0
  35. package/src/styles/theme-dark.css +2 -0
  36. package/src/styles/tokens.css +8 -0
  37. package/src/theme/index.js +40 -0
  38. package/src/utils/sanitize-html.js +44 -6
  39. package/types/index.d.ts +8 -0
package/dist/djm-ui.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! DJM UI v0.67.4 · MIT · 2026-10-26 */
1
+ /*! DJM UI v0.72.0 · MIT · 2026-10-26 */
2
2
 
3
3
  /* ---- tokens.css ---- */
4
4
 
@@ -19,6 +19,11 @@
19
19
  :root {
20
20
  color-scheme: light;
21
21
 
22
+ /* 字体族:宿主页面可通过覆盖这两个变量统一换字体 */
23
+ --djm-font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
24
+ "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
25
+ --djm-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
26
+
22
27
  --djm-brand-50: #eef6fe;
23
28
  --djm-brand-100: #dcebfb;
24
29
  --djm-brand-200: #b9d7f6;
@@ -70,6 +75,9 @@
70
75
  /* 彩色底上的文字(两主题均为白色) */
71
76
  --djm-text-inverse: #fff;
72
77
 
78
+ /* 文字提示的深底:暗色主题改用略亮的灰,避免和页面背景糊在一起 */
79
+ --djm-tooltip-bg: #1f2a37;
80
+
73
81
  /* 盖在图片等媒体内容上的蒙层,不随主题变化 */
74
82
  --djm-media-mask: rgba(9, 20, 33, 0.55);
75
83
 
@@ -155,6 +163,8 @@
155
163
  --djm-text-side: #c2ccd8;
156
164
  --djm-text-2: #a6b2c0;
157
165
  --djm-text-3: #8492a1;
166
+ /* 暗色下提示框比页面背景亮一档,白字仍有足够对比 */
167
+ --djm-tooltip-bg: #3a4652;
158
168
  /* 暗色下水印改用浅色,保持可辨识 */
159
169
  --djm-watermark: rgba(232, 237, 243, 0.12);
160
170
 
@@ -211,8 +221,7 @@ body {
211
221
  body {
212
222
  background: var(--djm-bg);
213
223
  color: var(--djm-text);
214
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
215
- "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
224
+ font-family: var(--djm-font-sans);
216
225
  font-size: 13px;
217
226
  line-height: 1.5;
218
227
  -webkit-font-smoothing: antialiased;
@@ -293,7 +302,7 @@ a {
293
302
  }
294
303
 
295
304
  .djm-mono {
296
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
305
+ font-family: var(--djm-font-mono);
297
306
  font-size: 11.5px;
298
307
  font-variant-numeric: tabular-nums;
299
308
  }
@@ -2120,7 +2129,8 @@ button.djm-breadcrumb-text {
2120
2129
  height: 16px;
2121
2130
  padding: 0 4px;
2122
2131
  border-radius: 8px;
2123
- background: var(--djm-red);
2132
+ /* 红点底色用实色档,暗色主题下白字才够清楚 */
2133
+ background: var(--djm-red-strong);
2124
2134
  color: var(--djm-text-inverse);
2125
2135
  font-size: 10px;
2126
2136
  font-style: normal;
@@ -3484,7 +3494,8 @@ button.djm-breadcrumb-text {
3484
3494
  background: none;
3485
3495
  padding: 0;
3486
3496
  font-size: 12px;
3487
- color: var(--djm-brand-600);
3497
+ /* 品牌深色档:浅色底与暗色底都能过 4.5:1 */
3498
+ color: var(--djm-brand-700);
3488
3499
  white-space: nowrap;
3489
3500
  }
3490
3501
 
@@ -4015,6 +4026,11 @@ input[type="date"] {
4015
4026
  font-size: 11.5px;
4016
4027
  margin-right: 2px;
4017
4028
  }
4029
+
4030
+ /* 表格工具栏的操作提示:选中行后自动隐藏 */
4031
+ .djm-toolbar-tip {
4032
+ font-size: 11.5px;
4033
+ }
4018
4034
  /* ---------------- 表单 ---------------- */
4019
4035
 
4020
4036
  .djm-form-grid {
@@ -6704,6 +6720,8 @@ input[type="date"] {
6704
6720
  /* ---------------- 富文本编辑器 ---------------- */
6705
6721
 
6706
6722
  .djm-rich-editor {
6723
+ display: flex;
6724
+ flex-direction: column;
6707
6725
  border: 1px solid var(--djm-border-strong);
6708
6726
  border-radius: 4px;
6709
6727
  overflow: hidden;
@@ -6715,11 +6733,26 @@ input[type="date"] {
6715
6733
  box-shadow: var(--djm-ring);
6716
6734
  }
6717
6735
 
6736
+ /* 全屏:铺满视口,内容区自己滚动 */
6737
+ .djm-rich-editor.djm-is-fullscreen {
6738
+ position: fixed;
6739
+ inset: 0;
6740
+ z-index: 1200;
6741
+ border: 0;
6742
+ border-radius: 0;
6743
+ }
6744
+
6745
+ .djm-rich-editor.djm-is-fullscreen .djm-rich-editor-content,
6746
+ .djm-rich-editor.djm-is-fullscreen .djm-rich-editor-source {
6747
+ flex: 1;
6748
+ max-height: none;
6749
+ }
6750
+
6718
6751
  .djm-rich-editor-toolbar {
6719
6752
  display: flex;
6720
6753
  align-items: center;
6721
6754
  flex-wrap: wrap;
6722
- gap: 4px;
6755
+ gap: 2px;
6723
6756
  padding: 5px 6px;
6724
6757
  border-bottom: 1px solid var(--djm-border);
6725
6758
  background: var(--djm-surface-2);
@@ -6727,9 +6760,9 @@ input[type="date"] {
6727
6760
 
6728
6761
  .djm-rich-editor-group {
6729
6762
  display: flex;
6730
- gap: 2px;
6731
- padding-right: 5px;
6732
- margin-right: 3px;
6763
+ gap: 1px;
6764
+ padding-right: 4px;
6765
+ margin-right: 2px;
6733
6766
  border-right: 1px solid var(--djm-border);
6734
6767
  }
6735
6768
 
@@ -6737,10 +6770,92 @@ input[type="date"] {
6737
6770
  border-right: 0;
6738
6771
  }
6739
6772
 
6773
+ /* 段落格式 / 字号下拉 */
6774
+ .djm-rich-editor-select {
6775
+ height: 26px;
6776
+ padding: 0 2px;
6777
+ border: 1px solid var(--djm-border);
6778
+ border-radius: 3px;
6779
+ background: var(--djm-surface);
6780
+ color: var(--djm-text-2);
6781
+ font: inherit;
6782
+ font-size: 11.5px;
6783
+ cursor: pointer;
6784
+ }
6785
+
6786
+ .djm-rich-editor-select-size {
6787
+ width: 64px;
6788
+ }
6789
+
6790
+ .djm-rich-editor-select:focus-visible {
6791
+ outline: 2px solid var(--djm-brand-500);
6792
+ outline-offset: -1px;
6793
+ }
6794
+
6795
+ .djm-rich-editor-select:disabled {
6796
+ opacity: 0.5;
6797
+ cursor: not-allowed;
6798
+ }
6799
+
6800
+ /* 颜色按钮:字母底部带当前色,背景色按钮直接把颜色铺在字母上 */
6801
+ .djm-rich-editor-color {
6802
+ position: relative;
6803
+ }
6804
+
6805
+ .djm-rich-editor-letter {
6806
+ display: inline-block;
6807
+ padding-bottom: 1px;
6808
+ border-bottom: 2px solid var(--djm-text);
6809
+ font-size: 12px;
6810
+ font-weight: 600;
6811
+ line-height: 1;
6812
+ }
6813
+
6814
+ .djm-rich-editor-letter-bg {
6815
+ padding: 0 3px;
6816
+ border-bottom: 0;
6817
+ border-radius: 2px;
6818
+ color: var(--djm-text);
6819
+ }
6820
+
6821
+ .djm-rich-editor-panel {
6822
+ position: absolute;
6823
+ top: calc(100% + 4px);
6824
+ left: 0;
6825
+ z-index: 5;
6826
+ display: grid;
6827
+ grid-template-columns: repeat(4, 20px);
6828
+ gap: 4px;
6829
+ padding: 6px;
6830
+ border: 1px solid var(--djm-border);
6831
+ border-radius: 6px;
6832
+ background: var(--djm-surface);
6833
+ box-shadow: var(--djm-shadow-md);
6834
+ }
6835
+
6836
+ .djm-rich-editor-swatch {
6837
+ width: 20px;
6838
+ height: 20px;
6839
+ padding: 0;
6840
+ border: 1px solid var(--djm-border);
6841
+ border-radius: 4px;
6842
+ cursor: pointer;
6843
+ }
6844
+
6845
+ .djm-rich-editor-swatch:hover {
6846
+ border-color: var(--djm-brand-500);
6847
+ }
6848
+
6849
+ /* 素材库按钮:媒体选择器默认是块级 span,塞进工具栏里要收成行内 */
6850
+ .djm-rich-editor-picker {
6851
+ display: inline-flex;
6852
+ align-items: center;
6853
+ }
6854
+
6740
6855
  .djm-rich-editor-btn {
6741
- min-width: 26px;
6856
+ min-width: 24px;
6742
6857
  height: 26px;
6743
- padding: 0 6px;
6858
+ padding: 0 4px;
6744
6859
  display: inline-flex;
6745
6860
  align-items: center;
6746
6861
  justify-content: center;
@@ -6823,11 +6938,93 @@ input[type="date"] {
6823
6938
  color: var(--djm-text-3);
6824
6939
  }
6825
6940
 
6826
- .djm-rich-editor-content h2 {
6941
+ .djm-rich-editor-content h1,
6942
+ .djm-rich-editor-content h2,
6943
+ .djm-rich-editor-content h3 {
6827
6944
  margin: 0 0 8px;
6945
+ color: var(--djm-text);
6946
+ line-height: 1.5;
6947
+ }
6948
+
6949
+ .djm-rich-editor-content h1 {
6950
+ font-size: 20px;
6951
+ }
6952
+
6953
+ .djm-rich-editor-content h2 {
6828
6954
  font-size: 16px;
6829
6955
  }
6830
6956
 
6957
+ .djm-rich-editor-content h3 {
6958
+ font-size: 14px;
6959
+ }
6960
+
6961
+ .djm-rich-editor-content blockquote {
6962
+ margin: 0 0 8px;
6963
+ padding: 4px 10px;
6964
+ border-left: 3px solid var(--djm-brand-500);
6965
+ background: var(--djm-surface-2);
6966
+ color: var(--djm-text-2);
6967
+ }
6968
+
6969
+ .djm-rich-editor-content pre {
6970
+ margin: 0 0 8px;
6971
+ padding: 10px 12px;
6972
+ overflow: auto;
6973
+ border-radius: 4px;
6974
+ background: var(--djm-surface-3);
6975
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
6976
+ font-size: 12px;
6977
+ line-height: 1.7;
6978
+ white-space: pre-wrap;
6979
+ word-break: break-word;
6980
+ }
6981
+
6982
+ .djm-rich-editor-content code {
6983
+ padding: 1px 4px;
6984
+ border-radius: 3px;
6985
+ background: var(--djm-surface-3);
6986
+ color: var(--djm-brand-700);
6987
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
6988
+ font-size: 12px;
6989
+ }
6990
+
6991
+ .djm-rich-editor-content pre code {
6992
+ padding: 0;
6993
+ background: none;
6994
+ color: inherit;
6995
+ }
6996
+
6997
+ .djm-rich-editor-content hr {
6998
+ margin: 12px 0;
6999
+ border: 0;
7000
+ border-top: 1px solid var(--djm-border);
7001
+ }
7002
+
7003
+ /* 图片:单图、多图统一限宽,避免撑破内容区 */
7004
+ .djm-rich-editor-content img {
7005
+ max-width: 100%;
7006
+ height: auto;
7007
+ border-radius: 4px;
7008
+ vertical-align: bottom;
7009
+ }
7010
+
7011
+ /* 上传插入的图片之间留一点间距,多图并排时不粘在一起 */
7012
+ .djm-rich-editor-img {
7013
+ margin: 2px 4px 2px 0;
7014
+ }
7015
+
7016
+ /* 上传中的占位块,上传完成后被图片替换 */
7017
+ .djm-rich-editor-uploading {
7018
+ display: inline-flex;
7019
+ align-items: center;
7020
+ padding: 4px 10px;
7021
+ border: 1px dashed var(--djm-border-strong);
7022
+ border-radius: 4px;
7023
+ background: var(--djm-surface-2);
7024
+ color: var(--djm-text-3);
7025
+ font-size: 12px;
7026
+ }
7027
+
6831
7028
  .djm-rich-editor-content p {
6832
7029
  margin: 0 0 8px;
6833
7030
  }
@@ -6855,6 +7052,24 @@ input[type="date"] {
6855
7052
  line-height: 1.7;
6856
7053
  }
6857
7054
 
7055
+ /* 底部状态:上传提示与字数 */
7056
+ .djm-rich-editor-foot {
7057
+ display: flex;
7058
+ align-items: center;
7059
+ justify-content: flex-end;
7060
+ gap: 12px;
7061
+ padding: 4px 12px;
7062
+ border-top: 1px solid var(--djm-border);
7063
+ background: var(--djm-surface-2);
7064
+ color: var(--djm-text-3);
7065
+ font-size: 11px;
7066
+ }
7067
+
7068
+ /* 文件选择框只作为上传入口,不显示 */
7069
+ .djm-rich-editor-file {
7070
+ display: none;
7071
+ }
7072
+
6858
7073
  .djm-editor-bar {
6859
7074
  display: flex;
6860
7075
  align-items: center;
@@ -7611,7 +7826,7 @@ input[type="date"] {
7611
7826
  /* 打开在弹窗 / 抽屉里时也要压在遮罩之上 */
7612
7827
  z-index: var(--djm-z-popper, 1450);
7613
7828
  border: 1px solid var(--djm-border);
7614
- border-radius: var(--djm-radius-md, 4px);
7829
+ border-radius: var(--djm-radius);
7615
7830
  background: var(--djm-surface);
7616
7831
  box-shadow: var(--djm-shadow-md, 0 6px 20px rgba(0, 0, 0, 0.12));
7617
7832
  }
@@ -8232,7 +8447,7 @@ input[type="date"] {
8232
8447
  padding: 0 10px;
8233
8448
  height: 30px;
8234
8449
  border: 1px solid var(--djm-border);
8235
- border-radius: var(--djm-radius-md, 4px);
8450
+ border-radius: var(--djm-radius);
8236
8451
  background: var(--djm-surface);
8237
8452
  color: var(--djm-text-3);
8238
8453
  }
@@ -8265,14 +8480,14 @@ input[type="date"] {
8265
8480
 
8266
8481
  .djm-media-item {
8267
8482
  border: 1px solid var(--djm-border);
8268
- border-radius: var(--djm-radius-md, 4px);
8483
+ border-radius: var(--djm-radius);
8269
8484
  overflow: hidden;
8270
8485
  cursor: pointer;
8271
8486
  background: var(--djm-surface);
8272
8487
  }
8273
8488
 
8274
8489
  .djm-media-item:hover {
8275
- border-color: var(--djm-brand-400, #79a9d6);
8490
+ border-color: var(--djm-brand-500);
8276
8491
  }
8277
8492
 
8278
8493
  .djm-media-item:focus-visible {
@@ -8356,6 +8571,526 @@ input[type="date"] {
8356
8571
  font-style: normal;
8357
8572
  }
8358
8573
 
8574
+ /* ---- components/content.css ---- */
8575
+
8576
+ /* DJM UI · 内容管理:文件管理器 / 图片相册 */
8577
+
8578
+ /* ---------------- 文件管理器 ---------------- */
8579
+
8580
+ .djm-fm {
8581
+ display: grid;
8582
+ grid-template-columns: 208px minmax(0, 1fr);
8583
+ border: 1px solid var(--djm-border);
8584
+ border-radius: var(--djm-radius-lg);
8585
+ overflow: hidden;
8586
+ background: var(--djm-surface);
8587
+ }
8588
+
8589
+ .djm-fm-side {
8590
+ display: flex;
8591
+ flex-direction: column;
8592
+ gap: 2px;
8593
+ padding: 10px;
8594
+ border-right: 1px solid var(--djm-border);
8595
+ background: var(--djm-surface-2);
8596
+ }
8597
+
8598
+ .djm-fm-side-title {
8599
+ padding: 4px 8px 8px;
8600
+ color: var(--djm-text-3);
8601
+ font-size: 10.5px;
8602
+ letter-spacing: 0.5px;
8603
+ }
8604
+
8605
+ .djm-fm-folder {
8606
+ display: flex;
8607
+ align-items: center;
8608
+ gap: 8px;
8609
+ height: 32px;
8610
+ padding: 0 8px;
8611
+ border: 0;
8612
+ border-radius: 4px;
8613
+ background: none;
8614
+ color: var(--djm-text-2);
8615
+ font-size: 12.5px;
8616
+ text-align: left;
8617
+ cursor: pointer;
8618
+ }
8619
+
8620
+ .djm-fm-folder:hover {
8621
+ background: var(--djm-brand-soft);
8622
+ color: var(--djm-brand-700);
8623
+ }
8624
+
8625
+ .djm-fm-folder.djm-is-active {
8626
+ background: var(--djm-brand-50);
8627
+ color: var(--djm-brand-700);
8628
+ font-weight: 600;
8629
+ }
8630
+
8631
+ .djm-fm-folder-count {
8632
+ margin-left: auto;
8633
+ color: var(--djm-text-3);
8634
+ font-size: 10.5px;
8635
+ }
8636
+
8637
+ .djm-fm-storage {
8638
+ margin-top: auto;
8639
+ padding: 12px 8px 4px;
8640
+ border-top: 1px solid var(--djm-border);
8641
+ color: var(--djm-text-3);
8642
+ font-size: 11px;
8643
+ }
8644
+
8645
+ .djm-fm-storage-head {
8646
+ display: flex;
8647
+ justify-content: space-between;
8648
+ gap: 6px;
8649
+ margin-bottom: 6px;
8650
+ color: var(--djm-text-2);
8651
+ }
8652
+
8653
+ .djm-fm-bar {
8654
+ height: 5px;
8655
+ overflow: hidden;
8656
+ border-radius: 3px;
8657
+ background: var(--djm-surface-3);
8658
+ }
8659
+
8660
+ .djm-fm-bar i {
8661
+ display: block;
8662
+ height: 100%;
8663
+ background: linear-gradient(90deg, var(--djm-brand-500), var(--djm-brand-600));
8664
+ }
8665
+
8666
+ .djm-fm-storage p {
8667
+ margin: 8px 0 0;
8668
+ line-height: 1.6;
8669
+ }
8670
+
8671
+ .djm-fm-main {
8672
+ display: flex;
8673
+ flex-direction: column;
8674
+ min-width: 0;
8675
+ }
8676
+
8677
+ .djm-fm-path {
8678
+ display: flex;
8679
+ align-items: center;
8680
+ justify-content: space-between;
8681
+ gap: 10px;
8682
+ padding: 8px 14px;
8683
+ border-bottom: 1px solid var(--djm-border);
8684
+ background: var(--djm-surface-2);
8685
+ }
8686
+
8687
+ .djm-fm-crumb {
8688
+ display: flex;
8689
+ align-items: center;
8690
+ gap: 6px;
8691
+ color: var(--djm-text);
8692
+ font-size: 12.5px;
8693
+ font-weight: 600;
8694
+ }
8695
+
8696
+ .djm-fm-crumb em {
8697
+ color: var(--djm-text-3);
8698
+ font-size: 11px;
8699
+ font-style: normal;
8700
+ font-weight: 400;
8701
+ }
8702
+
8703
+ .djm-fm-search {
8704
+ display: flex;
8705
+ align-items: center;
8706
+ gap: 6px;
8707
+ height: 28px;
8708
+ padding: 0 8px;
8709
+ border: 1px solid var(--djm-border);
8710
+ border-radius: 4px;
8711
+ background: var(--djm-surface);
8712
+ color: var(--djm-text-3);
8713
+ }
8714
+
8715
+ .djm-fm-search:focus-within {
8716
+ border-color: var(--djm-brand-500);
8717
+ }
8718
+
8719
+ .djm-fm-search input {
8720
+ width: 160px;
8721
+ border: 0;
8722
+ outline: none;
8723
+ background: none;
8724
+ color: var(--djm-text-2);
8725
+ font-size: 12px;
8726
+ }
8727
+
8728
+ .djm-fm-all {
8729
+ display: inline-flex;
8730
+ align-items: center;
8731
+ gap: 6px;
8732
+ padding-right: 2px;
8733
+ color: var(--djm-text-2);
8734
+ font-size: 12px;
8735
+ cursor: pointer;
8736
+ }
8737
+
8738
+ .djm-fm-grid {
8739
+ display: grid;
8740
+ grid-template-columns: repeat(auto-fill, minmax(168px, 1fr));
8741
+ gap: 12px;
8742
+ padding: 14px;
8743
+ }
8744
+
8745
+ .djm-fm-card {
8746
+ position: relative;
8747
+ display: flex;
8748
+ flex-direction: column;
8749
+ gap: 4px;
8750
+ padding: 8px;
8751
+ border: 1px solid var(--djm-border);
8752
+ border-radius: 6px;
8753
+ background: var(--djm-surface);
8754
+ }
8755
+
8756
+ .djm-fm-card.djm-is-selected {
8757
+ border-color: var(--djm-brand-500);
8758
+ box-shadow: 0 0 0 2px var(--djm-brand-soft);
8759
+ }
8760
+
8761
+ .djm-fm-check {
8762
+ position: absolute;
8763
+ top: 8px;
8764
+ left: 8px;
8765
+ z-index: 1;
8766
+ padding: 2px;
8767
+ border-radius: 4px;
8768
+ background: var(--djm-surface);
8769
+ }
8770
+
8771
+ .djm-fm-thumb {
8772
+ display: flex;
8773
+ align-items: center;
8774
+ justify-content: center;
8775
+ height: 96px;
8776
+ padding: 0;
8777
+ overflow: hidden;
8778
+ border: 0;
8779
+ border-radius: 4px;
8780
+ background: var(--djm-surface-3);
8781
+ cursor: zoom-in;
8782
+ }
8783
+
8784
+ .djm-fm-thumb img {
8785
+ width: 100%;
8786
+ height: 100%;
8787
+ object-fit: cover;
8788
+ }
8789
+
8790
+ .djm-fm-doc {
8791
+ color: var(--djm-text-3);
8792
+ font-size: 11px;
8793
+ font-weight: 600;
8794
+ letter-spacing: 0.4px;
8795
+ }
8796
+
8797
+ .djm-fm-name {
8798
+ margin-top: 2px;
8799
+ overflow: hidden;
8800
+ color: var(--djm-text);
8801
+ font-size: 12.5px;
8802
+ font-weight: 500;
8803
+ text-overflow: ellipsis;
8804
+ white-space: nowrap;
8805
+ }
8806
+
8807
+ .djm-fm-meta {
8808
+ color: var(--djm-text-3);
8809
+ font-size: 11px;
8810
+ }
8811
+
8812
+ .djm-fm-empty {
8813
+ margin: 40px 14px;
8814
+ }
8815
+
8816
+ .djm-fm-loading {
8817
+ display: flex;
8818
+ align-items: center;
8819
+ gap: 8px;
8820
+ padding: 10px 14px;
8821
+ color: var(--djm-text-3);
8822
+ font-size: 12px;
8823
+ }
8824
+
8825
+ /* 上传用的隐藏输入 */
8826
+ .djm-fm-file {
8827
+ display: none;
8828
+ }
8829
+
8830
+ .djm-fm-preview-img {
8831
+ display: block;
8832
+ width: 100%;
8833
+ max-height: 420px;
8834
+ border-radius: 6px;
8835
+ background: var(--djm-surface-3);
8836
+ object-fit: contain;
8837
+ }
8838
+
8839
+ .djm-fm-preview-empty {
8840
+ display: flex;
8841
+ flex-direction: column;
8842
+ align-items: center;
8843
+ gap: 8px;
8844
+ padding: 40px;
8845
+ border-radius: 6px;
8846
+ background: var(--djm-surface-2);
8847
+ color: var(--djm-text-3);
8848
+ font-size: 12px;
8849
+ }
8850
+
8851
+ .djm-fm-preview-meta {
8852
+ display: grid;
8853
+ grid-template-columns: repeat(4, minmax(0, 1fr));
8854
+ gap: 10px;
8855
+ margin-top: 12px;
8856
+ }
8857
+
8858
+ .djm-fm-preview-meta div {
8859
+ display: flex;
8860
+ flex-direction: column;
8861
+ gap: 2px;
8862
+ color: var(--djm-text-3);
8863
+ font-size: 11.5px;
8864
+ }
8865
+
8866
+ .djm-fm-preview-meta b {
8867
+ color: var(--djm-text-2);
8868
+ font-size: 12px;
8869
+ font-weight: 500;
8870
+ }
8871
+
8872
+ /* ---------------- 图片相册 ---------------- */
8873
+
8874
+ .djm-album-head {
8875
+ display: flex;
8876
+ align-items: center;
8877
+ justify-content: space-between;
8878
+ gap: 12px;
8879
+ flex-wrap: wrap;
8880
+ padding: 10px 14px;
8881
+ border-bottom: 1px solid var(--djm-border);
8882
+ background: var(--djm-surface-2);
8883
+ }
8884
+
8885
+ .djm-album-tabs {
8886
+ display: flex;
8887
+ flex-wrap: wrap;
8888
+ gap: 6px;
8889
+ }
8890
+
8891
+ .djm-album-tab {
8892
+ display: inline-flex;
8893
+ align-items: center;
8894
+ gap: 6px;
8895
+ height: 28px;
8896
+ padding: 0 10px;
8897
+ border: 1px solid var(--djm-border);
8898
+ border-radius: 14px;
8899
+ background: var(--djm-surface);
8900
+ color: var(--djm-text-2);
8901
+ font-size: 12px;
8902
+ cursor: pointer;
8903
+ }
8904
+
8905
+ .djm-album-tab span {
8906
+ color: var(--djm-text-3);
8907
+ font-size: 10.5px;
8908
+ }
8909
+
8910
+ .djm-album-tab:hover {
8911
+ border-color: var(--djm-brand-500);
8912
+ color: var(--djm-brand-700);
8913
+ }
8914
+
8915
+ .djm-album-tab.djm-is-active {
8916
+ border-color: var(--djm-brand-500);
8917
+ background: var(--djm-brand-soft);
8918
+ color: var(--djm-brand-700);
8919
+ font-weight: 600;
8920
+ }
8921
+
8922
+ .djm-album-tab.djm-is-active span {
8923
+ color: var(--djm-brand-700);
8924
+ }
8925
+
8926
+ .djm-album-actions {
8927
+ display: flex;
8928
+ align-items: center;
8929
+ gap: 10px;
8930
+ }
8931
+
8932
+ .djm-album-grid {
8933
+ display: grid;
8934
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
8935
+ gap: 14px;
8936
+ padding: 14px;
8937
+ }
8938
+
8939
+ .djm-album-card {
8940
+ position: relative;
8941
+ margin: 0;
8942
+ overflow: hidden;
8943
+ border: 1px solid var(--djm-border);
8944
+ border-radius: 6px;
8945
+ background: var(--djm-surface);
8946
+ }
8947
+
8948
+ .djm-album-card.djm-is-selected {
8949
+ border-color: var(--djm-brand-500);
8950
+ box-shadow: 0 0 0 2px var(--djm-brand-soft);
8951
+ }
8952
+
8953
+ .djm-album-thumb {
8954
+ position: relative;
8955
+ display: block;
8956
+ width: 100%;
8957
+ aspect-ratio: 4 / 3;
8958
+ padding: 0;
8959
+ overflow: hidden;
8960
+ border: 0;
8961
+ background: var(--djm-surface-3);
8962
+ cursor: zoom-in;
8963
+ }
8964
+
8965
+ .djm-album-thumb img {
8966
+ width: 100%;
8967
+ height: 100%;
8968
+ object-fit: cover;
8969
+ transition: transform 0.2s ease;
8970
+ }
8971
+
8972
+ .djm-album-thumb:hover img {
8973
+ transform: scale(1.04);
8974
+ }
8975
+
8976
+ .djm-album-zoom {
8977
+ position: absolute;
8978
+ left: 50%;
8979
+ top: 50%;
8980
+ display: inline-flex;
8981
+ align-items: center;
8982
+ gap: 4px;
8983
+ padding: 4px 8px;
8984
+ border-radius: 12px;
8985
+ background: rgba(15, 23, 32, 0.62);
8986
+ color: #fff;
8987
+ font-size: 11px;
8988
+ opacity: 0;
8989
+ pointer-events: none;
8990
+ transform: translate(-50%, -50%);
8991
+ transition: opacity 0.2s ease;
8992
+ }
8993
+
8994
+ .djm-album-thumb:hover .djm-album-zoom {
8995
+ opacity: 1;
8996
+ }
8997
+
8998
+ .djm-album-check {
8999
+ position: absolute;
9000
+ top: 8px;
9001
+ left: 8px;
9002
+ padding: 3px;
9003
+ border-radius: 4px;
9004
+ background: rgba(255, 255, 255, 0.9);
9005
+ }
9006
+
9007
+ .djm-album-card figcaption {
9008
+ display: flex;
9009
+ flex-direction: column;
9010
+ gap: 2px;
9011
+ padding: 8px 10px 10px;
9012
+ }
9013
+
9014
+ .djm-album-card figcaption strong {
9015
+ overflow: hidden;
9016
+ font-size: 12.5px;
9017
+ font-weight: 500;
9018
+ text-overflow: ellipsis;
9019
+ white-space: nowrap;
9020
+ }
9021
+
9022
+ .djm-album-card figcaption span {
9023
+ color: var(--djm-text-3);
9024
+ font-size: 11px;
9025
+ }
9026
+
9027
+ .djm-album-empty {
9028
+ padding: 60px 20px;
9029
+ }
9030
+
9031
+ .djm-album-viewer img {
9032
+ display: block;
9033
+ width: 100%;
9034
+ max-height: 520px;
9035
+ border-radius: 6px;
9036
+ background: var(--djm-surface-3);
9037
+ object-fit: contain;
9038
+ }
9039
+
9040
+ .djm-album-viewer-meta {
9041
+ display: flex;
9042
+ justify-content: space-between;
9043
+ gap: 10px;
9044
+ margin-top: 8px;
9045
+ color: var(--djm-text-3);
9046
+ font-size: 11.5px;
9047
+ }
9048
+
9049
+ @media (max-width: 860px) {
9050
+ .djm-fm {
9051
+ grid-template-columns: 1fr;
9052
+ }
9053
+
9054
+ .djm-fm-side {
9055
+ border-right: 0;
9056
+ border-bottom: 1px solid var(--djm-border);
9057
+ }
9058
+
9059
+ .djm-fm-folder {
9060
+ height: 30px;
9061
+ }
9062
+
9063
+ /* 窄屏:路径与搜索各占一行,避免文字被挤成两行 */
9064
+ .djm-fm-path {
9065
+ flex-wrap: wrap;
9066
+ }
9067
+
9068
+ .djm-fm-search {
9069
+ flex: 1 1 100%;
9070
+ }
9071
+
9072
+ .djm-fm-search input {
9073
+ width: 100%;
9074
+ }
9075
+
9076
+ .djm-fm-crumb em {
9077
+ display: none;
9078
+ }
9079
+
9080
+ .djm-fm-storage {
9081
+ display: none;
9082
+ }
9083
+
9084
+ .djm-fm-grid,
9085
+ .djm-album-grid {
9086
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
9087
+ }
9088
+
9089
+ .djm-fm-preview-meta {
9090
+ grid-template-columns: repeat(2, minmax(0, 1fr));
9091
+ }
9092
+ }
9093
+
8359
9094
  /* ---- components/kanban.css ---- */
8360
9095
 
8361
9096
  /* 看板:横向列排布,列内纵向卡片流,超宽横向滚动 */